Compare commits

...

15 commits

Author SHA1 Message Date
d7a287837e chore: update dependencies 2026-01-25 08:42:45 -03:00
dd71ac8820 Update dependencies and i18n logic 2026-01-24 22:06:07 -03:00
5ce3860f2c Refactor: Use workspace dependencies 2026-01-23 09:37:17 -03:00
29d3cb05b1 Update PROMPT.md 2026-01-22 20:24:03 -03:00
628f853c85 Add ANSI colors to log levels: red E, yellow W, green I, cyan D 2026-01-14 09:33:03 -03:00
8526b0d585 feat(i18n): add missing people, CRM, billing, products translations
- Add people-* keys to en, pt-BR, es locales
- Add crm-subtitle, crm-stage-*, crm-conversion-rate, crm-pipeline-value, etc
- Add billing-subtitle, billing-new-payment, billing-revenue-month, etc
- Add products-subtitle, products-items, products-pricelists, products-total-*, etc
2026-01-12 14:13:08 -03:00
9ff058294e feat(i18n): add missing navigation menu translations
- Add nav-docs, nav-sheet, nav-slides, nav-social, nav-all-apps
- Add nav-people, nav-editor, nav-dashboards, nav-security
- Add nav-designer, nav-project, nav-canvas, nav-goals
- Add nav-player, nav-workspace, nav-video, nav-learn
- Update all locales: en, pt-BR, es
2026-01-10 10:53:44 -03:00
49c7d3e751 Add chat mention i18n translations (en, pt-BR, es) 2026-01-10 07:06:47 -03:00
3d07d7f989 Add CRM, Billing, Products, Tickets, Forms i18n translations to .ftl files
- Add nav entries for crm, billing, products, tickets, forms (en, pt-BR, es)
- Add full CRM section: entities, actions, fields, pipeline stages
- Add full Billing section: invoices, payments, quotes, status, reports
- Add full Products section: catalog, services, price lists, inventory
- Add full Tickets section: cases, priorities, status, AI features
- Add full Forms section: templates, field types, actions
2026-01-10 06:59:48 -03:00
ff599a2cd4 Add i18n localization support with locales 2026-01-08 13:16:05 -03:00
a50d229346 Add limits module and resilience improvements 2025-12-28 11:50:48 -03:00
94f333f983 Update http_client and version modules 2025-12-24 09:29:29 -03:00
2d764af8d7 Remove all code comments 2025-12-23 18:41:16 -03:00
b430866dbf Update library components and models 2025-12-23 15:52:20 -03:00
2de330dbe9 Update botlib 2025-12-21 23:40:41 -03:00
51 changed files with 13770 additions and 502 deletions

View file

@ -6,33 +6,36 @@ description = "Shared library for General Bots - common types, utilities, and HT
license = "AGPL-3.0"
authors = ["Pragmatismo.com.br", "General Bots Community"]
repository = "https://github.com/GeneralBots/BotServer"
keywords = ["bot", "chatbot", "ai", "conversational", "library"]
categories = ["api-bindings", "web-programming"]
[features]
default = []
full = ["database", "http-client", "validation"]
database = ["dep:diesel"]
full = ["database", "http-client", "validation", "resilience", "i18n"]
database = []
http-client = ["dep:reqwest"]
validation = ["dep:validator"]
validation = []
resilience = []
i18n = []
[dependencies]
# Core
anyhow = "1.0"
thiserror = "2.0"
log = "0.4"
chrono = { version = "0.4", features = ["serde"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
uuid = { version = "1.11", features = ["serde", "v4"] }
toml = "0.8"
# Optional: Database
diesel = { version = "2.1", features = ["postgres", "uuid", "chrono", "serde_json", "r2d2"], optional = true }
anyhow = { workspace = true }
thiserror = { workspace = true }
log = { workspace = true }
env_logger = { workspace = true }
chrono = { workspace = true, features = ["serde", "clock"] }
serde = { workspace = true, features = ["derive"] }
serde_json = { workspace = true }
uuid = { workspace = true, features = ["serde", "v4"] }
toml = { workspace = true }
tokio = { workspace = true, features = ["sync", "time"] }
# Optional: HTTP Client
reqwest = { version = "0.12", features = ["json"], optional = true }
# Optional: Validation
validator = { version = "0.18", features = ["derive"], optional = true }
reqwest = { workspace = true, features = ["json", "rustls-tls"], optional = true }
[dev-dependencies]
tokio = { version = "1.41", features = ["rt", "macros"] }
tokio = { workspace = true, features = ["rt", "macros"] }
[lints]
workspace = true

304
PROMPT.md
View file

@ -1,139 +1,32 @@
# BotLib Development Prompt Guide
# BotLib Development Guide
**Version:** 6.1.0
**Purpose:** LLM context for BotLib shared library development
**Version:** 6.2.0
**Purpose:** Shared library for General Bots workspace
---
## Version Management - CRITICAL
## ZERO TOLERANCE POLICY
**Current version is 6.1.0 - DO NOT CHANGE without explicit approval!**
### Rules
1. **Version is 6.1.0 across ALL workspace crates**
2. **NEVER change version without explicit user approval**
3. **All workspace crates share version 6.1.0**
4. **BotLib does not have migrations - all migrations are in botserver/**
**EVERY SINGLE WARNING MUST BE FIXED. NO EXCEPTIONS.**
---
## Official Icons - Reference
**BotLib does not contain icons.** Icons are managed in:
- `botui/ui/suite/assets/icons/` - Runtime UI icons
- `botbook/src/assets/icons/` - Documentation icons
When documenting or referencing UI elements in BotLib:
- Reference icons by name (e.g., `gb-chat.svg`, `gb-drive.svg`)
- Never generate or embed icon content
- See `botui/PROMPT.md` for the complete icon list
---
## Weekly Maintenance - EVERY MONDAY
### Package Review Checklist
**Every Monday, review the following:**
1. **Dependency Updates**
```bash
cargo outdated
cargo audit
```
2. **Package Consolidation Opportunities**
- Check if new crates can replace custom code
- Look for crates that combine multiple dependencies
- Review `Cargo.toml` for redundant dependencies
3. **Code Reduction Candidates**
- Custom implementations that now have crate equivalents
- Boilerplate that can be replaced with derive macros
- Re-exports that can simplify downstream usage
4. **Feature Flag Review**
- Check if optional features are still needed
- Consolidate similar features
- Remove unused feature gates
### Packages to Watch
| Area | Potential Packages | Purpose |
|------|-------------------|---------|
| Error Handling | `anyhow`, `thiserror` | Consolidate error types |
| Validation | `validator` | Replace manual validation |
| Serialization | `serde` derives | Reduce boilerplate |
| UUID | `uuid` | Consistent ID generation |
---
## Project Overview
BotLib is the shared foundation library for the General Bots workspace. It provides common types, utilities, error handling, and optional integrations that are consumed by botserver, botui, and botapp.
### Workspace Position
## ❌ ABSOLUTE PROHIBITIONS
```
botlib/ # THIS PROJECT - Shared library
botserver/ # Main server (depends on botlib)
botui/ # Web/Desktop UI (depends on botlib)
botapp/ # Desktop app (depends on botlib)
botbook/ # Documentation
```
### What BotLib Provides
- **Error Types**: Common error handling with anyhow/thiserror
- **Models**: Shared data structures and types
- **HTTP Client**: Optional reqwest wrapper
- **Database**: Optional diesel integration
- **Validation**: Optional input validation
- **Branding**: Version and branding constants
---
## Feature Flags
```toml
[features]
default = []
full = ["database", "http-client", "validation"]
database = ["dep:diesel"]
http-client = ["dep:reqwest"]
validation = ["dep:validator"]
```
### Usage in Dependent Crates
```toml
# botserver/Cargo.toml
[dependencies.botlib]
path = "../botlib"
features = ["database"]
# botui/Cargo.toml
[dependencies.botlib]
path = "../botlib"
features = ["http-client"]
❌ NEVER use #![allow()] or #[allow()] in source code
❌ NEVER use _ prefix for unused variables - DELETE or USE them
❌ NEVER use .unwrap() - use ? or proper error handling
❌ NEVER use .expect() - use ? or proper error handling
❌ NEVER use panic!() or unreachable!()
❌ NEVER use todo!() or unimplemented!()
❌ NEVER leave unused imports or dead code
❌ NEVER add comments - code must be self-documenting
```
---
## Code Generation Rules
### CRITICAL REQUIREMENTS
```
- Library code must be generic and reusable
- No hardcoded values or project-specific logic
- All public APIs must be well-documented
- Feature gates for optional dependencies
- Zero warnings - clean compilation required
```
### Module Structure
## 🏗️ MODULE STRUCTURE
```
src/
@ -148,153 +41,74 @@ src/
---
## Adding New Features
## ✅ MANDATORY CODE PATTERNS
### Adding a Shared Type
### Error Handling
```rust
// src/models.rs
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use uuid::Uuid;
// ❌ WRONG
let value = something.unwrap();
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SharedEntity {
pub id: Uuid,
pub name: String,
pub created_at: DateTime<Utc>,
// ✅ CORRECT
let value = something?;
let value = something.ok_or_else(|| Error::NotFound)?;
```
### Self Usage
```rust
impl MyStruct {
fn new() -> Self { Self { } } // ✅ Not MyStruct
}
```
### Adding a Feature-Gated Module
### Format Strings
```rust
// src/lib.rs
#[cfg(feature = "my-feature")]
pub mod my_module;
#[cfg(feature = "my-feature")]
pub use my_module::MyType;
format!("Hello {name}") // ✅ Not format!("{}", name)
```
```toml
# Cargo.toml
[features]
my-feature = ["dep:some-crate"]
[dependencies]
some-crate = { version = "1.0", optional = true }
```
### Adding Error Types
### Display vs ToString
```rust
// src/error.rs
use thiserror::Error;
// ❌ WRONG
impl ToString for MyType { }
#[derive(Error, Debug)]
pub enum BotLibError {
#[error("Configuration error: {0}")]
Config(String),
#[error("HTTP error: {0}")]
Http(#[from] reqwest::Error),
#[error("Database error: {0}")]
Database(String),
}
pub type Result<T> = std::result::Result<T, BotLibError>;
// ✅ CORRECT
impl std::fmt::Display for MyType { }
```
---
## Re-exports Strategy
BotLib should re-export common dependencies to ensure version consistency:
### Derive Eq with PartialEq
```rust
// src/lib.rs
pub use anyhow;
pub use chrono;
pub use serde;
pub use serde_json;
pub use thiserror;
pub use uuid;
#[cfg(feature = "database")]
pub use diesel;
#[cfg(feature = "http-client")]
pub use reqwest;
```
Consumers then use:
```rust
use botlib::uuid::Uuid;
use botlib::chrono::Utc;
#[derive(PartialEq, Eq)] // ✅ Always both
struct MyStruct { }
```
---
## Dependencies
## 📦 KEY DEPENDENCIES
| Library | Version | Purpose | Optional |
|---------|---------|---------|----------|
| anyhow | 1.0 | Error handling | No |
| thiserror | 2.0 | Error derive | No |
| log | 0.4 | Logging facade | No |
| chrono | 0.4 | Date/time | No |
| serde | 1.0 | Serialization | No |
| serde_json | 1.0 | JSON | No |
| uuid | 1.11 | UUIDs | No |
| toml | 0.8 | Config parsing | No |
| diesel | 2.1 | Database ORM | Yes |
| reqwest | 0.12 | HTTP client | Yes |
| validator | 0.18 | Validation | Yes |
| Library | Version | Purpose |
|---------|---------|---------|
| anyhow | 1.0 | Error handling |
| thiserror | 2.0 | Error derive |
| chrono | 0.4 | Date/time |
| serde | 1.0 | Serialization |
| uuid | 1.11 | UUIDs |
| diesel | 2.1 | Database ORM |
| reqwest | 0.12 | HTTP client |
---
## Testing
## 🔑 REMEMBER
```bash
# Test all features
cargo test --all-features
# Test specific feature
cargo test --features database
# Test without optional features
cargo test
```
---
## Final Checks Before Commit
```bash
# Verify version is 6.1.0
grep "^version" Cargo.toml | grep "6.1.0"
# Build with all features
cargo build --all-features
# Check for warnings
cargo check --all-features 2>&1 | grep warning
# Run tests
cargo test --all-features
```
---
## Rules
- Keep botlib minimal and focused
- No business logic - only utilities and types
- Feature gate all optional dependencies
- Maintain backward compatibility
- Document all public APIs
- Target zero warnings
- **Version**: Always 6.1.0 - do not change without approval
- **ZERO WARNINGS** - Every clippy warning must be fixed
- **NO ALLOW IN CODE** - Never use #[allow()] in source files
- **NO DEAD CODE** - Delete unused code
- **NO UNWRAP/EXPECT** - Use ? operator
- **INLINE FORMAT ARGS** - `format!("{name}")` not `format!("{}", name)`
- **USE SELF** - In impl blocks, use Self not the type name
- **DERIVE EQ** - Always derive Eq with PartialEq
- **DISPLAY NOT TOSTRING** - Implement Display, not ToString
- **Version 6.2.0** - do not change without approval

557
locales/en/admin.ftl Normal file
View file

@ -0,0 +1,557 @@
# =============================================================================
# General Bots - Admin Translations (English)
# =============================================================================
# Administrative interface translations for the GB Admin Panel
# =============================================================================
# -----------------------------------------------------------------------------
# Admin Navigation & Dashboard
# -----------------------------------------------------------------------------
admin-title = Administration
admin-dashboard = Admin Dashboard
admin-overview = Overview
admin-welcome = Welcome to the Admin Panel
admin-nav-dashboard = Dashboard
admin-nav-users = Users
admin-nav-bots = Bots
admin-nav-tenants = Tenants
admin-nav-settings = Settings
admin-nav-logs = Logs
admin-nav-analytics = Analytics
admin-nav-security = Security
admin-nav-integrations = Integrations
admin-nav-billing = Billing
admin-nav-support = Support
admin-nav-groups = Groups
admin-nav-dns = DNS
admin-nav-system = System
# -----------------------------------------------------------------------------
# Admin Quick Actions
# -----------------------------------------------------------------------------
admin-quick-actions = Quick Actions
admin-create-user = Create User
admin-create-group = Create Group
admin-register-dns = Register DNS
admin-recent-activity = Recent Activity
admin-system-health = System Health
# -----------------------------------------------------------------------------
# User Management
# -----------------------------------------------------------------------------
admin-users-title = User Management
admin-users-list = User List
admin-users-add = Add User
admin-users-edit = Edit User
admin-users-delete = Delete User
admin-users-search = Search users...
admin-users-filter = Filter Users
admin-users-export = Export Users
admin-users-import = Import Users
admin-users-total = Total Users
admin-users-active = Active Users
admin-users-inactive = Inactive Users
admin-users-suspended = Suspended Users
admin-users-pending = Pending Verification
admin-users-last-login = Last Login
admin-users-created = Created
admin-users-role = Role
admin-users-status = Status
admin-users-actions = Actions
admin-users-no-users = No users found
admin-users-confirm-delete = Are you sure you want to delete this user?
admin-users-deleted = User deleted successfully
admin-users-saved = User saved successfully
admin-users-invite = Invite User
admin-users-invite-sent = Invitation sent successfully
admin-users-bulk-actions = Bulk Actions
admin-users-select-all = Select All
admin-users-deselect-all = Deselect All
# User Details
admin-user-details = User Details
admin-user-profile = Profile
admin-user-email = Email
admin-user-name = Name
admin-user-phone = Phone
admin-user-avatar = Avatar
admin-user-timezone = Timezone
admin-user-language = Language
admin-user-role-admin = Administrator
admin-user-role-manager = Manager
admin-user-role-user = User
admin-user-role-viewer = Viewer
admin-user-status-active = Active
admin-user-status-inactive = Inactive
admin-user-status-suspended = Suspended
admin-user-status-pending = Pending
admin-user-permissions = Permissions
admin-user-activity = Activity Log
admin-user-sessions = Active Sessions
admin-user-terminate-session = Terminate Session
admin-user-terminate-all = Terminate All Sessions
admin-user-reset-password = Reset Password
admin-user-force-logout = Force Logout
admin-user-enable-2fa = Enable 2FA
admin-user-disable-2fa = Disable 2FA
# -----------------------------------------------------------------------------
# Group Management
# -----------------------------------------------------------------------------
admin-groups-title = Group Management
admin-groups-subtitle = Manage groups, members, and permissions
admin-groups-list = Group List
admin-groups-add = Add Group
admin-groups-create = Create Group
admin-groups-edit = Edit Group
admin-groups-delete = Delete Group
admin-groups-search = Search groups...
admin-groups-filter = Filter Groups
admin-groups-total = Total Groups
admin-groups-active = Active Groups
admin-groups-no-groups = No groups found
admin-groups-confirm-delete = Are you sure you want to delete this group?
admin-groups-deleted = Group deleted successfully
admin-groups-saved = Group saved successfully
admin-groups-created = Group created successfully
admin-groups-loading = Loading groups...
# Group Details
admin-group-details = Group Details
admin-group-name = Group Name
admin-group-description = Description
admin-group-visibility = Visibility
admin-group-visibility-public = Public
admin-group-visibility-private = Private
admin-group-visibility-hidden = Hidden
admin-group-join-policy = Join Policy
admin-group-join-invite = Invite Only
admin-group-join-request = Request to Join
admin-group-join-open = Open
admin-group-members = Members
admin-group-member-count = { $count ->
[one] { $count } member
*[other] { $count } members
}
admin-group-add-member = Add Member
admin-group-remove-member = Remove Member
admin-group-permissions = Permissions
admin-group-settings = Settings
admin-group-analytics = Analytics
admin-group-overview = Overview
# Group View Modes
admin-groups-view-grid = Grid View
admin-groups-view-list = List View
admin-groups-all-visibility = All Visibility
# -----------------------------------------------------------------------------
# DNS Management
# -----------------------------------------------------------------------------
admin-dns-title = DNS Management
admin-dns-subtitle = Register and manage DNS hostnames for your bots
admin-dns-register = Register Hostname
admin-dns-registered = Registered Hostnames
admin-dns-search = Search hostnames...
admin-dns-refresh = Refresh
admin-dns-loading = Loading DNS records...
admin-dns-no-records = No DNS records found
admin-dns-confirm-delete = Are you sure you want to remove this hostname?
admin-dns-deleted = Hostname removed successfully
admin-dns-saved = DNS record saved successfully
admin-dns-created = Hostname registered successfully
# DNS Form Fields
admin-dns-hostname = Hostname
admin-dns-hostname-placeholder = mybot.example.com
admin-dns-hostname-help = Enter the full domain name you want to register
admin-dns-record-type = Record Type
admin-dns-record-type-a = A (IPv4)
admin-dns-record-type-aaaa = AAAA (IPv6)
admin-dns-record-type-cname = CNAME
admin-dns-ttl = TTL (seconds)
admin-dns-ttl-5min = 5 minutes (300)
admin-dns-ttl-1hour = 1 hour (3600)
admin-dns-ttl-1day = 1 day (86400)
admin-dns-target = Target/IP Address
admin-dns-target-placeholder-ipv4 = 192.168.1.1
admin-dns-target-placeholder-ipv6 = 2001:db8::1
admin-dns-target-placeholder-cname = target.example.com
admin-dns-target-help-a = Enter the IPv4 address to point to
admin-dns-target-help-aaaa = Enter the IPv6 address to point to
admin-dns-target-help-cname = Enter the target domain name
admin-dns-auto-ssl = Automatically provision SSL certificate
# DNS Table Headers
admin-dns-col-hostname = Hostname
admin-dns-col-type = Type
admin-dns-col-target = Target
admin-dns-col-ttl = TTL
admin-dns-col-ssl = SSL
admin-dns-col-status = Status
admin-dns-col-actions = Actions
# DNS Status
admin-dns-status-active = Active
admin-dns-status-pending = Pending
admin-dns-status-error = Error
admin-dns-ssl-enabled = SSL Enabled
admin-dns-ssl-disabled = No SSL
admin-dns-ssl-pending = SSL Pending
# DNS Info Cards
admin-dns-help-title = DNS Configuration Help
admin-dns-help-a-record = A Record
admin-dns-help-a-record-desc = Maps a domain name to an IPv4 address. Use this to point your hostname directly to a server IP.
admin-dns-help-aaaa-record = AAAA Record
admin-dns-help-aaaa-record-desc = Maps a domain name to an IPv6 address. Similar to A record but for IPv6 connectivity.
admin-dns-help-cname-record = CNAME Record
admin-dns-help-cname-record-desc = Creates an alias from one domain to another. Useful for pointing subdomains to your main domain.
admin-dns-help-ssl = SSL/TLS
admin-dns-help-ssl-desc = Automatically provisions Let's Encrypt certificates for secure HTTPS connections.
# DNS Edit/Remove Modals
admin-dns-edit-title = Edit DNS Record
admin-dns-remove-title = Remove Hostname
admin-dns-remove-warning = This will delete the DNS record and any associated SSL certificates. The hostname will no longer resolve.
# -----------------------------------------------------------------------------
# Bot Management
# -----------------------------------------------------------------------------
admin-bots-title = Bot Management
admin-bots-list = Bot List
admin-bots-add = Add Bot
admin-bots-edit = Edit Bot
admin-bots-delete = Delete Bot
admin-bots-search = Search bots...
admin-bots-filter = Filter Bots
admin-bots-total = Total Bots
admin-bots-active = Active Bots
admin-bots-inactive = Inactive Bots
admin-bots-draft = Draft Bots
admin-bots-published = Published Bots
admin-bots-no-bots = No bots found
admin-bots-confirm-delete = Are you sure you want to delete this bot?
admin-bots-deleted = Bot deleted successfully
admin-bots-saved = Bot saved successfully
admin-bots-duplicate = Duplicate Bot
admin-bots-export = Export Bot
admin-bots-import = Import Bot
admin-bots-publish = Publish
admin-bots-unpublish = Unpublish
admin-bots-test = Test Bot
admin-bots-logs = Bot Logs
admin-bots-analytics = Bot Analytics
admin-bots-conversations = Conversations
admin-bots-templates = Templates
admin-bots-dialogs = Dialogs
admin-bots-knowledge-base = Knowledge Base
# Bot Details
admin-bot-details = Bot Details
admin-bot-name = Bot Name
admin-bot-description = Description
admin-bot-avatar = Bot Avatar
admin-bot-language = Language
admin-bot-timezone = Timezone
admin-bot-greeting = Greeting Message
admin-bot-fallback = Fallback Message
admin-bot-channels = Channels
admin-bot-channel-web = Web Chat
admin-bot-channel-whatsapp = WhatsApp
admin-bot-channel-telegram = Telegram
admin-bot-channel-slack = Slack
admin-bot-channel-teams = Microsoft Teams
admin-bot-channel-email = Email
admin-bot-model = AI Model
admin-bot-temperature = Temperature
admin-bot-max-tokens = Max Tokens
admin-bot-system-prompt = System Prompt
# -----------------------------------------------------------------------------
# Tenant Management
# -----------------------------------------------------------------------------
admin-tenants-title = Tenant Management
admin-tenants-list = Tenant List
admin-tenants-add = Add Tenant
admin-tenants-edit = Edit Tenant
admin-tenants-delete = Delete Tenant
admin-tenants-search = Search tenants...
admin-tenants-total = Total Tenants
admin-tenants-active = Active Tenants
admin-tenants-suspended = Suspended Tenants
admin-tenants-trial = Trial Tenants
admin-tenants-no-tenants = No tenants found
admin-tenants-confirm-delete = Are you sure you want to delete this tenant?
admin-tenants-deleted = Tenant deleted successfully
admin-tenants-saved = Tenant saved successfully
# Tenant Details
admin-tenant-details = Tenant Details
admin-tenant-name = Tenant Name
admin-tenant-domain = Domain
admin-tenant-plan = Plan
admin-tenant-plan-free = Free
admin-tenant-plan-starter = Starter
admin-tenant-plan-professional = Professional
admin-tenant-plan-enterprise = Enterprise
admin-tenant-users = Users
admin-tenant-bots = Bots
admin-tenant-storage = Storage Used
admin-tenant-api-calls = API Calls
admin-tenant-limits = Usage Limits
admin-tenant-billing = Billing Info
# -----------------------------------------------------------------------------
# System Settings
# -----------------------------------------------------------------------------
admin-settings-title = System Settings
admin-settings-general = General Settings
admin-settings-security = Security Settings
admin-settings-email = Email Settings
admin-settings-storage = Storage Settings
admin-settings-integrations = Integrations
admin-settings-api = API Settings
admin-settings-appearance = Appearance
admin-settings-localization = Localization
admin-settings-notifications = Notifications
admin-settings-backup = Backup & Restore
admin-settings-maintenance = Maintenance Mode
admin-settings-saved = Settings saved successfully
admin-settings-reset = Reset to Defaults
admin-settings-confirm-reset = Are you sure you want to reset all settings to defaults?
# General Settings
admin-settings-site-name = Site Name
admin-settings-site-url = Site URL
admin-settings-admin-email = Admin Email
admin-settings-support-email = Support Email
admin-settings-default-language = Default Language
admin-settings-default-timezone = Default Timezone
admin-settings-date-format = Date Format
admin-settings-time-format = Time Format
admin-settings-currency = Currency
# Email Settings
admin-settings-smtp-host = SMTP Host
admin-settings-smtp-port = SMTP Port
admin-settings-smtp-user = SMTP Username
admin-settings-smtp-password = SMTP Password
admin-settings-smtp-encryption = Encryption
admin-settings-smtp-from-name = From Name
admin-settings-smtp-from-email = From Email
admin-settings-smtp-test = Send Test Email
admin-settings-smtp-test-success = Test email sent successfully
admin-settings-smtp-test-failed = Failed to send test email
# Storage Settings
admin-settings-storage-provider = Storage Provider
admin-settings-storage-local = Local Storage
admin-settings-storage-s3 = Amazon S3
admin-settings-storage-minio = MinIO
admin-settings-storage-gcs = Google Cloud Storage
admin-settings-storage-azure = Azure Blob Storage
admin-settings-storage-bucket = Bucket Name
admin-settings-storage-region = Region
admin-settings-storage-access-key = Access Key
admin-settings-storage-secret-key = Secret Key
admin-settings-storage-endpoint = Endpoint URL
# -----------------------------------------------------------------------------
# System Logs
# -----------------------------------------------------------------------------
admin-logs-title = System Logs
admin-logs-search = Search logs...
admin-logs-filter-level = Filter by Level
admin-logs-filter-source = Filter by Source
admin-logs-filter-date = Filter by Date
admin-logs-level-all = All Levels
admin-logs-level-debug = Debug
admin-logs-level-info = Info
admin-logs-level-warning = Warning
admin-logs-level-error = Error
admin-logs-level-critical = Critical
admin-logs-export = Export Logs
admin-logs-clear = Clear Logs
admin-logs-confirm-clear = Are you sure you want to clear all logs?
admin-logs-cleared = Logs cleared successfully
admin-logs-no-logs = No logs found
admin-logs-refresh = Refresh
admin-logs-auto-refresh = Auto Refresh
admin-logs-timestamp = Timestamp
admin-logs-level = Level
admin-logs-source = Source
admin-logs-message = Message
admin-logs-details = Details
# -----------------------------------------------------------------------------
# Analytics
# -----------------------------------------------------------------------------
admin-analytics-title = Analytics
admin-analytics-overview = Overview
admin-analytics-users = User Analytics
admin-analytics-bots = Bot Analytics
admin-analytics-conversations = Conversation Analytics
admin-analytics-performance = Performance
admin-analytics-period = Time Period
admin-analytics-period-today = Today
admin-analytics-period-week = This Week
admin-analytics-period-month = This Month
admin-analytics-period-quarter = This Quarter
admin-analytics-period-year = This Year
admin-analytics-period-custom = Custom Range
admin-analytics-export = Export Report
admin-analytics-total-users = Total Users
admin-analytics-new-users = New Users
admin-analytics-active-users = Active Users
admin-analytics-total-bots = Total Bots
admin-analytics-active-bots = Active Bots
admin-analytics-total-conversations = Total Conversations
admin-analytics-avg-response-time = Avg Response Time
admin-analytics-satisfaction-rate = Satisfaction Rate
admin-analytics-resolution-rate = Resolution Rate
# -----------------------------------------------------------------------------
# Security
# -----------------------------------------------------------------------------
admin-security-title = Security
admin-security-overview = Security Overview
admin-security-audit-log = Audit Log
admin-security-login-attempts = Login Attempts
admin-security-blocked-ips = Blocked IPs
admin-security-api-keys = API Keys
admin-security-webhooks = Webhooks
admin-security-cors = CORS Settings
admin-security-rate-limiting = Rate Limiting
admin-security-encryption = Encryption
admin-security-2fa = Two-Factor Authentication
admin-security-sso = Single Sign-On
admin-security-password-policy = Password Policy
# API Keys
admin-api-keys-title = API Keys
admin-api-keys-add = Create API Key
admin-api-keys-name = Key Name
admin-api-keys-key = API Key
admin-api-keys-secret = Secret Key
admin-api-keys-created = Created
admin-api-keys-last-used = Last Used
admin-api-keys-expires = Expires
admin-api-keys-never = Never
admin-api-keys-revoke = Revoke
admin-api-keys-confirm-revoke = Are you sure you want to revoke this API key?
admin-api-keys-revoked = API key revoked successfully
admin-api-keys-created-success = API key created successfully
admin-api-keys-copy = Copy to Clipboard
admin-api-keys-copied = Copied!
admin-api-keys-warning = Make sure to copy your API key now. You won't be able to see it again!
# -----------------------------------------------------------------------------
# Billing
# -----------------------------------------------------------------------------
admin-billing-title = Billing
admin-billing-overview = Billing Overview
admin-billing-current-plan = Current Plan
admin-billing-usage = Usage
admin-billing-invoices = Invoices
admin-billing-payment-methods = Payment Methods
admin-billing-upgrade = Upgrade Plan
admin-billing-downgrade = Downgrade Plan
admin-billing-cancel = Cancel Subscription
admin-billing-invoice-date = Invoice Date
admin-billing-invoice-amount = Amount
admin-billing-invoice-status = Status
admin-billing-invoice-paid = Paid
admin-billing-invoice-pending = Pending
admin-billing-invoice-overdue = Overdue
admin-billing-invoice-download = Download Invoice
# -----------------------------------------------------------------------------
# Backup & Restore
# -----------------------------------------------------------------------------
admin-backup-title = Backup & Restore
admin-backup-create = Create Backup
admin-backup-restore = Restore Backup
admin-backup-schedule = Schedule Backups
admin-backup-list = Backup History
admin-backup-name = Backup Name
admin-backup-size = Size
admin-backup-created = Created
admin-backup-download = Download
admin-backup-delete = Delete
admin-backup-confirm-restore = Are you sure you want to restore this backup? This will overwrite current data.
admin-backup-confirm-delete = Are you sure you want to delete this backup?
admin-backup-in-progress = Backup in progress...
admin-backup-completed = Backup completed successfully
admin-backup-failed = Backup failed
admin-backup-restore-in-progress = Restore in progress...
admin-backup-restore-completed = Restore completed successfully
admin-backup-restore-failed = Restore failed
# -----------------------------------------------------------------------------
# Maintenance Mode
# -----------------------------------------------------------------------------
admin-maintenance-title = Maintenance Mode
admin-maintenance-enable = Enable Maintenance Mode
admin-maintenance-disable = Disable Maintenance Mode
admin-maintenance-status = Current Status
admin-maintenance-active = Maintenance mode is active
admin-maintenance-inactive = Maintenance mode is inactive
admin-maintenance-message = Maintenance Message
admin-maintenance-default-message = We are currently performing scheduled maintenance. Please check back soon.
admin-maintenance-allowed-ips = Allowed IP Addresses
admin-maintenance-confirm-enable = Are you sure you want to enable maintenance mode? Users will not be able to access the system.
# -----------------------------------------------------------------------------
# Common Admin UI Elements
# -----------------------------------------------------------------------------
admin-required = Required
admin-optional = Optional
admin-loading = Loading...
admin-saving = Saving...
admin-deleting = Deleting...
admin-confirm = Confirm
admin-cancel = Cancel
admin-save = Save
admin-create = Create
admin-update = Update
admin-delete = Delete
admin-edit = Edit
admin-view = View
admin-close = Close
admin-back = Back
admin-next = Next
admin-previous = Previous
admin-refresh = Refresh
admin-export = Export
admin-import = Import
admin-search = Search
admin-filter = Filter
admin-clear = Clear
admin-select = Select
admin-select-all = Select All
admin-deselect-all = Deselect All
admin-actions = Actions
admin-more-actions = More Actions
admin-no-data = No data available
admin-error = An error occurred
admin-success = Success
admin-warning = Warning
admin-info = Information
# Table Pagination
admin-showing = Showing { $from } to { $to } of { $total } results
admin-page = Page { $current } of { $total }
admin-items-per-page = Items per page
admin-go-to-page = Go to page
# Bulk Actions
admin-bulk-delete = Delete Selected
admin-bulk-export = Export Selected
admin-bulk-activate = Activate Selected
admin-bulk-deactivate = Deactivate Selected
admin-selected-count = { $count ->
[one] { $count } item selected
*[other] { $count } items selected
}

173
locales/en/analytics.ftl Normal file
View file

@ -0,0 +1,173 @@
analytics-title = Analytics
analytics-dashboard = Analytics Dashboard
analytics-overview = Overview
analytics-reports = Reports
analytics-export = Export Data
analytics-refresh = Refresh Data
analytics-last-updated = Last updated: { $time }
analytics-period-today = Today
analytics-period-yesterday = Yesterday
analytics-period-week = This Week
analytics-period-last-week = Last Week
analytics-period-month = This Month
analytics-period-last-month = Last Month
analytics-period-quarter = This Quarter
analytics-period-year = This Year
analytics-period-custom = Custom Range
analytics-period-from = From
analytics-period-to = To
analytics-period-apply = Apply
analytics-metric-total = Total
analytics-metric-average = Average
analytics-metric-min = Minimum
analytics-metric-max = Maximum
analytics-metric-count = Count
analytics-metric-sum = Sum
analytics-metric-percentage = Percentage
analytics-metric-growth = Growth
analytics-metric-change = Change
analytics-metric-trend = Trend
analytics-users-title = User Analytics
analytics-users-total = Total Users
analytics-users-active = Active Users
analytics-users-new = New Users
analytics-users-returning = Returning Users
analytics-users-churned = Churned Users
analytics-users-growth = User Growth
analytics-users-retention = User Retention
analytics-users-engagement = User Engagement
analytics-users-by-country = Users by Country
analytics-users-by-device = Users by Device
analytics-users-by-browser = Users by Browser
analytics-users-by-os = Users by Operating System
analytics-users-sessions = Sessions
analytics-users-avg-session = Avg Session Duration
analytics-users-page-views = Page Views
analytics-users-bounce-rate = Bounce Rate
analytics-bots-title = Bot Analytics
analytics-bots-total = Total Bots
analytics-bots-active = Active Bots
analytics-bots-conversations = Total Conversations
analytics-bots-messages = Total Messages
analytics-bots-avg-messages = Avg Messages per Conversation
analytics-bots-response-time = Avg Response Time
analytics-bots-resolution-rate = Resolution Rate
analytics-bots-satisfaction = Satisfaction Score
analytics-bots-handoff-rate = Human Handoff Rate
analytics-bots-fallback-rate = Fallback Rate
analytics-bots-intent-accuracy = Intent Accuracy
analytics-bots-top-intents = Top Intents
analytics-bots-top-topics = Top Topics
analytics-bots-by-channel = Conversations by Channel
analytics-bots-by-hour = Conversations by Hour
analytics-bots-by-day = Conversations by Day
analytics-conversations-title = Conversation Analytics
analytics-conversations-total = Total Conversations
analytics-conversations-completed = Completed
analytics-conversations-abandoned = Abandoned
analytics-conversations-transferred = Transferred
analytics-conversations-avg-duration = Avg Duration
analytics-conversations-avg-messages = Avg Messages
analytics-conversations-first-response = First Response Time
analytics-conversations-wait-time = Avg Wait Time
analytics-conversations-peak-hours = Peak Hours
analytics-conversations-sentiment = Sentiment Analysis
analytics-conversations-sentiment-positive = Positive
analytics-conversations-sentiment-neutral = Neutral
analytics-conversations-sentiment-negative = Negative
analytics-conversations-languages = By Language
analytics-conversations-sources = By Source
analytics-performance-title = Performance Analytics
analytics-performance-uptime = Uptime
analytics-performance-availability = Availability
analytics-performance-response-time = Response Time
analytics-performance-latency = Latency
analytics-performance-throughput = Throughput
analytics-performance-error-rate = Error Rate
analytics-performance-cpu = CPU Usage
analytics-performance-memory = Memory Usage
analytics-performance-disk = Disk Usage
analytics-performance-network = Network I/O
analytics-performance-requests = Requests/sec
analytics-performance-concurrent = Concurrent Users
analytics-performance-queue-size = Queue Size
analytics-performance-cache-hit = Cache Hit Rate
analytics-api-title = API Analytics
analytics-api-calls = Total API Calls
analytics-api-success = Successful Calls
analytics-api-errors = Failed Calls
analytics-api-avg-latency = Avg Latency
analytics-api-by-endpoint = Calls by Endpoint
analytics-api-by-method = Calls by Method
analytics-api-by-status = Calls by Status Code
analytics-api-rate-limited = Rate Limited Calls
analytics-api-top-consumers = Top API Consumers
analytics-llm-title = LLM Analytics
analytics-llm-requests = Total Requests
analytics-llm-tokens-input = Input Tokens
analytics-llm-tokens-output = Output Tokens
analytics-llm-tokens-total = Total Tokens
analytics-llm-cost = Estimated Cost
analytics-llm-avg-latency = Avg Latency
analytics-llm-by-model = Usage by Model
analytics-llm-cache-hits = Cache Hits
analytics-llm-cache-misses = Cache Misses
analytics-storage-title = Storage Analytics
analytics-storage-total = Total Storage
analytics-storage-used = Used Storage
analytics-storage-available = Available Storage
analytics-storage-by-type = Storage by File Type
analytics-storage-by-tenant = Storage by Tenant
analytics-storage-growth = Storage Growth
analytics-storage-uploads = Total Uploads
analytics-storage-downloads = Total Downloads
analytics-chart-line = Line Chart
analytics-chart-bar = Bar Chart
analytics-chart-pie = Pie Chart
analytics-chart-area = Area Chart
analytics-chart-donut = Donut Chart
analytics-chart-table = Table View
analytics-chart-heatmap = Heatmap
analytics-chart-no-data = No data available for this period
analytics-comparison-previous = vs Previous Period
analytics-comparison-increase = { $value }% increase
analytics-comparison-decrease = { $value }% decrease
analytics-comparison-no-change = No change
analytics-filter-all = All
analytics-filter-apply = Apply Filters
analytics-filter-clear = Clear Filters
analytics-filter-by-bot = Filter by Bot
analytics-filter-by-channel = Filter by Channel
analytics-filter-by-user = Filter by User
analytics-filter-by-tenant = Filter by Tenant
analytics-report-generate = Generate Report
analytics-report-schedule = Schedule Report
analytics-report-download = Download Report
analytics-report-email = Email Report
analytics-report-format-pdf = PDF
analytics-report-format-csv = CSV
analytics-report-format-excel = Excel
analytics-report-format-json = JSON
analytics-report-generating = Generating report...
analytics-report-ready = Report ready for download
analytics-report-failed = Failed to generate report
analytics-realtime = Real-time Analytics
analytics-realtime-active = Active Now
analytics-realtime-conversations = Active Conversations
analytics-realtime-users = Online Users
analytics-realtime-requests = Requests/min
analytics-realtime-events = Events/sec

256
locales/en/auth.ftl Normal file
View file

@ -0,0 +1,256 @@
# =============================================================================
# General Bots - Authentication Translations (English)
# =============================================================================
# Authentication, Passkey/WebAuthn, and security interface translations
# =============================================================================
# -----------------------------------------------------------------------------
# Authentication General
# -----------------------------------------------------------------------------
auth-title = Authentication
auth-login = Log In
auth-logout = Log Out
auth-signup = Sign Up
auth-welcome = Welcome
auth-welcome-back = Welcome back, { $name }!
auth-session-expired = Your session has expired
auth-session-timeout = Session timeout in { $minutes } minutes
# -----------------------------------------------------------------------------
# Login Form
# -----------------------------------------------------------------------------
auth-login-title = Sign in to your account
auth-login-subtitle = Enter your credentials to continue
auth-login-email = Email Address
auth-login-username = Username
auth-login-password = Password
auth-login-remember = Remember me
auth-login-forgot = Forgot password?
auth-login-submit = Sign In
auth-login-loading = Signing in...
auth-login-or = or continue with
auth-login-no-account = Don't have an account?
auth-login-create-account = Create an account
# -----------------------------------------------------------------------------
# Passkey/WebAuthn
# -----------------------------------------------------------------------------
passkey-title = Passkeys
passkey-subtitle = Secure, passwordless authentication
passkey-description = Passkeys use your device's biometrics or PIN for secure, phishing-resistant sign-in
passkey-what-is = What is a passkey?
passkey-benefits = Benefits of passkeys
passkey-benefit-secure = More secure than passwords
passkey-benefit-easy = Easy to use - no passwords to remember
passkey-benefit-fast = Fast sign-in with biometrics
passkey-benefit-phishing = Resistant to phishing attacks
# -----------------------------------------------------------------------------
# Passkey Registration
# -----------------------------------------------------------------------------
passkey-register-title = Set Up Passkey
passkey-register-subtitle = Create a passkey for faster, more secure sign-in
passkey-register-description = Your device will ask you to verify your identity using your fingerprint, face, or screen lock
passkey-register-button = Create Passkey
passkey-register-name = Passkey Name
passkey-register-name-placeholder = e.g., MacBook Pro, iPhone
passkey-register-name-hint = Give your passkey a name to identify it later
passkey-register-loading = Setting up passkey...
passkey-register-verifying = Verifying with your device...
passkey-register-success = Passkey created successfully
passkey-register-error = Failed to create passkey
passkey-register-cancelled = Passkey setup cancelled
passkey-register-not-supported = Your browser doesn't support passkeys
# -----------------------------------------------------------------------------
# Passkey Authentication
# -----------------------------------------------------------------------------
passkey-login-title = Sign in with Passkey
passkey-login-subtitle = Use your passkey for secure, passwordless sign-in
passkey-login-button = Sign in with Passkey
passkey-login-loading = Authenticating...
passkey-login-verifying = Verifying passkey...
passkey-login-success = Signed in successfully
passkey-login-error = Authentication failed
passkey-login-cancelled = Authentication cancelled
passkey-login-no-passkeys = No passkeys found for this account
passkey-login-try-another = Try another method
# -----------------------------------------------------------------------------
# Passkey Management
# -----------------------------------------------------------------------------
passkey-manage-title = Manage Passkeys
passkey-manage-subtitle = View and manage your registered passkeys
passkey-manage-count = { $count ->
[one] { $count } passkey registered
*[other] { $count } passkeys registered
}
passkey-manage-add = Add New Passkey
passkey-manage-rename = Rename
passkey-manage-delete = Delete
passkey-manage-created = Created { $date }
passkey-manage-last-used = Last used { $date }
passkey-manage-never-used = Never used
passkey-manage-this-device = This device
passkey-manage-cross-platform = Cross-platform
passkey-manage-platform = Platform authenticator
passkey-manage-security-key = Security key
passkey-manage-empty = No passkeys registered
passkey-manage-empty-description = Add a passkey for faster, more secure sign-in
# -----------------------------------------------------------------------------
# Passkey Deletion
# -----------------------------------------------------------------------------
passkey-delete-title = Delete Passkey
passkey-delete-confirm = Are you sure you want to delete this passkey?
passkey-delete-warning = You won't be able to use this passkey to sign in anymore
passkey-delete-last-warning = This is your only passkey. You'll need to use password authentication after deleting it.
passkey-delete-success = Passkey deleted successfully
passkey-delete-error = Failed to delete passkey
# -----------------------------------------------------------------------------
# Password Fallback
# -----------------------------------------------------------------------------
passkey-fallback-title = Use Password Instead
passkey-fallback-description = If you can't use your passkey, you can sign in with your password
passkey-fallback-button = Use Password
passkey-fallback-or-passkey = Or sign in with passkey
passkey-fallback-setup-prompt = Set up a passkey for faster sign-in next time
passkey-fallback-setup-later = Maybe later
passkey-fallback-setup-now = Set up now
passkey-fallback-locked = Account temporarily locked
passkey-fallback-locked-description = Too many failed attempts. Try again in { $minutes } minutes.
passkey-fallback-attempts = { $remaining } attempts remaining
# -----------------------------------------------------------------------------
# Multi-Factor Authentication
# -----------------------------------------------------------------------------
mfa-title = Two-Factor Authentication
mfa-subtitle = Add an extra layer of security to your account
mfa-enabled = Two-factor authentication is enabled
mfa-disabled = Two-factor authentication is disabled
mfa-enable = Enable 2FA
mfa-disable = Disable 2FA
mfa-setup = Set Up 2FA
mfa-verify = Verify Code
mfa-code = Verification Code
mfa-code-placeholder = Enter 6-digit code
mfa-code-sent = Code sent to { $destination }
mfa-code-expired = Code has expired
mfa-code-invalid = Invalid code
mfa-resend = Resend code
mfa-resend-in = Resend in { $seconds }s
mfa-methods = Authentication Methods
mfa-method-app = Authenticator App
mfa-method-sms = SMS
mfa-method-email = Email
mfa-method-passkey = Passkey
mfa-backup-codes = Backup Codes
mfa-backup-codes-description = Save these codes in a safe place. Each code can only be used once.
mfa-backup-codes-remaining = { $count } backup codes remaining
mfa-backup-codes-generate = Generate New Codes
mfa-backup-codes-download = Download Codes
mfa-backup-codes-copy = Copy Codes
# -----------------------------------------------------------------------------
# Password Management
# -----------------------------------------------------------------------------
password-title = Password
password-change = Change Password
password-current = Current Password
password-new = New Password
password-confirm = Confirm New Password
password-requirements = Password Requirements
password-requirement-length = At least { $length } characters
password-requirement-uppercase = At least one uppercase letter
password-requirement-lowercase = At least one lowercase letter
password-requirement-number = At least one number
password-requirement-special = At least one special character
password-strength = Password Strength
password-strength-weak = Weak
password-strength-fair = Fair
password-strength-good = Good
password-strength-strong = Strong
password-match = Passwords match
password-mismatch = Passwords do not match
password-changed = Password changed successfully
password-change-error = Failed to change password
# -----------------------------------------------------------------------------
# Password Reset
# -----------------------------------------------------------------------------
password-reset-title = Reset Password
password-reset-subtitle = Enter your email to receive a reset link
password-reset-email-sent = Password reset email sent
password-reset-email-sent-description = Check your email for instructions to reset your password
password-reset-invalid-token = Invalid or expired reset link
password-reset-success = Password reset successfully
password-reset-error = Failed to reset password
# -----------------------------------------------------------------------------
# Session Management
# -----------------------------------------------------------------------------
session-title = Active Sessions
session-subtitle = Manage your active sessions across devices
session-current = Current Session
session-device = Device
session-location = Location
session-last-active = Last Active
session-ip-address = IP Address
session-browser = Browser
session-os = Operating System
session-sign-out = Sign Out
session-sign-out-all = Sign Out All Other Sessions
session-sign-out-confirm = Are you sure you want to sign out of this session?
session-sign-out-all-confirm = Are you sure you want to sign out of all other sessions?
# -----------------------------------------------------------------------------
# Security Settings
# -----------------------------------------------------------------------------
security-title = Security
security-subtitle = Manage your account security settings
security-overview = Security Overview
security-last-login = Last Sign In
security-password-last-changed = Password Last Changed
security-security-checkup = Security Checkup
security-checkup-description = Review your security settings
security-recommendation = Recommendation
security-add-passkey = Add a passkey for more secure sign-in
security-enable-mfa = Enable two-factor authentication
security-update-password = Update your password regularly
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
auth-error-invalid-credentials = Invalid email or password
auth-error-account-locked = Account is locked. Please contact support.
auth-error-account-disabled = Account has been disabled
auth-error-email-not-verified = Please verify your email address
auth-error-too-many-attempts = Too many failed attempts. Please try again later.
auth-error-network = Network error. Please check your connection.
auth-error-server = Server error. Please try again later.
auth-error-unknown = An unknown error occurred
auth-error-session-invalid = Invalid session. Please sign in again.
auth-error-token-expired = Your session has expired. Please sign in again.
auth-error-unauthorized = You are not authorized to perform this action
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
auth-success-login = Signed in successfully
auth-success-logout = Signed out successfully
auth-success-signup = Account created successfully
auth-success-password-changed = Password changed successfully
auth-success-email-verified = Email verified successfully
auth-success-mfa-enabled = Two-factor authentication enabled
auth-success-mfa-disabled = Two-factor authentication disabled
auth-success-session-terminated = Session terminated successfully
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
auth-notify-new-login = New sign-in from { $device } in { $location }
auth-notify-password-changed = Your password was changed
auth-notify-mfa-enabled = Two-factor authentication was enabled
auth-notify-passkey-added = New passkey was added to your account
auth-notify-suspicious-activity = Suspicious activity detected on your account

View file

@ -0,0 +1,150 @@
bot-greeting-default = Hello! How can I help you today?
bot-greeting-named = Hello, { $name }! How can I help you today?
bot-goodbye = Goodbye! Have a great day!
bot-help-prompt = I can help you with: { $topics }. What would you like to know?
bot-thank-you = Thank you for your message. How can I assist you today?
bot-echo-intro = Echo Bot: I will repeat everything you say. Type 'quit' to exit.
bot-you-said = You said: { $message }
bot-thinking = Let me think about that...
bot-processing = Processing your request...
bot-error-occurred = I'm sorry, something went wrong. Please try again.
bot-not-understood = I didn't understand that. Could you please rephrase?
bot-confirm-action = Are you sure you want to proceed?
bot-action-cancelled = Action cancelled.
bot-action-completed = Done!
bot-lead-welcome = Welcome! Let me help you get started.
bot-lead-ask-name = What's your name?
bot-lead-ask-email = And your email?
bot-lead-ask-company = What company are you from?
bot-lead-ask-phone = What's your phone number?
bot-lead-hot = Great! Our sales team will reach out shortly.
bot-lead-nurture = Thanks for your interest! We'll send you some resources.
bot-lead-score = Your lead score is { $score } out of 100.
bot-lead-saved = Your information has been saved successfully.
bot-schedule-created = Running scheduled task: { $name }
bot-schedule-next = Next run scheduled for { $datetime }
bot-schedule-cancelled = Schedule cancelled.
bot-schedule-paused = Schedule paused.
bot-schedule-resumed = Schedule resumed.
bot-monitor-alert = Alert: { $subject } has changed
bot-monitor-threshold = { $metric } has exceeded threshold: { $value }
bot-monitor-recovered = { $subject } has returned to normal.
bot-monitor-status = Current status: { $status }
bot-order-welcome = Welcome to our store! How can I help?
bot-order-track = Track my order
bot-order-browse = Browse products
bot-order-support = Contact support
bot-order-enter-id = Please enter your order number:
bot-order-status = Order status: { $status }
bot-order-shipped = Your order has been shipped! Tracking number: { $tracking }
bot-order-delivered = Your order has been delivered.
bot-order-processing = Your order is being processed.
bot-order-cancelled = Your order has been cancelled.
bot-order-ticket = Support ticket created: #{ $ticket }
bot-order-products-available = Here are our available products:
bot-order-product-item = { $name } - { $price }
bot-order-cart-added = Added { $product } to your cart.
bot-order-cart-total = Your cart total is { $total }.
bot-order-checkout = Proceeding to checkout...
bot-hr-welcome = HR Assistant here. How can I help?
bot-hr-request-leave = Request leave
bot-hr-check-balance = Check balance
bot-hr-view-policies = View policies
bot-hr-leave-type = What type of leave? (vacation/sick/personal)
bot-hr-start-date = Start date? (YYYY-MM-DD)
bot-hr-end-date = End date? (YYYY-MM-DD)
bot-hr-leave-submitted = Leave request submitted! Your manager will review it.
bot-hr-leave-approved = Your leave request has been approved.
bot-hr-leave-rejected = Your leave request has been rejected.
bot-hr-leave-pending = Your leave request is pending approval.
bot-hr-balance-title = Your leave balance:
bot-hr-vacation-days = Vacation: { $days } days
bot-hr-sick-days = Sick: { $days } days
bot-hr-personal-days = Personal: { $days } days
bot-hr-policy-found = Here's the policy information you requested:
bot-hr-policy-not-found = Policy not found. Please check the policy name.
bot-health-welcome = Welcome to our healthcare center. How can I help?
bot-health-book = Book appointment
bot-health-cancel = Cancel appointment
bot-health-view = View my appointments
bot-health-reschedule = Reschedule appointment
bot-health-type = What type of appointment? (general/specialist/lab)
bot-health-doctor = Which doctor would you prefer?
bot-health-date = What date works best for you?
bot-health-time = What time would you prefer?
bot-health-confirmed = Your appointment has been confirmed for { $datetime } with { $doctor }.
bot-health-cancelled = Your appointment has been cancelled.
bot-health-rescheduled = Your appointment has been rescheduled to { $datetime }.
bot-health-reminder = Reminder: You have an appointment on { $datetime }.
bot-health-no-appointments = You don't have any upcoming appointments.
bot-health-appointments-list = Your upcoming appointments:
bot-support-welcome = How can I help you today?
bot-support-describe = Please describe your issue:
bot-support-category = What category best describes your issue?
bot-support-priority = How urgent is this issue?
bot-support-ticket-created = Support ticket #{ $ticket } has been created.
bot-support-ticket-status = Ticket #{ $ticket } status: { $status }
bot-support-ticket-updated = Your ticket has been updated.
bot-support-ticket-resolved = Your ticket has been resolved. Please let us know if you need further assistance.
bot-support-transfer = Transferring you to a human agent...
bot-support-wait-time = Estimated wait time: { $minutes } minutes.
bot-support-agent-joined = Agent { $name } has joined the conversation.
bot-survey-intro = We'd love to hear your feedback!
bot-survey-question = { $question }
bot-survey-scale = On a scale of 1-10, how would you rate { $subject }?
bot-survey-open = Please share any additional comments:
bot-survey-thanks = Thank you for your feedback!
bot-survey-completed = Survey completed successfully.
bot-survey-skip = You can skip this question if you prefer.
bot-notification-new-message = You have a new message from { $sender }.
bot-notification-task-due = Task "{ $task }" is due { $when }.
bot-notification-reminder = Reminder: { $message }
bot-notification-update = Update: { $message }
bot-notification-alert = Alert: { $message }
bot-command-help = Available commands:
bot-command-unknown = Unknown command. Type 'help' for available commands.
bot-command-invalid = Invalid command syntax. Usage: { $usage }
bot-transfer-to-human = Transferring you to a human agent. Please wait...
bot-transfer-complete = You are now connected with { $agent }.
bot-transfer-unavailable = No agents are currently available. Please try again later.
bot-transfer-queue-position = You are number { $position } in the queue.
bot-auth-login-prompt = Please enter your credentials to continue.
bot-auth-login-success = You have been logged in successfully.
bot-auth-login-failed = Login failed. Please check your credentials.
bot-auth-logout-success = You have been logged out.
bot-auth-session-expired = Your session has expired. Please log in again.
bot-file-upload-prompt = Please upload your file.
bot-file-upload-success = File "{ $filename }" uploaded successfully.
bot-file-upload-failed = Failed to upload file. Please try again.
bot-file-download-ready = Your file is ready for download.
bot-file-processing = Processing your file...
bot-payment-amount = The total amount is { $amount }.
bot-payment-method = Please select a payment method.
bot-payment-processing = Processing your payment...
bot-payment-success = Payment successful! Transaction ID: { $transactionId }
bot-payment-failed = Payment failed. Please try again or use a different payment method.
bot-payment-refund = Your refund of { $amount } has been processed.
bot-subscription-active = Your subscription is active until { $endDate }.
bot-subscription-expired = Your subscription has expired.
bot-subscription-renew = Would you like to renew your subscription?
bot-subscription-upgraded = Your subscription has been upgraded to { $plan }.
bot-subscription-cancelled = Your subscription has been cancelled.
bot-feedback-positive = Thank you for your positive feedback!
bot-feedback-negative = We're sorry to hear that. How can we improve?
bot-feedback-rating = You rated this interaction { $rating } out of 5.

186
locales/en/channels.ftl Normal file
View file

@ -0,0 +1,186 @@
channel-web = Web Chat
channel-whatsapp = WhatsApp
channel-telegram = Telegram
channel-slack = Slack
channel-teams = Microsoft Teams
channel-email = Email
channel-sms = SMS
channel-instagram = Instagram
channel-messenger = Facebook Messenger
channel-discord = Discord
channel-voice = Voice
channel-api = API
channel-status-connected = Connected
channel-status-disconnected = Disconnected
channel-status-connecting = Connecting...
channel-status-error = Connection Error
channel-status-pending = Pending Setup
channel-status-active = Active
channel-status-inactive = Inactive
channel-status-suspended = Suspended
channel-setup-title = Channel Setup
channel-setup-description = Connect your bot to different communication channels
channel-setup-select = Select a channel to configure
channel-setup-configure = Configure Channel
channel-setup-test = Test Connection
channel-setup-save = Save Configuration
channel-setup-cancel = Cancel
channel-setup-reset = Reset to Defaults
channel-connect = Connect
channel-disconnect = Disconnect
channel-reconnect = Reconnect
channel-refresh = Refresh Status
channel-settings = Channel Settings
channel-delete = Remove Channel
channel-confirm-delete = Are you sure you want to remove this channel?
channel-deleted = Channel removed successfully
channel-saved = Channel configuration saved
channel-whatsapp-phone = Phone Number
channel-whatsapp-business-id = Business Account ID
channel-whatsapp-api-key = API Key
channel-whatsapp-webhook = Webhook URL
channel-whatsapp-verify-token = Verify Token
channel-whatsapp-template = Message Template
channel-whatsapp-templates = Message Templates
channel-whatsapp-template-create = Create Template
channel-whatsapp-template-status = Template Status
channel-whatsapp-template-approved = Approved
channel-whatsapp-template-pending = Pending Approval
channel-whatsapp-template-rejected = Rejected
channel-whatsapp-24h-window = 24-hour messaging window
channel-whatsapp-session-active = Session active
channel-whatsapp-session-expired = Session expired
channel-telegram-bot-token = Bot Token
channel-telegram-bot-username = Bot Username
channel-telegram-webhook = Webhook URL
channel-telegram-commands = Bot Commands
channel-telegram-command-add = Add Command
channel-telegram-command-name = Command Name
channel-telegram-command-description = Description
channel-telegram-inline-mode = Inline Mode
channel-telegram-group-privacy = Group Privacy Mode
channel-slack-workspace = Workspace
channel-slack-bot-token = Bot Token
channel-slack-signing-secret = Signing Secret
channel-slack-app-id = App ID
channel-slack-channels = Channels
channel-slack-channel-select = Select Channels
channel-slack-events = Event Subscriptions
channel-slack-slash-commands = Slash Commands
channel-slack-interactivity = Interactivity
channel-teams-tenant-id = Tenant ID
channel-teams-app-id = Application ID
channel-teams-app-secret = Application Secret
channel-teams-bot-id = Bot ID
channel-teams-manifest = App Manifest
channel-teams-publish = Publish to Teams
channel-teams-install = Install in Teams
channel-email-smtp-host = SMTP Host
channel-email-smtp-port = SMTP Port
channel-email-smtp-user = SMTP Username
channel-email-smtp-password = SMTP Password
channel-email-smtp-encryption = Encryption
channel-email-imap-host = IMAP Host
channel-email-imap-port = IMAP Port
channel-email-from-name = From Name
channel-email-from-address = From Address
channel-email-reply-to = Reply-To Address
channel-email-signature = Email Signature
channel-instagram-account = Instagram Account
channel-instagram-page-id = Page ID
channel-instagram-access-token = Access Token
channel-instagram-business = Business Account
channel-instagram-comments = Comment Replies
channel-instagram-stories = Story Mentions
channel-instagram-dm = Direct Messages
channel-messenger-page-id = Page ID
channel-messenger-app-id = App ID
channel-messenger-app-secret = App Secret
channel-messenger-page-token = Page Access Token
channel-messenger-verify-token = Verify Token
channel-messenger-persistent-menu = Persistent Menu
channel-messenger-get-started = Get Started Button
channel-sms-provider = SMS Provider
channel-sms-twilio = Twilio
channel-sms-vonage = Vonage
channel-sms-account-sid = Account SID
channel-sms-auth-token = Auth Token
channel-sms-phone-number = Phone Number
channel-sms-sender-id = Sender ID
channel-voice-provider = Voice Provider
channel-voice-twilio = Twilio
channel-voice-vonage = Vonage
channel-voice-phone-number = Phone Number
channel-voice-greeting = Voice Greeting
channel-voice-fallback = Fallback Message
channel-voice-transcription = Enable Transcription
channel-voice-recording = Enable Recording
channel-voice-language = Voice Language
channel-voice-voice-type = Voice Type
channel-discord-bot-token = Bot Token
channel-discord-client-id = Client ID
channel-discord-client-secret = Client Secret
channel-discord-guild = Server (Guild)
channel-discord-channels = Channels
channel-discord-permissions = Bot Permissions
channel-discord-invite-url = Invite URL
channel-api-endpoint = API Endpoint
channel-api-key = API Key
channel-api-secret = API Secret
channel-api-webhook = Webhook URL
channel-api-rate-limit = Rate Limit
channel-api-documentation = API Documentation
channel-widget-title = Web Widget
channel-widget-position = Widget Position
channel-widget-position-left = Bottom Left
channel-widget-position-right = Bottom Right
channel-widget-color = Primary Color
channel-widget-header = Header Text
channel-widget-placeholder = Input Placeholder
channel-widget-welcome = Welcome Message
channel-widget-avatar = Bot Avatar
channel-widget-bubble = Chat Bubble
channel-widget-preview = Preview Widget
channel-widget-embed-code = Embed Code
channel-widget-copy-code = Copy Code
channel-widget-code-copied = Code copied to clipboard
channel-routing-title = Channel Routing
channel-routing-default = Default Channel
channel-routing-rules = Routing Rules
channel-routing-add-rule = Add Rule
channel-routing-condition = Condition
channel-routing-action = Action
channel-routing-priority = Priority
channel-routing-fallback = Fallback Channel
channel-analytics-messages = Messages
channel-analytics-conversations = Conversations
channel-analytics-users = Unique Users
channel-analytics-response-time = Avg Response Time
channel-analytics-satisfaction = Satisfaction Score
channel-analytics-by-channel = Analytics by Channel
channel-error-connection = Failed to connect to channel
channel-error-authentication = Authentication failed
channel-error-configuration = Invalid configuration
channel-error-rate-limit = Rate limit exceeded
channel-error-webhook = Webhook verification failed
channel-error-permission = Insufficient permissions
channel-error-not-found = Channel not found
channel-error-already-exists = Channel already configured

347
locales/en/common.ftl Normal file
View file

@ -0,0 +1,347 @@
# ============================================================================
# General Bots - Common Translations (English)
# ============================================================================
# This file contains shared strings used across all GB components.
# Keep message IDs lowercase with hyphens: category-subcategory-descriptor
# ============================================================================
# -----------------------------------------------------------------------------
# Brand
# -----------------------------------------------------------------------------
app-name = General Bots
app-tagline = Your AI-powered productivity workspace
# -----------------------------------------------------------------------------
# Common Actions
# -----------------------------------------------------------------------------
action-save = Save
action-cancel = Cancel
action-delete = Delete
action-edit = Edit
action-close = Close
action-confirm = Confirm
action-retry = Retry
action-back = Back
action-next = Next
action-submit = Submit
action-search = Search
action-refresh = Refresh
action-copy = Copy
action-paste = Paste
action-undo = Undo
action-redo = Redo
action-select = Select
action-select-all = Select All
action-clear = Clear
action-reset = Reset
action-apply = Apply
action-create = Create
action-update = Update
action-remove = Remove
action-add = Add
action-upload = Upload
action-download = Download
action-export = Export
action-import = Import
action-share = Share
action-send = Send
action-reply = Reply
action-forward = Forward
action-archive = Archive
action-restore = Restore
action-duplicate = Duplicate
action-rename = Rename
action-move = Move
action-filter = Filter
action-sort = Sort
action-view = View
action-hide = Hide
action-show = Show
action-expand = Expand
action-collapse = Collapse
action-enable = Enable
action-disable = Disable
action-connect = Connect
action-disconnect = Disconnect
action-sync = Sync
action-start = Start
action-stop = Stop
action-pause = Pause
action-resume = Resume
action-continue = Continue
action-finish = Finish
action-complete = Complete
action-approve = Approve
action-reject = Reject
action-accept = Accept
action-decline = Decline
action-login = Log In
action-logout = Log Out
action-signup = Sign Up
action-forgot-password = Forgot Password
# -----------------------------------------------------------------------------
# Common Labels
# -----------------------------------------------------------------------------
label-loading = Loading...
label-saving = Saving...
label-processing = Processing...
label-searching = Searching...
label-uploading = Uploading...
label-downloading = Downloading...
label-no-results = No results found
label-no-data = No data available
label-empty = Empty
label-none = None
label-all = All
label-selected = Selected
label-required = Required
label-optional = Optional
label-default = Default
label-custom = Custom
label-new = New
label-draft = Draft
label-pending = Pending
label-active = Active
label-inactive = Inactive
label-enabled = Enabled
label-disabled = Disabled
label-public = Public
label-private = Private
label-shared = Shared
label-yes = Yes
label-no = No
label-on = On
label-off = Off
label-true = True
label-false = False
label-unknown = Unknown
label-other = Other
label-more = More
label-less = Less
label-details = Details
label-summary = Summary
label-description = Description
label-name = Name
label-title = Title
label-type = Type
label-status = Status
label-priority = Priority
label-date = Date
label-time = Time
label-size = Size
label-count = Count
label-total = Total
label-average = Average
label-minimum = Minimum
label-maximum = Maximum
label-version = Version
label-id = ID
label-created = Created
label-updated = Updated
label-modified = Modified
label-deleted = Deleted
label-by = By
label-from = From
label-to = To
label-at = At
label-in = In
label-of = Of
# -----------------------------------------------------------------------------
# Status Messages
# -----------------------------------------------------------------------------
status-success = Success
status-error = Error
status-warning = Warning
status-info = Information
status-loading = Loading
status-complete = Complete
status-incomplete = Incomplete
status-failed = Failed
status-cancelled = Cancelled
status-pending = Pending
status-in-progress = In Progress
status-done = Done
status-ready = Ready
status-not-ready = Not Ready
status-connected = Connected
status-disconnected = Disconnected
status-online = Online
status-offline = Offline
status-available = Available
status-unavailable = Unavailable
status-busy = Busy
status-away = Away
# -----------------------------------------------------------------------------
# Confirmation Dialogs
# -----------------------------------------------------------------------------
confirm-delete = Are you sure you want to delete this?
confirm-delete-item = Are you sure you want to delete "{ $name }"?
confirm-delete-items = Are you sure you want to delete { $count ->
[one] this item
*[other] these { $count } items
}?
confirm-discard-changes = You have unsaved changes. Are you sure you want to discard them?
confirm-logout = Are you sure you want to log out?
confirm-cancel = Are you sure you want to cancel?
# -----------------------------------------------------------------------------
# Time and Dates
# -----------------------------------------------------------------------------
time-now = Just now
time-seconds-ago = { $count ->
[one] { $count } second ago
*[other] { $count } seconds ago
}
time-minutes-ago = { $count ->
[one] { $count } minute ago
*[other] { $count } minutes ago
}
time-hours-ago = { $count ->
[one] { $count } hour ago
*[other] { $count } hours ago
}
time-days-ago = { $count ->
[one] { $count } day ago
*[other] { $count } days ago
}
time-weeks-ago = { $count ->
[one] { $count } week ago
*[other] { $count } weeks ago
}
time-months-ago = { $count ->
[one] { $count } month ago
*[other] { $count } months ago
}
time-years-ago = { $count ->
[one] { $count } year ago
*[other] { $count } years ago
}
time-in-seconds = { $count ->
[one] in { $count } second
*[other] in { $count } seconds
}
time-in-minutes = { $count ->
[one] in { $count } minute
*[other] in { $count } minutes
}
time-in-hours = { $count ->
[one] in { $count } hour
*[other] in { $count } hours
}
time-in-days = { $count ->
[one] in { $count } day
*[other] in { $count } days
}
time-today = Today
time-yesterday = Yesterday
time-tomorrow = Tomorrow
time-this-week = This week
time-last-week = Last week
time-next-week = Next week
time-this-month = This month
time-last-month = Last month
time-next-month = Next month
time-this-year = This year
time-last-year = Last year
time-next-year = Next year
# Days of the week
day-sunday = Sunday
day-monday = Monday
day-tuesday = Tuesday
day-wednesday = Wednesday
day-thursday = Thursday
day-friday = Friday
day-saturday = Saturday
day-sun = Sun
day-mon = Mon
day-tue = Tue
day-wed = Wed
day-thu = Thu
day-fri = Fri
day-sat = Sat
# Months
month-january = January
month-february = February
month-march = March
month-april = April
month-may = May
month-june = June
month-july = July
month-august = August
month-september = September
month-october = October
month-november = November
month-december = December
month-jan = Jan
month-feb = Feb
month-mar = Mar
month-apr = Apr
month-may-short = May
month-jun = Jun
month-jul = Jul
month-aug = Aug
month-sep = Sep
month-oct = Oct
month-nov = Nov
month-dec = Dec
# -----------------------------------------------------------------------------
# File Sizes
# -----------------------------------------------------------------------------
size-bytes = { $value } B
size-kilobytes = { $value } KB
size-megabytes = { $value } MB
size-gigabytes = { $value } GB
size-terabytes = { $value } TB
# -----------------------------------------------------------------------------
# Pagination
# -----------------------------------------------------------------------------
pagination-page = Page { $current } of { $total }
pagination-showing = Showing { $start } to { $end } of { $total }
pagination-items-per-page = Items per page
pagination-first = First
pagination-previous = Previous
pagination-next = Next
pagination-last = Last
pagination-go-to-page = Go to page
# -----------------------------------------------------------------------------
# Form Validation
# -----------------------------------------------------------------------------
validation-required = This field is required
validation-required-field = { $field } is required
validation-email-invalid = Please enter a valid email address
validation-url-invalid = Please enter a valid URL
validation-number-invalid = Please enter a valid number
validation-date-invalid = Please enter a valid date
validation-min-length = Must be at least { $min } characters
validation-max-length = Must be no more than { $max } characters
validation-min-value = Must be at least { $min }
validation-max-value = Must be no more than { $max }
validation-pattern-mismatch = Invalid format
validation-passwords-mismatch = Passwords do not match
validation-file-too-large = File is too large. Maximum size is { $max }
validation-file-type-invalid = Invalid file type. Allowed types: { $types }
# -----------------------------------------------------------------------------
# Accessibility
# -----------------------------------------------------------------------------
a11y-skip-to-content = Skip to main content
a11y-loading = Loading, please wait
a11y-menu-open = Open menu
a11y-menu-close = Close menu
a11y-expand = Expand
a11y-collapse = Collapse
a11y-selected = Selected
a11y-not-selected = Not selected
a11y-required = Required field
a11y-error = Error
a11y-success = Success
a11y-warning = Warning
a11y-info = Information

324
locales/en/contacts.ftl Normal file
View file

@ -0,0 +1,324 @@
# =============================================================================
# General Bots - Contacts Translations (English)
# =============================================================================
# Contact management interface translations
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation & Headers
# -----------------------------------------------------------------------------
contacts-title = Contacts
contacts-subtitle = Manage your contacts and relationships
contacts-nav-all = All Contacts
contacts-nav-favorites = Favorites
contacts-nav-recent = Recently Added
contacts-nav-groups = Groups
contacts-nav-tags = Tags
# -----------------------------------------------------------------------------
# Views & Filters
# -----------------------------------------------------------------------------
contacts-view-list = List View
contacts-view-grid = Grid View
contacts-filter-all = All
contacts-filter-active = Active
contacts-filter-inactive = Inactive
contacts-filter-leads = Leads
contacts-filter-customers = Customers
contacts-filter-prospects = Prospects
contacts-filter-archived = Archived
contacts-search-placeholder = Search contacts...
contacts-sort-name = Sort by Name
contacts-sort-company = Sort by Company
contacts-sort-recent = Sort by Recent
contacts-sort-created = Sort by Created
# -----------------------------------------------------------------------------
# Contact Fields
# -----------------------------------------------------------------------------
contacts-field-first-name = First Name
contacts-field-last-name = Last Name
contacts-field-email = Email
contacts-field-phone = Phone
contacts-field-mobile = Mobile
contacts-field-company = Company
contacts-field-job-title = Job Title
contacts-field-department = Department
contacts-field-website = Website
contacts-field-linkedin = LinkedIn
contacts-field-twitter = Twitter
contacts-field-address = Address
contacts-field-city = City
contacts-field-state = State/Province
contacts-field-postal-code = Postal Code
contacts-field-country = Country
contacts-field-notes = Notes
contacts-field-tags = Tags
contacts-field-source = Source
contacts-field-status = Status
contacts-field-last-contacted = Last Contacted
contacts-field-created-at = Created
contacts-field-updated-at = Updated
# -----------------------------------------------------------------------------
# Contact Status
# -----------------------------------------------------------------------------
contacts-status-active = Active
contacts-status-inactive = Inactive
contacts-status-lead = Lead
contacts-status-customer = Customer
contacts-status-prospect = Prospect
contacts-status-archived = Archived
# -----------------------------------------------------------------------------
# Contact Source
# -----------------------------------------------------------------------------
contacts-source-manual = Manual Entry
contacts-source-import = Import
contacts-source-webform = Web Form
contacts-source-api = API
contacts-source-email = Email
contacts-source-meeting = Meeting
contacts-source-referral = Referral
contacts-source-social = Social Media
# -----------------------------------------------------------------------------
# Actions
# -----------------------------------------------------------------------------
contacts-action-add = Add Contact
contacts-action-edit = Edit Contact
contacts-action-delete = Delete Contact
contacts-action-archive = Archive Contact
contacts-action-restore = Restore Contact
contacts-action-favorite = Add to Favorites
contacts-action-unfavorite = Remove from Favorites
contacts-action-export = Export Contacts
contacts-action-import = Import Contacts
contacts-action-merge = Merge Contacts
contacts-action-send-email = Send Email
contacts-action-schedule-meeting = Schedule Meeting
contacts-action-create-task = Create Task
contacts-action-add-note = Add Note
contacts-action-add-tag = Add Tag
contacts-action-remove-tag = Remove Tag
# -----------------------------------------------------------------------------
# Bulk Actions
# -----------------------------------------------------------------------------
contacts-bulk-selected = { $count } contacts selected
contacts-bulk-delete = Delete Selected
contacts-bulk-archive = Archive Selected
contacts-bulk-add-tag = Add Tag to Selected
contacts-bulk-remove-tag = Remove Tag from Selected
contacts-bulk-add-to-group = Add to Group
contacts-bulk-remove-from-group = Remove from Group
contacts-bulk-export = Export Selected
contacts-bulk-change-status = Change Status
# -----------------------------------------------------------------------------
# Groups
# -----------------------------------------------------------------------------
contacts-groups-title = Contact Groups
contacts-groups-create = Create Group
contacts-groups-edit = Edit Group
contacts-groups-delete = Delete Group
contacts-groups-name = Group Name
contacts-groups-description = Description
contacts-groups-color = Color
contacts-groups-members = { $count } members
contacts-groups-add-members = Add Members
contacts-groups-remove-members = Remove Members
# -----------------------------------------------------------------------------
# Import/Export
# -----------------------------------------------------------------------------
contacts-import-title = Import Contacts
contacts-import-description = Upload a file to import contacts
contacts-import-format-csv = CSV File
contacts-import-format-vcard = vCard File
contacts-import-format-json = JSON File
contacts-import-drop-zone = Drag and drop your file here, or click to browse
contacts-import-mapping = Field Mapping
contacts-import-preview = Preview
contacts-import-skip-duplicates = Skip duplicate entries
contacts-import-update-existing = Update existing contacts
contacts-import-success = Successfully imported { $count } contacts
contacts-import-errors = { $count } errors during import
contacts-export-title = Export Contacts
contacts-export-description = Download your contacts
contacts-export-format = Export Format
contacts-export-all = Export All Contacts
contacts-export-selected = Export Selected
contacts-export-group = Export Group
contacts-export-include-custom = Include Custom Fields
contacts-export-success = Successfully exported { $count } contacts
# -----------------------------------------------------------------------------
# Detail Panel
# -----------------------------------------------------------------------------
contacts-detail-title = Contact Details
contacts-detail-info = Information
contacts-detail-activity = Activity
contacts-detail-notes = Notes
contacts-detail-tasks = Tasks
contacts-detail-events = Events
contacts-detail-files = Files
contacts-detail-history = History
# -----------------------------------------------------------------------------
# Activity Types
# -----------------------------------------------------------------------------
contacts-activity-email = Email
contacts-activity-call = Phone Call
contacts-activity-meeting = Meeting
contacts-activity-task = Task
contacts-activity-note = Note
contacts-activity-status-change = Status Changed
contacts-activity-created = Contact Created
contacts-activity-updated = Contact Updated
contacts-activity-imported = Contact Imported
# -----------------------------------------------------------------------------
# Quick Actions
# -----------------------------------------------------------------------------
contacts-quick-email = Email
contacts-quick-call = Call
contacts-quick-meeting = Meeting
contacts-quick-task = Task
# -----------------------------------------------------------------------------
# Calendar Integration
# -----------------------------------------------------------------------------
contacts-calendar-link = Link to Event
contacts-calendar-unlink = Unlink from Event
contacts-calendar-events = Related Events
contacts-calendar-upcoming = Upcoming Events
contacts-calendar-past = Past Events
contacts-calendar-role = Role
contacts-calendar-role-attendee = Attendee
contacts-calendar-role-organizer = Organizer
contacts-calendar-role-optional = Optional
contacts-calendar-role-speaker = Speaker
contacts-calendar-role-host = Host
contacts-calendar-response = Response Status
contacts-calendar-response-accepted = Accepted
contacts-calendar-response-declined = Declined
contacts-calendar-response-tentative = Tentative
contacts-calendar-response-pending = Pending
# -----------------------------------------------------------------------------
# Tasks Integration
# -----------------------------------------------------------------------------
contacts-tasks-assign = Assign to Task
contacts-tasks-unassign = Unassign from Task
contacts-tasks-related = Related Tasks
contacts-tasks-active = Active Tasks
contacts-tasks-completed = Completed Tasks
contacts-tasks-overdue = Overdue Tasks
contacts-tasks-role = Role
contacts-tasks-role-assignee = Assignee
contacts-tasks-role-reviewer = Reviewer
contacts-tasks-role-stakeholder = Stakeholder
contacts-tasks-role-collaborator = Collaborator
contacts-tasks-role-client = Client
contacts-tasks-role-approver = Approver
contacts-tasks-workload = Workload
contacts-tasks-workload-low = Low
contacts-tasks-workload-medium = Medium
contacts-tasks-workload-high = High
contacts-tasks-workload-overloaded = Overloaded
# -----------------------------------------------------------------------------
# External Sync
# -----------------------------------------------------------------------------
contacts-sync-title = Address Book Sync
contacts-sync-description = Sync with external address books
contacts-sync-google = Google Contacts
contacts-sync-microsoft = Microsoft People
contacts-sync-apple = Apple Contacts
contacts-sync-carddav = CardDAV Server
contacts-sync-connect = Connect Account
contacts-sync-disconnect = Disconnect
contacts-sync-connected = Connected
contacts-sync-last-sync = Last synced { $time }
contacts-sync-in-progress = Sync in progress...
contacts-sync-success = Sync completed successfully
contacts-sync-error = Sync failed
contacts-sync-direction = Sync Direction
contacts-sync-direction-two-way = Two-way Sync
contacts-sync-direction-import = Import Only
contacts-sync-direction-export = Export Only
contacts-sync-conflicts = { $count } conflicts detected
contacts-sync-resolve = Resolve Conflicts
contacts-sync-keep-local = Keep Local
contacts-sync-keep-remote = Keep Remote
contacts-sync-merge = Merge Both
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
contacts-empty-title = No contacts yet
contacts-empty-description = Add your first contact to get started
contacts-empty-action = Add Contact
contacts-empty-search = No contacts match your search
contacts-empty-filter = No contacts match the selected filter
contacts-empty-group = This group has no members
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
contacts-confirm-delete = Are you sure you want to delete this contact?
contacts-confirm-delete-bulk = Are you sure you want to delete { $count } contacts?
contacts-confirm-archive = Are you sure you want to archive this contact?
contacts-confirm-merge = Are you sure you want to merge these contacts?
contacts-confirm-disconnect = Are you sure you want to disconnect this account?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
contacts-success-created = Contact created successfully
contacts-success-updated = Contact updated successfully
contacts-success-deleted = Contact deleted successfully
contacts-success-archived = Contact archived successfully
contacts-success-restored = Contact restored successfully
contacts-success-merged = Contacts merged successfully
contacts-success-imported = Contacts imported successfully
contacts-success-exported = Contacts exported successfully
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
contacts-error-create = Failed to create contact
contacts-error-update = Failed to update contact
contacts-error-delete = Failed to delete contact
contacts-error-import = Failed to import contacts
contacts-error-export = Failed to export contacts
contacts-error-sync = Sync failed
contacts-error-duplicate = A contact with this email already exists
contacts-error-required = This field is required
contacts-error-invalid-email = Please enter a valid email address
contacts-error-invalid-phone = Please enter a valid phone number
# -----------------------------------------------------------------------------
# People Module
# -----------------------------------------------------------------------------
people-title = People
people-subtitle = Contacts, Groups & Directory
people-search = Search contacts...
people-add = Add Contact
people-tab-contacts = Contacts
people-tab-groups = Groups
people-tab-directory = Directory
people-tab-recent = Recent
people-loading = Loading contacts...
people-add-contact = Add Contact
people-first-name = First Name
people-last-name = Last Name
people-email = Email
people-phone = Phone
people-company = Company
people-job-title = Title
people-notes = Notes
people-empty-title = No contacts yet
people-empty-desc = Add your first contact to get started

165
locales/en/errors.ftl Normal file
View file

@ -0,0 +1,165 @@
# General Bots - Error Messages (English)
# This file contains all error message translations
# =============================================================================
# HTTP Errors
# =============================================================================
error-http-400 = Bad request. Please check your input.
error-http-401 = Authentication required. Please log in.
error-http-403 = You don't have permission to access this resource.
error-http-404 = { $entity } not found.
error-http-409 = Conflict: { $message }
error-http-429 = Too many requests. Please wait { $seconds } seconds.
error-http-500 = Internal server error. Please try again later.
error-http-502 = Bad gateway. The server received an invalid response.
error-http-503 = Service temporarily unavailable. Please try again later.
error-http-504 = Request timed out after { $milliseconds }ms.
# =============================================================================
# Validation Errors
# =============================================================================
error-validation-required = { $field } is required.
error-validation-email = Please enter a valid email address.
error-validation-url = Please enter a valid URL.
error-validation-phone = Please enter a valid phone number.
error-validation-min-length = { $field } must be at least { $min } characters.
error-validation-max-length = { $field } must be no more than { $max } characters.
error-validation-min-value = { $field } must be at least { $min }.
error-validation-max-value = { $field } must be no more than { $max }.
error-validation-pattern = { $field } format is invalid.
error-validation-unique = { $field } already exists.
error-validation-mismatch = { $field } does not match { $other }.
error-validation-date-format = Please enter a valid date in the format { $format }.
error-validation-date-past = { $field } must be in the past.
error-validation-date-future = { $field } must be in the future.
# =============================================================================
# Authentication Errors
# =============================================================================
error-auth-invalid-credentials = Invalid email or password.
error-auth-account-locked = Your account has been locked. Please contact support.
error-auth-account-disabled = Your account has been disabled.
error-auth-session-expired = Your session has expired. Please log in again.
error-auth-token-invalid = Invalid or expired token.
error-auth-token-missing = Authentication token is required.
error-auth-mfa-required = Multi-factor authentication is required.
error-auth-mfa-invalid = Invalid verification code.
error-auth-password-weak = Password is too weak. Please use a stronger password.
error-auth-password-expired = Your password has expired. Please reset it.
# =============================================================================
# Configuration Errors
# =============================================================================
error-config = Configuration error: { $message }
error-config-missing = Missing configuration: { $key }
error-config-invalid = Invalid configuration value for { $key }: { $reason }
error-config-file-not-found = Configuration file not found: { $path }
error-config-parse = Failed to parse configuration: { $message }
# =============================================================================
# Database Errors
# =============================================================================
error-database = Database error: { $message }
error-database-connection = Failed to connect to database.
error-database-timeout = Database operation timed out.
error-database-constraint = Database constraint violation: { $constraint }
error-database-duplicate = A record with this { $field } already exists.
error-database-migration = Database migration failed: { $message }
# =============================================================================
# File & Storage Errors
# =============================================================================
error-file-not-found = File not found: { $filename }
error-file-too-large = File is too large. Maximum size is { $maxSize }.
error-file-type-not-allowed = File type not allowed. Allowed types: { $allowedTypes }.
error-file-upload-failed = File upload failed: { $message }
error-file-read = Failed to read file: { $message }
error-file-write = Failed to write file: { $message }
error-storage-full = Storage quota exceeded.
error-storage-unavailable = Storage service is unavailable.
# =============================================================================
# Network & External Service Errors
# =============================================================================
error-network = Network error: { $message }
error-network-timeout = Connection timed out.
error-network-unreachable = Server is unreachable.
error-service-unavailable = Service unavailable: { $service }
error-external-api = External API error: { $message }
error-rate-limit = Rate limited. Retry after { $seconds }s.
# =============================================================================
# Bot & Dialog Errors
# =============================================================================
error-bot-not-found = Bot not found: { $botId }
error-bot-disabled = This bot is currently disabled.
error-bot-script-error = Script error at line { $line }: { $message }
error-bot-timeout = Bot response timed out.
error-bot-quota-exceeded = Bot usage quota exceeded.
error-dialog-not-found = Dialog not found: { $dialogId }
error-dialog-invalid = Invalid dialog configuration: { $message }
# =============================================================================
# LLM & AI Errors
# =============================================================================
error-llm-unavailable = AI service is currently unavailable.
error-llm-timeout = AI request timed out.
error-llm-rate-limit = AI rate limit exceeded. Please wait before trying again.
error-llm-content-filter = Content was filtered by safety guidelines.
error-llm-context-length = Input is too long. Please shorten your message.
error-llm-invalid-response = Received invalid response from AI service.
# =============================================================================
# Email Errors
# =============================================================================
error-email-send-failed = Failed to send email: { $message }
error-email-invalid-recipient = Invalid recipient email address: { $email }
error-email-attachment-failed = Failed to attach file: { $filename }
error-email-template-not-found = Email template not found: { $template }
# =============================================================================
# Calendar & Scheduling Errors
# =============================================================================
error-calendar-conflict = Time slot conflicts with existing event.
error-calendar-past-date = Cannot schedule events in the past.
error-calendar-invalid-recurrence = Invalid recurrence pattern.
error-calendar-event-not-found = Event not found: { $eventId }
# =============================================================================
# Task Errors
# =============================================================================
error-task-not-found = Task not found: { $taskId }
error-task-already-completed = Task has already been completed.
error-task-circular-dependency = Circular dependency detected in tasks.
error-task-invalid-status = Invalid task status transition.
# =============================================================================
# Permission Errors
# =============================================================================
error-permission-denied = You don't have permission to perform this action.
error-permission-resource = You don't have access to this { $resource }.
error-permission-action = You cannot { $action } this { $resource }.
error-permission-owner-only = Only the owner can perform this action.
# =============================================================================
# Generic Errors
# =============================================================================
error-internal = Internal error: { $message }
error-unexpected = An unexpected error occurred. Please try again.
error-not-implemented = This feature is not yet implemented.
error-maintenance = System is under maintenance. Please try again later.
error-unknown = An unknown error occurred.

View file

@ -0,0 +1,127 @@
notification-title-new-message = New Message
notification-title-task-due = Task Due
notification-title-task-assigned = Task Assigned
notification-title-task-completed = Task Completed
notification-title-meeting-reminder = Meeting Reminder
notification-title-meeting-started = Meeting Started
notification-title-file-shared = File Shared
notification-title-file-uploaded = File Uploaded
notification-title-comment-added = New Comment
notification-title-mention = You were mentioned
notification-title-system = System Notification
notification-title-security = Security Alert
notification-title-update = Update Available
notification-title-error = Error Occurred
notification-title-success = Success
notification-title-warning = Warning
notification-title-info = Information
notification-message-new = You have a new message from { $sender }
notification-message-unread = You have { $count ->
[one] { $count } unread message
*[other] { $count } unread messages
}
notification-task-due-soon = Task "{ $task }" is due in { $time }
notification-task-due-today = Task "{ $task }" is due today
notification-task-due-overdue = Task "{ $task }" is overdue by { $time }
notification-task-assigned-to-you = You have been assigned to task "{ $task }"
notification-task-assigned-by = { $assigner } assigned you to "{ $task }"
notification-task-completed-by = { $user } completed task "{ $task }"
notification-task-status-changed = Task "{ $task }" status changed to { $status }
notification-meeting-in-minutes = Meeting "{ $meeting }" starts in { $minutes } minutes
notification-meeting-starting-now = Meeting "{ $meeting }" is starting now
notification-meeting-cancelled = Meeting "{ $meeting }" has been cancelled
notification-meeting-rescheduled = Meeting "{ $meeting }" has been rescheduled to { $datetime }
notification-meeting-invite = { $inviter } invited you to "{ $meeting }"
notification-meeting-response = { $user } { $response } your meeting invite
notification-file-shared-with-you = { $sharer } shared "{ $filename }" with you
notification-file-uploaded-by = { $uploader } uploaded "{ $filename }"
notification-file-modified = "{ $filename }" was modified by { $user }
notification-file-deleted = "{ $filename }" was deleted by { $user }
notification-file-download-ready = Your file "{ $filename }" is ready for download
notification-file-upload-complete = Upload of "{ $filename }" completed successfully
notification-file-upload-failed = Upload of "{ $filename }" failed
notification-comment-on-task = { $user } commented on task "{ $task }"
notification-comment-on-file = { $user } commented on "{ $filename }"
notification-comment-reply = { $user } replied to your comment
notification-mention-in-comment = { $user } mentioned you in a comment
notification-mention-in-chat = { $user } mentioned you in { $channel }
notification-login-new-device = New login detected from { $device } in { $location }
notification-login-failed = Failed login attempt on your account
notification-password-changed = Your password was changed successfully
notification-password-expiring = Your password will expire in { $days } days
notification-session-expired = Your session has expired
notification-account-locked = Your account has been locked
notification-two-factor-enabled = Two-factor authentication has been enabled
notification-two-factor-disabled = Two-factor authentication has been disabled
notification-subscription-expiring = Your subscription expires in { $days } days
notification-subscription-expired = Your subscription has expired
notification-subscription-renewed = Your subscription has been renewed until { $date }
notification-payment-successful = Payment of { $amount } was successful
notification-payment-failed = Payment of { $amount } failed
notification-invoice-ready = Your invoice for { $period } is ready
notification-bot-response = { $bot } responded to your query
notification-bot-error = { $bot } encountered an error
notification-bot-offline = { $bot } is currently offline
notification-bot-online = { $bot } is now online
notification-bot-updated = { $bot } has been updated
notification-system-maintenance = System maintenance scheduled for { $datetime }
notification-system-update = System update available: { $version }
notification-system-restored = System has been restored
notification-system-degraded = System is experiencing degraded performance
notification-action-view = View
notification-action-dismiss = Dismiss
notification-action-mark-read = Mark as read
notification-action-mark-all-read = Mark all as read
notification-action-settings = Notification settings
notification-action-reply = Reply
notification-action-open = Open
notification-action-join = Join
notification-action-accept = Accept
notification-action-decline = Decline
notification-time-just-now = Just now
notification-time-minutes = { $count ->
[one] { $count } minute ago
*[other] { $count } minutes ago
}
notification-time-hours = { $count ->
[one] { $count } hour ago
*[other] { $count } hours ago
}
notification-time-days = { $count ->
[one] { $count } day ago
*[other] { $count } days ago
}
notification-time-weeks = { $count ->
[one] { $count } week ago
*[other] { $count } weeks ago
}
notification-preference-all = All notifications
notification-preference-important = Important only
notification-preference-none = None
notification-preference-email = Email notifications
notification-preference-push = Push notifications
notification-preference-in-app = In-app notifications
notification-preference-sound = Sound enabled
notification-preference-vibration = Vibration enabled
notification-empty = No notifications
notification-empty-description = You're all caught up!
notification-load-more = Load more
notification-clear-all = Clear all notifications
notification-filter-all = All
notification-filter-unread = Unread
notification-filter-mentions = Mentions
notification-filter-tasks = Tasks
notification-filter-messages = Messages
notification-filter-system = System

1638
locales/en/ui.ftl Normal file

File diff suppressed because it is too large Load diff

142
locales/en/video.ftl Normal file
View file

@ -0,0 +1,142 @@
# =============================================================================
# General Bots - English Video Editor Translations
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation
# -----------------------------------------------------------------------------
nav-video = Video
# -----------------------------------------------------------------------------
# Video Editor - Main
# -----------------------------------------------------------------------------
video-title = Video Editor
video-new-project = New Project
video-project-info = Project Info
video-duration = Duration
video-clips = Clips
video-layers = Layers
video-resolution = Resolution
# -----------------------------------------------------------------------------
# Video Editor - Add Elements
# -----------------------------------------------------------------------------
video-add-elements = Add Elements
video-add-clip = Video Clip
video-add-text = Text
video-add-image = Image
video-add-shape = Shape
video-add-audio = Audio
video-add-narration = Narration
# -----------------------------------------------------------------------------
# Video Editor - Properties
# -----------------------------------------------------------------------------
video-properties = Properties
video-name = Name
video-volume = Volume
video-opacity = Opacity
video-position-x = Position X
video-position-y = Position Y
video-rotation = Rotation
video-transition-in = Transition In
video-transition-out = Transition Out
# -----------------------------------------------------------------------------
# Video Editor - Timeline
# -----------------------------------------------------------------------------
video-video-track = Video
video-text-track = Text & Overlays
video-audio-track = Audio
# -----------------------------------------------------------------------------
# Video Editor - Preview
# -----------------------------------------------------------------------------
video-preview = Preview
video-add-content = Add clips or elements to start editing
# -----------------------------------------------------------------------------
# Video Editor - Chat
# -----------------------------------------------------------------------------
video-ai-assistant = AI Assistant
video-playhead-at = Playhead:
video-selected = Selected:
video-chat-placeholder = Describe what you want to change...
video-chat-welcome = Hi! I'm your video editing assistant. You can tell me what to change, like "add a title here" or "make it bigger". I'll understand your current selection and playhead position.
# -----------------------------------------------------------------------------
# Video Editor - Export
# -----------------------------------------------------------------------------
video-export = Export
video-export-video = Export Video
video-format = Format
video-quality = Quality
video-start-export = Start Export
video-exporting = Exporting...
video-export-complete = Export Complete
video-export-failed = Export Failed
# -----------------------------------------------------------------------------
# Video Editor - Projects
# -----------------------------------------------------------------------------
video-recent-projects = Recent Projects
video-no-projects = No projects yet
video-create-first = Create your first video project
video-project-name = Project Name
video-aspect-ratio = Aspect Ratio
video-frame-rate = Frame Rate
video-create = Create
# -----------------------------------------------------------------------------
# Video Editor - Text Layer
# -----------------------------------------------------------------------------
video-text-content = Text Content
video-font-family = Font
video-font-size = Size
video-text-color = Color
video-duration-sec = Duration (sec)
video-add = Add
# -----------------------------------------------------------------------------
# Video Editor - Actions
# -----------------------------------------------------------------------------
video-undo = Undo
video-redo = Redo
video-cut = Cut
video-split = Split
video-delete = Delete
video-save = Save
# -----------------------------------------------------------------------------
# Video Editor - Status
# -----------------------------------------------------------------------------
video-status-draft = Draft
video-status-editing = Editing
video-status-exporting = Exporting
video-status-published = Published
video-status-archived = Archived
# -----------------------------------------------------------------------------
# Video Editor - Notifications
# -----------------------------------------------------------------------------
video-project-created = Project created
video-project-saved = Project saved
video-clip-added = Clip added
video-layer-added = Layer added
video-text-added = Text layer added
video-shape-added = Shape added
video-audio-added = Audio track added
video-item-deleted = Item deleted
video-export-started = Export started
video-export-completed = Export completed successfully
video-error-create-project = Failed to create project
video-error-load-project = Failed to load project
video-error-add-clip = Failed to add clip
video-error-add-layer = Failed to add layer
video-error-delete = Failed to delete item
video-error-export = Failed to start export
video-create-project-first = Please create a project first
video-select-clip-to-split = Select a clip to split
video-playhead-within-clip = Playhead must be within the selected clip
video-tts-coming-soon = TTS generation coming soon
video-split-coming-soon = Split feature coming soon

313
locales/en/webinar.ftl Normal file
View file

@ -0,0 +1,313 @@
# =============================================================================
# General Bots - Webinar Translations (English)
# =============================================================================
# Webinar, recording, and transcription interface translations
# =============================================================================
# -----------------------------------------------------------------------------
# Webinar Navigation & Headers
# -----------------------------------------------------------------------------
webinar-title = Webinars
webinar-subtitle = Host and manage webinars
webinar-nav-upcoming = Upcoming
webinar-nav-live = Live Now
webinar-nav-past = Past Webinars
webinar-nav-recordings = Recordings
webinar-nav-analytics = Analytics
# -----------------------------------------------------------------------------
# Webinar Status
# -----------------------------------------------------------------------------
webinar-status-draft = Draft
webinar-status-scheduled = Scheduled
webinar-status-live = Live
webinar-status-paused = Paused
webinar-status-ended = Ended
webinar-status-cancelled = Cancelled
# -----------------------------------------------------------------------------
# Webinar Fields
# -----------------------------------------------------------------------------
webinar-field-title = Title
webinar-field-description = Description
webinar-field-scheduled-start = Start Date & Time
webinar-field-scheduled-end = End Date & Time
webinar-field-duration = Duration
webinar-field-timezone = Timezone
webinar-field-host = Host
webinar-field-panelists = Panelists
webinar-field-max-attendees = Maximum Attendees
webinar-field-registration-url = Registration URL
# -----------------------------------------------------------------------------
# Webinar Actions
# -----------------------------------------------------------------------------
webinar-action-create = Create Webinar
webinar-action-edit = Edit Webinar
webinar-action-delete = Delete Webinar
webinar-action-cancel = Cancel Webinar
webinar-action-start = Start Webinar
webinar-action-end = End Webinar
webinar-action-pause = Pause Webinar
webinar-action-resume = Resume Webinar
webinar-action-join = Join Webinar
webinar-action-leave = Leave Webinar
webinar-action-share = Share Link
webinar-action-copy-link = Copy Link
webinar-action-invite = Invite Panelists
# -----------------------------------------------------------------------------
# Participant Roles
# -----------------------------------------------------------------------------
webinar-role-host = Host
webinar-role-cohost = Co-Host
webinar-role-presenter = Presenter
webinar-role-panelist = Panelist
webinar-role-attendee = Attendee
# -----------------------------------------------------------------------------
# Participant Actions
# -----------------------------------------------------------------------------
webinar-participant-mute = Mute
webinar-participant-unmute = Unmute
webinar-participant-video-on = Turn On Video
webinar-participant-video-off = Turn Off Video
webinar-participant-promote = Promote to Panelist
webinar-participant-demote = Demote to Attendee
webinar-participant-remove = Remove from Webinar
webinar-participant-allow-speak = Allow to Speak
webinar-participant-spotlight = Spotlight
# -----------------------------------------------------------------------------
# Hand Raising
# -----------------------------------------------------------------------------
webinar-hand-raise = Raise Hand
webinar-hand-lower = Lower Hand
webinar-hand-raised-count = { $count } hands raised
webinar-hand-allow = Allow to Speak
webinar-hand-dismiss = Dismiss
# -----------------------------------------------------------------------------
# Q&A Panel
# -----------------------------------------------------------------------------
webinar-qa-title = Q&A
webinar-qa-submit = Submit Question
webinar-qa-placeholder = Type your question...
webinar-qa-anonymous = Ask Anonymously
webinar-qa-pending = Pending Questions
webinar-qa-answered = Answered Questions
webinar-qa-dismissed = Dismissed
webinar-qa-upvote = Upvote
webinar-qa-upvotes = { $count } upvotes
webinar-qa-answer = Answer
webinar-qa-answer-live = Answer Live
webinar-qa-dismiss = Dismiss
webinar-qa-pin = Pin Question
webinar-qa-unpin = Unpin
webinar-qa-highlight = Highlight
webinar-qa-no-questions = No questions yet
# -----------------------------------------------------------------------------
# Polls
# -----------------------------------------------------------------------------
webinar-poll-title = Polls
webinar-poll-create = Create Poll
webinar-poll-launch = Launch Poll
webinar-poll-close = Close Poll
webinar-poll-results = Show Results
webinar-poll-hide-results = Hide Results
webinar-poll-question = Question
webinar-poll-options = Options
webinar-poll-add-option = Add Option
webinar-poll-single-choice = Single Choice
webinar-poll-multiple-choice = Multiple Choice
webinar-poll-votes = { $count } votes
webinar-poll-vote = Vote
webinar-poll-voted = You voted
# -----------------------------------------------------------------------------
# Registration
# -----------------------------------------------------------------------------
webinar-registration-title = Registration
webinar-registration-required = Registration Required
webinar-registration-open = Open Registration
webinar-registration-closed = Registration Closed
webinar-registration-register = Register
webinar-registration-registered = You're Registered
webinar-registration-cancel = Cancel Registration
webinar-registration-count = { $count } registered
webinar-registration-fields = Registration Fields
webinar-registration-name = Full Name
webinar-registration-email = Email Address
webinar-registration-confirmation = Registration Confirmed
webinar-registration-pending = Pending Confirmation
webinar-registration-waitlist = Waitlist
# -----------------------------------------------------------------------------
# Webinar Settings
# -----------------------------------------------------------------------------
webinar-settings-title = Webinar Settings
webinar-settings-general = General
webinar-settings-permissions = Permissions
webinar-settings-registration = Registration
webinar-settings-recording = Recording
webinar-settings-allow-chat = Allow Chat
webinar-settings-allow-qa = Allow Q&A
webinar-settings-allow-hand-raise = Allow Hand Raising
webinar-settings-allow-reactions = Allow Reactions
webinar-settings-moderated-qa = Moderated Q&A
webinar-settings-anonymous-qa = Allow Anonymous Questions
webinar-settings-waiting-room = Enable Waiting Room
webinar-settings-practice-session = Practice Session
webinar-settings-auto-record = Auto-Record
# -----------------------------------------------------------------------------
# Recording
# -----------------------------------------------------------------------------
recording-title = Recordings
recording-start = Start Recording
recording-stop = Stop Recording
recording-pause = Pause Recording
recording-resume = Resume Recording
recording-status-recording = Recording
recording-status-processing = Processing
recording-status-ready = Ready
recording-status-failed = Failed
recording-status-deleted = Deleted
recording-status-expired = Expired
recording-duration = Duration
recording-size = File Size
recording-quality = Quality
recording-quality-standard = Standard (720p)
recording-quality-high = High (1080p)
recording-quality-ultra = Ultra (4K)
recording-quality-audio = Audio Only
recording-download = Download Recording
recording-share = Share Recording
recording-delete = Delete Recording
recording-view-count = { $count } views
recording-download-count = { $count } downloads
recording-expires = Expires { $date }
# -----------------------------------------------------------------------------
# Transcription
# -----------------------------------------------------------------------------
transcription-title = Transcription
transcription-start = Start Transcription
transcription-status-pending = Pending
transcription-status-in-progress = Transcribing...
transcription-status-completed = Completed
transcription-status-failed = Failed
transcription-status-partial = Partially Completed
transcription-language = Language
transcription-speaker-identification = Speaker Identification
transcription-speakers = { $count } speakers identified
transcription-words = { $count } words
transcription-confidence = { $percent }% confidence
transcription-download = Download Transcript
transcription-export = Export
transcription-export-txt = Plain Text (.txt)
transcription-export-vtt = WebVTT (.vtt)
transcription-export-srt = SubRip (.srt)
transcription-export-json = JSON (.json)
transcription-search = Search transcript...
transcription-jump-to = Jump to timestamp
transcription-edit = Edit Transcript
transcription-save = Save Changes
# -----------------------------------------------------------------------------
# Transcription Languages
# -----------------------------------------------------------------------------
transcription-lang-en-us = English (US)
transcription-lang-en-gb = English (UK)
transcription-lang-es-es = Spanish (Spain)
transcription-lang-es-mx = Spanish (Mexico)
transcription-lang-fr-fr = French
transcription-lang-de-de = German
transcription-lang-it-it = Italian
transcription-lang-pt-br = Portuguese (Brazil)
transcription-lang-pt-pt = Portuguese (Portugal)
transcription-lang-nl-nl = Dutch
transcription-lang-pl-pl = Polish
transcription-lang-ru-ru = Russian
transcription-lang-ja-jp = Japanese
transcription-lang-ko-kr = Korean
transcription-lang-zh-cn = Chinese (Simplified)
transcription-lang-zh-tw = Chinese (Traditional)
transcription-lang-ar-sa = Arabic
transcription-lang-hi-in = Hindi
transcription-lang-tr-tr = Turkish
transcription-lang-vi-vn = Vietnamese
# -----------------------------------------------------------------------------
# Webinar Analytics
# -----------------------------------------------------------------------------
webinar-analytics-title = Webinar Analytics
webinar-analytics-overview = Overview
webinar-analytics-registrations = Total Registrations
webinar-analytics-attendees = Total Attendees
webinar-analytics-peak-attendees = Peak Attendees
webinar-analytics-avg-watch-time = Average Watch Time
webinar-analytics-questions = Questions Asked
webinar-analytics-questions-answered = Questions Answered
webinar-analytics-reactions = Reactions
webinar-analytics-poll-participation = Poll Participation
webinar-analytics-engagement = Engagement Score
webinar-analytics-retention = Audience Retention
webinar-analytics-export = Export Report
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
webinar-empty-upcoming = No upcoming webinars
webinar-empty-past = No past webinars
webinar-empty-recordings = No recordings available
webinar-empty-schedule = Schedule your first webinar
webinar-empty-transcription = No transcription available
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
webinar-confirm-end = Are you sure you want to end this webinar?
webinar-confirm-cancel = Are you sure you want to cancel this webinar?
webinar-confirm-delete = Are you sure you want to delete this webinar?
webinar-confirm-delete-recording = Are you sure you want to delete this recording?
webinar-confirm-stop-recording = Are you sure you want to stop recording?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
webinar-success-created = Webinar created successfully
webinar-success-updated = Webinar updated successfully
webinar-success-started = Webinar started
webinar-success-ended = Webinar ended
webinar-success-cancelled = Webinar cancelled
webinar-success-recording-started = Recording started
webinar-success-recording-stopped = Recording stopped
webinar-success-transcription-started = Transcription started
webinar-success-transcription-completed = Transcription completed
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
webinar-error-create = Failed to create webinar
webinar-error-start = Failed to start webinar
webinar-error-join = Failed to join webinar
webinar-error-recording-start = Failed to start recording
webinar-error-recording-stop = Failed to stop recording
webinar-error-transcription = Transcription failed
webinar-error-max-participants = Maximum participants reached
webinar-error-not-authorized = You are not authorized to perform this action
webinar-error-webinar-ended = This webinar has ended
webinar-error-registration-closed = Registration is closed
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
webinar-notify-starting-soon = Webinar starting in { $minutes } minutes
webinar-notify-started = Webinar has started
webinar-notify-ended = Webinar has ended
webinar-notify-hand-raised = { $name } raised their hand
webinar-notify-question-submitted = New question submitted
webinar-notify-recording-ready = Recording is ready
webinar-notify-transcription-ready = Transcription is ready

365
locales/es/admin.ftl Normal file
View file

@ -0,0 +1,365 @@
# =============================================================================
# General Bots - Traducciones de Administración (Español)
# =============================================================================
# Traducciones de la interfaz administrativa para el Panel de Admin de GB
# =============================================================================
# -----------------------------------------------------------------------------
# Navegación y Panel de Administración
# -----------------------------------------------------------------------------
admin-title = Administración
admin-dashboard = Panel de Administración
admin-overview = Resumen
admin-welcome = Bienvenido al Panel de Administración
admin-nav-dashboard = Panel
admin-nav-users = Usuarios
admin-nav-bots = Bots
admin-nav-tenants = Inquilinos
admin-nav-settings = Configuración
admin-nav-logs = Registros
admin-nav-analytics = Analíticas
admin-nav-security = Seguridad
admin-nav-integrations = Integraciones
admin-nav-billing = Facturación
admin-nav-support = Soporte
admin-nav-groups = Grupos
admin-nav-dns = DNS
admin-nav-system = Sistema
# -----------------------------------------------------------------------------
# Acciones Rápidas de Admin
# -----------------------------------------------------------------------------
admin-quick-actions = Acciones Rápidas
admin-create-user = Crear Usuario
admin-create-group = Crear Grupo
admin-register-dns = Registrar DNS
admin-recent-activity = Actividad Reciente
admin-system-health = Salud del Sistema
# -----------------------------------------------------------------------------
# Gestión de Usuarios
# -----------------------------------------------------------------------------
admin-users-title = Gestión de Usuarios
admin-users-list = Lista de Usuarios
admin-users-add = Agregar Usuario
admin-users-edit = Editar Usuario
admin-users-delete = Eliminar Usuario
admin-users-search = Buscar usuarios...
admin-users-filter = Filtrar Usuarios
admin-users-export = Exportar Usuarios
admin-users-import = Importar Usuarios
admin-users-total = Total de Usuarios
admin-users-active = Usuarios Activos
admin-users-inactive = Usuarios Inactivos
admin-users-suspended = Usuarios Suspendidos
admin-users-pending = Verificación Pendiente
admin-users-last-login = Último Acceso
admin-users-created = Creado
admin-users-role = Rol
admin-users-status = Estado
admin-users-actions = Acciones
admin-users-no-users = No se encontraron usuarios
admin-users-confirm-delete = ¿Estás seguro de que deseas eliminar este usuario?
admin-users-deleted = Usuario eliminado exitosamente
admin-users-saved = Usuario guardado exitosamente
admin-users-invite = Invitar Usuario
admin-users-invite-sent = Invitación enviada exitosamente
admin-users-bulk-actions = Acciones Masivas
admin-users-select-all = Seleccionar Todo
admin-users-deselect-all = Deseleccionar Todo
# Detalles de Usuario
admin-user-details = Detalles del Usuario
admin-user-profile = Perfil
admin-user-email = Correo Electrónico
admin-user-name = Nombre
admin-user-phone = Teléfono
admin-user-avatar = Avatar
admin-user-timezone = Zona Horaria
admin-user-language = Idioma
admin-user-role-admin = Administrador
admin-user-role-manager = Gerente
admin-user-role-user = Usuario
admin-user-role-viewer = Visualizador
admin-user-status-active = Activo
admin-user-status-inactive = Inactivo
admin-user-status-suspended = Suspendido
admin-user-status-pending = Pendiente
admin-user-permissions = Permisos
admin-user-activity = Registro de Actividad
admin-user-sessions = Sesiones Activas
admin-user-terminate-session = Terminar Sesión
admin-user-terminate-all = Terminar Todas las Sesiones
admin-user-reset-password = Restablecer Contraseña
admin-user-force-logout = Forzar Cierre de Sesión
admin-user-enable-2fa = Habilitar 2FA
admin-user-disable-2fa = Deshabilitar 2FA
# -----------------------------------------------------------------------------
# Gestión de Grupos
# -----------------------------------------------------------------------------
admin-groups-title = Gestión de Grupos
admin-groups-subtitle = Administra grupos, miembros y permisos
admin-groups-list = Lista de Grupos
admin-groups-add = Agregar Grupo
admin-groups-create = Crear Grupo
admin-groups-edit = Editar Grupo
admin-groups-delete = Eliminar Grupo
admin-groups-search = Buscar grupos...
admin-groups-filter = Filtrar Grupos
admin-groups-total = Total de Grupos
admin-groups-active = Grupos Activos
admin-groups-no-groups = No se encontraron grupos
admin-groups-confirm-delete = ¿Estás seguro de que deseas eliminar este grupo?
admin-groups-deleted = Grupo eliminado exitosamente
admin-groups-saved = Grupo guardado exitosamente
admin-groups-created = Grupo creado exitosamente
admin-groups-loading = Cargando grupos...
# Detalles de Grupo
admin-group-details = Detalles del Grupo
admin-group-name = Nombre del Grupo
admin-group-description = Descripción
admin-group-visibility = Visibilidad
admin-group-visibility-public = Público
admin-group-visibility-private = Privado
admin-group-visibility-hidden = Oculto
admin-group-join-policy = Política de Unión
admin-group-join-invite = Solo por Invitación
admin-group-join-request = Solicitar Unirse
admin-group-join-open = Abierto
admin-group-members = Miembros
admin-group-member-count = { $count ->
[one] { $count } miembro
*[other] { $count } miembros
}
admin-group-add-member = Agregar Miembro
admin-group-remove-member = Eliminar Miembro
admin-group-permissions = Permisos
admin-group-settings = Configuración
admin-group-analytics = Analíticas
admin-group-overview = Resumen
# Modos de Vista de Grupos
admin-groups-view-grid = Vista de Cuadrícula
admin-groups-view-list = Vista de Lista
admin-groups-all-visibility = Toda Visibilidad
# -----------------------------------------------------------------------------
# Gestión de DNS
# -----------------------------------------------------------------------------
admin-dns-title = Gestión de DNS
admin-dns-subtitle = Registra y administra nombres de host DNS para tus bots
admin-dns-register = Registrar Nombre de Host
admin-dns-registered = Nombres de Host Registrados
admin-dns-search = Buscar nombres de host...
admin-dns-refresh = Actualizar
admin-dns-loading = Cargando registros DNS...
admin-dns-no-records = No se encontraron registros DNS
admin-dns-confirm-delete = ¿Estás seguro de que deseas eliminar este nombre de host?
admin-dns-deleted = Nombre de host eliminado exitosamente
admin-dns-saved = Registro DNS guardado exitosamente
admin-dns-created = Nombre de host registrado exitosamente
# Campos del Formulario DNS
admin-dns-hostname = Nombre de Host
admin-dns-hostname-placeholder = mibot.ejemplo.com
admin-dns-hostname-help = Ingresa el nombre de dominio completo que deseas registrar
admin-dns-record-type = Tipo de Registro
admin-dns-record-type-a = A (IPv4)
admin-dns-record-type-aaaa = AAAA (IPv6)
admin-dns-record-type-cname = CNAME
admin-dns-ttl = TTL (segundos)
admin-dns-ttl-5min = 5 minutos (300)
admin-dns-ttl-1hour = 1 hora (3600)
admin-dns-ttl-1day = 1 día (86400)
admin-dns-target = Destino/Dirección IP
admin-dns-target-placeholder-ipv4 = 192.168.1.1
admin-dns-target-placeholder-ipv6 = 2001:db8::1
admin-dns-target-placeholder-cname = destino.ejemplo.com
admin-dns-target-help-a = Ingresa la dirección IPv4 a la que apuntar
admin-dns-target-help-aaaa = Ingresa la dirección IPv6 a la que apuntar
admin-dns-target-help-cname = Ingresa el nombre de dominio destino
admin-dns-auto-ssl = Aprovisionar certificado SSL automáticamente
# Encabezados de Tabla DNS
admin-dns-col-hostname = Nombre de Host
admin-dns-col-type = Tipo
admin-dns-col-target = Destino
admin-dns-col-ttl = TTL
admin-dns-col-ssl = SSL
admin-dns-col-status = Estado
admin-dns-col-actions = Acciones
# Estado DNS
admin-dns-status-active = Activo
admin-dns-status-pending = Pendiente
admin-dns-status-error = Error
admin-dns-ssl-enabled = SSL Habilitado
admin-dns-ssl-disabled = Sin SSL
admin-dns-ssl-pending = SSL Pendiente
# Tarjetas de Ayuda DNS
admin-dns-help-title = Ayuda de Configuración DNS
admin-dns-help-a-record = Registro A
admin-dns-help-a-record-desc = Mapea un nombre de dominio a una dirección IPv4. Úsalo para apuntar tu nombre de host directamente a una IP de servidor.
admin-dns-help-aaaa-record = Registro AAAA
admin-dns-help-aaaa-record-desc = Mapea un nombre de dominio a una dirección IPv6. Similar al registro A pero para conectividad IPv6.
admin-dns-help-cname-record = Registro CNAME
admin-dns-help-cname-record-desc = Crea un alias de un dominio a otro. Útil para apuntar subdominios a tu dominio principal.
admin-dns-help-ssl = SSL/TLS
admin-dns-help-ssl-desc = Aprovisiona automáticamente certificados Let's Encrypt para conexiones HTTPS seguras.
# Modales de Editar/Eliminar DNS
admin-dns-edit-title = Editar Registro DNS
admin-dns-remove-title = Eliminar Nombre de Host
admin-dns-remove-warning = Esto eliminará el registro DNS y cualquier certificado SSL asociado. El nombre de host ya no resolverá.
# -----------------------------------------------------------------------------
# Gestión de Bots
# -----------------------------------------------------------------------------
admin-bots-title = Gestión de Bots
admin-bots-list = Lista de Bots
admin-bots-add = Agregar Bot
admin-bots-edit = Editar Bot
admin-bots-delete = Eliminar Bot
admin-bots-search = Buscar bots...
admin-bots-filter = Filtrar Bots
admin-bots-total = Total de Bots
admin-bots-active = Bots Activos
admin-bots-inactive = Bots Inactivos
admin-bots-draft = Bots en Borrador
admin-bots-published = Bots Publicados
admin-bots-no-bots = No se encontraron bots
admin-bots-confirm-delete = ¿Estás seguro de que deseas eliminar este bot?
admin-bots-deleted = Bot eliminado exitosamente
admin-bots-saved = Bot guardado exitosamente
admin-bots-duplicate = Duplicar Bot
admin-bots-export = Exportar Bot
admin-bots-import = Importar Bot
admin-bots-publish = Publicar
admin-bots-unpublish = Despublicar
admin-bots-test = Probar Bot
admin-bots-logs = Registros del Bot
admin-bots-analytics = Analíticas del Bot
admin-bots-conversations = Conversaciones
admin-bots-templates = Plantillas
admin-bots-dialogs = Diálogos
admin-bots-knowledge-base = Base de Conocimiento
# Detalles del Bot
admin-bot-details = Detalles del Bot
admin-bot-name = Nombre del Bot
admin-bot-description = Descripción
admin-bot-avatar = Avatar
admin-bot-status = Estado
admin-bot-status-active = Activo
admin-bot-status-inactive = Inactivo
admin-bot-status-draft = Borrador
admin-bot-status-published = Publicado
admin-bot-language = Idioma
admin-bot-timezone = Zona Horaria
admin-bot-welcome-message = Mensaje de Bienvenida
admin-bot-fallback-message = Mensaje de Respaldo
admin-bot-channels = Canales
admin-bot-integrations = Integraciones
admin-bot-settings = Configuración
admin-bot-permissions = Permisos
admin-bot-analytics = Analíticas
admin-bot-usage = Uso
admin-bot-conversations-count = { $count ->
[one] { $count } conversación
*[other] { $count } conversaciones
}
# -----------------------------------------------------------------------------
# Gestión de Inquilinos
# -----------------------------------------------------------------------------
admin-tenants-title = Gestión de Inquilinos
admin-tenants-list = Lista de Inquilinos
admin-tenants-add = Agregar Inquilino
admin-tenants-edit = Editar Inquilino
admin-tenants-delete = Eliminar Inquilino
admin-tenants-search = Buscar inquilinos...
admin-tenants-no-tenants = No se encontraron inquilinos
admin-tenants-confirm-delete = ¿Estás seguro de que deseas eliminar este inquilino?
admin-tenants-deleted = Inquilino eliminado exitosamente
admin-tenants-saved = Inquilino guardado exitosamente
# -----------------------------------------------------------------------------
# Configuración del Sistema
# -----------------------------------------------------------------------------
admin-settings-title = Configuración del Sistema
admin-settings-general = General
admin-settings-security = Seguridad
admin-settings-email = Correo Electrónico
admin-settings-storage = Almacenamiento
admin-settings-integrations = Integraciones
admin-settings-api = API
admin-settings-webhooks = Webhooks
admin-settings-branding = Marca
admin-settings-saved = Configuración guardada exitosamente
# -----------------------------------------------------------------------------
# Registros y Monitoreo
# -----------------------------------------------------------------------------
admin-logs-title = Registros del Sistema
admin-logs-filter = Filtrar Registros
admin-logs-level = Nivel
admin-logs-level-all = Todos
admin-logs-level-debug = Depuración
admin-logs-level-info = Información
admin-logs-level-warn = Advertencia
admin-logs-level-error = Error
admin-logs-search = Buscar registros...
admin-logs-refresh = Actualizar
admin-logs-export = Exportar Registros
admin-logs-clear = Limpiar Registros
admin-logs-no-logs = No se encontraron registros
admin-logs-timestamp = Marca de Tiempo
admin-logs-message = Mensaje
admin-logs-source = Fuente
# -----------------------------------------------------------------------------
# Seguridad
# -----------------------------------------------------------------------------
admin-security-title = Configuración de Seguridad
admin-security-2fa = Autenticación de Dos Factores
admin-security-2fa-required = Requerir 2FA para todos los usuarios
admin-security-password-policy = Política de Contraseñas
admin-security-password-min-length = Longitud Mínima
admin-security-password-require-uppercase = Requerir Mayúsculas
admin-security-password-require-lowercase = Requerir Minúsculas
admin-security-password-require-numbers = Requerir Números
admin-security-password-require-symbols = Requerir Símbolos
admin-security-session-timeout = Tiempo de Espera de Sesión
admin-security-ip-whitelist = Lista Blanca de IP
admin-security-audit-log = Registro de Auditoría
admin-security-api-keys = Claves de API
# -----------------------------------------------------------------------------
# Integraciones
# -----------------------------------------------------------------------------
admin-integrations-title = Integraciones
admin-integrations-available = Integraciones Disponibles
admin-integrations-connected = Integraciones Conectadas
admin-integrations-connect = Conectar
admin-integrations-disconnect = Desconectar
admin-integrations-configure = Configurar
admin-integrations-status-connected = Conectado
admin-integrations-status-disconnected = Desconectado
admin-integrations-status-error = Error
admin-integrations-no-integrations = No hay integraciones configuradas
# -----------------------------------------------------------------------------
# Facturación
# -----------------------------------------------------------------------------
admin-billing-title = Facturación
admin-billing-current-plan = Plan Actual
admin-billing-usage = Uso
admin-billing-invoices = Facturas
admin-billing-payment-methods = Métodos de Pago
admin-billing-upgrade = Mejorar Plan
admin-billing-downgrade = Reducir Plan
admin-billing-cancel = Cancelar Suscripción

148
locales/es/analytics.ftl Normal file
View file

@ -0,0 +1,148 @@
analytics-title = Analíticas
analytics-dashboard = Panel de Analíticas
analytics-overview = Resumen
analytics-reports = Informes
analytics-export = Exportar Datos
analytics-refresh = Actualizar Datos
analytics-last-updated = Última actualización: { $time }
analytics-period-today = Hoy
analytics-period-yesterday = Ayer
analytics-period-week = Esta Semana
analytics-period-last-week = Semana Pasada
analytics-period-month = Este Mes
analytics-period-last-month = Mes Pasado
analytics-period-quarter = Este Trimestre
analytics-period-year = Este Año
analytics-period-custom = Rango Personalizado
analytics-period-from = Desde
analytics-period-to = Hasta
analytics-period-apply = Aplicar
analytics-metric-total = Total
analytics-metric-average = Promedio
analytics-metric-min = Mínimo
analytics-metric-max = Máximo
analytics-metric-count = Cantidad
analytics-metric-sum = Suma
analytics-metric-percentage = Porcentaje
analytics-metric-growth = Crecimiento
analytics-metric-change = Cambio
analytics-metric-trend = Tendencia
analytics-users-title = Analíticas de Usuarios
analytics-users-total = Total de Usuarios
analytics-users-active = Usuarios Activos
analytics-users-new = Nuevos Usuarios
analytics-users-returning = Usuarios Recurrentes
analytics-users-churned = Usuarios Perdidos
analytics-users-growth = Crecimiento de Usuarios
analytics-users-retention = Retención de Usuarios
analytics-users-engagement = Compromiso de Usuarios
analytics-users-by-country = Usuarios por País
analytics-users-by-device = Usuarios por Dispositivo
analytics-users-by-browser = Usuarios por Navegador
analytics-users-by-os = Usuarios por Sistema Operativo
analytics-users-sessions = Sesiones
analytics-users-avg-session = Duración Promedio de Sesión
analytics-users-page-views = Vistas de Página
analytics-users-bounce-rate = Tasa de Rebote
analytics-bots-title = Analíticas de Bots
analytics-bots-total = Total de Bots
analytics-bots-active = Bots Activos
analytics-bots-conversations = Total de Conversaciones
analytics-bots-messages = Total de Mensajes
analytics-bots-avg-messages = Promedio de Mensajes por Conversación
analytics-bots-response-time = Tiempo de Respuesta Promedio
analytics-bots-resolution-rate = Tasa de Resolución
analytics-bots-satisfaction = Puntuación de Satisfacción
analytics-bots-handoff-rate = Tasa de Transferencia a Humanos
analytics-bots-fallback-rate = Tasa de Respaldo
analytics-bots-intent-accuracy = Precisión de Intención
analytics-bots-top-intents = Intenciones Principales
analytics-bots-top-topics = Temas Principales
analytics-bots-by-channel = Conversaciones por Canal
analytics-bots-by-hour = Conversaciones por Hora
analytics-bots-by-day = Conversaciones por Día
analytics-conversations-title = Analíticas de Conversaciones
analytics-conversations-total = Total de Conversaciones
analytics-conversations-completed = Completadas
analytics-conversations-abandoned = Abandonadas
analytics-conversations-transferred = Transferidas
analytics-conversations-avg-duration = Duración Promedio
analytics-conversations-avg-messages = Mensajes Promedio
analytics-conversations-first-response = Tiempo de Primera Respuesta
analytics-conversations-wait-time = Tiempo de Espera Promedio
analytics-conversations-peak-hours = Horas Pico
analytics-conversations-sentiment = Análisis de Sentimiento
analytics-conversations-sentiment-positive = Positivo
analytics-conversations-sentiment-neutral = Neutral
analytics-conversations-sentiment-negative = Negativo
analytics-conversations-languages = Por Idioma
analytics-conversations-sources = Por Fuente
analytics-performance-title = Analíticas de Rendimiento
analytics-performance-uptime = Tiempo de Actividad
analytics-performance-availability = Disponibilidad
analytics-performance-response-time = Tiempo de Respuesta
analytics-performance-latency = Latencia
analytics-performance-throughput = Rendimiento
analytics-performance-error-rate = Tasa de Errores
analytics-performance-cpu = Uso de CPU
analytics-performance-memory = Uso de Memoria
analytics-performance-disk = Uso de Disco
analytics-performance-network = E/S de Red
analytics-performance-requests = Solicitudes/seg
analytics-performance-concurrent = Usuarios Concurrentes
analytics-performance-queue-size = Tamaño de Cola
analytics-performance-cache-hit = Tasa de Aciertos de Caché
analytics-charts-title = Gráficos
analytics-charts-line = Gráfico de Líneas
analytics-charts-bar = Gráfico de Barras
analytics-charts-pie = Gráfico Circular
analytics-charts-area = Gráfico de Área
analytics-charts-scatter = Gráfico de Dispersión
analytics-charts-heatmap = Mapa de Calor
analytics-charts-funnel = Gráfico de Embudo
analytics-charts-table = Tabla
analytics-charts-no-data = No hay datos disponibles
analytics-charts-loading = Cargando datos...
analytics-filters-title = Filtros
analytics-filters-apply = Aplicar Filtros
analytics-filters-clear = Limpiar Filtros
analytics-filters-save = Guardar Filtro
analytics-filters-load = Cargar Filtro
analytics-filters-date-range = Rango de Fechas
analytics-filters-bot = Bot
analytics-filters-channel = Canal
analytics-filters-user = Usuario
analytics-filters-status = Estado
analytics-filters-sentiment = Sentimiento
analytics-export-csv = Exportar como CSV
analytics-export-excel = Exportar como Excel
analytics-export-pdf = Exportar como PDF
analytics-export-json = Exportar como JSON
analytics-export-in-progress = Exportación en progreso...
analytics-export-complete = Exportación completada
analytics-export-failed = La exportación falló
analytics-realtime = Tiempo Real
analytics-realtime-users = Usuarios en Tiempo Real
analytics-realtime-conversations = Conversaciones Activas
analytics-realtime-events = Eventos en Vivo
analytics-realtime-connected = Conectado
analytics-realtime-disconnected = Desconectado
analytics-comparison = Comparación
analytics-comparison-previous = Período Anterior
analytics-comparison-year-over-year = Año contra Año
analytics-comparison-month-over-month = Mes contra Mes
analytics-comparison-week-over-week = Semana contra Semana
analytics-comparison-increase = Aumento
analytics-comparison-decrease = Disminución
analytics-comparison-no-change = Sin Cambio

256
locales/es/auth.ftl Normal file
View file

@ -0,0 +1,256 @@
# =============================================================================
# General Bots - Authentication Translations (Spanish)
# =============================================================================
# Traducciones de autenticación, Passkey/WebAuthn y seguridad
# =============================================================================
# -----------------------------------------------------------------------------
# Authentication General
# -----------------------------------------------------------------------------
auth-title = Autenticación
auth-login = Iniciar Sesión
auth-logout = Cerrar Sesión
auth-signup = Registrarse
auth-welcome = Bienvenido
auth-welcome-back = ¡Bienvenido de nuevo, { $name }!
auth-session-expired = Tu sesión ha expirado
auth-session-timeout = La sesión expira en { $minutes } minutos
# -----------------------------------------------------------------------------
# Login Form
# -----------------------------------------------------------------------------
auth-login-title = Inicia sesión en tu cuenta
auth-login-subtitle = Introduce tus credenciales para continuar
auth-login-email = Correo Electrónico
auth-login-username = Nombre de Usuario
auth-login-password = Contraseña
auth-login-remember = Recordarme
auth-login-forgot = ¿Olvidaste tu contraseña?
auth-login-submit = Iniciar Sesión
auth-login-loading = Iniciando sesión...
auth-login-or = o continúa con
auth-login-no-account = ¿No tienes una cuenta?
auth-login-create-account = Crear una cuenta
# -----------------------------------------------------------------------------
# Passkey/WebAuthn
# -----------------------------------------------------------------------------
passkey-title = Llaves de Acceso
passkey-subtitle = Autenticación segura sin contraseña
passkey-description = Las llaves de acceso utilizan la biometría o PIN de tu dispositivo para un inicio de sesión seguro y resistente al phishing
passkey-what-is = ¿Qué es una llave de acceso?
passkey-benefits = Beneficios de las llaves de acceso
passkey-benefit-secure = Más seguro que las contraseñas
passkey-benefit-easy = Fácil de usar - sin contraseñas que recordar
passkey-benefit-fast = Inicio de sesión rápido con biometría
passkey-benefit-phishing = Resistente a ataques de phishing
# -----------------------------------------------------------------------------
# Passkey Registration
# -----------------------------------------------------------------------------
passkey-register-title = Configurar Llave de Acceso
passkey-register-subtitle = Crea una llave de acceso para un inicio de sesión más rápido y seguro
passkey-register-description = Tu dispositivo te pedirá verificar tu identidad usando huella dactilar, rostro o bloqueo de pantalla
passkey-register-button = Crear Llave de Acceso
passkey-register-name = Nombre de la Llave de Acceso
passkey-register-name-placeholder = ej: MacBook Pro, iPhone
passkey-register-name-hint = Dale un nombre a tu llave de acceso para identificarla después
passkey-register-loading = Configurando llave de acceso...
passkey-register-verifying = Verificando con tu dispositivo...
passkey-register-success = Llave de acceso creada con éxito
passkey-register-error = Error al crear llave de acceso
passkey-register-cancelled = Configuración de llave de acceso cancelada
passkey-register-not-supported = Tu navegador no soporta llaves de acceso
# -----------------------------------------------------------------------------
# Passkey Authentication
# -----------------------------------------------------------------------------
passkey-login-title = Iniciar Sesión con Llave de Acceso
passkey-login-subtitle = Usa tu llave de acceso para un inicio de sesión seguro sin contraseña
passkey-login-button = Iniciar Sesión con Llave de Acceso
passkey-login-loading = Autenticando...
passkey-login-verifying = Verificando llave de acceso...
passkey-login-success = Sesión iniciada con éxito
passkey-login-error = Error en la autenticación
passkey-login-cancelled = Autenticación cancelada
passkey-login-no-passkeys = No se encontraron llaves de acceso para esta cuenta
passkey-login-try-another = Probar otro método
# -----------------------------------------------------------------------------
# Passkey Management
# -----------------------------------------------------------------------------
passkey-manage-title = Gestionar Llaves de Acceso
passkey-manage-subtitle = Ver y gestionar tus llaves de acceso registradas
passkey-manage-count = { $count ->
[one] { $count } llave de acceso registrada
*[other] { $count } llaves de acceso registradas
}
passkey-manage-add = Añadir Nueva Llave de Acceso
passkey-manage-rename = Renombrar
passkey-manage-delete = Eliminar
passkey-manage-created = Creada el { $date }
passkey-manage-last-used = Último uso el { $date }
passkey-manage-never-used = Nunca usada
passkey-manage-this-device = Este dispositivo
passkey-manage-cross-platform = Multiplataforma
passkey-manage-platform = Autenticador de plataforma
passkey-manage-security-key = Llave de seguridad
passkey-manage-empty = No hay llaves de acceso registradas
passkey-manage-empty-description = Añade una llave de acceso para un inicio de sesión más rápido y seguro
# -----------------------------------------------------------------------------
# Passkey Deletion
# -----------------------------------------------------------------------------
passkey-delete-title = Eliminar Llave de Acceso
passkey-delete-confirm = ¿Estás seguro de que quieres eliminar esta llave de acceso?
passkey-delete-warning = No podrás usar esta llave de acceso para iniciar sesión
passkey-delete-last-warning = Esta es tu única llave de acceso. Necesitarás usar autenticación con contraseña después de eliminarla.
passkey-delete-success = Llave de acceso eliminada con éxito
passkey-delete-error = Error al eliminar llave de acceso
# -----------------------------------------------------------------------------
# Password Fallback
# -----------------------------------------------------------------------------
passkey-fallback-title = Usar Contraseña
passkey-fallback-description = Si no puedes usar tu llave de acceso, puedes iniciar sesión con tu contraseña
passkey-fallback-button = Usar Contraseña
passkey-fallback-or-passkey = O inicia sesión con llave de acceso
passkey-fallback-setup-prompt = Configura una llave de acceso para un inicio de sesión más rápido la próxima vez
passkey-fallback-setup-later = Quizás después
passkey-fallback-setup-now = Configurar ahora
passkey-fallback-locked = Cuenta temporalmente bloqueada
passkey-fallback-locked-description = Demasiados intentos fallidos. Inténtalo de nuevo en { $minutes } minutos.
passkey-fallback-attempts = { $remaining } intentos restantes
# -----------------------------------------------------------------------------
# Multi-Factor Authentication
# -----------------------------------------------------------------------------
mfa-title = Autenticación de Dos Factores
mfa-subtitle = Añade una capa extra de seguridad a tu cuenta
mfa-enabled = La autenticación de dos factores está activada
mfa-disabled = La autenticación de dos factores está desactivada
mfa-enable = Activar 2FA
mfa-disable = Desactivar 2FA
mfa-setup = Configurar 2FA
mfa-verify = Verificar Código
mfa-code = Código de Verificación
mfa-code-placeholder = Introduce el código de 6 dígitos
mfa-code-sent = Código enviado a { $destination }
mfa-code-expired = El código ha expirado
mfa-code-invalid = Código inválido
mfa-resend = Reenviar código
mfa-resend-in = Reenviar en { $seconds }s
mfa-methods = Métodos de Autenticación
mfa-method-app = Aplicación Autenticadora
mfa-method-sms = SMS
mfa-method-email = Correo Electrónico
mfa-method-passkey = Llave de Acceso
mfa-backup-codes = Códigos de Respaldo
mfa-backup-codes-description = Guarda estos códigos en un lugar seguro. Cada código solo puede usarse una vez.
mfa-backup-codes-remaining = { $count } códigos de respaldo restantes
mfa-backup-codes-generate = Generar Nuevos Códigos
mfa-backup-codes-download = Descargar Códigos
mfa-backup-codes-copy = Copiar Códigos
# -----------------------------------------------------------------------------
# Password Management
# -----------------------------------------------------------------------------
password-title = Contraseña
password-change = Cambiar Contraseña
password-current = Contraseña Actual
password-new = Nueva Contraseña
password-confirm = Confirmar Nueva Contraseña
password-requirements = Requisitos de la Contraseña
password-requirement-length = Al menos { $length } caracteres
password-requirement-uppercase = Al menos una letra mayúscula
password-requirement-lowercase = Al menos una letra minúscula
password-requirement-number = Al menos un número
password-requirement-special = Al menos un carácter especial
password-strength = Fortaleza de la Contraseña
password-strength-weak = Débil
password-strength-fair = Aceptable
password-strength-good = Buena
password-strength-strong = Fuerte
password-match = Las contraseñas coinciden
password-mismatch = Las contraseñas no coinciden
password-changed = Contraseña cambiada con éxito
password-change-error = Error al cambiar contraseña
# -----------------------------------------------------------------------------
# Password Reset
# -----------------------------------------------------------------------------
password-reset-title = Restablecer Contraseña
password-reset-subtitle = Introduce tu correo para recibir un enlace de restablecimiento
password-reset-email-sent = Correo de restablecimiento de contraseña enviado
password-reset-email-sent-description = Revisa tu correo para instrucciones de restablecimiento de contraseña
password-reset-invalid-token = Enlace de restablecimiento inválido o expirado
password-reset-success = Contraseña restablecida con éxito
password-reset-error = Error al restablecer contraseña
# -----------------------------------------------------------------------------
# Session Management
# -----------------------------------------------------------------------------
session-title = Sesiones Activas
session-subtitle = Gestiona tus sesiones activas en diferentes dispositivos
session-current = Sesión Actual
session-device = Dispositivo
session-location = Ubicación
session-last-active = Última Actividad
session-ip-address = Dirección IP
session-browser = Navegador
session-os = Sistema Operativo
session-sign-out = Cerrar Sesión
session-sign-out-all = Cerrar Todas las Otras Sesiones
session-sign-out-confirm = ¿Estás seguro de que quieres cerrar esta sesión?
session-sign-out-all-confirm = ¿Estás seguro de que quieres cerrar todas las otras sesiones?
# -----------------------------------------------------------------------------
# Security Settings
# -----------------------------------------------------------------------------
security-title = Seguridad
security-subtitle = Gestiona la configuración de seguridad de tu cuenta
security-overview = Resumen de Seguridad
security-last-login = Último Inicio de Sesión
security-password-last-changed = Último Cambio de Contraseña
security-security-checkup = Revisión de Seguridad
security-checkup-description = Revisa tu configuración de seguridad
security-recommendation = Recomendación
security-add-passkey = Añade una llave de acceso para un inicio de sesión más seguro
security-enable-mfa = Activa la autenticación de dos factores
security-update-password = Actualiza tu contraseña regularmente
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
auth-error-invalid-credentials = Correo o contraseña inválidos
auth-error-account-locked = Cuenta bloqueada. Por favor, contacta con soporte.
auth-error-account-disabled = La cuenta ha sido desactivada
auth-error-email-not-verified = Por favor, verifica tu dirección de correo
auth-error-too-many-attempts = Demasiados intentos fallidos. Por favor, inténtalo más tarde.
auth-error-network = Error de red. Por favor, comprueba tu conexión.
auth-error-server = Error del servidor. Por favor, inténtalo más tarde.
auth-error-unknown = Ha ocurrido un error desconocido
auth-error-session-invalid = Sesión inválida. Por favor, inicia sesión de nuevo.
auth-error-token-expired = Tu sesión ha expirado. Por favor, inicia sesión de nuevo.
auth-error-unauthorized = No estás autorizado para realizar esta acción
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
auth-success-login = Sesión iniciada con éxito
auth-success-logout = Sesión cerrada con éxito
auth-success-signup = Cuenta creada con éxito
auth-success-password-changed = Contraseña cambiada con éxito
auth-success-email-verified = Correo verificado con éxito
auth-success-mfa-enabled = Autenticación de dos factores activada
auth-success-mfa-disabled = Autenticación de dos factores desactivada
auth-success-session-terminated = Sesión terminada con éxito
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
auth-notify-new-login = Nuevo inicio de sesión desde { $device } en { $location }
auth-notify-password-changed = Tu contraseña ha sido cambiada
auth-notify-mfa-enabled = La autenticación de dos factores ha sido activada
auth-notify-passkey-added = Nueva llave de acceso añadida a tu cuenta
auth-notify-suspicious-activity = Actividad sospechosa detectada en tu cuenta

View file

@ -0,0 +1,150 @@
bot-greeting-default = ¡Hola! ¿En qué puedo ayudarte hoy?
bot-greeting-named = ¡Hola, { $name }! ¿En qué puedo ayudarte hoy?
bot-goodbye = ¡Adiós! ¡Que tengas un excelente día!
bot-help-prompt = Puedo ayudarte con: { $topics }. ¿Qué te gustaría saber?
bot-thank-you = Gracias por tu mensaje. ¿En qué puedo asistirte hoy?
bot-echo-intro = Bot de Eco: Repetiré todo lo que digas. Escribe 'salir' para terminar.
bot-you-said = Dijiste: { $message }
bot-thinking = Déjame pensar en eso...
bot-processing = Procesando tu solicitud...
bot-error-occurred = Lo siento, algo salió mal. Por favor intenta de nuevo.
bot-not-understood = No entendí eso. ¿Podrías reformularlo?
bot-confirm-action = ¿Estás seguro de que deseas continuar?
bot-action-cancelled = Acción cancelada.
bot-action-completed = ¡Listo!
bot-lead-welcome = ¡Bienvenido! Déjame ayudarte a comenzar.
bot-lead-ask-name = ¿Cuál es tu nombre?
bot-lead-ask-email = ¿Y tu correo electrónico?
bot-lead-ask-company = ¿De qué empresa eres?
bot-lead-ask-phone = ¿Cuál es tu número de teléfono?
bot-lead-hot = ¡Excelente! Nuestro equipo de ventas se comunicará contigo pronto.
bot-lead-nurture = ¡Gracias por tu interés! Te enviaremos algunos recursos.
bot-lead-score = Tu puntuación de prospecto es { $score } de 100.
bot-lead-saved = Tu información ha sido guardada exitosamente.
bot-schedule-created = Ejecutando tarea programada: { $name }
bot-schedule-next = Próxima ejecución programada para { $datetime }
bot-schedule-cancelled = Programación cancelada.
bot-schedule-paused = Programación pausada.
bot-schedule-resumed = Programación reanudada.
bot-monitor-alert = Alerta: { $subject } ha cambiado
bot-monitor-threshold = { $metric } ha excedido el umbral: { $value }
bot-monitor-recovered = { $subject } ha vuelto a la normalidad.
bot-monitor-status = Estado actual: { $status }
bot-order-welcome = ¡Bienvenido a nuestra tienda! ¿En qué puedo ayudarte?
bot-order-track = Rastrear mi pedido
bot-order-browse = Ver productos
bot-order-support = Contactar soporte
bot-order-enter-id = Por favor ingresa tu número de pedido:
bot-order-status = Estado del pedido: { $status }
bot-order-shipped = ¡Tu pedido ha sido enviado! Número de seguimiento: { $tracking }
bot-order-delivered = Tu pedido ha sido entregado.
bot-order-processing = Tu pedido está siendo procesado.
bot-order-cancelled = Tu pedido ha sido cancelado.
bot-order-ticket = Ticket de soporte creado: #{ $ticket }
bot-order-products-available = Aquí están nuestros productos disponibles:
bot-order-product-item = { $name } - { $price }
bot-order-cart-added = { $product } agregado a tu carrito.
bot-order-cart-total = El total de tu carrito es { $total }.
bot-order-checkout = Procediendo al pago...
bot-hr-welcome = Asistente de RR.HH. aquí. ¿En qué puedo ayudarte?
bot-hr-request-leave = Solicitar permiso
bot-hr-check-balance = Consultar saldo
bot-hr-view-policies = Ver políticas
bot-hr-leave-type = ¿Qué tipo de permiso? (vacaciones/enfermedad/personal)
bot-hr-start-date = ¿Fecha de inicio? (AAAA-MM-DD)
bot-hr-end-date = ¿Fecha de fin? (AAAA-MM-DD)
bot-hr-leave-submitted = ¡Solicitud de permiso enviada! Tu gerente la revisará.
bot-hr-leave-approved = Tu solicitud de permiso ha sido aprobada.
bot-hr-leave-rejected = Tu solicitud de permiso ha sido rechazada.
bot-hr-leave-pending = Tu solicitud de permiso está pendiente de aprobación.
bot-hr-balance-title = Tu saldo de permisos:
bot-hr-vacation-days = Vacaciones: { $days } días
bot-hr-sick-days = Enfermedad: { $days } días
bot-hr-personal-days = Personal: { $days } días
bot-hr-policy-found = Aquí está la información de la política que solicitaste:
bot-hr-policy-not-found = Política no encontrada. Por favor verifica el nombre de la política.
bot-health-welcome = Bienvenido a nuestro centro de salud. ¿En qué puedo ayudarte?
bot-health-book = Agendar cita
bot-health-cancel = Cancelar cita
bot-health-view = Ver mis citas
bot-health-reschedule = Reprogramar cita
bot-health-type = ¿Qué tipo de cita? (general/especialista/laboratorio)
bot-health-doctor = ¿Qué doctor preferirías?
bot-health-date = ¿Qué fecha te funciona mejor?
bot-health-time = ¿Qué horario preferirías?
bot-health-confirmed = Tu cita ha sido confirmada para { $datetime } con { $doctor }.
bot-health-cancelled = Tu cita ha sido cancelada.
bot-health-rescheduled = Tu cita ha sido reprogramada para { $datetime }.
bot-health-reminder = Recordatorio: Tienes una cita el { $datetime }.
bot-health-no-appointments = No tienes citas próximas.
bot-health-appointments-list = Tus próximas citas:
bot-support-welcome = ¿En qué puedo ayudarte hoy?
bot-support-describe = Por favor describe tu problema:
bot-support-category = ¿Qué categoría describe mejor tu problema?
bot-support-priority = ¿Qué tan urgente es este problema?
bot-support-ticket-created = Se ha creado el ticket de soporte #{ $ticket }.
bot-support-ticket-status = Estado del ticket #{ $ticket }: { $status }
bot-support-ticket-updated = Tu ticket ha sido actualizado.
bot-support-ticket-resolved = Tu ticket ha sido resuelto. Por favor avísanos si necesitas más asistencia.
bot-support-transfer = Transfiriéndote a un agente humano...
bot-support-wait-time = Tiempo de espera estimado: { $minutes } minutos.
bot-support-agent-joined = El agente { $name } se ha unido a la conversación.
bot-survey-intro = ¡Nos encantaría escuchar tus comentarios!
bot-survey-question = { $question }
bot-survey-scale = En una escala del 1 al 10, ¿cómo calificarías { $subject }?
bot-survey-open = Por favor comparte cualquier comentario adicional:
bot-survey-thanks = ¡Gracias por tus comentarios!
bot-survey-completed = Encuesta completada exitosamente.
bot-survey-skip = Puedes omitir esta pregunta si lo prefieres.
bot-notification-new-message = Tienes un nuevo mensaje de { $sender }.
bot-notification-task-due = La tarea "{ $task }" vence { $when }.
bot-notification-reminder = Recordatorio: { $message }
bot-notification-update = Actualización: { $message }
bot-notification-alert = Alerta: { $message }
bot-command-help = Comandos disponibles:
bot-command-unknown = Comando desconocido. Escribe 'ayuda' para ver los comandos disponibles.
bot-command-invalid = Sintaxis de comando inválida. Uso: { $usage }
bot-transfer-to-human = Transfiriéndote a un agente humano. Por favor espera...
bot-transfer-complete = Ahora estás conectado con { $agent }.
bot-transfer-unavailable = No hay agentes disponibles actualmente. Por favor intenta más tarde.
bot-transfer-queue-position = Eres el número { $position } en la cola.
bot-auth-login-prompt = Por favor ingresa tus credenciales para continuar.
bot-auth-login-success = Has iniciado sesión exitosamente.
bot-auth-login-failed = Error al iniciar sesión. Por favor verifica tus credenciales.
bot-auth-logout-success = Has cerrado sesión.
bot-auth-session-expired = Tu sesión ha expirado. Por favor inicia sesión nuevamente.
bot-file-upload-prompt = Por favor sube tu archivo.
bot-file-upload-success = Archivo "{ $filename }" subido exitosamente.
bot-file-upload-failed = Error al subir el archivo. Por favor intenta de nuevo.
bot-file-download-ready = Tu archivo está listo para descargar.
bot-file-processing = Procesando tu archivo...
bot-payment-amount = El monto total es { $amount }.
bot-payment-method = Por favor selecciona un método de pago.
bot-payment-processing = Procesando tu pago...
bot-payment-success = ¡Pago exitoso! ID de transacción: { $transactionId }
bot-payment-failed = El pago falló. Por favor intenta de nuevo o usa otro método de pago.
bot-payment-refund = Tu reembolso de { $amount } ha sido procesado.
bot-subscription-active = Tu suscripción está activa hasta { $endDate }.
bot-subscription-expired = Tu suscripción ha expirado.
bot-subscription-renew = ¿Te gustaría renovar tu suscripción?
bot-subscription-upgraded = Tu suscripción ha sido mejorada a { $plan }.
bot-subscription-cancelled = Tu suscripción ha sido cancelada.
bot-feedback-positive = ¡Gracias por tus comentarios positivos!
bot-feedback-negative = Lamentamos escuchar eso. ¿Cómo podemos mejorar?
bot-feedback-rating = Calificaste esta interacción { $rating } de 5.

186
locales/es/channels.ftl Normal file
View file

@ -0,0 +1,186 @@
channel-web = Chat Web
channel-whatsapp = WhatsApp
channel-telegram = Telegram
channel-slack = Slack
channel-teams = Microsoft Teams
channel-email = Correo Electrónico
channel-sms = SMS
channel-instagram = Instagram
channel-messenger = Facebook Messenger
channel-discord = Discord
channel-voice = Voz
channel-api = API
channel-status-connected = Conectado
channel-status-disconnected = Desconectado
channel-status-connecting = Conectando...
channel-status-error = Error de Conexión
channel-status-pending = Configuración Pendiente
channel-status-active = Activo
channel-status-inactive = Inactivo
channel-status-suspended = Suspendido
channel-setup-title = Configuración de Canal
channel-setup-description = Conecta tu bot a diferentes canales de comunicación
channel-setup-select = Selecciona un canal para configurar
channel-setup-configure = Configurar Canal
channel-setup-test = Probar Conexión
channel-setup-save = Guardar Configuración
channel-setup-cancel = Cancelar
channel-setup-reset = Restablecer Valores Predeterminados
channel-connect = Conectar
channel-disconnect = Desconectar
channel-reconnect = Reconectar
channel-refresh = Actualizar Estado
channel-settings = Configuración del Canal
channel-delete = Eliminar Canal
channel-confirm-delete = ¿Estás seguro de que deseas eliminar este canal?
channel-deleted = Canal eliminado exitosamente
channel-saved = Configuración del canal guardada
channel-whatsapp-phone = Número de Teléfono
channel-whatsapp-business-id = ID de Cuenta Empresarial
channel-whatsapp-api-key = Clave de API
channel-whatsapp-webhook = URL del Webhook
channel-whatsapp-verify-token = Token de Verificación
channel-whatsapp-template = Plantilla de Mensaje
channel-whatsapp-templates = Plantillas de Mensajes
channel-whatsapp-template-create = Crear Plantilla
channel-whatsapp-template-status = Estado de la Plantilla
channel-whatsapp-template-approved = Aprobada
channel-whatsapp-template-pending = Pendiente de Aprobación
channel-whatsapp-template-rejected = Rechazada
channel-whatsapp-24h-window = Ventana de mensajes de 24 horas
channel-whatsapp-session-active = Sesión activa
channel-whatsapp-session-expired = Sesión expirada
channel-telegram-bot-token = Token del Bot
channel-telegram-bot-username = Nombre de Usuario del Bot
channel-telegram-webhook = URL del Webhook
channel-telegram-commands = Comandos del Bot
channel-telegram-command-add = Agregar Comando
channel-telegram-command-name = Nombre del Comando
channel-telegram-command-description = Descripción
channel-telegram-inline-mode = Modo en Línea
channel-telegram-group-privacy = Modo de Privacidad de Grupo
channel-slack-workspace = Espacio de Trabajo
channel-slack-bot-token = Token del Bot
channel-slack-signing-secret = Secreto de Firma
channel-slack-app-id = ID de la Aplicación
channel-slack-channels = Canales
channel-slack-channel-select = Seleccionar Canales
channel-slack-events = Suscripciones a Eventos
channel-slack-slash-commands = Comandos de Barra
channel-slack-interactivity = Interactividad
channel-teams-tenant-id = ID del Inquilino
channel-teams-app-id = ID de Aplicación
channel-teams-app-secret = Secreto de Aplicación
channel-teams-bot-id = ID del Bot
channel-teams-manifest = Manifiesto de la App
channel-teams-publish = Publicar en Teams
channel-teams-install = Instalar en Teams
channel-email-smtp-host = Servidor SMTP
channel-email-smtp-port = Puerto SMTP
channel-email-smtp-user = Usuario SMTP
channel-email-smtp-password = Contraseña SMTP
channel-email-smtp-encryption = Cifrado
channel-email-imap-host = Servidor IMAP
channel-email-imap-port = Puerto IMAP
channel-email-from-name = Nombre del Remitente
channel-email-from-address = Dirección del Remitente
channel-email-reply-to = Dirección de Respuesta
channel-email-signature = Firma de Correo
channel-instagram-account = Cuenta de Instagram
channel-instagram-page-id = ID de Página
channel-instagram-access-token = Token de Acceso
channel-instagram-business = Cuenta Empresarial
channel-instagram-comments = Respuestas a Comentarios
channel-instagram-stories = Menciones en Historias
channel-instagram-dm = Mensajes Directos
channel-messenger-page-id = ID de Página
channel-messenger-app-id = ID de Aplicación
channel-messenger-app-secret = Secreto de Aplicación
channel-messenger-page-token = Token de Acceso de Página
channel-messenger-verify-token = Token de Verificación
channel-messenger-persistent-menu = Menú Persistente
channel-messenger-get-started = Botón de Comenzar
channel-sms-provider = Proveedor de SMS
channel-sms-twilio = Twilio
channel-sms-vonage = Vonage
channel-sms-account-sid = SID de Cuenta
channel-sms-auth-token = Token de Autenticación
channel-sms-phone-number = Número de Teléfono
channel-sms-sender-id = ID del Remitente
channel-voice-provider = Proveedor de Voz
channel-voice-twilio = Twilio
channel-voice-vonage = Vonage
channel-voice-phone-number = Número de Teléfono
channel-voice-greeting = Saludo de Voz
channel-voice-fallback = Mensaje de Respaldo
channel-voice-transcription = Habilitar Transcripción
channel-voice-recording = Habilitar Grabación
channel-voice-language = Idioma de Voz
channel-voice-voice-type = Tipo de Voz
channel-discord-bot-token = Token del Bot
channel-discord-client-id = ID de Cliente
channel-discord-client-secret = Secreto de Cliente
channel-discord-guild = Servidor (Guild)
channel-discord-channels = Canales
channel-discord-permissions = Permisos del Bot
channel-discord-invite-url = URL de Invitación
channel-api-endpoint = Punto Final de API
channel-api-key = Clave de API
channel-api-secret = Secreto de API
channel-api-webhook = URL del Webhook
channel-api-rate-limit = Límite de Tasa
channel-api-documentation = Documentación de API
channel-widget-title = Widget Web
channel-widget-position = Posición del Widget
channel-widget-position-left = Abajo a la Izquierda
channel-widget-position-right = Abajo a la Derecha
channel-widget-color = Color Principal
channel-widget-header = Texto del Encabezado
channel-widget-placeholder = Texto de Marcador
channel-widget-welcome = Mensaje de Bienvenida
channel-widget-avatar = Avatar del Bot
channel-widget-bubble = Burbuja de Chat
channel-widget-preview = Vista Previa del Widget
channel-widget-embed-code = Código para Incrustar
channel-widget-copy-code = Copiar Código
channel-widget-code-copied = Código copiado al portapapeles
channel-routing-title = Enrutamiento de Canal
channel-routing-default = Canal Predeterminado
channel-routing-rules = Reglas de Enrutamiento
channel-routing-add-rule = Agregar Regla
channel-routing-condition = Condición
channel-routing-action = Acción
channel-routing-priority = Prioridad
channel-routing-fallback = Canal de Respaldo
channel-analytics-messages = Mensajes
channel-analytics-conversations = Conversaciones
channel-analytics-users = Usuarios Únicos
channel-analytics-response-time = Tiempo de Respuesta Promedio
channel-analytics-satisfaction = Puntuación de Satisfacción
channel-analytics-by-channel = Analíticas por Canal
channel-error-connection = Error al conectar al canal
channel-error-authentication = Autenticación fallida
channel-error-configuration = Configuración inválida
channel-error-rate-limit = Límite de tasa excedido
channel-error-webhook = Verificación del webhook fallida
channel-error-permission = Permisos insuficientes
channel-error-not-found = Canal no encontrado
channel-error-already-exists = Canal ya configurado

347
locales/es/common.ftl Normal file
View file

@ -0,0 +1,347 @@
# ============================================================================
# General Bots - Traducciones Comunes (Español)
# ============================================================================
# Este archivo contiene cadenas compartidas utilizadas en todos los componentes de GB.
# Mantener los IDs de mensaje en minúsculas con guiones: categoría-subcategoría-descriptor
# ============================================================================
# -----------------------------------------------------------------------------
# Marca
# -----------------------------------------------------------------------------
app-name = General Bots
app-tagline = Tu espacio de trabajo de productividad impulsado por IA
# -----------------------------------------------------------------------------
# Acciones Comunes
# -----------------------------------------------------------------------------
action-save = Guardar
action-cancel = Cancelar
action-delete = Eliminar
action-edit = Editar
action-close = Cerrar
action-confirm = Confirmar
action-retry = Reintentar
action-back = Atrás
action-next = Siguiente
action-submit = Enviar
action-search = Buscar
action-refresh = Actualizar
action-copy = Copiar
action-paste = Pegar
action-undo = Deshacer
action-redo = Rehacer
action-select = Seleccionar
action-select-all = Seleccionar Todo
action-clear = Limpiar
action-reset = Restablecer
action-apply = Aplicar
action-create = Crear
action-update = Actualizar
action-remove = Quitar
action-add = Agregar
action-upload = Subir
action-download = Descargar
action-export = Exportar
action-import = Importar
action-share = Compartir
action-send = Enviar
action-reply = Responder
action-forward = Reenviar
action-archive = Archivar
action-restore = Restaurar
action-duplicate = Duplicar
action-rename = Renombrar
action-move = Mover
action-filter = Filtrar
action-sort = Ordenar
action-view = Ver
action-hide = Ocultar
action-show = Mostrar
action-expand = Expandir
action-collapse = Contraer
action-enable = Habilitar
action-disable = Deshabilitar
action-connect = Conectar
action-disconnect = Desconectar
action-sync = Sincronizar
action-start = Iniciar
action-stop = Detener
action-pause = Pausar
action-resume = Reanudar
action-continue = Continuar
action-finish = Finalizar
action-complete = Completar
action-approve = Aprobar
action-reject = Rechazar
action-accept = Aceptar
action-decline = Rechazar
action-login = Iniciar Sesión
action-logout = Cerrar Sesión
action-signup = Registrarse
action-forgot-password = Olvidé mi Contraseña
# -----------------------------------------------------------------------------
# Etiquetas Comunes
# -----------------------------------------------------------------------------
label-loading = Cargando...
label-saving = Guardando...
label-processing = Procesando...
label-searching = Buscando...
label-uploading = Subiendo...
label-downloading = Descargando...
label-no-results = No se encontraron resultados
label-no-data = No hay datos disponibles
label-empty = Vacío
label-none = Ninguno
label-all = Todo
label-selected = Seleccionado
label-required = Requerido
label-optional = Opcional
label-default = Predeterminado
label-custom = Personalizado
label-new = Nuevo
label-draft = Borrador
label-pending = Pendiente
label-active = Activo
label-inactive = Inactivo
label-enabled = Habilitado
label-disabled = Deshabilitado
label-public = Público
label-private = Privado
label-shared = Compartido
label-yes = Sí
label-no = No
label-on = Encendido
label-off = Apagado
label-true = Verdadero
label-false = Falso
label-unknown = Desconocido
label-other = Otro
label-more = Más
label-less = Menos
label-details = Detalles
label-summary = Resumen
label-description = Descripción
label-name = Nombre
label-title = Título
label-type = Tipo
label-status = Estado
label-priority = Prioridad
label-date = Fecha
label-time = Hora
label-size = Tamaño
label-count = Cantidad
label-total = Total
label-average = Promedio
label-minimum = Mínimo
label-maximum = Máximo
label-version = Versión
label-id = ID
label-created = Creado
label-updated = Actualizado
label-modified = Modificado
label-deleted = Eliminado
label-by = Por
label-from = De
label-to = Para
label-at = En
label-in = En
label-of = De
# -----------------------------------------------------------------------------
# Mensajes de Estado
# -----------------------------------------------------------------------------
status-success = Éxito
status-error = Error
status-warning = Advertencia
status-info = Información
status-loading = Cargando
status-complete = Completo
status-incomplete = Incompleto
status-failed = Fallido
status-cancelled = Cancelado
status-pending = Pendiente
status-in-progress = En Progreso
status-done = Listo
status-ready = Listo
status-not-ready = No Listo
status-connected = Conectado
status-disconnected = Desconectado
status-online = En Línea
status-offline = Fuera de Línea
status-available = Disponible
status-unavailable = No Disponible
status-busy = Ocupado
status-away = Ausente
# -----------------------------------------------------------------------------
# Diálogos de Confirmación
# -----------------------------------------------------------------------------
confirm-delete = ¿Estás seguro de que deseas eliminar esto?
confirm-delete-item = ¿Estás seguro de que deseas eliminar "{ $name }"?
confirm-delete-items = ¿Estás seguro de que deseas eliminar { $count ->
[one] este elemento
*[other] estos { $count } elementos
}?
confirm-discard-changes = Tienes cambios sin guardar. ¿Estás seguro de que deseas descartarlos?
confirm-logout = ¿Estás seguro de que deseas cerrar sesión?
confirm-cancel = ¿Estás seguro de que deseas cancelar?
# -----------------------------------------------------------------------------
# Tiempo y Fechas
# -----------------------------------------------------------------------------
time-now = Ahora mismo
time-seconds-ago = { $count ->
[one] hace { $count } segundo
*[other] hace { $count } segundos
}
time-minutes-ago = { $count ->
[one] hace { $count } minuto
*[other] hace { $count } minutos
}
time-hours-ago = { $count ->
[one] hace { $count } hora
*[other] hace { $count } horas
}
time-days-ago = { $count ->
[one] hace { $count } día
*[other] hace { $count } días
}
time-weeks-ago = { $count ->
[one] hace { $count } semana
*[other] hace { $count } semanas
}
time-months-ago = { $count ->
[one] hace { $count } mes
*[other] hace { $count } meses
}
time-years-ago = { $count ->
[one] hace { $count } año
*[other] hace { $count } años
}
time-in-seconds = { $count ->
[one] en { $count } segundo
*[other] en { $count } segundos
}
time-in-minutes = { $count ->
[one] en { $count } minuto
*[other] en { $count } minutos
}
time-in-hours = { $count ->
[one] en { $count } hora
*[other] en { $count } horas
}
time-in-days = { $count ->
[one] en { $count } día
*[other] en { $count } días
}
time-today = Hoy
time-yesterday = Ayer
time-tomorrow = Mañana
time-this-week = Esta semana
time-last-week = La semana pasada
time-next-week = La próxima semana
time-this-month = Este mes
time-last-month = El mes pasado
time-next-month = El próximo mes
time-this-year = Este año
time-last-year = El año pasado
time-next-year = El próximo año
# Días de la semana
day-sunday = Domingo
day-monday = Lunes
day-tuesday = Martes
day-wednesday = Miércoles
day-thursday = Jueves
day-friday = Viernes
day-saturday = Sábado
day-sun = Dom
day-mon = Lun
day-tue = Mar
day-wed = Mié
day-thu = Jue
day-fri = Vie
day-sat = Sáb
# Meses
month-january = Enero
month-february = Febrero
month-march = Marzo
month-april = Abril
month-may = Mayo
month-june = Junio
month-july = Julio
month-august = Agosto
month-september = Septiembre
month-october = Octubre
month-november = Noviembre
month-december = Diciembre
month-jan = Ene
month-feb = Feb
month-mar = Mar
month-apr = Abr
month-may-short = May
month-jun = Jun
month-jul = Jul
month-aug = Ago
month-sep = Sep
month-oct = Oct
month-nov = Nov
month-dec = Dic
# -----------------------------------------------------------------------------
# Tamaños de Archivo
# -----------------------------------------------------------------------------
size-bytes = { $value } B
size-kilobytes = { $value } KB
size-megabytes = { $value } MB
size-gigabytes = { $value } GB
size-terabytes = { $value } TB
# -----------------------------------------------------------------------------
# Paginación
# -----------------------------------------------------------------------------
pagination-page = Página { $current } de { $total }
pagination-showing = Mostrando { $start } a { $end } de { $total }
pagination-items-per-page = Elementos por página
pagination-first = Primera
pagination-previous = Anterior
pagination-next = Siguiente
pagination-last = Última
pagination-go-to-page = Ir a la página
# -----------------------------------------------------------------------------
# Validación de Formularios
# -----------------------------------------------------------------------------
validation-required = Este campo es requerido
validation-required-field = { $field } es requerido
validation-email-invalid = Por favor ingresa una dirección de correo válida
validation-url-invalid = Por favor ingresa una URL válida
validation-number-invalid = Por favor ingresa un número válido
validation-date-invalid = Por favor ingresa una fecha válida
validation-min-length = Debe tener al menos { $min } caracteres
validation-max-length = No debe tener más de { $max } caracteres
validation-min-value = Debe ser al menos { $min }
validation-max-value = No debe ser mayor que { $max }
validation-pattern-mismatch = Formato inválido
validation-passwords-mismatch = Las contraseñas no coinciden
validation-file-too-large = El archivo es muy grande. El tamaño máximo es { $max }
validation-file-type-invalid = Tipo de archivo inválido. Tipos permitidos: { $types }
# -----------------------------------------------------------------------------
# Accesibilidad
# -----------------------------------------------------------------------------
a11y-skip-to-content = Saltar al contenido principal
a11y-loading = Cargando, por favor espera
a11y-menu-open = Abrir menú
a11y-menu-close = Cerrar menú
a11y-expand = Expandir
a11y-collapse = Contraer
a11y-selected = Seleccionado
a11y-not-selected = No seleccionado
a11y-required = Campo requerido
a11y-error = Error
a11y-success = Éxito
a11y-warning = Advertencia
a11y-info = Información

324
locales/es/contacts.ftl Normal file
View file

@ -0,0 +1,324 @@
# =============================================================================
# General Bots - Contacts Translations (Spanish)
# =============================================================================
# Traducciones de la interfaz de gestión de contactos
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation & Headers
# -----------------------------------------------------------------------------
contacts-title = Contactos
contacts-subtitle = Gestiona tus contactos y relaciones
contacts-nav-all = Todos los Contactos
contacts-nav-favorites = Favoritos
contacts-nav-recent = Añadidos Recientemente
contacts-nav-groups = Grupos
contacts-nav-tags = Etiquetas
# -----------------------------------------------------------------------------
# Views & Filters
# -----------------------------------------------------------------------------
contacts-view-list = Vista de Lista
contacts-view-grid = Vista de Cuadrícula
contacts-filter-all = Todos
contacts-filter-active = Activos
contacts-filter-inactive = Inactivos
contacts-filter-leads = Leads
contacts-filter-customers = Clientes
contacts-filter-prospects = Prospectos
contacts-filter-archived = Archivados
contacts-search-placeholder = Buscar contactos...
contacts-sort-name = Ordenar por Nombre
contacts-sort-company = Ordenar por Empresa
contacts-sort-recent = Ordenar por Recientes
contacts-sort-created = Ordenar por Creación
# -----------------------------------------------------------------------------
# Contact Fields
# -----------------------------------------------------------------------------
contacts-field-first-name = Nombre
contacts-field-last-name = Apellido
contacts-field-email = Correo Electrónico
contacts-field-phone = Teléfono
contacts-field-mobile = Móvil
contacts-field-company = Empresa
contacts-field-job-title = Cargo
contacts-field-department = Departamento
contacts-field-website = Sitio Web
contacts-field-linkedin = LinkedIn
contacts-field-twitter = Twitter
contacts-field-address = Dirección
contacts-field-city = Ciudad
contacts-field-state = Estado/Provincia
contacts-field-postal-code = Código Postal
contacts-field-country = País
contacts-field-notes = Notas
contacts-field-tags = Etiquetas
contacts-field-source = Origen
contacts-field-status = Estado
contacts-field-last-contacted = Último Contacto
contacts-field-created-at = Creado
contacts-field-updated-at = Actualizado
# -----------------------------------------------------------------------------
# Contact Status
# -----------------------------------------------------------------------------
contacts-status-active = Activo
contacts-status-inactive = Inactivo
contacts-status-lead = Lead
contacts-status-customer = Cliente
contacts-status-prospect = Prospecto
contacts-status-archived = Archivado
# -----------------------------------------------------------------------------
# Contact Source
# -----------------------------------------------------------------------------
contacts-source-manual = Entrada Manual
contacts-source-import = Importación
contacts-source-webform = Formulario Web
contacts-source-api = API
contacts-source-email = Correo Electrónico
contacts-source-meeting = Reunión
contacts-source-referral = Referencia
contacts-source-social = Redes Sociales
# -----------------------------------------------------------------------------
# Actions
# -----------------------------------------------------------------------------
contacts-action-add = Añadir Contacto
contacts-action-edit = Editar Contacto
contacts-action-delete = Eliminar Contacto
contacts-action-archive = Archivar Contacto
contacts-action-restore = Restaurar Contacto
contacts-action-favorite = Añadir a Favoritos
contacts-action-unfavorite = Quitar de Favoritos
contacts-action-export = Exportar Contactos
contacts-action-import = Importar Contactos
contacts-action-merge = Fusionar Contactos
contacts-action-send-email = Enviar Correo
contacts-action-schedule-meeting = Programar Reunión
contacts-action-create-task = Crear Tarea
contacts-action-add-note = Añadir Nota
contacts-action-add-tag = Añadir Etiqueta
contacts-action-remove-tag = Quitar Etiqueta
# -----------------------------------------------------------------------------
# Bulk Actions
# -----------------------------------------------------------------------------
contacts-bulk-selected = { $count } contactos seleccionados
contacts-bulk-delete = Eliminar Seleccionados
contacts-bulk-archive = Archivar Seleccionados
contacts-bulk-add-tag = Añadir Etiqueta a Seleccionados
contacts-bulk-remove-tag = Quitar Etiqueta de Seleccionados
contacts-bulk-add-to-group = Añadir al Grupo
contacts-bulk-remove-from-group = Quitar del Grupo
contacts-bulk-export = Exportar Seleccionados
contacts-bulk-change-status = Cambiar Estado
# -----------------------------------------------------------------------------
# Groups
# -----------------------------------------------------------------------------
contacts-groups-title = Grupos de Contactos
contacts-groups-create = Crear Grupo
contacts-groups-edit = Editar Grupo
contacts-groups-delete = Eliminar Grupo
contacts-groups-name = Nombre del Grupo
contacts-groups-description = Descripción
contacts-groups-color = Color
contacts-groups-members = { $count } miembros
contacts-groups-add-members = Añadir Miembros
contacts-groups-remove-members = Quitar Miembros
# -----------------------------------------------------------------------------
# Import/Export
# -----------------------------------------------------------------------------
contacts-import-title = Importar Contactos
contacts-import-description = Sube un archivo para importar contactos
contacts-import-format-csv = Archivo CSV
contacts-import-format-vcard = Archivo vCard
contacts-import-format-json = Archivo JSON
contacts-import-drop-zone = Arrastra y suelta tu archivo aquí, o haz clic para buscar
contacts-import-mapping = Mapeo de Campos
contacts-import-preview = Vista Previa
contacts-import-skip-duplicates = Omitir entradas duplicadas
contacts-import-update-existing = Actualizar contactos existentes
contacts-import-success = { $count } contactos importados con éxito
contacts-import-errors = { $count } errores durante la importación
contacts-export-title = Exportar Contactos
contacts-export-description = Descarga tus contactos
contacts-export-format = Formato de Exportación
contacts-export-all = Exportar Todos los Contactos
contacts-export-selected = Exportar Seleccionados
contacts-export-group = Exportar Grupo
contacts-export-include-custom = Incluir Campos Personalizados
contacts-export-success = { $count } contactos exportados con éxito
# -----------------------------------------------------------------------------
# Detail Panel
# -----------------------------------------------------------------------------
contacts-detail-title = Detalles del Contacto
contacts-detail-info = Información
contacts-detail-activity = Actividad
contacts-detail-notes = Notas
contacts-detail-tasks = Tareas
contacts-detail-events = Eventos
contacts-detail-files = Archivos
contacts-detail-history = Historial
# -----------------------------------------------------------------------------
# Activity Types
# -----------------------------------------------------------------------------
contacts-activity-email = Correo Electrónico
contacts-activity-call = Llamada
contacts-activity-meeting = Reunión
contacts-activity-task = Tarea
contacts-activity-note = Nota
contacts-activity-status-change = Estado Cambiado
contacts-activity-created = Contacto Creado
contacts-activity-updated = Contacto Actualizado
contacts-activity-imported = Contacto Importado
# -----------------------------------------------------------------------------
# Quick Actions
# -----------------------------------------------------------------------------
contacts-quick-email = Correo
contacts-quick-call = Llamar
contacts-quick-meeting = Reunión
contacts-quick-task = Tarea
# -----------------------------------------------------------------------------
# Calendar Integration
# -----------------------------------------------------------------------------
contacts-calendar-link = Vincular al Evento
contacts-calendar-unlink = Desvincular del Evento
contacts-calendar-events = Eventos Relacionados
contacts-calendar-upcoming = Próximos Eventos
contacts-calendar-past = Eventos Pasados
contacts-calendar-role = Rol
contacts-calendar-role-attendee = Asistente
contacts-calendar-role-organizer = Organizador
contacts-calendar-role-optional = Opcional
contacts-calendar-role-speaker = Ponente
contacts-calendar-role-host = Anfitrión
contacts-calendar-response = Estado de Respuesta
contacts-calendar-response-accepted = Aceptado
contacts-calendar-response-declined = Rechazado
contacts-calendar-response-tentative = Tentativo
contacts-calendar-response-pending = Pendiente
# -----------------------------------------------------------------------------
# Tasks Integration
# -----------------------------------------------------------------------------
contacts-tasks-assign = Asignar a Tarea
contacts-tasks-unassign = Desasignar de Tarea
contacts-tasks-related = Tareas Relacionadas
contacts-tasks-active = Tareas Activas
contacts-tasks-completed = Tareas Completadas
contacts-tasks-overdue = Tareas Vencidas
contacts-tasks-role = Rol
contacts-tasks-role-assignee = Responsable
contacts-tasks-role-reviewer = Revisor
contacts-tasks-role-stakeholder = Parte Interesada
contacts-tasks-role-collaborator = Colaborador
contacts-tasks-role-client = Cliente
contacts-tasks-role-approver = Aprobador
contacts-tasks-workload = Carga de Trabajo
contacts-tasks-workload-low = Baja
contacts-tasks-workload-medium = Media
contacts-tasks-workload-high = Alta
contacts-tasks-workload-overloaded = Sobrecargado
# -----------------------------------------------------------------------------
# External Sync
# -----------------------------------------------------------------------------
contacts-sync-title = Sincronización de Agenda
contacts-sync-description = Sincroniza con agendas externas
contacts-sync-google = Google Contactos
contacts-sync-microsoft = Microsoft People
contacts-sync-apple = Contactos de Apple
contacts-sync-carddav = Servidor CardDAV
contacts-sync-connect = Conectar Cuenta
contacts-sync-disconnect = Desconectar
contacts-sync-connected = Conectado
contacts-sync-last-sync = Última sincronización { $time }
contacts-sync-in-progress = Sincronización en progreso...
contacts-sync-success = Sincronización completada con éxito
contacts-sync-error = Error en la sincronización
contacts-sync-direction = Dirección de Sincronización
contacts-sync-direction-two-way = Sincronización Bidireccional
contacts-sync-direction-import = Solo Importar
contacts-sync-direction-export = Solo Exportar
contacts-sync-conflicts = { $count } conflictos detectados
contacts-sync-resolve = Resolver Conflictos
contacts-sync-keep-local = Mantener Local
contacts-sync-keep-remote = Mantener Remoto
contacts-sync-merge = Fusionar Ambos
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
contacts-empty-title = Aún no hay contactos
contacts-empty-description = Añade tu primer contacto para comenzar
contacts-empty-action = Añadir Contacto
contacts-empty-search = Ningún contacto coincide con tu búsqueda
contacts-empty-filter = Ningún contacto coincide con el filtro seleccionado
contacts-empty-group = Este grupo no tiene miembros
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
contacts-confirm-delete = ¿Estás seguro de que quieres eliminar este contacto?
contacts-confirm-delete-bulk = ¿Estás seguro de que quieres eliminar { $count } contactos?
contacts-confirm-archive = ¿Estás seguro de que quieres archivar este contacto?
contacts-confirm-merge = ¿Estás seguro de que quieres fusionar estos contactos?
contacts-confirm-disconnect = ¿Estás seguro de que quieres desconectar esta cuenta?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
contacts-success-created = Contacto creado con éxito
contacts-success-updated = Contacto actualizado con éxito
contacts-success-deleted = Contacto eliminado con éxito
contacts-success-archived = Contacto archivado con éxito
contacts-success-restored = Contacto restaurado con éxito
contacts-success-merged = Contactos fusionados con éxito
contacts-success-imported = Contactos importados con éxito
contacts-success-exported = Contactos exportados con éxito
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
contacts-error-create = Error al crear contacto
contacts-error-update = Error al actualizar contacto
contacts-error-delete = Error al eliminar contacto
contacts-error-import = Error al importar contactos
contacts-error-export = Error al exportar contactos
contacts-error-sync = Error en la sincronización
contacts-error-duplicate = Ya existe un contacto con este correo electrónico
contacts-error-required = Este campo es obligatorio
contacts-error-invalid-email = Por favor, introduce una dirección de correo válida
contacts-error-invalid-phone = Por favor, introduce un número de teléfono válido
# -----------------------------------------------------------------------------
# People Module
# -----------------------------------------------------------------------------
people-title = Personas
people-subtitle = Contactos, Grupos y Directorio
people-search = Buscar contactos...
people-add = Agregar Contacto
people-tab-contacts = Contactos
people-tab-groups = Grupos
people-tab-directory = Directorio
people-tab-recent = Recientes
people-loading = Cargando contactos...
people-add-contact = Agregar Contacto
people-first-name = Nombre
people-last-name = Apellido
people-email = Correo Electrónico
people-phone = Teléfono
people-company = Empresa
people-job-title = Cargo
people-notes = Notas
people-empty-title = No hay contactos aún
people-empty-desc = Agrega tu primer contacto para comenzar

165
locales/es/errors.ftl Normal file
View file

@ -0,0 +1,165 @@
# General Bots - Mensajes de Error (Español)
# Este archivo contiene todas las traducciones de mensajes de error
# =============================================================================
# Errores HTTP
# =============================================================================
error-http-400 = Solicitud incorrecta. Por favor verifica tu entrada.
error-http-401 = Autenticación requerida. Por favor inicia sesión.
error-http-403 = No tienes permiso para acceder a este recurso.
error-http-404 = { $entity } no encontrado.
error-http-409 = Conflicto: { $message }
error-http-429 = Demasiadas solicitudes. Por favor espera { $seconds } segundos.
error-http-500 = Error interno del servidor. Por favor intenta más tarde.
error-http-502 = Puerta de enlace incorrecta. El servidor recibió una respuesta inválida.
error-http-503 = Servicio temporalmente no disponible. Por favor intenta más tarde.
error-http-504 = La solicitud expiró después de { $milliseconds }ms.
# =============================================================================
# Errores de Validación
# =============================================================================
error-validation-required = { $field } es requerido.
error-validation-email = Por favor ingresa una dirección de correo válida.
error-validation-url = Por favor ingresa una URL válida.
error-validation-phone = Por favor ingresa un número de teléfono válido.
error-validation-min-length = { $field } debe tener al menos { $min } caracteres.
error-validation-max-length = { $field } no debe tener más de { $max } caracteres.
error-validation-min-value = { $field } debe ser al menos { $min }.
error-validation-max-value = { $field } no debe ser mayor que { $max }.
error-validation-pattern = El formato de { $field } es inválido.
error-validation-unique = { $field } ya existe.
error-validation-mismatch = { $field } no coincide con { $other }.
error-validation-date-format = Por favor ingresa una fecha válida en el formato { $format }.
error-validation-date-past = { $field } debe ser en el pasado.
error-validation-date-future = { $field } debe ser en el futuro.
# =============================================================================
# Errores de Autenticación
# =============================================================================
error-auth-invalid-credentials = Correo o contraseña inválidos.
error-auth-account-locked = Tu cuenta ha sido bloqueada. Por favor contacta a soporte.
error-auth-account-disabled = Tu cuenta ha sido deshabilitada.
error-auth-session-expired = Tu sesión ha expirado. Por favor inicia sesión nuevamente.
error-auth-token-invalid = Token inválido o expirado.
error-auth-token-missing = Se requiere token de autenticación.
error-auth-mfa-required = Se requiere autenticación de múltiples factores.
error-auth-mfa-invalid = Código de verificación inválido.
error-auth-password-weak = La contraseña es muy débil. Por favor usa una contraseña más fuerte.
error-auth-password-expired = Tu contraseña ha expirado. Por favor restablécela.
# =============================================================================
# Errores de Configuración
# =============================================================================
error-config = Error de configuración: { $message }
error-config-missing = Configuración faltante: { $key }
error-config-invalid = Valor de configuración inválido para { $key }: { $reason }
error-config-file-not-found = Archivo de configuración no encontrado: { $path }
error-config-parse = Error al analizar configuración: { $message }
# =============================================================================
# Errores de Base de Datos
# =============================================================================
error-database = Error de base de datos: { $message }
error-database-connection = Error al conectar a la base de datos.
error-database-timeout = La operación de base de datos expiró.
error-database-constraint = Violación de restricción de base de datos: { $constraint }
error-database-duplicate = Ya existe un registro con este { $field }.
error-database-migration = La migración de base de datos falló: { $message }
# =============================================================================
# Errores de Archivos y Almacenamiento
# =============================================================================
error-file-not-found = Archivo no encontrado: { $filename }
error-file-too-large = El archivo es muy grande. El tamaño máximo es { $maxSize }.
error-file-type-not-allowed = Tipo de archivo no permitido. Tipos permitidos: { $allowedTypes }.
error-file-upload-failed = La subida del archivo falló: { $message }
error-file-read = Error al leer archivo: { $message }
error-file-write = Error al escribir archivo: { $message }
error-storage-full = Cuota de almacenamiento excedida.
error-storage-unavailable = El servicio de almacenamiento no está disponible.
# =============================================================================
# Errores de Red y Servicios Externos
# =============================================================================
error-network = Error de red: { $message }
error-network-timeout = La conexión expiró.
error-network-unreachable = El servidor no es alcanzable.
error-service-unavailable = Servicio no disponible: { $service }
error-external-api = Error de API externa: { $message }
error-rate-limit = Límite de tasa alcanzado. Reintentar después de { $seconds }s.
# =============================================================================
# Errores de Bot y Diálogos
# =============================================================================
error-bot-not-found = Bot no encontrado: { $botId }
error-bot-disabled = Este bot está actualmente deshabilitado.
error-bot-script-error = Error de script en línea { $line }: { $message }
error-bot-timeout = La respuesta del bot expiró.
error-bot-quota-exceeded = Cuota de uso del bot excedida.
error-dialog-not-found = Diálogo no encontrado: { $dialogId }
error-dialog-invalid = Configuración de diálogo inválida: { $message }
# =============================================================================
# Errores de LLM e IA
# =============================================================================
error-llm-unavailable = El servicio de IA no está disponible actualmente.
error-llm-timeout = La solicitud de IA expiró.
error-llm-rate-limit = Límite de tasa de IA excedido. Por favor espera antes de intentar nuevamente.
error-llm-content-filter = El contenido fue filtrado por las pautas de seguridad.
error-llm-context-length = La entrada es muy larga. Por favor acorta tu mensaje.
error-llm-invalid-response = Se recibió una respuesta inválida del servicio de IA.
# =============================================================================
# Errores de Correo Electrónico
# =============================================================================
error-email-send-failed = Error al enviar correo: { $message }
error-email-invalid-recipient = Dirección de correo del destinatario inválida: { $email }
error-email-attachment-failed = Error al adjuntar archivo: { $filename }
error-email-template-not-found = Plantilla de correo no encontrada: { $template }
# =============================================================================
# Errores de Calendario y Programación
# =============================================================================
error-calendar-conflict = El horario conflictúa con un evento existente.
error-calendar-past-date = No se pueden programar eventos en el pasado.
error-calendar-invalid-recurrence = Patrón de recurrencia inválido.
error-calendar-event-not-found = Evento no encontrado: { $eventId }
# =============================================================================
# Errores de Tareas
# =============================================================================
error-task-not-found = Tarea no encontrada: { $taskId }
error-task-already-completed = La tarea ya ha sido completada.
error-task-circular-dependency = Se detectó una dependencia circular en las tareas.
error-task-invalid-status = Transición de estado de tarea inválida.
# =============================================================================
# Errores de Permisos
# =============================================================================
error-permission-denied = No tienes permiso para realizar esta acción.
error-permission-resource = No tienes acceso a este { $resource }.
error-permission-action = No puedes { $action } este { $resource }.
error-permission-owner-only = Solo el propietario puede realizar esta acción.
# =============================================================================
# Errores Genéricos
# =============================================================================
error-internal = Error interno: { $message }
error-unexpected = Ocurrió un error inesperado. Por favor intenta nuevamente.
error-not-implemented = Esta función aún no está implementada.
error-maintenance = El sistema está en mantenimiento. Por favor intenta más tarde.
error-unknown = Ocurrió un error desconocido.

View file

@ -0,0 +1,127 @@
notification-title-new-message = Nuevo Mensaje
notification-title-task-due = Tarea Vence
notification-title-task-assigned = Tarea Asignada
notification-title-task-completed = Tarea Completada
notification-title-meeting-reminder = Recordatorio de Reunión
notification-title-meeting-started = Reunión Iniciada
notification-title-file-shared = Archivo Compartido
notification-title-file-uploaded = Archivo Subido
notification-title-comment-added = Nuevo Comentario
notification-title-mention = Te mencionaron
notification-title-system = Notificación del Sistema
notification-title-security = Alerta de Seguridad
notification-title-update = Actualización Disponible
notification-title-error = Ocurrió un Error
notification-title-success = Éxito
notification-title-warning = Advertencia
notification-title-info = Información
notification-message-new = Tienes un nuevo mensaje de { $sender }
notification-message-unread = Tienes { $count ->
[one] { $count } mensaje sin leer
*[other] { $count } mensajes sin leer
}
notification-task-due-soon = La tarea "{ $task }" vence en { $time }
notification-task-due-today = La tarea "{ $task }" vence hoy
notification-task-due-overdue = La tarea "{ $task }" está vencida por { $time }
notification-task-assigned-to-you = Te han asignado a la tarea "{ $task }"
notification-task-assigned-by = { $assigner } te asignó a "{ $task }"
notification-task-completed-by = { $user } completó la tarea "{ $task }"
notification-task-status-changed = El estado de la tarea "{ $task }" cambió a { $status }
notification-meeting-in-minutes = La reunión "{ $meeting }" comienza en { $minutes } minutos
notification-meeting-starting-now = La reunión "{ $meeting }" está comenzando ahora
notification-meeting-cancelled = La reunión "{ $meeting }" ha sido cancelada
notification-meeting-rescheduled = La reunión "{ $meeting }" ha sido reprogramada para { $datetime }
notification-meeting-invite = { $inviter } te invitó a "{ $meeting }"
notification-meeting-response = { $user } { $response } tu invitación a la reunión
notification-file-shared-with-you = { $sharer } compartió "{ $filename }" contigo
notification-file-uploaded-by = { $uploader } subió "{ $filename }"
notification-file-modified = "{ $filename }" fue modificado por { $user }
notification-file-deleted = "{ $filename }" fue eliminado por { $user }
notification-file-download-ready = Tu archivo "{ $filename }" está listo para descargar
notification-file-upload-complete = La subida de "{ $filename }" se completó exitosamente
notification-file-upload-failed = La subida de "{ $filename }" falló
notification-comment-on-task = { $user } comentó en la tarea "{ $task }"
notification-comment-on-file = { $user } comentó en "{ $filename }"
notification-comment-reply = { $user } respondió a tu comentario
notification-mention-in-comment = { $user } te mencionó en un comentario
notification-mention-in-chat = { $user } te mencionó en { $channel }
notification-login-new-device = Nuevo inicio de sesión detectado desde { $device } en { $location }
notification-login-failed = Intento de inicio de sesión fallido en tu cuenta
notification-password-changed = Tu contraseña fue cambiada exitosamente
notification-password-expiring = Tu contraseña expirará en { $days } días
notification-session-expired = Tu sesión ha expirado
notification-account-locked = Tu cuenta ha sido bloqueada
notification-two-factor-enabled = La autenticación de dos factores ha sido habilitada
notification-two-factor-disabled = La autenticación de dos factores ha sido deshabilitada
notification-subscription-expiring = Tu suscripción expira en { $days } días
notification-subscription-expired = Tu suscripción ha expirado
notification-subscription-renewed = Tu suscripción ha sido renovada hasta { $date }
notification-payment-successful = El pago de { $amount } fue exitoso
notification-payment-failed = El pago de { $amount } falló
notification-invoice-ready = Tu factura de { $period } está lista
notification-bot-response = { $bot } respondió a tu consulta
notification-bot-error = { $bot } encontró un error
notification-bot-offline = { $bot } está actualmente fuera de línea
notification-bot-online = { $bot } está ahora en línea
notification-bot-updated = { $bot } ha sido actualizado
notification-system-maintenance = Mantenimiento del sistema programado para { $datetime }
notification-system-update = Actualización del sistema disponible: { $version }
notification-system-restored = El sistema ha sido restaurado
notification-system-degraded = El sistema está experimentando rendimiento degradado
notification-action-view = Ver
notification-action-dismiss = Descartar
notification-action-mark-read = Marcar como leído
notification-action-mark-all-read = Marcar todo como leído
notification-action-settings = Configuración de notificaciones
notification-action-reply = Responder
notification-action-open = Abrir
notification-action-join = Unirse
notification-action-accept = Aceptar
notification-action-decline = Rechazar
notification-time-just-now = Ahora mismo
notification-time-minutes = { $count ->
[one] hace { $count } minuto
*[other] hace { $count } minutos
}
notification-time-hours = { $count ->
[one] hace { $count } hora
*[other] hace { $count } horas
}
notification-time-days = { $count ->
[one] hace { $count } día
*[other] hace { $count } días
}
notification-time-weeks = { $count ->
[one] hace { $count } semana
*[other] hace { $count } semanas
}
notification-preference-all = Todas las notificaciones
notification-preference-important = Solo importantes
notification-preference-none = Ninguna
notification-preference-email = Notificaciones por correo
notification-preference-push = Notificaciones push
notification-preference-in-app = Notificaciones en la app
notification-preference-sound = Sonido habilitado
notification-preference-vibration = Vibración habilitada
notification-empty = Sin notificaciones
notification-empty-description = ¡Estás al día!
notification-load-more = Cargar más
notification-clear-all = Limpiar todas las notificaciones
notification-filter-all = Todas
notification-filter-unread = Sin leer
notification-filter-mentions = Menciones
notification-filter-tasks = Tareas
notification-filter-messages = Mensajes
notification-filter-system = Sistema

943
locales/es/ui.ftl Normal file
View file

@ -0,0 +1,943 @@
# =============================================================================
# General Bots - Traducciones de UI en Español
# =============================================================================
# -----------------------------------------------------------------------------
# Navegación
# -----------------------------------------------------------------------------
nav-home = Inicio
nav-chat = Chat
nav-drive = Archivos
nav-tasks = Tareas
nav-mail = Correo
nav-calendar = Calendario
nav-meet = Reuniones
nav-paper = Documentos
nav-research = Investigación
nav-analytics = Analíticas
nav-settings = Configuración
nav-admin = Administración
nav-monitoring = Monitoreo
nav-sources = Fuentes
nav-tools = Herramientas
nav-attendant = Asistente
nav-crm = CRM
nav-billing = Facturación
nav-products = Productos
nav-tickets = Tickets
nav-docs = Documentos
nav-sheet = Hojas de Cálculo
nav-slides = Presentaciones
nav-social = Social
nav-all-apps = Todas las Apps
nav-people = Personas
nav-editor = Editor
nav-dashboards = Paneles
nav-security = Seguridad
nav-designer = Diseñador
nav-project = Proyecto
nav-canvas = Canvas
nav-goals = Metas
nav-player = Reproductor
nav-workspace = Espacio de Trabajo
nav-video = Video
nav-learn = Aprender
# -----------------------------------------------------------------------------
# Panel de Control
# -----------------------------------------------------------------------------
dashboard-title = Panel de Control
dashboard-welcome = ¡Bienvenido de nuevo, { $name }!
dashboard-quick-actions = Acciones Rápidas
dashboard-recent-activity = Actividad Reciente
dashboard-no-activity = Sin actividad reciente. ¡Comienza a explorar!
dashboard-analytics = Analíticas
# -----------------------------------------------------------------------------
# Acciones Rápidas
# -----------------------------------------------------------------------------
quick-start-chat = Iniciar Chat
quick-upload-files = Subir Archivos
quick-new-task = Nueva Tarea
quick-compose-email = Redactar Correo
quick-start-meeting = Iniciar Reunión
quick-new-event = Nuevo Evento
# -----------------------------------------------------------------------------
# Tarjetas de Aplicaciones
# -----------------------------------------------------------------------------
app-chat-name = Chat
app-chat-desc = Conversaciones impulsadas por IA. Haz preguntas, obtén ayuda y automatiza tareas.
app-drive-name = Archivos
app-drive-desc = Almacenamiento en la nube para todos tus archivos. Sube, organiza y comparte.
app-tasks-name = Tareas
app-tasks-desc = Mantente organizado con listas de tareas, prioridades y fechas límite.
app-mail-name = Correo
app-mail-desc = Cliente de correo con escritura asistida por IA y organización inteligente.
app-calendar-name = Calendario
app-calendar-desc = Programa reuniones, eventos y administra tu tiempo efectivamente.
app-meet-name = Reuniones
app-meet-desc = Videoconferencias con pantalla compartida y transcripción en vivo.
app-paper-name = Documentos
app-paper-desc = Escribe documentos con asistencia de IA. Notas, informes y más.
app-research-name = Investigación
app-research-desc = Búsqueda y descubrimiento impulsado por IA en todas tus fuentes.
app-analytics-name = Analíticas
app-analytics-desc = Paneles e informes para seguir el uso y obtener insights.
# -----------------------------------------------------------------------------
# Encabezado de Suite
# -----------------------------------------------------------------------------
suite-title = Suite General Bots
suite-tagline = Tu espacio de trabajo de productividad impulsado por IA. Chatea, colabora y crea.
suite-new-intent = Nueva Intención
# -----------------------------------------------------------------------------
# Panel de IA
# -----------------------------------------------------------------------------
ai-developer = Desarrollador IA
ai-developing = Desarrollando: { $project }
ai-quick-actions = Acciones Rápidas
ai-add-field = Agregar campo
ai-change-color = Cambiar color
ai-add-validation = Agregar validación
ai-export-data = Exportar datos
ai-placeholder = Escribe tus modificaciones...
ai-thinking = La IA está pensando...
ai-status-online = En línea
ai-status-offline = Desconectado
# -----------------------------------------------------------------------------
# Chat
# -----------------------------------------------------------------------------
chat-title = Chat
chat-placeholder = Escribe tu mensaje...
chat-send = Enviar
chat-new-conversation = Nueva Conversación
chat-history = Historial de Chat
chat-clear = Limpiar Chat
chat-export = Exportar Chat
chat-typing = { $name } está escribiendo...
chat-online = En línea
chat-offline = Desconectado
chat-last-seen = Última vez { $time }
chat-mention-title = Referenciar Entidad
chat-mention-placeholder = Mensaje... (escribe @ para mencionar)
chat-mention-search = Buscar entidades...
chat-mention-no-results = No se encontraron resultados
chat-mention-type-hint = Escribe : para buscar
# -----------------------------------------------------------------------------
# Drive / Archivos
# -----------------------------------------------------------------------------
drive-title = Archivos
drive-upload = Subir
drive-new-folder = Nueva Carpeta
drive-empty = Sin archivos aún. ¡Sube algo!
drive-search = Buscar archivos...
drive-sort-name = Nombre
drive-sort-date = Fecha
drive-sort-size = Tamaño
drive-sort-type = Tipo
drive-view-grid = Vista de Cuadrícula
drive-view-list = Vista de Lista
drive-selected = { $count ->
[one] { $count } elemento seleccionado
*[other] { $count } elementos seleccionados
}
drive-file-size = { $size ->
[bytes] { $value } B
[kb] { $value } KB
[mb] { $value } MB
[gb] { $value } GB
*[other] { $value } bytes
}
drive-drop-files = Arrastra archivos aquí para subir
# -----------------------------------------------------------------------------
# Tareas
# -----------------------------------------------------------------------------
tasks-title = Tareas
tasks-new = Nueva Tarea
tasks-due-today = Vence Hoy
tasks-overdue = Vencidas
tasks-completed = Completadas
tasks-all = Todas las Tareas
tasks-priority-high = Prioridad Alta
tasks-priority-medium = Prioridad Media
tasks-priority-low = Prioridad Baja
tasks-no-due-date = Sin fecha límite
tasks-add-subtask = Agregar subtarea
tasks-mark-complete = Marcar como completada
tasks-mark-incomplete = Marcar como incompleta
tasks-delete-confirm = ¿Estás seguro de que deseas eliminar esta tarea?
tasks-count = { $count ->
[zero] Sin tareas
[one] { $count } tarea
*[other] { $count } tareas
}
# -----------------------------------------------------------------------------
# Calendario
# -----------------------------------------------------------------------------
calendar-title = Calendario
calendar-today = Hoy
calendar-new-event = Nuevo Evento
calendar-all-day = Todo el día
calendar-repeat = Repetir
calendar-reminder = Recordatorio
calendar-view-day = Día
calendar-view-week = Semana
calendar-view-month = Mes
calendar-view-year = Año
calendar-no-events = Sin eventos programados
calendar-event-title = Título del evento
calendar-event-location = Ubicación
calendar-event-description = Descripción
calendar-event-attendees = Asistentes
# -----------------------------------------------------------------------------
# Meet / Videoconferencias
# -----------------------------------------------------------------------------
meet-title = Reuniones
meet-join = Unirse a Reunión
meet-start = Iniciar Reunión
meet-mute = Silenciar
meet-unmute = Activar Micrófono
meet-video-on = Cámara Encendida
meet-video-off = Cámara Apagada
meet-share-screen = Compartir Pantalla
meet-stop-sharing = Dejar de Compartir
meet-end-call = Finalizar Llamada
meet-leave = Salir de la Reunión
meet-participants = { $count ->
[one] { $count } participante
*[other] { $count } participantes
}
meet-waiting-room = Sala de Espera
meet-admit = Admitir
meet-remove = Eliminar
meet-chat = Chat de Reunión
meet-raise-hand = Levantar Mano
meet-lower-hand = Bajar Mano
meet-recording = Grabando
meet-start-recording = Iniciar Grabación
meet-stop-recording = Detener Grabación
# -----------------------------------------------------------------------------
# Correo / Email
# -----------------------------------------------------------------------------
mail-title = Correo
mail-compose = Redactar
mail-inbox = Bandeja de Entrada
mail-sent = Enviados
mail-drafts = Borradores
mail-trash = Papelera
mail-spam = Spam
mail-starred = Destacados
mail-archive = Archivo
mail-to = Para
mail-cc = CC
mail-bcc = CCO
mail-subject = Asunto
mail-body = Mensaje
mail-reply = Responder
mail-reply-all = Responder a Todos
mail-forward = Reenviar
mail-send = Enviar
mail-discard = Descartar
mail-save-draft = Guardar Borrador
mail-attach = Adjuntar Archivos
mail-unread = { $count ->
[one] { $count } sin leer
*[other] { $count } sin leer
}
mail-empty-inbox = Tu bandeja de entrada está vacía
mail-no-subject = (Sin asunto)
# -----------------------------------------------------------------------------
# Configuración
# -----------------------------------------------------------------------------
settings-title = Configuración
settings-general = General
settings-account = Cuenta
settings-notifications = Notificaciones
settings-privacy = Privacidad
settings-security = Seguridad
settings-language = Idioma
settings-theme = Tema
settings-theme-light = Claro
settings-theme-dark = Oscuro
settings-theme-system = Sistema
settings-save = Guardar Cambios
settings-saved = Configuración guardada exitosamente
settings-timezone = Zona Horaria
settings-date-format = Formato de Fecha
settings-time-format = Formato de Hora
# -----------------------------------------------------------------------------
# Autenticación / Login
# -----------------------------------------------------------------------------
auth-login = Iniciar Sesión
auth-logout = Cerrar Sesión
auth-signup = Registrarse
auth-forgot-password = ¿Olvidaste tu Contraseña?
auth-reset-password = Restablecer Contraseña
auth-email = Correo Electrónico
auth-password = Contraseña
auth-confirm-password = Confirmar Contraseña
auth-remember-me = Recordarme
auth-login-success = Sesión iniciada exitosamente
auth-logout-success = Sesión cerrada exitosamente
auth-invalid-credentials = Correo o contraseña inválidos
auth-session-expired = Tu sesión ha expirado. Por favor inicia sesión nuevamente.
# -----------------------------------------------------------------------------
# Búsqueda
# -----------------------------------------------------------------------------
search-placeholder = Buscar...
search-no-results = No se encontraron resultados
search-results = { $count ->
[one] { $count } resultado
*[other] { $count } resultados
}
search-in-progress = Buscando...
search-advanced = Búsqueda Avanzada
search-filters = Filtros
search-clear-filters = Limpiar Filtros
# -----------------------------------------------------------------------------
# Paginación
# -----------------------------------------------------------------------------
pagination-previous = Anterior
pagination-next = Siguiente
pagination-first = Primera
pagination-last = Última
pagination-page = Página { $current } de { $total }
pagination-showing = Mostrando { $from } a { $to } de { $total }
# -----------------------------------------------------------------------------
# Tablas
# -----------------------------------------------------------------------------
table-no-data = No hay datos disponibles
table-loading = Cargando datos...
table-actions = Acciones
table-select-all = Seleccionar Todo
table-deselect-all = Deseleccionar Todo
table-export = Exportar
table-import = Importar
# -----------------------------------------------------------------------------
# Formularios
# -----------------------------------------------------------------------------
form-required = Requerido
form-optional = Opcional
form-submit = Enviar
form-reset = Restablecer
form-clear = Limpiar
form-uploading = Subiendo...
form-processing = Procesando...
# -----------------------------------------------------------------------------
# Modales / Diálogos
# -----------------------------------------------------------------------------
modal-confirm-title = Confirmar Acción
modal-confirm-message = ¿Estás seguro de que deseas continuar?
modal-delete-title = Confirmación de Eliminación
modal-delete-message = Esta acción no se puede deshacer. ¿Estás seguro?
# -----------------------------------------------------------------------------
# Tooltips
# -----------------------------------------------------------------------------
tooltip-copy = Copiar al portapapeles
tooltip-copied = ¡Copiado!
tooltip-expand = Expandir
tooltip-collapse = Contraer
tooltip-refresh = Actualizar
tooltip-download = Descargar
tooltip-upload = Subir
tooltip-print = Imprimir
tooltip-fullscreen = Pantalla Completa
tooltip-exit-fullscreen = Salir de Pantalla Completa
# -----------------------------------------------------------------------------
# Configuración - Idioma y Localización
# -----------------------------------------------------------------------------
settings-language = Idioma
settings-language-desc = Elige tu idioma preferido
settings-display-language = Idioma de Visualización
settings-language-affects = Afecta todo el texto en la aplicación
settings-date-format = Formato de Fecha
settings-date-format-desc = Cómo se muestran las fechas
settings-time-format = Formato de Hora
settings-time-format-desc = Reloj de 12 horas o 24 horas
settings-saved = Configuración guardada exitosamente
settings-language-changed = Idioma cambiado exitosamente
settings-reload-required = Se requiere recargar la página para aplicar cambios
# Configuración - Perfil
settings-profile = Configuración de Perfil
settings-profile-desc = Administra tu información personal y preferencias
settings-profile-photo = Foto de Perfil
settings-profile-photo-desc = Tu foto de perfil es visible para otros usuarios
settings-upload-photo = Subir Foto
settings-remove-photo = Eliminar
settings-basic-info = Información Básica
settings-display-name = Nombre para Mostrar
settings-username = Nombre de Usuario
settings-email-address = Correo Electrónico
settings-bio = Biografía
settings-bio-placeholder = Cuéntanos sobre ti...
settings-contact-info = Información de Contacto
settings-phone-number = Número de Teléfono
settings-location = Ubicación
settings-website = Sitio Web
# Configuración - Seguridad
settings-security = Configuración de Seguridad
settings-security-desc = Protege tu cuenta con seguridad mejorada
settings-change-password = Cambiar Contraseña
settings-change-password-desc = Actualiza tu contraseña regularmente para mejor seguridad
settings-current-password = Contraseña Actual
settings-new-password = Nueva Contraseña
settings-confirm-password = Confirmar Nueva Contraseña
settings-update-password = Actualizar Contraseña
settings-2fa = Autenticación de Dos Factores
settings-2fa-desc = Agrega una capa extra de seguridad a tu cuenta
settings-authenticator-app = Aplicación de Autenticación
settings-authenticator-desc = Usa una app de autenticación para códigos 2FA
settings-enable-2fa = Habilitar 2FA
settings-disable-2fa = Deshabilitar 2FA
settings-active-sessions = Sesiones Activas
settings-active-sessions-desc = Administra tus sesiones de inicio de sesión activas
settings-this-device = Este dispositivo
settings-terminate-session = Terminar
settings-terminate-all = Terminar Todas las Otras Sesiones
# Configuración - Apariencia
settings-appearance = Apariencia
settings-appearance-desc = Personaliza cómo se ve la aplicación
settings-theme-selection = Tema
settings-theme-selection-desc = Elige tu tema de color preferido
settings-theme-dark = Oscuro
settings-theme-light = Claro
settings-theme-blue = Azul
settings-theme-purple = Púrpura
settings-theme-green = Verde
settings-theme-orange = Naranja
settings-layout-preferences = Preferencias de Diseño
settings-compact-mode = Modo Compacto
settings-compact-mode-desc = Reduce el espaciado para más contenido
settings-show-sidebar = Mostrar Barra Lateral
settings-show-sidebar-desc = Siempre mostrar la barra de navegación
settings-animations = Animaciones
settings-animations-desc = Habilitar animaciones y transiciones de UI
# Configuración - Notificaciones
settings-notifications-title = Notificaciones
settings-notifications-desc = Controla cómo recibes notificaciones
settings-email-notifications = Notificaciones por Correo
settings-direct-messages = Mensajes Directos
settings-direct-messages-desc = Recibir correo para nuevos mensajes directos
settings-mentions = Menciones
settings-mentions-desc = Recibir correo cuando alguien te menciona
settings-weekly-digest = Resumen Semanal
settings-weekly-digest-desc = Obtén un resumen semanal de actividad
settings-marketing = Marketing
settings-marketing-desc = Recibir noticias y actualizaciones de productos
settings-push-notifications = Notificaciones Push
settings-enable-push = Habilitar Notificaciones Push
settings-enable-push-desc = Recibir notificaciones push del navegador
settings-notification-sound = Sonido
settings-notification-sound-desc = Reproducir sonido para notificaciones
settings-in-app-notifications = Notificaciones en la App
# Configuración - Almacenamiento
settings-storage = Almacenamiento
settings-storage-desc = Administra tu uso de almacenamiento
settings-storage-usage = Uso de Almacenamiento
settings-storage-used = { $used } de { $total } usado
settings-storage-upgrade = Mejorar Almacenamiento
# Configuración - Privacidad
settings-privacy-title = Privacidad
settings-privacy-desc = Controla tu configuración de privacidad
settings-data-collection = Recolección de Datos
settings-analytics = Analíticas
settings-analytics-desc = Ayúdanos a mejorar enviando datos de uso anónimos
settings-crash-reports = Reportes de Errores
settings-crash-reports-desc = Enviar reportes de errores automáticamente
settings-download-data = Descargar Tus Datos
settings-download-data-desc = Obtén una copia de todos tus datos
settings-delete-account = Eliminar Cuenta
settings-delete-account-desc = Eliminar permanentemente tu cuenta y todos los datos
settings-delete-account-warning = Esta acción no se puede deshacer
# Configuración - Facturación
settings-billing = Facturación
settings-billing-desc = Administra tu suscripción y métodos de pago
settings-current-plan = Plan Actual
settings-free-plan = Plan Gratuito
settings-pro-plan = Plan Pro
settings-enterprise-plan = Plan Empresarial
settings-upgrade-plan = Mejorar Plan
settings-payment-methods = Métodos de Pago
settings-add-payment = Agregar Método de Pago
settings-billing-history = Historial de Facturación
# -----------------------------------------------------------------------------
# Paper (Editor de Documentos)
# -----------------------------------------------------------------------------
paper-title = Documentos
paper-new-note = Nueva Nota
paper-search-notes = Buscar notas...
paper-quick-start = Inicio Rápido
paper-template-blank = En Blanco
paper-template-meeting = Reunión
paper-template-todo = Lista de Tareas
paper-template-research = Investigación
paper-untitled = Sin Título
paper-placeholder = Comienza a escribir, o escribe / para comandos...
paper-commands = Comandos
paper-heading1 = Título 1
paper-heading1-desc = Título de sección grande
paper-heading2 = Título 2
paper-heading2-desc = Título de sección mediano
paper-heading3 = Título 3
paper-heading3-desc = Título de sección pequeño
paper-paragraph = Párrafo
paper-paragraph-desc = Texto plano
paper-bullet-list = Lista con Viñetas
paper-bullet-list-desc = Lista sin orden
paper-numbered-list = Lista Numerada
paper-numbered-list-desc = Lista ordenada
paper-todo-list = Lista de Tareas
paper-todo-list-desc = Lista de tareas marcables
paper-quote = Cita
paper-quote-desc = Bloque de cita para referencias
paper-divider = Divisor
# =============================================================================
# CRM
# =============================================================================
# -----------------------------------------------------------------------------
# CRM Navegación & General
# -----------------------------------------------------------------------------
crm-title = CRM
crm-pipeline = Pipeline
crm-leads = Leads
crm-opportunities = Oportunidades
crm-accounts = Cuentas
crm-contacts = Contactos
crm-activities = Actividades
# -----------------------------------------------------------------------------
# CRM Entidades
# -----------------------------------------------------------------------------
crm-lead = Lead
crm-lead-desc = Prospecto no calificado
crm-opportunity = Oportunidad
crm-opportunity-desc = Oportunidad de venta calificada
crm-account = Cuenta
crm-account-desc = Empresa u organización
crm-contact = Contacto
crm-contact-desc = Persona en una cuenta
crm-activity = Actividad
crm-activity-desc = Tarea, llamada o correo
# -----------------------------------------------------------------------------
# CRM Acciones
# -----------------------------------------------------------------------------
crm-qualify = Calificar
crm-convert = Convertir
crm-won = Ganado
crm-lost = Perdido
crm-new-lead = Nuevo Lead
crm-new-opportunity = Nueva Oportunidad
crm-new-account = Nueva Cuenta
crm-new-contact = Nuevo Contacto
# -----------------------------------------------------------------------------
# CRM Campos
# -----------------------------------------------------------------------------
crm-stage = Etapa
crm-value = Valor
crm-probability = Probabilidad
crm-close-date = Fecha de Cierre
crm-company = Empresa
crm-phone = Teléfono
crm-email = Correo
crm-source = Origen
crm-owner = Responsable
# -----------------------------------------------------------------------------
# CRM Etapas del Pipeline
# -----------------------------------------------------------------------------
crm-pipeline-new = Nuevo
crm-pipeline-contacted = Contactado
crm-pipeline-qualified = Calificado
crm-pipeline-proposal = Propuesta
crm-pipeline-negotiation = Negociación
crm-pipeline-closed-won = Cerrado Ganado
crm-pipeline-closed-lost = Cerrado Perdido
# -----------------------------------------------------------------------------
# CRM Estadísticas & Métricas
# -----------------------------------------------------------------------------
crm-subtitle = Gestionar leads, oportunidades y clientes
crm-stage-lead = Lead
crm-stage-qualified = Calificado
crm-stage-proposal = Propuesta
crm-stage-negotiation = Negociación
crm-stage-won = Ganado
crm-stage-lost = Perdido
crm-conversion-rate = Tasa de Conversión
crm-pipeline-value = Valor del Pipeline
crm-avg-deal = Valor Promedio
crm-won-month = Ganados Este Mes
# -----------------------------------------------------------------------------
# CRM Estados Vacíos
# -----------------------------------------------------------------------------
crm-no-leads = No se encontraron leads
crm-no-opportunities = No se encontraron oportunidades
crm-no-accounts = No se encontraron cuentas
crm-no-contacts = No se encontraron contactos
crm-drag-hint = Arrastra las tarjetas para cambiar la etapa
# =============================================================================
# Facturación
# =============================================================================
# -----------------------------------------------------------------------------
# Facturación Navegación & General
# -----------------------------------------------------------------------------
billing-title = Facturación
billing-invoices = Facturas
billing-payments = Pagos
billing-quotes = Cotizaciones
billing-dashboard = Panel
# -----------------------------------------------------------------------------
# Facturación Entidades
# -----------------------------------------------------------------------------
billing-invoice = Factura
billing-invoice-desc = Cobro al cliente
billing-payment = Pago
billing-payment-desc = Pago recibido
billing-quote = Cotización
billing-quote-desc = Cotización de precio
# -----------------------------------------------------------------------------
# Facturación Estado
# -----------------------------------------------------------------------------
billing-due-date = Fecha de Vencimiento
billing-overdue = Vencido
billing-paid = Pagado
billing-pending = Pendiente
billing-draft = Borrador
billing-sent = Enviado
billing-partial = Parcial
billing-cancelled = Cancelado
# -----------------------------------------------------------------------------
# Facturación Acciones
# -----------------------------------------------------------------------------
billing-new-invoice = Nueva Factura
billing-new-quote = Nueva Cotización
billing-new-payment = Nuevo Pago
billing-send-invoice = Enviar Factura
billing-record-payment = Registrar Pago
billing-mark-paid = Marcar como Pagado
billing-void = Anular
# -----------------------------------------------------------------------------
# Facturación Campos
# -----------------------------------------------------------------------------
billing-amount = Monto
billing-tax = Impuesto
billing-subtotal = Subtotal
billing-total = Total
billing-discount = Descuento
billing-line-items = Artículos
billing-add-item = Agregar Artículo
billing-remove-item = Eliminar Artículo
billing-customer = Cliente
billing-issue-date = Fecha de Emisión
billing-payment-terms = Términos de Pago
billing-notes = Notas
billing-invoice-number = Número de Factura
billing-quote-number = Número de Cotización
# -----------------------------------------------------------------------------
# Facturación Reportes
# -----------------------------------------------------------------------------
billing-revenue = Ingresos
billing-outstanding = Pendiente
billing-this-month = Este Mes
billing-last-month = Mes Pasado
billing-total-paid = Total Pagado
billing-total-overdue = Total Vencido
billing-subtitle = Facturas, pagos y cotizaciones
billing-revenue-month = Ingresos Este Mes
billing-total-revenue = Ingresos Totales
billing-paid-month = Pagado Este Mes
# -----------------------------------------------------------------------------
# Facturación Estados Vacíos
# -----------------------------------------------------------------------------
billing-no-invoices = No se encontraron facturas
billing-no-payments = No se encontraron pagos
billing-no-quotes = No se encontraron cotizaciones
# =============================================================================
# Productos
# =============================================================================
# -----------------------------------------------------------------------------
# Productos Navegación & General
# -----------------------------------------------------------------------------
products-title = Productos
products-catalog = Catálogo
products-services = Servicios
products-price-lists = Listas de Precios
products-inventory = Inventario
# -----------------------------------------------------------------------------
# Productos Entidades
# -----------------------------------------------------------------------------
products-product = Producto
products-product-desc = Producto físico o digital
products-service = Servicio
products-service-desc = Oferta de servicio
products-price-list = Lista de Precios
products-price-list-desc = Niveles de precios
# -----------------------------------------------------------------------------
# Productos Acciones
# -----------------------------------------------------------------------------
products-new-product = Nuevo Producto
products-new-service = Nuevo Servicio
products-new-price-list = Nueva Lista de Precios
products-new-pricelist = Nueva Lista de Precios
products-edit-product = Editar Producto
products-duplicate = Duplicar
# -----------------------------------------------------------------------------
# Productos Campos
# -----------------------------------------------------------------------------
products-sku = SKU
products-category = Categoría
products-price = Precio
products-unit = Unidad
products-stock = Stock
products-cost = Costo
products-margin = Margen
products-barcode = Código de Barras
# -----------------------------------------------------------------------------
# Productos Estado
# -----------------------------------------------------------------------------
products-in-stock = En Stock
products-out-of-stock = Sin Stock
products-low-stock = Stock Bajo
products-active = Activo
products-inactive = Inactivo
products-featured = Destacado
products-archived = Archivado
# -----------------------------------------------------------------------------
# Productos Estadísticas & Métricas
# -----------------------------------------------------------------------------
products-subtitle = Gestionar productos, servicios y precios
products-items = Productos
products-pricelists = Listas de Precios
products-total-products = Total de Productos
products-total-services = Total de Servicios
# -----------------------------------------------------------------------------
# Productos Estados Vacíos
# -----------------------------------------------------------------------------
products-no-products = No se encontraron productos
products-no-services = No se encontraron servicios
products-no-price-lists = No se encontraron listas de precios
# =============================================================================
# Tickets (Casos de Soporte)
# =============================================================================
# -----------------------------------------------------------------------------
# Tickets Navegación & General
# -----------------------------------------------------------------------------
tickets-title = Tickets
tickets-cases = Casos
tickets-open = Abiertos
tickets-closed = Cerrados
tickets-all = Todos los Tickets
tickets-my-tickets = Mis Tickets
# -----------------------------------------------------------------------------
# Tickets Entidades
# -----------------------------------------------------------------------------
tickets-case = Caso
tickets-case-desc = Ticket de soporte
tickets-resolution = Resolución
tickets-resolution-desc = Solución sugerida por IA
# -----------------------------------------------------------------------------
# Tickets Prioridad
# -----------------------------------------------------------------------------
tickets-priority = Prioridad
tickets-priority-low = Baja
tickets-priority-medium = Media
tickets-priority-high = Alta
tickets-priority-urgent = Urgente
# -----------------------------------------------------------------------------
# Tickets Estado
# -----------------------------------------------------------------------------
tickets-status = Estado
tickets-status-new = Nuevo
tickets-status-open = Abierto
tickets-status-pending = Pendiente
tickets-status-resolved = Resuelto
tickets-status-closed = Cerrado
tickets-status-on-hold = En Espera
# -----------------------------------------------------------------------------
# Tickets Acciones
# -----------------------------------------------------------------------------
tickets-new-ticket = Nuevo Ticket
tickets-assign = Asignar
tickets-reassign = Reasignar
tickets-escalate = Escalar
tickets-resolve = Resolver
tickets-reopen = Reabrir
tickets-close = Cerrar
tickets-merge = Fusionar
# -----------------------------------------------------------------------------
# Tickets Campos
# -----------------------------------------------------------------------------
tickets-subject = Asunto
tickets-description = Descripción
tickets-category = Categoría
tickets-assigned = Asignado a
tickets-unassigned = Sin Asignar
tickets-created = Creado
tickets-updated = Actualizado
tickets-response-time = Tiempo de Respuesta
tickets-resolution-time = Tiempo de Resolución
tickets-customer = Cliente
tickets-internal-notes = Notas Internas
tickets-attachments = Adjuntos
# -----------------------------------------------------------------------------
# Tickets Funciones de IA
# -----------------------------------------------------------------------------
tickets-ai-suggestion = Sugerencia de IA
tickets-apply-suggestion = Aplicar Sugerencia
tickets-ai-summary = Resumen de IA
tickets-similar-tickets = Tickets Similares
tickets-suggested-articles = Artículos Sugeridos
# -----------------------------------------------------------------------------
# Tickets Estados Vacíos
# -----------------------------------------------------------------------------
tickets-no-tickets = No se encontraron tickets
tickets-no-open = No hay tickets abiertos
tickets-no-closed = No hay tickets cerrados
# -----------------------------------------------------------------------------
# Security Module
# -----------------------------------------------------------------------------
security-title = Seguridad
security-subtitle = Herramientas de seguridad, escaneo de cumplimiento y protección del servidor
security-tab-compliance = Informe de Cumplimiento API
security-tab-protection = Protección
security-export-report = Exportar Informe
security-run-scan = Ejecutar Escaneo
security-critical = Crítico
security-critical-desc = Acción inmediata requerida
security-high = Alto
security-high-desc = Riesgo de seguridad
security-medium = Medio
security-medium-desc = Debe ser atendido
security-low = Bajo
security-low-desc = Mejores prácticas
security-info = Info
security-info-desc = Informativo
security-filter-severity = Severidad:
security-filter-all-severities = Todas las Severidades
security-filter-type = Tipo:
security-filter-all-types = Todos los Tipos
security-type-password = Contraseña en Config
security-type-hardcoded = Secretos Hardcodeados
security-type-deprecated = Palabras Clave Obsoletas
security-type-fragile = Código Frágil
security-type-config = Problemas de Configuración
security-results = Problemas de Cumplimiento
security-col-severity = Severidad
security-col-issue = Tipo de Problema
security-col-location = Ubicación
security-col-details = Descripción
security-col-action = Acción
# -----------------------------------------------------------------------------
# Learn Module
# -----------------------------------------------------------------------------
learn-title = Aprender
learn-my-progress = Mi Progreso
learn-completed = Completados
learn-in-progress = En Progreso
learn-certificates = Certificados
learn-time-spent = Tiempo Invertido
learn-categories = Categorías
learn-all-courses = Todos los Cursos
learn-mandatory = Obligatorio
learn-compliance = Cumplimiento
learn-security = Seguridad
learn-skills = Habilidades
learn-onboarding = Incorporación
learn-difficulty = Dificultad
learn-my-certificates = Mis Certificados
learn-view-all = Ver Todo
# -----------------------------------------------------------------------------
# Workspace Module
# -----------------------------------------------------------------------------
workspace-title = Espacio de Trabajo
workspace-search-pages = Buscar páginas...
workspace-recent = Recientes
workspace-favorites = Favoritos
workspace-pages = Páginas
workspace-templates = Plantillas
workspace-trash = Papelera
workspace-settings = Configuración
# -----------------------------------------------------------------------------
# Player Module
# -----------------------------------------------------------------------------
player-title = Reproductor de Medios
player-no-file = Ningún archivo seleccionado
player-search = Buscar archivos...
player-recent = Recientes
player-files = Archivos
# -----------------------------------------------------------------------------
# Goals Module
# -----------------------------------------------------------------------------
goals-title = Metas y OKRs
goals-dashboard = Panel
goals-objectives = Objetivos
goals-alignment = Alineación
goals-ai-suggestions = Sugerencias de IA

142
locales/es/video.ftl Normal file
View file

@ -0,0 +1,142 @@
# =============================================================================
# General Bots - Spanish Video Editor Translations
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation
# -----------------------------------------------------------------------------
nav-video = Video
# -----------------------------------------------------------------------------
# Video Editor - Main
# -----------------------------------------------------------------------------
video-title = Editor de Video
video-new-project = Nuevo Proyecto
video-project-info = Información del Proyecto
video-duration = Duración
video-clips = Clips
video-layers = Capas
video-resolution = Resolución
# -----------------------------------------------------------------------------
# Video Editor - Add Elements
# -----------------------------------------------------------------------------
video-add-elements = Agregar Elementos
video-add-clip = Clip de Video
video-add-text = Texto
video-add-image = Imagen
video-add-shape = Forma
video-add-audio = Audio
video-add-narration = Narración
# -----------------------------------------------------------------------------
# Video Editor - Properties
# -----------------------------------------------------------------------------
video-properties = Propiedades
video-name = Nombre
video-volume = Volumen
video-opacity = Opacidad
video-position-x = Posición X
video-position-y = Posición Y
video-rotation = Rotación
video-transition-in = Transición de Entrada
video-transition-out = Transición de Salida
# -----------------------------------------------------------------------------
# Video Editor - Timeline
# -----------------------------------------------------------------------------
video-video-track = Video
video-text-track = Texto y Superposiciones
video-audio-track = Audio
# -----------------------------------------------------------------------------
# Video Editor - Preview
# -----------------------------------------------------------------------------
video-preview = Vista Previa
video-add-content = Agrega clips o elementos para comenzar a editar
# -----------------------------------------------------------------------------
# Video Editor - Chat
# -----------------------------------------------------------------------------
video-ai-assistant = Asistente IA
video-playhead-at = Cursor:
video-selected = Seleccionado:
video-chat-placeholder = Describe lo que quieres cambiar...
video-chat-welcome = ¡Hola! Soy tu asistente de edición de video. Puedes decirme qué cambiar, como "agrega un título aquí" o "hazlo más grande". Entenderé tu selección actual y la posición del cursor.
# -----------------------------------------------------------------------------
# Video Editor - Export
# -----------------------------------------------------------------------------
video-export = Exportar
video-export-video = Exportar Video
video-format = Formato
video-quality = Calidad
video-start-export = Iniciar Exportación
video-exporting = Exportando...
video-export-complete = Exportación Completa
video-export-failed = Exportación Fallida
# -----------------------------------------------------------------------------
# Video Editor - Projects
# -----------------------------------------------------------------------------
video-recent-projects = Proyectos Recientes
video-no-projects = Aún no hay proyectos
video-create-first = Crea tu primer proyecto de video
video-project-name = Nombre del Proyecto
video-aspect-ratio = Relación de Aspecto
video-frame-rate = Velocidad de Fotogramas
video-create = Crear
# -----------------------------------------------------------------------------
# Video Editor - Text Layer
# -----------------------------------------------------------------------------
video-text-content = Contenido del Texto
video-font-family = Fuente
video-font-size = Tamaño
video-text-color = Color
video-duration-sec = Duración (seg)
video-add = Agregar
# -----------------------------------------------------------------------------
# Video Editor - Actions
# -----------------------------------------------------------------------------
video-undo = Deshacer
video-redo = Rehacer
video-cut = Cortar
video-split = Dividir
video-delete = Eliminar
video-save = Guardar
# -----------------------------------------------------------------------------
# Video Editor - Status
# -----------------------------------------------------------------------------
video-status-draft = Borrador
video-status-editing = Editando
video-status-exporting = Exportando
video-status-published = Publicado
video-status-archived = Archivado
# -----------------------------------------------------------------------------
# Video Editor - Notifications
# -----------------------------------------------------------------------------
video-project-created = Proyecto creado
video-project-saved = Proyecto guardado
video-clip-added = Clip agregado
video-layer-added = Capa agregada
video-text-added = Capa de texto agregada
video-shape-added = Forma agregada
video-audio-added = Pista de audio agregada
video-item-deleted = Elemento eliminado
video-export-started = Exportación iniciada
video-export-completed = Exportación completada exitosamente
video-error-create-project = Error al crear proyecto
video-error-load-project = Error al cargar proyecto
video-error-add-clip = Error al agregar clip
video-error-add-layer = Error al agregar capa
video-error-delete = Error al eliminar elemento
video-error-export = Error al iniciar exportación
video-create-project-first = Por favor crea un proyecto primero
video-select-clip-to-split = Selecciona un clip para dividir
video-playhead-within-clip = El cursor debe estar dentro del clip seleccionado
video-tts-coming-soon = Generación de TTS próximamente
video-split-coming-soon = Función de dividir próximamente

313
locales/es/webinar.ftl Normal file
View file

@ -0,0 +1,313 @@
# =============================================================================
# General Bots - Webinar Translations (Spanish)
# =============================================================================
# Traducciones de la interfaz de webinar, grabación y transcripción
# =============================================================================
# -----------------------------------------------------------------------------
# Webinar Navigation & Headers
# -----------------------------------------------------------------------------
webinar-title = Webinars
webinar-subtitle = Organiza y gestiona webinars
webinar-nav-upcoming = Próximos
webinar-nav-live = En Vivo
webinar-nav-past = Webinars Anteriores
webinar-nav-recordings = Grabaciones
webinar-nav-analytics = Análisis
# -----------------------------------------------------------------------------
# Webinar Status
# -----------------------------------------------------------------------------
webinar-status-draft = Borrador
webinar-status-scheduled = Programado
webinar-status-live = En Vivo
webinar-status-paused = Pausado
webinar-status-ended = Finalizado
webinar-status-cancelled = Cancelado
# -----------------------------------------------------------------------------
# Webinar Fields
# -----------------------------------------------------------------------------
webinar-field-title = Título
webinar-field-description = Descripción
webinar-field-scheduled-start = Fecha y Hora de Inicio
webinar-field-scheduled-end = Fecha y Hora de Fin
webinar-field-duration = Duración
webinar-field-timezone = Zona Horaria
webinar-field-host = Anfitrión
webinar-field-panelists = Panelistas
webinar-field-max-attendees = Máximo de Asistentes
webinar-field-registration-url = URL de Registro
# -----------------------------------------------------------------------------
# Webinar Actions
# -----------------------------------------------------------------------------
webinar-action-create = Crear Webinar
webinar-action-edit = Editar Webinar
webinar-action-delete = Eliminar Webinar
webinar-action-cancel = Cancelar Webinar
webinar-action-start = Iniciar Webinar
webinar-action-end = Finalizar Webinar
webinar-action-pause = Pausar Webinar
webinar-action-resume = Reanudar Webinar
webinar-action-join = Unirse al Webinar
webinar-action-leave = Salir del Webinar
webinar-action-share = Compartir Enlace
webinar-action-copy-link = Copiar Enlace
webinar-action-invite = Invitar Panelistas
# -----------------------------------------------------------------------------
# Participant Roles
# -----------------------------------------------------------------------------
webinar-role-host = Anfitrión
webinar-role-cohost = Co-Anfitrión
webinar-role-presenter = Presentador
webinar-role-panelist = Panelista
webinar-role-attendee = Asistente
# -----------------------------------------------------------------------------
# Participant Actions
# -----------------------------------------------------------------------------
webinar-participant-mute = Silenciar
webinar-participant-unmute = Activar Audio
webinar-participant-video-on = Activar Vídeo
webinar-participant-video-off = Desactivar Vídeo
webinar-participant-promote = Promover a Panelista
webinar-participant-demote = Degradar a Asistente
webinar-participant-remove = Expulsar del Webinar
webinar-participant-allow-speak = Permitir Hablar
webinar-participant-spotlight = Destacar
# -----------------------------------------------------------------------------
# Hand Raising
# -----------------------------------------------------------------------------
webinar-hand-raise = Levantar la Mano
webinar-hand-lower = Bajar la Mano
webinar-hand-raised-count = { $count } manos levantadas
webinar-hand-allow = Permitir Hablar
webinar-hand-dismiss = Descartar
# -----------------------------------------------------------------------------
# Q&A Panel
# -----------------------------------------------------------------------------
webinar-qa-title = Preguntas y Respuestas
webinar-qa-submit = Enviar Pregunta
webinar-qa-placeholder = Escribe tu pregunta...
webinar-qa-anonymous = Preguntar Anónimamente
webinar-qa-pending = Preguntas Pendientes
webinar-qa-answered = Preguntas Respondidas
webinar-qa-dismissed = Descartadas
webinar-qa-upvote = Votar
webinar-qa-upvotes = { $count } votos
webinar-qa-answer = Responder
webinar-qa-answer-live = Responder en Vivo
webinar-qa-dismiss = Descartar
webinar-qa-pin = Fijar Pregunta
webinar-qa-unpin = Desfijar
webinar-qa-highlight = Destacar
webinar-qa-no-questions = Aún no hay preguntas
# -----------------------------------------------------------------------------
# Polls
# -----------------------------------------------------------------------------
webinar-poll-title = Encuestas
webinar-poll-create = Crear Encuesta
webinar-poll-launch = Lanzar Encuesta
webinar-poll-close = Cerrar Encuesta
webinar-poll-results = Mostrar Resultados
webinar-poll-hide-results = Ocultar Resultados
webinar-poll-question = Pregunta
webinar-poll-options = Opciones
webinar-poll-add-option = Añadir Opción
webinar-poll-single-choice = Opción Única
webinar-poll-multiple-choice = Opción Múltiple
webinar-poll-votes = { $count } votos
webinar-poll-vote = Votar
webinar-poll-voted = Has votado
# -----------------------------------------------------------------------------
# Registration
# -----------------------------------------------------------------------------
webinar-registration-title = Registro
webinar-registration-required = Registro Obligatorio
webinar-registration-open = Registro Abierto
webinar-registration-closed = Registro Cerrado
webinar-registration-register = Registrarse
webinar-registration-registered = Estás Registrado
webinar-registration-cancel = Cancelar Registro
webinar-registration-count = { $count } registrados
webinar-registration-fields = Campos de Registro
webinar-registration-name = Nombre Completo
webinar-registration-email = Correo Electrónico
webinar-registration-confirmation = Registro Confirmado
webinar-registration-pending = Confirmación Pendiente
webinar-registration-waitlist = Lista de Espera
# -----------------------------------------------------------------------------
# Webinar Settings
# -----------------------------------------------------------------------------
webinar-settings-title = Configuración del Webinar
webinar-settings-general = General
webinar-settings-permissions = Permisos
webinar-settings-registration = Registro
webinar-settings-recording = Grabación
webinar-settings-allow-chat = Permitir Chat
webinar-settings-allow-qa = Permitir Preguntas y Respuestas
webinar-settings-allow-hand-raise = Permitir Levantar la Mano
webinar-settings-allow-reactions = Permitir Reacciones
webinar-settings-moderated-qa = Preguntas Moderadas
webinar-settings-anonymous-qa = Permitir Preguntas Anónimas
webinar-settings-waiting-room = Habilitar Sala de Espera
webinar-settings-practice-session = Sesión de Práctica
webinar-settings-auto-record = Grabar Automáticamente
# -----------------------------------------------------------------------------
# Recording
# -----------------------------------------------------------------------------
recording-title = Grabaciones
recording-start = Iniciar Grabación
recording-stop = Detener Grabación
recording-pause = Pausar Grabación
recording-resume = Reanudar Grabación
recording-status-recording = Grabando
recording-status-processing = Procesando
recording-status-ready = Lista
recording-status-failed = Fallida
recording-status-deleted = Eliminada
recording-status-expired = Expirada
recording-duration = Duración
recording-size = Tamaño del Archivo
recording-quality = Calidad
recording-quality-standard = Estándar (720p)
recording-quality-high = Alta (1080p)
recording-quality-ultra = Ultra (4K)
recording-quality-audio = Solo Audio
recording-download = Descargar Grabación
recording-share = Compartir Grabación
recording-delete = Eliminar Grabación
recording-view-count = { $count } visualizaciones
recording-download-count = { $count } descargas
recording-expires = Expira el { $date }
# -----------------------------------------------------------------------------
# Transcription
# -----------------------------------------------------------------------------
transcription-title = Transcripción
transcription-start = Iniciar Transcripción
transcription-status-pending = Pendiente
transcription-status-in-progress = Transcribiendo...
transcription-status-completed = Completada
transcription-status-failed = Fallida
transcription-status-partial = Parcialmente Completada
transcription-language = Idioma
transcription-speaker-identification = Identificación de Hablantes
transcription-speakers = { $count } hablantes identificados
transcription-words = { $count } palabras
transcription-confidence = { $percent }% de confianza
transcription-download = Descargar Transcripción
transcription-export = Exportar
transcription-export-txt = Texto Plano (.txt)
transcription-export-vtt = WebVTT (.vtt)
transcription-export-srt = SubRip (.srt)
transcription-export-json = JSON (.json)
transcription-search = Buscar en transcripción...
transcription-jump-to = Ir al momento
transcription-edit = Editar Transcripción
transcription-save = Guardar Cambios
# -----------------------------------------------------------------------------
# Transcription Languages
# -----------------------------------------------------------------------------
transcription-lang-en-us = Inglés (EE.UU.)
transcription-lang-en-gb = Inglés (Reino Unido)
transcription-lang-es-es = Español (España)
transcription-lang-es-mx = Español (México)
transcription-lang-fr-fr = Francés
transcription-lang-de-de = Alemán
transcription-lang-it-it = Italiano
transcription-lang-pt-br = Portugués (Brasil)
transcription-lang-pt-pt = Portugués (Portugal)
transcription-lang-nl-nl = Holandés
transcription-lang-pl-pl = Polaco
transcription-lang-ru-ru = Ruso
transcription-lang-ja-jp = Japonés
transcription-lang-ko-kr = Coreano
transcription-lang-zh-cn = Chino (Simplificado)
transcription-lang-zh-tw = Chino (Tradicional)
transcription-lang-ar-sa = Árabe
transcription-lang-hi-in = Hindi
transcription-lang-tr-tr = Turco
transcription-lang-vi-vn = Vietnamita
# -----------------------------------------------------------------------------
# Webinar Analytics
# -----------------------------------------------------------------------------
webinar-analytics-title = Análisis del Webinar
webinar-analytics-overview = Resumen
webinar-analytics-registrations = Total de Registros
webinar-analytics-attendees = Total de Asistentes
webinar-analytics-peak-attendees = Pico de Asistentes
webinar-analytics-avg-watch-time = Tiempo Medio de Visualización
webinar-analytics-questions = Preguntas Realizadas
webinar-analytics-questions-answered = Preguntas Respondidas
webinar-analytics-reactions = Reacciones
webinar-analytics-poll-participation = Participación en Encuestas
webinar-analytics-engagement = Puntuación de Engagement
webinar-analytics-retention = Retención de Audiencia
webinar-analytics-export = Exportar Informe
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
webinar-empty-upcoming = No hay webinars programados
webinar-empty-past = No hay webinars anteriores
webinar-empty-recordings = No hay grabaciones disponibles
webinar-empty-schedule = Programa tu primer webinar
webinar-empty-transcription = No hay transcripción disponible
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
webinar-confirm-end = ¿Estás seguro de que quieres finalizar este webinar?
webinar-confirm-cancel = ¿Estás seguro de que quieres cancelar este webinar?
webinar-confirm-delete = ¿Estás seguro de que quieres eliminar este webinar?
webinar-confirm-delete-recording = ¿Estás seguro de que quieres eliminar esta grabación?
webinar-confirm-stop-recording = ¿Estás seguro de que quieres detener la grabación?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
webinar-success-created = Webinar creado con éxito
webinar-success-updated = Webinar actualizado con éxito
webinar-success-started = Webinar iniciado
webinar-success-ended = Webinar finalizado
webinar-success-cancelled = Webinar cancelado
webinar-success-recording-started = Grabación iniciada
webinar-success-recording-stopped = Grabación detenida
webinar-success-transcription-started = Transcripción iniciada
webinar-success-transcription-completed = Transcripción completada
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
webinar-error-create = Error al crear webinar
webinar-error-start = Error al iniciar webinar
webinar-error-join = Error al unirse al webinar
webinar-error-recording-start = Error al iniciar grabación
webinar-error-recording-stop = Error al detener grabación
webinar-error-transcription = Error en la transcripción
webinar-error-max-participants = Número máximo de participantes alcanzado
webinar-error-not-authorized = No estás autorizado para realizar esta acción
webinar-error-webinar-ended = Este webinar ha finalizado
webinar-error-registration-closed = El registro está cerrado
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
webinar-notify-starting-soon = El webinar comienza en { $minutes } minutos
webinar-notify-started = El webinar ha comenzado
webinar-notify-ended = El webinar ha finalizado
webinar-notify-hand-raised = { $name } ha levantado la mano
webinar-notify-question-submitted = Nueva pregunta enviada
webinar-notify-recording-ready = La grabación está lista
webinar-notify-transcription-ready = La transcripción está lista

557
locales/pt-BR/admin.ftl Normal file
View file

@ -0,0 +1,557 @@
# =============================================================================
# General Bots - Traduções de Administração (Português Brasileiro)
# =============================================================================
# Traduções da interface administrativa para o Painel Admin do GB
# =============================================================================
# -----------------------------------------------------------------------------
# Navegação Admin & Painel
# -----------------------------------------------------------------------------
admin-title = Administração
admin-dashboard = Painel Administrativo
admin-overview = Visão Geral
admin-welcome = Bem-vindo ao Painel Administrativo
admin-nav-dashboard = Painel
admin-nav-users = Usuários
admin-nav-bots = Bots
admin-nav-tenants = Inquilinos
admin-nav-settings = Configurações
admin-nav-logs = Logs
admin-nav-analytics = Análises
admin-nav-security = Segurança
admin-nav-integrations = Integrações
admin-nav-billing = Faturamento
admin-nav-support = Suporte
admin-nav-groups = Grupos
admin-nav-dns = DNS
admin-nav-system = Sistema
# -----------------------------------------------------------------------------
# Ações Rápidas Admin
# -----------------------------------------------------------------------------
admin-quick-actions = Ações Rápidas
admin-create-user = Criar Usuário
admin-create-group = Criar Grupo
admin-register-dns = Registrar DNS
admin-recent-activity = Atividade Recente
admin-system-health = Saúde do Sistema
# -----------------------------------------------------------------------------
# Gerenciamento de Usuários
# -----------------------------------------------------------------------------
admin-users-title = Gerenciamento de Usuários
admin-users-list = Lista de Usuários
admin-users-add = Adicionar Usuário
admin-users-edit = Editar Usuário
admin-users-delete = Excluir Usuário
admin-users-search = Buscar usuários...
admin-users-filter = Filtrar Usuários
admin-users-export = Exportar Usuários
admin-users-import = Importar Usuários
admin-users-total = Total de Usuários
admin-users-active = Usuários Ativos
admin-users-inactive = Usuários Inativos
admin-users-suspended = Usuários Suspensos
admin-users-pending = Verificação Pendente
admin-users-last-login = Último Login
admin-users-created = Criado em
admin-users-role = Função
admin-users-status = Status
admin-users-actions = Ações
admin-users-no-users = Nenhum usuário encontrado
admin-users-confirm-delete = Tem certeza que deseja excluir este usuário?
admin-users-deleted = Usuário excluído com sucesso
admin-users-saved = Usuário salvo com sucesso
admin-users-invite = Convidar Usuário
admin-users-invite-sent = Convite enviado com sucesso
admin-users-bulk-actions = Ações em Massa
admin-users-select-all = Selecionar Todos
admin-users-deselect-all = Desmarcar Todos
# Detalhes do Usuário
admin-user-details = Detalhes do Usuário
admin-user-profile = Perfil
admin-user-email = E-mail
admin-user-name = Nome
admin-user-phone = Telefone
admin-user-avatar = Avatar
admin-user-timezone = Fuso Horário
admin-user-language = Idioma
admin-user-role-admin = Administrador
admin-user-role-manager = Gerente
admin-user-role-user = Usuário
admin-user-role-viewer = Visualizador
admin-user-status-active = Ativo
admin-user-status-inactive = Inativo
admin-user-status-suspended = Suspenso
admin-user-status-pending = Pendente
admin-user-permissions = Permissões
admin-user-activity = Log de Atividades
admin-user-sessions = Sessões Ativas
admin-user-terminate-session = Encerrar Sessão
admin-user-terminate-all = Encerrar Todas as Sessões
admin-user-reset-password = Redefinir Senha
admin-user-force-logout = Forçar Logout
admin-user-enable-2fa = Ativar 2FA
admin-user-disable-2fa = Desativar 2FA
# -----------------------------------------------------------------------------
# Gerenciamento de Grupos
# -----------------------------------------------------------------------------
admin-groups-title = Gerenciamento de Grupos
admin-groups-subtitle = Gerencie grupos, membros e permissões
admin-groups-list = Lista de Grupos
admin-groups-add = Adicionar Grupo
admin-groups-create = Criar Grupo
admin-groups-edit = Editar Grupo
admin-groups-delete = Excluir Grupo
admin-groups-search = Buscar grupos...
admin-groups-filter = Filtrar Grupos
admin-groups-total = Total de Grupos
admin-groups-active = Grupos Ativos
admin-groups-no-groups = Nenhum grupo encontrado
admin-groups-confirm-delete = Tem certeza que deseja excluir este grupo?
admin-groups-deleted = Grupo excluído com sucesso
admin-groups-saved = Grupo salvo com sucesso
admin-groups-created = Grupo criado com sucesso
admin-groups-loading = Carregando grupos...
# Detalhes do Grupo
admin-group-details = Detalhes do Grupo
admin-group-name = Nome do Grupo
admin-group-description = Descrição
admin-group-visibility = Visibilidade
admin-group-visibility-public = Público
admin-group-visibility-private = Privado
admin-group-visibility-hidden = Oculto
admin-group-join-policy = Política de Entrada
admin-group-join-invite = Apenas por Convite
admin-group-join-request = Solicitar Entrada
admin-group-join-open = Aberto
admin-group-members = Membros
admin-group-member-count = { $count ->
[one] { $count } membro
*[other] { $count } membros
}
admin-group-add-member = Adicionar Membro
admin-group-remove-member = Remover Membro
admin-group-permissions = Permissões
admin-group-settings = Configurações
admin-group-analytics = Análises
admin-group-overview = Visão Geral
# Modos de Visualização de Grupos
admin-groups-view-grid = Visualização em Grade
admin-groups-view-list = Visualização em Lista
admin-groups-all-visibility = Todas as Visibilidades
# -----------------------------------------------------------------------------
# Gerenciamento de DNS
# -----------------------------------------------------------------------------
admin-dns-title = Gerenciamento de DNS
admin-dns-subtitle = Registre e gerencie hostnames DNS para seus bots
admin-dns-register = Registrar Hostname
admin-dns-registered = Hostnames Registrados
admin-dns-search = Buscar hostnames...
admin-dns-refresh = Atualizar
admin-dns-loading = Carregando registros DNS...
admin-dns-no-records = Nenhum registro DNS encontrado
admin-dns-confirm-delete = Tem certeza que deseja remover este hostname?
admin-dns-deleted = Hostname removido com sucesso
admin-dns-saved = Registro DNS salvo com sucesso
admin-dns-created = Hostname registrado com sucesso
# Campos do Formulário DNS
admin-dns-hostname = Hostname
admin-dns-hostname-placeholder = meubot.exemplo.com
admin-dns-hostname-help = Digite o nome de domínio completo que deseja registrar
admin-dns-record-type = Tipo de Registro
admin-dns-record-type-a = A (IPv4)
admin-dns-record-type-aaaa = AAAA (IPv6)
admin-dns-record-type-cname = CNAME
admin-dns-ttl = TTL (segundos)
admin-dns-ttl-5min = 5 minutos (300)
admin-dns-ttl-1hour = 1 hora (3600)
admin-dns-ttl-1day = 1 dia (86400)
admin-dns-target = Destino/Endereço IP
admin-dns-target-placeholder-ipv4 = 192.168.1.1
admin-dns-target-placeholder-ipv6 = 2001:db8::1
admin-dns-target-placeholder-cname = destino.exemplo.com
admin-dns-target-help-a = Digite o endereço IPv4 de destino
admin-dns-target-help-aaaa = Digite o endereço IPv6 de destino
admin-dns-target-help-cname = Digite o nome de domínio de destino
admin-dns-auto-ssl = Provisionar certificado SSL automaticamente
# Cabeçalhos da Tabela DNS
admin-dns-col-hostname = Hostname
admin-dns-col-type = Tipo
admin-dns-col-target = Destino
admin-dns-col-ttl = TTL
admin-dns-col-ssl = SSL
admin-dns-col-status = Status
admin-dns-col-actions = Ações
# Status DNS
admin-dns-status-active = Ativo
admin-dns-status-pending = Pendente
admin-dns-status-error = Erro
admin-dns-ssl-enabled = SSL Ativado
admin-dns-ssl-disabled = Sem SSL
admin-dns-ssl-pending = SSL Pendente
# Cards de Ajuda DNS
admin-dns-help-title = Ajuda de Configuração DNS
admin-dns-help-a-record = Registro A
admin-dns-help-a-record-desc = Mapeia um nome de domínio para um endereço IPv4. Use para apontar seu hostname diretamente para um IP de servidor.
admin-dns-help-aaaa-record = Registro AAAA
admin-dns-help-aaaa-record-desc = Mapeia um nome de domínio para um endereço IPv6. Similar ao registro A, mas para conectividade IPv6.
admin-dns-help-cname-record = Registro CNAME
admin-dns-help-cname-record-desc = Cria um alias de um domínio para outro. Útil para apontar subdomínios para seu domínio principal.
admin-dns-help-ssl = SSL/TLS
admin-dns-help-ssl-desc = Provisiona automaticamente certificados Let's Encrypt para conexões HTTPS seguras.
# Modais de Edição/Remoção DNS
admin-dns-edit-title = Editar Registro DNS
admin-dns-remove-title = Remover Hostname
admin-dns-remove-warning = Isso excluirá o registro DNS e quaisquer certificados SSL associados. O hostname não será mais resolvido.
# -----------------------------------------------------------------------------
# Gerenciamento de Bots
# -----------------------------------------------------------------------------
admin-bots-title = Gerenciamento de Bots
admin-bots-list = Lista de Bots
admin-bots-add = Adicionar Bot
admin-bots-edit = Editar Bot
admin-bots-delete = Excluir Bot
admin-bots-search = Buscar bots...
admin-bots-filter = Filtrar Bots
admin-bots-total = Total de Bots
admin-bots-active = Bots Ativos
admin-bots-inactive = Bots Inativos
admin-bots-draft = Bots em Rascunho
admin-bots-published = Bots Publicados
admin-bots-no-bots = Nenhum bot encontrado
admin-bots-confirm-delete = Tem certeza que deseja excluir este bot?
admin-bots-deleted = Bot excluído com sucesso
admin-bots-saved = Bot salvo com sucesso
admin-bots-duplicate = Duplicar Bot
admin-bots-export = Exportar Bot
admin-bots-import = Importar Bot
admin-bots-publish = Publicar
admin-bots-unpublish = Despublicar
admin-bots-test = Testar Bot
admin-bots-logs = Logs do Bot
admin-bots-analytics = Análises do Bot
admin-bots-conversations = Conversas
admin-bots-templates = Templates
admin-bots-dialogs = Diálogos
admin-bots-knowledge-base = Base de Conhecimento
# Detalhes do Bot
admin-bot-details = Detalhes do Bot
admin-bot-name = Nome do Bot
admin-bot-description = Descrição
admin-bot-avatar = Avatar do Bot
admin-bot-language = Idioma
admin-bot-timezone = Fuso Horário
admin-bot-greeting = Mensagem de Saudação
admin-bot-fallback = Mensagem de Fallback
admin-bot-channels = Canais
admin-bot-channel-web = Chat Web
admin-bot-channel-whatsapp = WhatsApp
admin-bot-channel-telegram = Telegram
admin-bot-channel-slack = Slack
admin-bot-channel-teams = Microsoft Teams
admin-bot-channel-email = E-mail
admin-bot-model = Modelo de IA
admin-bot-temperature = Temperatura
admin-bot-max-tokens = Máximo de Tokens
admin-bot-system-prompt = Prompt do Sistema
# -----------------------------------------------------------------------------
# Gerenciamento de Inquilinos
# -----------------------------------------------------------------------------
admin-tenants-title = Gerenciamento de Inquilinos
admin-tenants-list = Lista de Inquilinos
admin-tenants-add = Adicionar Inquilino
admin-tenants-edit = Editar Inquilino
admin-tenants-delete = Excluir Inquilino
admin-tenants-search = Buscar inquilinos...
admin-tenants-total = Total de Inquilinos
admin-tenants-active = Inquilinos Ativos
admin-tenants-suspended = Inquilinos Suspensos
admin-tenants-trial = Inquilinos em Teste
admin-tenants-no-tenants = Nenhum inquilino encontrado
admin-tenants-confirm-delete = Tem certeza que deseja excluir este inquilino?
admin-tenants-deleted = Inquilino excluído com sucesso
admin-tenants-saved = Inquilino salvo com sucesso
# Detalhes do Inquilino
admin-tenant-details = Detalhes do Inquilino
admin-tenant-name = Nome do Inquilino
admin-tenant-domain = Domínio
admin-tenant-plan = Plano
admin-tenant-plan-free = Gratuito
admin-tenant-plan-starter = Inicial
admin-tenant-plan-professional = Profissional
admin-tenant-plan-enterprise = Empresarial
admin-tenant-users = Usuários
admin-tenant-bots = Bots
admin-tenant-storage = Armazenamento Usado
admin-tenant-api-calls = Chamadas de API
admin-tenant-limits = Limites de Uso
admin-tenant-billing = Informações de Faturamento
# -----------------------------------------------------------------------------
# Configurações do Sistema
# -----------------------------------------------------------------------------
admin-settings-title = Configurações do Sistema
admin-settings-general = Configurações Gerais
admin-settings-security = Configurações de Segurança
admin-settings-email = Configurações de E-mail
admin-settings-storage = Configurações de Armazenamento
admin-settings-integrations = Integrações
admin-settings-api = Configurações de API
admin-settings-appearance = Aparência
admin-settings-localization = Localização
admin-settings-notifications = Notificações
admin-settings-backup = Backup e Restauração
admin-settings-maintenance = Modo de Manutenção
admin-settings-saved = Configurações salvas com sucesso
admin-settings-reset = Restaurar Padrões
admin-settings-confirm-reset = Tem certeza que deseja restaurar todas as configurações para os padrões?
# Configurações Gerais
admin-settings-site-name = Nome do Site
admin-settings-site-url = URL do Site
admin-settings-admin-email = E-mail do Admin
admin-settings-support-email = E-mail de Suporte
admin-settings-default-language = Idioma Padrão
admin-settings-default-timezone = Fuso Horário Padrão
admin-settings-date-format = Formato de Data
admin-settings-time-format = Formato de Hora
admin-settings-currency = Moeda
# Configurações de E-mail
admin-settings-smtp-host = Host SMTP
admin-settings-smtp-port = Porta SMTP
admin-settings-smtp-user = Usuário SMTP
admin-settings-smtp-password = Senha SMTP
admin-settings-smtp-encryption = Criptografia
admin-settings-smtp-from-name = Nome do Remetente
admin-settings-smtp-from-email = E-mail do Remetente
admin-settings-smtp-test = Enviar E-mail de Teste
admin-settings-smtp-test-success = E-mail de teste enviado com sucesso
admin-settings-smtp-test-failed = Falha ao enviar e-mail de teste
# Configurações de Armazenamento
admin-settings-storage-provider = Provedor de Armazenamento
admin-settings-storage-local = Armazenamento Local
admin-settings-storage-s3 = Amazon S3
admin-settings-storage-minio = MinIO
admin-settings-storage-gcs = Google Cloud Storage
admin-settings-storage-azure = Azure Blob Storage
admin-settings-storage-bucket = Nome do Bucket
admin-settings-storage-region = Região
admin-settings-storage-access-key = Chave de Acesso
admin-settings-storage-secret-key = Chave Secreta
admin-settings-storage-endpoint = URL do Endpoint
# -----------------------------------------------------------------------------
# Logs do Sistema
# -----------------------------------------------------------------------------
admin-logs-title = Logs do Sistema
admin-logs-search = Buscar logs...
admin-logs-filter-level = Filtrar por Nível
admin-logs-filter-source = Filtrar por Origem
admin-logs-filter-date = Filtrar por Data
admin-logs-level-all = Todos os Níveis
admin-logs-level-debug = Debug
admin-logs-level-info = Info
admin-logs-level-warning = Aviso
admin-logs-level-error = Erro
admin-logs-level-critical = Crítico
admin-logs-export = Exportar Logs
admin-logs-clear = Limpar Logs
admin-logs-confirm-clear = Tem certeza que deseja limpar todos os logs?
admin-logs-cleared = Logs limpos com sucesso
admin-logs-no-logs = Nenhum log encontrado
admin-logs-refresh = Atualizar
admin-logs-auto-refresh = Atualização Automática
admin-logs-timestamp = Data/Hora
admin-logs-level = Nível
admin-logs-source = Origem
admin-logs-message = Mensagem
admin-logs-details = Detalhes
# -----------------------------------------------------------------------------
# Análises
# -----------------------------------------------------------------------------
admin-analytics-title = Análises
admin-analytics-overview = Visão Geral
admin-analytics-users = Análises de Usuários
admin-analytics-bots = Análises de Bots
admin-analytics-conversations = Análises de Conversas
admin-analytics-performance = Desempenho
admin-analytics-period = Período
admin-analytics-period-today = Hoje
admin-analytics-period-week = Esta Semana
admin-analytics-period-month = Este Mês
admin-analytics-period-quarter = Este Trimestre
admin-analytics-period-year = Este Ano
admin-analytics-period-custom = Período Personalizado
admin-analytics-export = Exportar Relatório
admin-analytics-total-users = Total de Usuários
admin-analytics-new-users = Novos Usuários
admin-analytics-active-users = Usuários Ativos
admin-analytics-total-bots = Total de Bots
admin-analytics-active-bots = Bots Ativos
admin-analytics-total-conversations = Total de Conversas
admin-analytics-avg-response-time = Tempo Médio de Resposta
admin-analytics-satisfaction-rate = Taxa de Satisfação
admin-analytics-resolution-rate = Taxa de Resolução
# -----------------------------------------------------------------------------
# Segurança
# -----------------------------------------------------------------------------
admin-security-title = Segurança
admin-security-overview = Visão Geral de Segurança
admin-security-audit-log = Log de Auditoria
admin-security-login-attempts = Tentativas de Login
admin-security-blocked-ips = IPs Bloqueados
admin-security-api-keys = Chaves de API
admin-security-webhooks = Webhooks
admin-security-cors = Configurações CORS
admin-security-rate-limiting = Limitação de Taxa
admin-security-encryption = Criptografia
admin-security-2fa = Autenticação de Dois Fatores
admin-security-sso = Login Único (SSO)
admin-security-password-policy = Política de Senhas
# Chaves de API
admin-api-keys-title = Chaves de API
admin-api-keys-add = Criar Chave de API
admin-api-keys-name = Nome da Chave
admin-api-keys-key = Chave de API
admin-api-keys-secret = Chave Secreta
admin-api-keys-created = Criada em
admin-api-keys-last-used = Último Uso
admin-api-keys-expires = Expira em
admin-api-keys-never = Nunca
admin-api-keys-revoke = Revogar
admin-api-keys-confirm-revoke = Tem certeza que deseja revogar esta chave de API?
admin-api-keys-revoked = Chave de API revogada com sucesso
admin-api-keys-created-success = Chave de API criada com sucesso
admin-api-keys-copy = Copiar para Área de Transferência
admin-api-keys-copied = Copiado!
admin-api-keys-warning = Certifique-se de copiar sua chave de API agora. Você não poderá vê-la novamente!
# -----------------------------------------------------------------------------
# Faturamento
# -----------------------------------------------------------------------------
admin-billing-title = Faturamento
admin-billing-overview = Visão Geral do Faturamento
admin-billing-current-plan = Plano Atual
admin-billing-usage = Uso
admin-billing-invoices = Faturas
admin-billing-payment-methods = Métodos de Pagamento
admin-billing-upgrade = Fazer Upgrade do Plano
admin-billing-downgrade = Fazer Downgrade do Plano
admin-billing-cancel = Cancelar Assinatura
admin-billing-invoice-date = Data da Fatura
admin-billing-invoice-amount = Valor
admin-billing-invoice-status = Status
admin-billing-invoice-paid = Pago
admin-billing-invoice-pending = Pendente
admin-billing-invoice-overdue = Atrasado
admin-billing-invoice-download = Baixar Fatura
# -----------------------------------------------------------------------------
# Backup e Restauração
# -----------------------------------------------------------------------------
admin-backup-title = Backup e Restauração
admin-backup-create = Criar Backup
admin-backup-restore = Restaurar Backup
admin-backup-schedule = Agendar Backups
admin-backup-list = Histórico de Backups
admin-backup-name = Nome do Backup
admin-backup-size = Tamanho
admin-backup-created = Criado em
admin-backup-download = Baixar
admin-backup-delete = Excluir
admin-backup-confirm-restore = Tem certeza que deseja restaurar este backup? Isso irá sobrescrever os dados atuais.
admin-backup-confirm-delete = Tem certeza que deseja excluir este backup?
admin-backup-in-progress = Backup em andamento...
admin-backup-completed = Backup concluído com sucesso
admin-backup-failed = Falha no backup
admin-backup-restore-in-progress = Restauração em andamento...
admin-backup-restore-completed = Restauração concluída com sucesso
admin-backup-restore-failed = Falha na restauração
# -----------------------------------------------------------------------------
# Modo de Manutenção
# -----------------------------------------------------------------------------
admin-maintenance-title = Modo de Manutenção
admin-maintenance-enable = Ativar Modo de Manutenção
admin-maintenance-disable = Desativar Modo de Manutenção
admin-maintenance-status = Status Atual
admin-maintenance-active = Modo de manutenção está ativo
admin-maintenance-inactive = Modo de manutenção está inativo
admin-maintenance-message = Mensagem de Manutenção
admin-maintenance-default-message = Estamos realizando manutenção programada. Por favor, volte em breve.
admin-maintenance-allowed-ips = Endereços IP Permitidos
admin-maintenance-confirm-enable = Tem certeza que deseja ativar o modo de manutenção? Os usuários não poderão acessar o sistema.
# -----------------------------------------------------------------------------
# Elementos Comuns da Interface Admin
# -----------------------------------------------------------------------------
admin-required = Obrigatório
admin-optional = Opcional
admin-loading = Carregando...
admin-saving = Salvando...
admin-deleting = Excluindo...
admin-confirm = Confirmar
admin-cancel = Cancelar
admin-save = Salvar
admin-create = Criar
admin-update = Atualizar
admin-delete = Excluir
admin-edit = Editar
admin-view = Visualizar
admin-close = Fechar
admin-back = Voltar
admin-next = Próximo
admin-previous = Anterior
admin-refresh = Atualizar
admin-export = Exportar
admin-import = Importar
admin-search = Buscar
admin-filter = Filtrar
admin-clear = Limpar
admin-select = Selecionar
admin-select-all = Selecionar Todos
admin-deselect-all = Desmarcar Todos
admin-actions = Ações
admin-more-actions = Mais Ações
admin-no-data = Nenhum dado disponível
admin-error = Ocorreu um erro
admin-success = Sucesso
admin-warning = Atenção
admin-info = Informação
# Paginação de Tabelas
admin-showing = Mostrando { $from } a { $to } de { $total } resultados
admin-page = Página { $current } de { $total }
admin-items-per-page = Itens por página
admin-go-to-page = Ir para página
# Ações em Massa
admin-bulk-delete = Excluir Selecionados
admin-bulk-export = Exportar Selecionados
admin-bulk-activate = Ativar Selecionados
admin-bulk-deactivate = Desativar Selecionados
admin-selected-count = { $count ->
[one] { $count } item selecionado
*[other] { $count } itens selecionados
}

173
locales/pt-BR/analytics.ftl Normal file
View file

@ -0,0 +1,173 @@
analytics-title = Análises
analytics-dashboard = Painel de Análises
analytics-overview = Visão Geral
analytics-reports = Relatórios
analytics-export = Exportar Dados
analytics-refresh = Atualizar Dados
analytics-last-updated = Última atualização: { $time }
analytics-period-today = Hoje
analytics-period-yesterday = Ontem
analytics-period-week = Esta Semana
analytics-period-last-week = Semana Passada
analytics-period-month = Este Mês
analytics-period-last-month = Mês Passado
analytics-period-quarter = Este Trimestre
analytics-period-year = Este Ano
analytics-period-custom = Período Personalizado
analytics-period-from = De
analytics-period-to = Até
analytics-period-apply = Aplicar
analytics-metric-total = Total
analytics-metric-average = Média
analytics-metric-min = Mínimo
analytics-metric-max = Máximo
analytics-metric-count = Contagem
analytics-metric-sum = Soma
analytics-metric-percentage = Porcentagem
analytics-metric-growth = Crescimento
analytics-metric-change = Variação
analytics-metric-trend = Tendência
analytics-users-title = Análises de Usuários
analytics-users-total = Total de Usuários
analytics-users-active = Usuários Ativos
analytics-users-new = Novos Usuários
analytics-users-returning = Usuários Recorrentes
analytics-users-churned = Usuários Perdidos
analytics-users-growth = Crescimento de Usuários
analytics-users-retention = Retenção de Usuários
analytics-users-engagement = Engajamento de Usuários
analytics-users-by-country = Usuários por País
analytics-users-by-device = Usuários por Dispositivo
analytics-users-by-browser = Usuários por Navegador
analytics-users-by-os = Usuários por Sistema Operacional
analytics-users-sessions = Sessões
analytics-users-avg-session = Duração Média da Sessão
analytics-users-page-views = Visualizações de Página
analytics-users-bounce-rate = Taxa de Rejeição
analytics-bots-title = Análises de Bots
analytics-bots-total = Total de Bots
analytics-bots-active = Bots Ativos
analytics-bots-conversations = Total de Conversas
analytics-bots-messages = Total de Mensagens
analytics-bots-avg-messages = Média de Mensagens por Conversa
analytics-bots-response-time = Tempo Médio de Resposta
analytics-bots-resolution-rate = Taxa de Resolução
analytics-bots-satisfaction = Índice de Satisfação
analytics-bots-handoff-rate = Taxa de Transferência para Humano
analytics-bots-fallback-rate = Taxa de Fallback
analytics-bots-intent-accuracy = Precisão de Intenção
analytics-bots-top-intents = Principais Intenções
analytics-bots-top-topics = Principais Tópicos
analytics-bots-by-channel = Conversas por Canal
analytics-bots-by-hour = Conversas por Hora
analytics-bots-by-day = Conversas por Dia
analytics-conversations-title = Análises de Conversas
analytics-conversations-total = Total de Conversas
analytics-conversations-completed = Concluídas
analytics-conversations-abandoned = Abandonadas
analytics-conversations-transferred = Transferidas
analytics-conversations-avg-duration = Duração Média
analytics-conversations-avg-messages = Média de Mensagens
analytics-conversations-first-response = Tempo da Primeira Resposta
analytics-conversations-wait-time = Tempo Médio de Espera
analytics-conversations-peak-hours = Horários de Pico
analytics-conversations-sentiment = Análise de Sentimento
analytics-conversations-sentiment-positive = Positivo
analytics-conversations-sentiment-neutral = Neutro
analytics-conversations-sentiment-negative = Negativo
analytics-conversations-languages = Por Idioma
analytics-conversations-sources = Por Origem
analytics-performance-title = Análises de Desempenho
analytics-performance-uptime = Tempo de Atividade
analytics-performance-availability = Disponibilidade
analytics-performance-response-time = Tempo de Resposta
analytics-performance-latency = Latência
analytics-performance-throughput = Taxa de Transferência
analytics-performance-error-rate = Taxa de Erros
analytics-performance-cpu = Uso de CPU
analytics-performance-memory = Uso de Memória
analytics-performance-disk = Uso de Disco
analytics-performance-network = E/S de Rede
analytics-performance-requests = Requisições/seg
analytics-performance-concurrent = Usuários Simultâneos
analytics-performance-queue-size = Tamanho da Fila
analytics-performance-cache-hit = Taxa de Acerto de Cache
analytics-api-title = Análises de API
analytics-api-calls = Total de Chamadas de API
analytics-api-success = Chamadas Bem-sucedidas
analytics-api-errors = Chamadas com Falha
analytics-api-avg-latency = Latência Média
analytics-api-by-endpoint = Chamadas por Endpoint
analytics-api-by-method = Chamadas por Método
analytics-api-by-status = Chamadas por Código de Status
analytics-api-rate-limited = Chamadas Limitadas por Taxa
analytics-api-top-consumers = Principais Consumidores de API
analytics-llm-title = Análises de LLM
analytics-llm-requests = Total de Requisições
analytics-llm-tokens-input = Tokens de Entrada
analytics-llm-tokens-output = Tokens de Saída
analytics-llm-tokens-total = Total de Tokens
analytics-llm-cost = Custo Estimado
analytics-llm-avg-latency = Latência Média
analytics-llm-by-model = Uso por Modelo
analytics-llm-cache-hits = Acertos de Cache
analytics-llm-cache-misses = Erros de Cache
analytics-storage-title = Análises de Armazenamento
analytics-storage-total = Armazenamento Total
analytics-storage-used = Armazenamento Usado
analytics-storage-available = Armazenamento Disponível
analytics-storage-by-type = Armazenamento por Tipo de Arquivo
analytics-storage-by-tenant = Armazenamento por Inquilino
analytics-storage-growth = Crescimento de Armazenamento
analytics-storage-uploads = Total de Uploads
analytics-storage-downloads = Total de Downloads
analytics-chart-line = Gráfico de Linha
analytics-chart-bar = Gráfico de Barras
analytics-chart-pie = Gráfico de Pizza
analytics-chart-area = Gráfico de Área
analytics-chart-donut = Gráfico de Rosca
analytics-chart-table = Visualização em Tabela
analytics-chart-heatmap = Mapa de Calor
analytics-chart-no-data = Nenhum dado disponível para este período
analytics-comparison-previous = vs Período Anterior
analytics-comparison-increase = aumento de { $value }%
analytics-comparison-decrease = redução de { $value }%
analytics-comparison-no-change = Sem alteração
analytics-filter-all = Todos
analytics-filter-apply = Aplicar Filtros
analytics-filter-clear = Limpar Filtros
analytics-filter-by-bot = Filtrar por Bot
analytics-filter-by-channel = Filtrar por Canal
analytics-filter-by-user = Filtrar por Usuário
analytics-filter-by-tenant = Filtrar por Inquilino
analytics-report-generate = Gerar Relatório
analytics-report-schedule = Agendar Relatório
analytics-report-download = Baixar Relatório
analytics-report-email = Enviar Relatório por E-mail
analytics-report-format-pdf = PDF
analytics-report-format-csv = CSV
analytics-report-format-excel = Excel
analytics-report-format-json = JSON
analytics-report-generating = Gerando relatório...
analytics-report-ready = Relatório pronto para download
analytics-report-failed = Falha ao gerar relatório
analytics-realtime = Análises em Tempo Real
analytics-realtime-active = Ativos Agora
analytics-realtime-conversations = Conversas Ativas
analytics-realtime-users = Usuários Online
analytics-realtime-requests = Requisições/min
analytics-realtime-events = Eventos/seg

256
locales/pt-BR/auth.ftl Normal file
View file

@ -0,0 +1,256 @@
# =============================================================================
# General Bots - Authentication Translations (Portuguese - Brazil)
# =============================================================================
# Traduções de autenticação, Passkey/WebAuthn e segurança
# =============================================================================
# -----------------------------------------------------------------------------
# Authentication General
# -----------------------------------------------------------------------------
auth-title = Autenticação
auth-login = Entrar
auth-logout = Sair
auth-signup = Cadastrar
auth-welcome = Bem-vindo
auth-welcome-back = Bem-vindo de volta, { $name }!
auth-session-expired = Sua sessão expirou
auth-session-timeout = Sessão expira em { $minutes } minutos
# -----------------------------------------------------------------------------
# Login Form
# -----------------------------------------------------------------------------
auth-login-title = Entre na sua conta
auth-login-subtitle = Digite suas credenciais para continuar
auth-login-email = Endereço de E-mail
auth-login-username = Nome de Usuário
auth-login-password = Senha
auth-login-remember = Lembrar-me
auth-login-forgot = Esqueceu a senha?
auth-login-submit = Entrar
auth-login-loading = Entrando...
auth-login-or = ou continue com
auth-login-no-account = Não tem uma conta?
auth-login-create-account = Criar uma conta
# -----------------------------------------------------------------------------
# Passkey/WebAuthn
# -----------------------------------------------------------------------------
passkey-title = Chaves de Acesso
passkey-subtitle = Autenticação segura sem senha
passkey-description = Chaves de acesso usam a biometria ou PIN do seu dispositivo para login seguro e resistente a phishing
passkey-what-is = O que é uma chave de acesso?
passkey-benefits = Benefícios das chaves de acesso
passkey-benefit-secure = Mais seguro que senhas
passkey-benefit-easy = Fácil de usar - sem senhas para lembrar
passkey-benefit-fast = Login rápido com biometria
passkey-benefit-phishing = Resistente a ataques de phishing
# -----------------------------------------------------------------------------
# Passkey Registration
# -----------------------------------------------------------------------------
passkey-register-title = Configurar Chave de Acesso
passkey-register-subtitle = Crie uma chave de acesso para login mais rápido e seguro
passkey-register-description = Seu dispositivo pedirá para verificar sua identidade usando impressão digital, rosto ou bloqueio de tela
passkey-register-button = Criar Chave de Acesso
passkey-register-name = Nome da Chave de Acesso
passkey-register-name-placeholder = ex: MacBook Pro, iPhone
passkey-register-name-hint = Dê um nome à sua chave de acesso para identificá-la depois
passkey-register-loading = Configurando chave de acesso...
passkey-register-verifying = Verificando com seu dispositivo...
passkey-register-success = Chave de acesso criada com sucesso
passkey-register-error = Falha ao criar chave de acesso
passkey-register-cancelled = Configuração de chave de acesso cancelada
passkey-register-not-supported = Seu navegador não suporta chaves de acesso
# -----------------------------------------------------------------------------
# Passkey Authentication
# -----------------------------------------------------------------------------
passkey-login-title = Entrar com Chave de Acesso
passkey-login-subtitle = Use sua chave de acesso para login seguro sem senha
passkey-login-button = Entrar com Chave de Acesso
passkey-login-loading = Autenticando...
passkey-login-verifying = Verificando chave de acesso...
passkey-login-success = Login realizado com sucesso
passkey-login-error = Falha na autenticação
passkey-login-cancelled = Autenticação cancelada
passkey-login-no-passkeys = Nenhuma chave de acesso encontrada para esta conta
passkey-login-try-another = Tentar outro método
# -----------------------------------------------------------------------------
# Passkey Management
# -----------------------------------------------------------------------------
passkey-manage-title = Gerenciar Chaves de Acesso
passkey-manage-subtitle = Visualize e gerencie suas chaves de acesso registradas
passkey-manage-count = { $count ->
[one] { $count } chave de acesso registrada
*[other] { $count } chaves de acesso registradas
}
passkey-manage-add = Adicionar Nova Chave de Acesso
passkey-manage-rename = Renomear
passkey-manage-delete = Excluir
passkey-manage-created = Criada em { $date }
passkey-manage-last-used = Último uso em { $date }
passkey-manage-never-used = Nunca usada
passkey-manage-this-device = Este dispositivo
passkey-manage-cross-platform = Multiplataforma
passkey-manage-platform = Autenticador de plataforma
passkey-manage-security-key = Chave de segurança
passkey-manage-empty = Nenhuma chave de acesso registrada
passkey-manage-empty-description = Adicione uma chave de acesso para login mais rápido e seguro
# -----------------------------------------------------------------------------
# Passkey Deletion
# -----------------------------------------------------------------------------
passkey-delete-title = Excluir Chave de Acesso
passkey-delete-confirm = Tem certeza de que deseja excluir esta chave de acesso?
passkey-delete-warning = Você não poderá mais usar esta chave de acesso para entrar
passkey-delete-last-warning = Esta é sua única chave de acesso. Você precisará usar autenticação por senha após excluí-la.
passkey-delete-success = Chave de acesso excluída com sucesso
passkey-delete-error = Falha ao excluir chave de acesso
# -----------------------------------------------------------------------------
# Password Fallback
# -----------------------------------------------------------------------------
passkey-fallback-title = Usar Senha
passkey-fallback-description = Se você não pode usar sua chave de acesso, pode entrar com sua senha
passkey-fallback-button = Usar Senha
passkey-fallback-or-passkey = Ou entre com chave de acesso
passkey-fallback-setup-prompt = Configure uma chave de acesso para login mais rápido na próxima vez
passkey-fallback-setup-later = Talvez depois
passkey-fallback-setup-now = Configurar agora
passkey-fallback-locked = Conta temporariamente bloqueada
passkey-fallback-locked-description = Muitas tentativas falhas. Tente novamente em { $minutes } minutos.
passkey-fallback-attempts = { $remaining } tentativas restantes
# -----------------------------------------------------------------------------
# Multi-Factor Authentication
# -----------------------------------------------------------------------------
mfa-title = Autenticação de Dois Fatores
mfa-subtitle = Adicione uma camada extra de segurança à sua conta
mfa-enabled = Autenticação de dois fatores está ativada
mfa-disabled = Autenticação de dois fatores está desativada
mfa-enable = Ativar 2FA
mfa-disable = Desativar 2FA
mfa-setup = Configurar 2FA
mfa-verify = Verificar Código
mfa-code = Código de Verificação
mfa-code-placeholder = Digite o código de 6 dígitos
mfa-code-sent = Código enviado para { $destination }
mfa-code-expired = O código expirou
mfa-code-invalid = Código inválido
mfa-resend = Reenviar código
mfa-resend-in = Reenviar em { $seconds }s
mfa-methods = Métodos de Autenticação
mfa-method-app = Aplicativo Autenticador
mfa-method-sms = SMS
mfa-method-email = E-mail
mfa-method-passkey = Chave de Acesso
mfa-backup-codes = Códigos de Backup
mfa-backup-codes-description = Guarde esses códigos em um lugar seguro. Cada código só pode ser usado uma vez.
mfa-backup-codes-remaining = { $count } códigos de backup restantes
mfa-backup-codes-generate = Gerar Novos Códigos
mfa-backup-codes-download = Baixar Códigos
mfa-backup-codes-copy = Copiar Códigos
# -----------------------------------------------------------------------------
# Password Management
# -----------------------------------------------------------------------------
password-title = Senha
password-change = Alterar Senha
password-current = Senha Atual
password-new = Nova Senha
password-confirm = Confirmar Nova Senha
password-requirements = Requisitos da Senha
password-requirement-length = Pelo menos { $length } caracteres
password-requirement-uppercase = Pelo menos uma letra maiúscula
password-requirement-lowercase = Pelo menos uma letra minúscula
password-requirement-number = Pelo menos um número
password-requirement-special = Pelo menos um caractere especial
password-strength = Força da Senha
password-strength-weak = Fraca
password-strength-fair = Razoável
password-strength-good = Boa
password-strength-strong = Forte
password-match = As senhas coincidem
password-mismatch = As senhas não coincidem
password-changed = Senha alterada com sucesso
password-change-error = Falha ao alterar senha
# -----------------------------------------------------------------------------
# Password Reset
# -----------------------------------------------------------------------------
password-reset-title = Redefinir Senha
password-reset-subtitle = Digite seu e-mail para receber um link de redefinição
password-reset-email-sent = E-mail de redefinição de senha enviado
password-reset-email-sent-description = Verifique seu e-mail para instruções de redefinição de senha
password-reset-invalid-token = Link de redefinição inválido ou expirado
password-reset-success = Senha redefinida com sucesso
password-reset-error = Falha ao redefinir senha
# -----------------------------------------------------------------------------
# Session Management
# -----------------------------------------------------------------------------
session-title = Sessões Ativas
session-subtitle = Gerencie suas sessões ativas em diferentes dispositivos
session-current = Sessão Atual
session-device = Dispositivo
session-location = Localização
session-last-active = Última Atividade
session-ip-address = Endereço IP
session-browser = Navegador
session-os = Sistema Operacional
session-sign-out = Encerrar Sessão
session-sign-out-all = Encerrar Todas as Outras Sessões
session-sign-out-confirm = Tem certeza de que deseja encerrar esta sessão?
session-sign-out-all-confirm = Tem certeza de que deseja encerrar todas as outras sessões?
# -----------------------------------------------------------------------------
# Security Settings
# -----------------------------------------------------------------------------
security-title = Segurança
security-subtitle = Gerencie as configurações de segurança da sua conta
security-overview = Visão Geral de Segurança
security-last-login = Último Login
security-password-last-changed = Última Alteração de Senha
security-security-checkup = Verificação de Segurança
security-checkup-description = Revise suas configurações de segurança
security-recommendation = Recomendação
security-add-passkey = Adicione uma chave de acesso para login mais seguro
security-enable-mfa = Ative a autenticação de dois fatores
security-update-password = Atualize sua senha regularmente
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
auth-error-invalid-credentials = E-mail ou senha inválidos
auth-error-account-locked = Conta bloqueada. Por favor, entre em contato com o suporte.
auth-error-account-disabled = A conta foi desativada
auth-error-email-not-verified = Por favor, verifique seu endereço de e-mail
auth-error-too-many-attempts = Muitas tentativas falhas. Por favor, tente novamente mais tarde.
auth-error-network = Erro de rede. Por favor, verifique sua conexão.
auth-error-server = Erro do servidor. Por favor, tente novamente mais tarde.
auth-error-unknown = Ocorreu um erro desconhecido
auth-error-session-invalid = Sessão inválida. Por favor, entre novamente.
auth-error-token-expired = Sua sessão expirou. Por favor, entre novamente.
auth-error-unauthorized = Você não está autorizado a realizar esta ação
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
auth-success-login = Login realizado com sucesso
auth-success-logout = Logout realizado com sucesso
auth-success-signup = Conta criada com sucesso
auth-success-password-changed = Senha alterada com sucesso
auth-success-email-verified = E-mail verificado com sucesso
auth-success-mfa-enabled = Autenticação de dois fatores ativada
auth-success-mfa-disabled = Autenticação de dois fatores desativada
auth-success-session-terminated = Sessão encerrada com sucesso
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
auth-notify-new-login = Novo login de { $device } em { $location }
auth-notify-password-changed = Sua senha foi alterada
auth-notify-mfa-enabled = Autenticação de dois fatores foi ativada
auth-notify-passkey-added = Nova chave de acesso foi adicionada à sua conta
auth-notify-suspicious-activity = Atividade suspeita detectada em sua conta

View file

@ -0,0 +1,150 @@
bot-greeting-default = Olá! Como posso ajudar você hoje?
bot-greeting-named = Olá, { $name }! Como posso ajudar você hoje?
bot-goodbye = Até logo! Tenha um ótimo dia!
bot-help-prompt = Posso ajudar com: { $topics }. O que você gostaria de saber?
bot-thank-you = Obrigado pela sua mensagem. Como posso ajudá-lo?
bot-echo-intro = Bot Echo: Vou repetir tudo que você disser. Digite 'sair' para encerrar.
bot-you-said = Você disse: { $message }
bot-thinking = Deixe-me pensar sobre isso...
bot-processing = Processando sua solicitação...
bot-error-occurred = Desculpe, algo deu errado. Por favor, tente novamente.
bot-not-understood = Não entendi. Você poderia reformular?
bot-confirm-action = Tem certeza que deseja continuar?
bot-action-cancelled = Ação cancelada.
bot-action-completed = Pronto!
bot-lead-welcome = Bem-vindo! Deixe-me ajudá-lo a começar.
bot-lead-ask-name = Qual é o seu nome?
bot-lead-ask-email = E seu e-mail?
bot-lead-ask-company = De qual empresa você é?
bot-lead-ask-phone = Qual é o seu telefone?
bot-lead-hot = Ótimo! Nossa equipe de vendas entrará em contato em breve.
bot-lead-nurture = Obrigado pelo seu interesse! Enviaremos alguns materiais.
bot-lead-score = Sua pontuação de lead é { $score } de 100.
bot-lead-saved = Suas informações foram salvas com sucesso.
bot-schedule-created = Executando tarefa agendada: { $name }
bot-schedule-next = Próxima execução agendada para { $datetime }
bot-schedule-cancelled = Agendamento cancelado.
bot-schedule-paused = Agendamento pausado.
bot-schedule-resumed = Agendamento retomado.
bot-monitor-alert = Alerta: { $subject } foi alterado
bot-monitor-threshold = { $metric } excedeu o limite: { $value }
bot-monitor-recovered = { $subject } voltou ao normal.
bot-monitor-status = Status atual: { $status }
bot-order-welcome = Bem-vindo à nossa loja! Como posso ajudar?
bot-order-track = Rastrear meu pedido
bot-order-browse = Ver produtos
bot-order-support = Falar com suporte
bot-order-enter-id = Por favor, digite o número do seu pedido:
bot-order-status = Status do pedido: { $status }
bot-order-shipped = Seu pedido foi enviado! Código de rastreamento: { $tracking }
bot-order-delivered = Seu pedido foi entregue.
bot-order-processing = Seu pedido está sendo processado.
bot-order-cancelled = Seu pedido foi cancelado.
bot-order-ticket = Ticket de suporte criado: #{ $ticket }
bot-order-products-available = Aqui estão nossos produtos disponíveis:
bot-order-product-item = { $name } - { $price }
bot-order-cart-added = { $product } adicionado ao seu carrinho.
bot-order-cart-total = O total do seu carrinho é { $total }.
bot-order-checkout = Prosseguindo para o pagamento...
bot-hr-welcome = Assistente de RH aqui. Como posso ajudar?
bot-hr-request-leave = Solicitar folga
bot-hr-check-balance = Consultar saldo
bot-hr-view-policies = Ver políticas
bot-hr-leave-type = Qual tipo de folga? (férias/médica/pessoal)
bot-hr-start-date = Data de início? (DD/MM/AAAA)
bot-hr-end-date = Data de término? (DD/MM/AAAA)
bot-hr-leave-submitted = Solicitação de folga enviada! Seu gestor irá revisar.
bot-hr-leave-approved = Sua solicitação de folga foi aprovada.
bot-hr-leave-rejected = Sua solicitação de folga foi rejeitada.
bot-hr-leave-pending = Sua solicitação de folga está pendente de aprovação.
bot-hr-balance-title = Seu saldo de folgas:
bot-hr-vacation-days = Férias: { $days } dias
bot-hr-sick-days = Licença médica: { $days } dias
bot-hr-personal-days = Pessoal: { $days } dias
bot-hr-policy-found = Aqui estão as informações da política solicitada:
bot-hr-policy-not-found = Política não encontrada. Por favor, verifique o nome da política.
bot-health-welcome = Bem-vindo ao nosso centro de saúde. Como posso ajudar?
bot-health-book = Agendar consulta
bot-health-cancel = Cancelar consulta
bot-health-view = Ver minhas consultas
bot-health-reschedule = Reagendar consulta
bot-health-type = Qual tipo de consulta? (clínica geral/especialista/laboratório)
bot-health-doctor = Qual médico você prefere?
bot-health-date = Qual data funciona melhor para você?
bot-health-time = Qual horário você prefere?
bot-health-confirmed = Sua consulta foi confirmada para { $datetime } com { $doctor }.
bot-health-cancelled = Sua consulta foi cancelada.
bot-health-rescheduled = Sua consulta foi reagendada para { $datetime }.
bot-health-reminder = Lembrete: Você tem uma consulta em { $datetime }.
bot-health-no-appointments = Você não tem consultas agendadas.
bot-health-appointments-list = Suas próximas consultas:
bot-support-welcome = Como posso ajudá-lo hoje?
bot-support-describe = Por favor, descreva seu problema:
bot-support-category = Qual categoria melhor descreve seu problema?
bot-support-priority = Qual a urgência deste problema?
bot-support-ticket-created = Ticket de suporte #{ $ticket } foi criado.
bot-support-ticket-status = Status do ticket #{ $ticket }: { $status }
bot-support-ticket-updated = Seu ticket foi atualizado.
bot-support-ticket-resolved = Seu ticket foi resolvido. Por favor, nos avise se precisar de mais ajuda.
bot-support-transfer = Transferindo você para um atendente humano...
bot-support-wait-time = Tempo estimado de espera: { $minutes } minutos.
bot-support-agent-joined = O atendente { $name } entrou na conversa.
bot-survey-intro = Adoraríamos ouvir sua opinião!
bot-survey-question = { $question }
bot-survey-scale = Em uma escala de 1 a 10, como você avalia { $subject }?
bot-survey-open = Por favor, compartilhe comentários adicionais:
bot-survey-thanks = Obrigado pelo seu feedback!
bot-survey-completed = Pesquisa concluída com sucesso.
bot-survey-skip = Você pode pular esta pergunta se preferir.
bot-notification-new-message = Você tem uma nova mensagem de { $sender }.
bot-notification-task-due = A tarefa "{ $task }" vence { $when }.
bot-notification-reminder = Lembrete: { $message }
bot-notification-update = Atualização: { $message }
bot-notification-alert = Alerta: { $message }
bot-command-help = Comandos disponíveis:
bot-command-unknown = Comando desconhecido. Digite 'ajuda' para ver os comandos disponíveis.
bot-command-invalid = Sintaxe de comando inválida. Uso: { $usage }
bot-transfer-to-human = Transferindo você para um atendente humano. Por favor, aguarde...
bot-transfer-complete = Você está agora conectado com { $agent }.
bot-transfer-unavailable = Nenhum atendente disponível no momento. Por favor, tente novamente mais tarde.
bot-transfer-queue-position = Você é o número { $position } na fila.
bot-auth-login-prompt = Por favor, insira suas credenciais para continuar.
bot-auth-login-success = Login realizado com sucesso.
bot-auth-login-failed = Falha no login. Por favor, verifique suas credenciais.
bot-auth-logout-success = Logout realizado com sucesso.
bot-auth-session-expired = Sua sessão expirou. Por favor, faça login novamente.
bot-file-upload-prompt = Por favor, envie seu arquivo.
bot-file-upload-success = Arquivo "{ $filename }" enviado com sucesso.
bot-file-upload-failed = Falha ao enviar arquivo. Por favor, tente novamente.
bot-file-download-ready = Seu arquivo está pronto para download.
bot-file-processing = Processando seu arquivo...
bot-payment-amount = O valor total é { $amount }.
bot-payment-method = Por favor, selecione um método de pagamento.
bot-payment-processing = Processando seu pagamento...
bot-payment-success = Pagamento realizado com sucesso! ID da transação: { $transactionId }
bot-payment-failed = Falha no pagamento. Por favor, tente novamente ou use outro método de pagamento.
bot-payment-refund = Seu reembolso de { $amount } foi processado.
bot-subscription-active = Sua assinatura está ativa até { $endDate }.
bot-subscription-expired = Sua assinatura expirou.
bot-subscription-renew = Você gostaria de renovar sua assinatura?
bot-subscription-upgraded = Sua assinatura foi atualizada para o plano { $plan }.
bot-subscription-cancelled = Sua assinatura foi cancelada.
bot-feedback-positive = Obrigado pelo seu feedback positivo!
bot-feedback-negative = Lamentamos saber disso. Como podemos melhorar?
bot-feedback-rating = Você avaliou esta interação com { $rating } de 5.

186
locales/pt-BR/channels.ftl Normal file
View file

@ -0,0 +1,186 @@
channel-web = Chat Web
channel-whatsapp = WhatsApp
channel-telegram = Telegram
channel-slack = Slack
channel-teams = Microsoft Teams
channel-email = E-mail
channel-sms = SMS
channel-instagram = Instagram
channel-messenger = Facebook Messenger
channel-discord = Discord
channel-voice = Voz
channel-api = API
channel-status-connected = Conectado
channel-status-disconnected = Desconectado
channel-status-connecting = Conectando...
channel-status-error = Erro de Conexão
channel-status-pending = Configuração Pendente
channel-status-active = Ativo
channel-status-inactive = Inativo
channel-status-suspended = Suspenso
channel-setup-title = Configuração de Canal
channel-setup-description = Conecte seu bot a diferentes canais de comunicação
channel-setup-select = Selecione um canal para configurar
channel-setup-configure = Configurar Canal
channel-setup-test = Testar Conexão
channel-setup-save = Salvar Configuração
channel-setup-cancel = Cancelar
channel-setup-reset = Restaurar Padrões
channel-connect = Conectar
channel-disconnect = Desconectar
channel-reconnect = Reconectar
channel-refresh = Atualizar Status
channel-settings = Configurações do Canal
channel-delete = Remover Canal
channel-confirm-delete = Tem certeza que deseja remover este canal?
channel-deleted = Canal removido com sucesso
channel-saved = Configuração do canal salva
channel-whatsapp-phone = Número de Telefone
channel-whatsapp-business-id = ID da Conta Business
channel-whatsapp-api-key = Chave de API
channel-whatsapp-webhook = URL do Webhook
channel-whatsapp-verify-token = Token de Verificação
channel-whatsapp-template = Template de Mensagem
channel-whatsapp-templates = Templates de Mensagem
channel-whatsapp-template-create = Criar Template
channel-whatsapp-template-status = Status do Template
channel-whatsapp-template-approved = Aprovado
channel-whatsapp-template-pending = Aguardando Aprovação
channel-whatsapp-template-rejected = Rejeitado
channel-whatsapp-24h-window = Janela de mensagens de 24 horas
channel-whatsapp-session-active = Sessão ativa
channel-whatsapp-session-expired = Sessão expirada
channel-telegram-bot-token = Token do Bot
channel-telegram-bot-username = Nome de Usuário do Bot
channel-telegram-webhook = URL do Webhook
channel-telegram-commands = Comandos do Bot
channel-telegram-command-add = Adicionar Comando
channel-telegram-command-name = Nome do Comando
channel-telegram-command-description = Descrição
channel-telegram-inline-mode = Modo Inline
channel-telegram-group-privacy = Modo de Privacidade em Grupos
channel-slack-workspace = Workspace
channel-slack-bot-token = Token do Bot
channel-slack-signing-secret = Segredo de Assinatura
channel-slack-app-id = ID do App
channel-slack-channels = Canais
channel-slack-channel-select = Selecionar Canais
channel-slack-events = Assinaturas de Eventos
channel-slack-slash-commands = Comandos Slash
channel-slack-interactivity = Interatividade
channel-teams-tenant-id = ID do Tenant
channel-teams-app-id = ID do Aplicativo
channel-teams-app-secret = Segredo do Aplicativo
channel-teams-bot-id = ID do Bot
channel-teams-manifest = Manifesto do App
channel-teams-publish = Publicar no Teams
channel-teams-install = Instalar no Teams
channel-email-smtp-host = Host SMTP
channel-email-smtp-port = Porta SMTP
channel-email-smtp-user = Usuário SMTP
channel-email-smtp-password = Senha SMTP
channel-email-smtp-encryption = Criptografia
channel-email-imap-host = Host IMAP
channel-email-imap-port = Porta IMAP
channel-email-from-name = Nome do Remetente
channel-email-from-address = Endereço do Remetente
channel-email-reply-to = Endereço de Resposta
channel-email-signature = Assinatura de E-mail
channel-instagram-account = Conta do Instagram
channel-instagram-page-id = ID da Página
channel-instagram-access-token = Token de Acesso
channel-instagram-business = Conta Business
channel-instagram-comments = Respostas a Comentários
channel-instagram-stories = Menções em Stories
channel-instagram-dm = Mensagens Diretas
channel-messenger-page-id = ID da Página
channel-messenger-app-id = ID do App
channel-messenger-app-secret = Segredo do App
channel-messenger-page-token = Token de Acesso da Página
channel-messenger-verify-token = Token de Verificação
channel-messenger-persistent-menu = Menu Persistente
channel-messenger-get-started = Botão de Começar
channel-sms-provider = Provedor de SMS
channel-sms-twilio = Twilio
channel-sms-vonage = Vonage
channel-sms-account-sid = Account SID
channel-sms-auth-token = Token de Autenticação
channel-sms-phone-number = Número de Telefone
channel-sms-sender-id = ID do Remetente
channel-voice-provider = Provedor de Voz
channel-voice-twilio = Twilio
channel-voice-vonage = Vonage
channel-voice-phone-number = Número de Telefone
channel-voice-greeting = Saudação de Voz
channel-voice-fallback = Mensagem de Fallback
channel-voice-transcription = Ativar Transcrição
channel-voice-recording = Ativar Gravação
channel-voice-language = Idioma da Voz
channel-voice-voice-type = Tipo de Voz
channel-discord-bot-token = Token do Bot
channel-discord-client-id = ID do Cliente
channel-discord-client-secret = Segredo do Cliente
channel-discord-guild = Servidor (Guild)
channel-discord-channels = Canais
channel-discord-permissions = Permissões do Bot
channel-discord-invite-url = URL de Convite
channel-api-endpoint = Endpoint da API
channel-api-key = Chave de API
channel-api-secret = Segredo da API
channel-api-webhook = URL do Webhook
channel-api-rate-limit = Limite de Taxa
channel-api-documentation = Documentação da API
channel-widget-title = Widget Web
channel-widget-position = Posição do Widget
channel-widget-position-left = Inferior Esquerdo
channel-widget-position-right = Inferior Direito
channel-widget-color = Cor Principal
channel-widget-header = Texto do Cabeçalho
channel-widget-placeholder = Placeholder do Campo
channel-widget-welcome = Mensagem de Boas-vindas
channel-widget-avatar = Avatar do Bot
channel-widget-bubble = Balão de Chat
channel-widget-preview = Visualizar Widget
channel-widget-embed-code = Código de Incorporação
channel-widget-copy-code = Copiar Código
channel-widget-code-copied = Código copiado para a área de transferência
channel-routing-title = Roteamento de Canais
channel-routing-default = Canal Padrão
channel-routing-rules = Regras de Roteamento
channel-routing-add-rule = Adicionar Regra
channel-routing-condition = Condição
channel-routing-action = Ação
channel-routing-priority = Prioridade
channel-routing-fallback = Canal de Fallback
channel-analytics-messages = Mensagens
channel-analytics-conversations = Conversas
channel-analytics-users = Usuários Únicos
channel-analytics-response-time = Tempo Médio de Resposta
channel-analytics-satisfaction = Índice de Satisfação
channel-analytics-by-channel = Análises por Canal
channel-error-connection = Falha ao conectar ao canal
channel-error-authentication = Falha na autenticação
channel-error-configuration = Configuração inválida
channel-error-rate-limit = Limite de taxa excedido
channel-error-webhook = Falha na verificação do webhook
channel-error-permission = Permissões insuficientes
channel-error-not-found = Canal não encontrado
channel-error-already-exists = Canal já configurado

347
locales/pt-BR/common.ftl Normal file
View file

@ -0,0 +1,347 @@
# ============================================================================
# General Bots - Traduções Comuns (Português Brasileiro)
# ============================================================================
# Este arquivo contém strings compartilhadas em todos os componentes GB.
# Mantenha os IDs de mensagem em minúsculas com hífens: categoria-subcategoria-descritor
# ============================================================================
# -----------------------------------------------------------------------------
# Marca
# -----------------------------------------------------------------------------
app-name = General Bots
app-tagline = Seu espaço de trabalho com inteligência artificial
# -----------------------------------------------------------------------------
# Ações Comuns
# -----------------------------------------------------------------------------
action-save = Salvar
action-cancel = Cancelar
action-delete = Excluir
action-edit = Editar
action-close = Fechar
action-confirm = Confirmar
action-retry = Tentar novamente
action-back = Voltar
action-next = Próximo
action-submit = Enviar
action-search = Buscar
action-refresh = Atualizar
action-copy = Copiar
action-paste = Colar
action-undo = Desfazer
action-redo = Refazer
action-select = Selecionar
action-select-all = Selecionar tudo
action-clear = Limpar
action-reset = Redefinir
action-apply = Aplicar
action-create = Criar
action-update = Atualizar
action-remove = Remover
action-add = Adicionar
action-upload = Enviar
action-download = Baixar
action-export = Exportar
action-import = Importar
action-share = Compartilhar
action-send = Enviar
action-reply = Responder
action-forward = Encaminhar
action-archive = Arquivar
action-restore = Restaurar
action-duplicate = Duplicar
action-rename = Renomear
action-move = Mover
action-filter = Filtrar
action-sort = Ordenar
action-view = Visualizar
action-hide = Ocultar
action-show = Mostrar
action-expand = Expandir
action-collapse = Recolher
action-enable = Ativar
action-disable = Desativar
action-connect = Conectar
action-disconnect = Desconectar
action-sync = Sincronizar
action-start = Iniciar
action-stop = Parar
action-pause = Pausar
action-resume = Continuar
action-continue = Continuar
action-finish = Finalizar
action-complete = Concluir
action-approve = Aprovar
action-reject = Rejeitar
action-accept = Aceitar
action-decline = Recusar
action-login = Entrar
action-logout = Sair
action-signup = Cadastrar-se
action-forgot-password = Esqueci a senha
# -----------------------------------------------------------------------------
# Rótulos Comuns
# -----------------------------------------------------------------------------
label-loading = Carregando...
label-saving = Salvando...
label-processing = Processando...
label-searching = Buscando...
label-uploading = Enviando...
label-downloading = Baixando...
label-no-results = Nenhum resultado encontrado
label-no-data = Nenhum dado disponível
label-empty = Vazio
label-none = Nenhum
label-all = Todos
label-selected = Selecionado
label-required = Obrigatório
label-optional = Opcional
label-default = Padrão
label-custom = Personalizado
label-new = Novo
label-draft = Rascunho
label-pending = Pendente
label-active = Ativo
label-inactive = Inativo
label-enabled = Ativado
label-disabled = Desativado
label-public = Público
label-private = Privado
label-shared = Compartilhado
label-yes = Sim
label-no = Não
label-on = Ligado
label-off = Desligado
label-true = Verdadeiro
label-false = Falso
label-unknown = Desconhecido
label-other = Outro
label-more = Mais
label-less = Menos
label-details = Detalhes
label-summary = Resumo
label-description = Descrição
label-name = Nome
label-title = Título
label-type = Tipo
label-status = Status
label-priority = Prioridade
label-date = Data
label-time = Hora
label-size = Tamanho
label-count = Quantidade
label-total = Total
label-average = Média
label-minimum = Mínimo
label-maximum = Máximo
label-version = Versão
label-id = ID
label-created = Criado
label-updated = Atualizado
label-modified = Modificado
label-deleted = Excluído
label-by = Por
label-from = De
label-to = Para
label-at = Em
label-in = Em
label-of = De
# -----------------------------------------------------------------------------
# Mensagens de Status
# -----------------------------------------------------------------------------
status-success = Sucesso
status-error = Erro
status-warning = Atenção
status-info = Informação
status-loading = Carregando
status-complete = Concluído
status-incomplete = Incompleto
status-failed = Falhou
status-cancelled = Cancelado
status-pending = Pendente
status-in-progress = Em andamento
status-done = Feito
status-ready = Pronto
status-not-ready = Não pronto
status-connected = Conectado
status-disconnected = Desconectado
status-online = Online
status-offline = Offline
status-available = Disponível
status-unavailable = Indisponível
status-busy = Ocupado
status-away = Ausente
# -----------------------------------------------------------------------------
# Diálogos de Confirmação
# -----------------------------------------------------------------------------
confirm-delete = Tem certeza que deseja excluir isto?
confirm-delete-item = Tem certeza que deseja excluir "{ $name }"?
confirm-delete-items = Tem certeza que deseja excluir { $count ->
[one] este item
*[other] estes { $count } itens
}?
confirm-discard-changes = Você tem alterações não salvas. Tem certeza que deseja descartá-las?
confirm-logout = Tem certeza que deseja sair?
confirm-cancel = Tem certeza que deseja cancelar?
# -----------------------------------------------------------------------------
# Tempo e Datas
# -----------------------------------------------------------------------------
time-now = Agora mesmo
time-seconds-ago = { $count ->
[one] { $count } segundo atrás
*[other] { $count } segundos atrás
}
time-minutes-ago = { $count ->
[one] { $count } minuto atrás
*[other] { $count } minutos atrás
}
time-hours-ago = { $count ->
[one] { $count } hora atrás
*[other] { $count } horas atrás
}
time-days-ago = { $count ->
[one] { $count } dia atrás
*[other] { $count } dias atrás
}
time-weeks-ago = { $count ->
[one] { $count } semana atrás
*[other] { $count } semanas atrás
}
time-months-ago = { $count ->
[one] { $count } mês atrás
*[other] { $count } meses atrás
}
time-years-ago = { $count ->
[one] { $count } ano atrás
*[other] { $count } anos atrás
}
time-in-seconds = { $count ->
[one] em { $count } segundo
*[other] em { $count } segundos
}
time-in-minutes = { $count ->
[one] em { $count } minuto
*[other] em { $count } minutos
}
time-in-hours = { $count ->
[one] em { $count } hora
*[other] em { $count } horas
}
time-in-days = { $count ->
[one] em { $count } dia
*[other] em { $count } dias
}
time-today = Hoje
time-yesterday = Ontem
time-tomorrow = Amanhã
time-this-week = Esta semana
time-last-week = Semana passada
time-next-week = Próxima semana
time-this-month = Este mês
time-last-month = Mês passado
time-next-month = Próximo mês
time-this-year = Este ano
time-last-year = Ano passado
time-next-year = Próximo ano
# Dias da semana
day-sunday = Domingo
day-monday = Segunda-feira
day-tuesday = Terça-feira
day-wednesday = Quarta-feira
day-thursday = Quinta-feira
day-friday = Sexta-feira
day-saturday = Sábado
day-sun = Dom
day-mon = Seg
day-tue = Ter
day-wed = Qua
day-thu = Qui
day-fri = Sex
day-sat = Sáb
# Meses
month-january = Janeiro
month-february = Fevereiro
month-march = Março
month-april = Abril
month-may = Maio
month-june = Junho
month-july = Julho
month-august = Agosto
month-september = Setembro
month-october = Outubro
month-november = Novembro
month-december = Dezembro
month-jan = Jan
month-feb = Fev
month-mar = Mar
month-apr = Abr
month-may-short = Mai
month-jun = Jun
month-jul = Jul
month-aug = Ago
month-sep = Set
month-oct = Out
month-nov = Nov
month-dec = Dez
# -----------------------------------------------------------------------------
# Tamanhos de Arquivo
# -----------------------------------------------------------------------------
size-bytes = { $value } B
size-kilobytes = { $value } KB
size-megabytes = { $value } MB
size-gigabytes = { $value } GB
size-terabytes = { $value } TB
# -----------------------------------------------------------------------------
# Paginação
# -----------------------------------------------------------------------------
pagination-page = Página { $current } de { $total }
pagination-showing = Exibindo { $start } a { $end } de { $total }
pagination-items-per-page = Itens por página
pagination-first = Primeira
pagination-previous = Anterior
pagination-next = Próxima
pagination-last = Última
pagination-go-to-page = Ir para página
# -----------------------------------------------------------------------------
# Validação de Formulário
# -----------------------------------------------------------------------------
validation-required = Este campo é obrigatório
validation-required-field = { $field } é obrigatório
validation-email-invalid = Por favor, insira um endereço de e-mail válido
validation-url-invalid = Por favor, insira uma URL válida
validation-number-invalid = Por favor, insira um número válido
validation-date-invalid = Por favor, insira uma data válida
validation-min-length = Deve ter pelo menos { $min } caracteres
validation-max-length = Deve ter no máximo { $max } caracteres
validation-min-value = Deve ser pelo menos { $min }
validation-max-value = Deve ser no máximo { $max }
validation-pattern-mismatch = Formato inválido
validation-passwords-mismatch = As senhas não coincidem
validation-file-too-large = Arquivo muito grande. Tamanho máximo é { $max }
validation-file-type-invalid = Tipo de arquivo inválido. Tipos permitidos: { $types }
# -----------------------------------------------------------------------------
# Acessibilidade
# -----------------------------------------------------------------------------
a11y-skip-to-content = Pular para o conteúdo principal
a11y-loading = Carregando, por favor aguarde
a11y-menu-open = Abrir menu
a11y-menu-close = Fechar menu
a11y-expand = Expandir
a11y-collapse = Recolher
a11y-selected = Selecionado
a11y-not-selected = Não selecionado
a11y-required = Campo obrigatório
a11y-error = Erro
a11y-success = Sucesso
a11y-warning = Atenção
a11y-info = Informação

324
locales/pt-BR/contacts.ftl Normal file
View file

@ -0,0 +1,324 @@
# =============================================================================
# General Bots - Contacts Translations (Portuguese - Brazil)
# =============================================================================
# Traduções da interface de gerenciamento de contatos
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation & Headers
# -----------------------------------------------------------------------------
contacts-title = Contatos
contacts-subtitle = Gerencie seus contatos e relacionamentos
contacts-nav-all = Todos os Contatos
contacts-nav-favorites = Favoritos
contacts-nav-recent = Adicionados Recentemente
contacts-nav-groups = Grupos
contacts-nav-tags = Tags
# -----------------------------------------------------------------------------
# Views & Filters
# -----------------------------------------------------------------------------
contacts-view-list = Visualização em Lista
contacts-view-grid = Visualização em Grade
contacts-filter-all = Todos
contacts-filter-active = Ativos
contacts-filter-inactive = Inativos
contacts-filter-leads = Leads
contacts-filter-customers = Clientes
contacts-filter-prospects = Prospects
contacts-filter-archived = Arquivados
contacts-search-placeholder = Pesquisar contatos...
contacts-sort-name = Ordenar por Nome
contacts-sort-company = Ordenar por Empresa
contacts-sort-recent = Ordenar por Recentes
contacts-sort-created = Ordenar por Criação
# -----------------------------------------------------------------------------
# Contact Fields
# -----------------------------------------------------------------------------
contacts-field-first-name = Nome
contacts-field-last-name = Sobrenome
contacts-field-email = E-mail
contacts-field-phone = Telefone
contacts-field-mobile = Celular
contacts-field-company = Empresa
contacts-field-job-title = Cargo
contacts-field-department = Departamento
contacts-field-website = Website
contacts-field-linkedin = LinkedIn
contacts-field-twitter = Twitter
contacts-field-address = Endereço
contacts-field-city = Cidade
contacts-field-state = Estado
contacts-field-postal-code = CEP
contacts-field-country = País
contacts-field-notes = Observações
contacts-field-tags = Tags
contacts-field-source = Origem
contacts-field-status = Status
contacts-field-last-contacted = Último Contato
contacts-field-created-at = Criado em
contacts-field-updated-at = Atualizado em
# -----------------------------------------------------------------------------
# Contact Status
# -----------------------------------------------------------------------------
contacts-status-active = Ativo
contacts-status-inactive = Inativo
contacts-status-lead = Lead
contacts-status-customer = Cliente
contacts-status-prospect = Prospect
contacts-status-archived = Arquivado
# -----------------------------------------------------------------------------
# Contact Source
# -----------------------------------------------------------------------------
contacts-source-manual = Entrada Manual
contacts-source-import = Importação
contacts-source-webform = Formulário Web
contacts-source-api = API
contacts-source-email = E-mail
contacts-source-meeting = Reunião
contacts-source-referral = Indicação
contacts-source-social = Redes Sociais
# -----------------------------------------------------------------------------
# Actions
# -----------------------------------------------------------------------------
contacts-action-add = Adicionar Contato
contacts-action-edit = Editar Contato
contacts-action-delete = Excluir Contato
contacts-action-archive = Arquivar Contato
contacts-action-restore = Restaurar Contato
contacts-action-favorite = Adicionar aos Favoritos
contacts-action-unfavorite = Remover dos Favoritos
contacts-action-export = Exportar Contatos
contacts-action-import = Importar Contatos
contacts-action-merge = Mesclar Contatos
contacts-action-send-email = Enviar E-mail
contacts-action-schedule-meeting = Agendar Reunião
contacts-action-create-task = Criar Tarefa
contacts-action-add-note = Adicionar Observação
contacts-action-add-tag = Adicionar Tag
contacts-action-remove-tag = Remover Tag
# -----------------------------------------------------------------------------
# Bulk Actions
# -----------------------------------------------------------------------------
contacts-bulk-selected = { $count } contatos selecionados
contacts-bulk-delete = Excluir Selecionados
contacts-bulk-archive = Arquivar Selecionados
contacts-bulk-add-tag = Adicionar Tag aos Selecionados
contacts-bulk-remove-tag = Remover Tag dos Selecionados
contacts-bulk-add-to-group = Adicionar ao Grupo
contacts-bulk-remove-from-group = Remover do Grupo
contacts-bulk-export = Exportar Selecionados
contacts-bulk-change-status = Alterar Status
# -----------------------------------------------------------------------------
# Groups
# -----------------------------------------------------------------------------
contacts-groups-title = Grupos de Contatos
contacts-groups-create = Criar Grupo
contacts-groups-edit = Editar Grupo
contacts-groups-delete = Excluir Grupo
contacts-groups-name = Nome do Grupo
contacts-groups-description = Descrição
contacts-groups-color = Cor
contacts-groups-members = { $count } membros
contacts-groups-add-members = Adicionar Membros
contacts-groups-remove-members = Remover Membros
# -----------------------------------------------------------------------------
# Import/Export
# -----------------------------------------------------------------------------
contacts-import-title = Importar Contatos
contacts-import-description = Envie um arquivo para importar contatos
contacts-import-format-csv = Arquivo CSV
contacts-import-format-vcard = Arquivo vCard
contacts-import-format-json = Arquivo JSON
contacts-import-drop-zone = Arraste e solte seu arquivo aqui, ou clique para procurar
contacts-import-mapping = Mapeamento de Campos
contacts-import-preview = Pré-visualização
contacts-import-skip-duplicates = Ignorar entradas duplicadas
contacts-import-update-existing = Atualizar contatos existentes
contacts-import-success = { $count } contatos importados com sucesso
contacts-import-errors = { $count } erros durante a importação
contacts-export-title = Exportar Contatos
contacts-export-description = Baixe seus contatos
contacts-export-format = Formato de Exportação
contacts-export-all = Exportar Todos os Contatos
contacts-export-selected = Exportar Selecionados
contacts-export-group = Exportar Grupo
contacts-export-include-custom = Incluir Campos Personalizados
contacts-export-success = { $count } contatos exportados com sucesso
# -----------------------------------------------------------------------------
# Detail Panel
# -----------------------------------------------------------------------------
contacts-detail-title = Detalhes do Contato
contacts-detail-info = Informações
contacts-detail-activity = Atividade
contacts-detail-notes = Observações
contacts-detail-tasks = Tarefas
contacts-detail-events = Eventos
contacts-detail-files = Arquivos
contacts-detail-history = Histórico
# -----------------------------------------------------------------------------
# Activity Types
# -----------------------------------------------------------------------------
contacts-activity-email = E-mail
contacts-activity-call = Ligação
contacts-activity-meeting = Reunião
contacts-activity-task = Tarefa
contacts-activity-note = Observação
contacts-activity-status-change = Status Alterado
contacts-activity-created = Contato Criado
contacts-activity-updated = Contato Atualizado
contacts-activity-imported = Contato Importado
# -----------------------------------------------------------------------------
# Quick Actions
# -----------------------------------------------------------------------------
contacts-quick-email = E-mail
contacts-quick-call = Ligar
contacts-quick-meeting = Reunião
contacts-quick-task = Tarefa
# -----------------------------------------------------------------------------
# Calendar Integration
# -----------------------------------------------------------------------------
contacts-calendar-link = Vincular ao Evento
contacts-calendar-unlink = Desvincular do Evento
contacts-calendar-events = Eventos Relacionados
contacts-calendar-upcoming = Próximos Eventos
contacts-calendar-past = Eventos Passados
contacts-calendar-role = Função
contacts-calendar-role-attendee = Participante
contacts-calendar-role-organizer = Organizador
contacts-calendar-role-optional = Opcional
contacts-calendar-role-speaker = Palestrante
contacts-calendar-role-host = Anfitrião
contacts-calendar-response = Status de Resposta
contacts-calendar-response-accepted = Aceito
contacts-calendar-response-declined = Recusado
contacts-calendar-response-tentative = Tentativa
contacts-calendar-response-pending = Pendente
# -----------------------------------------------------------------------------
# Tasks Integration
# -----------------------------------------------------------------------------
contacts-tasks-assign = Atribuir à Tarefa
contacts-tasks-unassign = Desatribuir da Tarefa
contacts-tasks-related = Tarefas Relacionadas
contacts-tasks-active = Tarefas Ativas
contacts-tasks-completed = Tarefas Concluídas
contacts-tasks-overdue = Tarefas Atrasadas
contacts-tasks-role = Função
contacts-tasks-role-assignee = Responsável
contacts-tasks-role-reviewer = Revisor
contacts-tasks-role-stakeholder = Parte Interessada
contacts-tasks-role-collaborator = Colaborador
contacts-tasks-role-client = Cliente
contacts-tasks-role-approver = Aprovador
contacts-tasks-workload = Carga de Trabalho
contacts-tasks-workload-low = Baixa
contacts-tasks-workload-medium = Média
contacts-tasks-workload-high = Alta
contacts-tasks-workload-overloaded = Sobrecarregado
# -----------------------------------------------------------------------------
# External Sync
# -----------------------------------------------------------------------------
contacts-sync-title = Sincronização de Agenda
contacts-sync-description = Sincronize com agendas externas
contacts-sync-google = Google Contatos
contacts-sync-microsoft = Microsoft People
contacts-sync-apple = Contatos Apple
contacts-sync-carddav = Servidor CardDAV
contacts-sync-connect = Conectar Conta
contacts-sync-disconnect = Desconectar
contacts-sync-connected = Conectado
contacts-sync-last-sync = Última sincronização { $time }
contacts-sync-in-progress = Sincronização em andamento...
contacts-sync-success = Sincronização concluída com sucesso
contacts-sync-error = Falha na sincronização
contacts-sync-direction = Direção da Sincronização
contacts-sync-direction-two-way = Sincronização Bidirecional
contacts-sync-direction-import = Apenas Importar
contacts-sync-direction-export = Apenas Exportar
contacts-sync-conflicts = { $count } conflitos detectados
contacts-sync-resolve = Resolver Conflitos
contacts-sync-keep-local = Manter Local
contacts-sync-keep-remote = Manter Remoto
contacts-sync-merge = Mesclar Ambos
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
contacts-empty-title = Nenhum contato ainda
contacts-empty-description = Adicione seu primeiro contato para começar
contacts-empty-action = Adicionar Contato
contacts-empty-search = Nenhum contato corresponde à sua pesquisa
contacts-empty-filter = Nenhum contato corresponde ao filtro selecionado
contacts-empty-group = Este grupo não tem membros
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
contacts-confirm-delete = Tem certeza de que deseja excluir este contato?
contacts-confirm-delete-bulk = Tem certeza de que deseja excluir { $count } contatos?
contacts-confirm-archive = Tem certeza de que deseja arquivar este contato?
contacts-confirm-merge = Tem certeza de que deseja mesclar estes contatos?
contacts-confirm-disconnect = Tem certeza de que deseja desconectar esta conta?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
contacts-success-created = Contato criado com sucesso
contacts-success-updated = Contato atualizado com sucesso
contacts-success-deleted = Contato excluído com sucesso
contacts-success-archived = Contato arquivado com sucesso
contacts-success-restored = Contato restaurado com sucesso
contacts-success-merged = Contatos mesclados com sucesso
contacts-success-imported = Contatos importados com sucesso
contacts-success-exported = Contatos exportados com sucesso
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
contacts-error-create = Falha ao criar contato
contacts-error-update = Falha ao atualizar contato
contacts-error-delete = Falha ao excluir contato
contacts-error-import = Falha ao importar contatos
contacts-error-export = Falha ao exportar contatos
contacts-error-sync = Falha na sincronização
contacts-error-duplicate = Já existe um contato com este e-mail
contacts-error-required = Este campo é obrigatório
contacts-error-invalid-email = Por favor, insira um endereço de e-mail válido
contacts-error-invalid-phone = Por favor, insira um número de telefone válido
# -----------------------------------------------------------------------------
# People Module
# -----------------------------------------------------------------------------
people-title = Pessoas
people-subtitle = Contatos, Grupos e Diretório
people-search = Buscar contatos...
people-add = Adicionar Contato
people-tab-contacts = Contatos
people-tab-groups = Grupos
people-tab-directory = Diretório
people-tab-recent = Recentes
people-loading = Carregando contatos...
people-add-contact = Adicionar Contato
people-first-name = Nome
people-last-name = Sobrenome
people-email = E-mail
people-phone = Telefone
people-company = Empresa
people-job-title = Cargo
people-notes = Notas
people-empty-title = Nenhum contato ainda
people-empty-desc = Adicione seu primeiro contato para começar

165
locales/pt-BR/errors.ftl Normal file
View file

@ -0,0 +1,165 @@
# General Bots - Mensagens de Erro (Português Brasileiro)
# Este arquivo contém todas as traduções de mensagens de erro
# =============================================================================
# Erros HTTP
# =============================================================================
error-http-400 = Requisição inválida. Por favor, verifique seus dados.
error-http-401 = Autenticação necessária. Por favor, faça login.
error-http-403 = Você não tem permissão para acessar este recurso.
error-http-404 = { $entity } não encontrado.
error-http-409 = Conflito: { $message }
error-http-429 = Muitas requisições. Por favor, aguarde { $seconds } segundos.
error-http-500 = Erro interno do servidor. Por favor, tente novamente mais tarde.
error-http-502 = Gateway inválido. O servidor recebeu uma resposta inválida.
error-http-503 = Serviço temporariamente indisponível. Por favor, tente novamente mais tarde.
error-http-504 = Tempo limite da requisição excedido após { $milliseconds }ms.
# =============================================================================
# Erros de Validação
# =============================================================================
error-validation-required = { $field } é obrigatório.
error-validation-email = Por favor, insira um endereço de e-mail válido.
error-validation-url = Por favor, insira uma URL válida.
error-validation-phone = Por favor, insira um número de telefone válido.
error-validation-min-length = { $field } deve ter pelo menos { $min } caracteres.
error-validation-max-length = { $field } deve ter no máximo { $max } caracteres.
error-validation-min-value = { $field } deve ser pelo menos { $min }.
error-validation-max-value = { $field } deve ser no máximo { $max }.
error-validation-pattern = O formato de { $field } é inválido.
error-validation-unique = { $field } já existe.
error-validation-mismatch = { $field } não corresponde a { $other }.
error-validation-date-format = Por favor, insira uma data válida no formato { $format }.
error-validation-date-past = { $field } deve estar no passado.
error-validation-date-future = { $field } deve estar no futuro.
# =============================================================================
# Erros de Autenticação
# =============================================================================
error-auth-invalid-credentials = E-mail ou senha inválidos.
error-auth-account-locked = Sua conta foi bloqueada. Por favor, entre em contato com o suporte.
error-auth-account-disabled = Sua conta foi desativada.
error-auth-session-expired = Sua sessão expirou. Por favor, faça login novamente.
error-auth-token-invalid = Token inválido ou expirado.
error-auth-token-missing = Token de autenticação é obrigatório.
error-auth-mfa-required = Autenticação de dois fatores é obrigatória.
error-auth-mfa-invalid = Código de verificação inválido.
error-auth-password-weak = A senha é muito fraca. Por favor, use uma senha mais forte.
error-auth-password-expired = Sua senha expirou. Por favor, redefina-a.
# =============================================================================
# Erros de Configuração
# =============================================================================
error-config = Erro de configuração: { $message }
error-config-missing = Configuração ausente: { $key }
error-config-invalid = Valor de configuração inválido para { $key }: { $reason }
error-config-file-not-found = Arquivo de configuração não encontrado: { $path }
error-config-parse = Falha ao analisar configuração: { $message }
# =============================================================================
# Erros de Banco de Dados
# =============================================================================
error-database = Erro de banco de dados: { $message }
error-database-connection = Falha ao conectar ao banco de dados.
error-database-timeout = Operação do banco de dados expirou.
error-database-constraint = Violação de restrição do banco de dados: { $constraint }
error-database-duplicate = Um registro com este { $field } já existe.
error-database-migration = Migração do banco de dados falhou: { $message }
# =============================================================================
# Erros de Arquivo e Armazenamento
# =============================================================================
error-file-not-found = Arquivo não encontrado: { $filename }
error-file-too-large = Arquivo muito grande. Tamanho máximo é { $maxSize }.
error-file-type-not-allowed = Tipo de arquivo não permitido. Tipos permitidos: { $allowedTypes }.
error-file-upload-failed = Falha no envio do arquivo: { $message }
error-file-read = Falha ao ler arquivo: { $message }
error-file-write = Falha ao escrever arquivo: { $message }
error-storage-full = Cota de armazenamento excedida.
error-storage-unavailable = Serviço de armazenamento indisponível.
# =============================================================================
# Erros de Rede e Serviços Externos
# =============================================================================
error-network = Erro de rede: { $message }
error-network-timeout = Conexão expirou.
error-network-unreachable = Servidor inacessível.
error-service-unavailable = Serviço indisponível: { $service }
error-external-api = Erro de API externa: { $message }
error-rate-limit = Limite de requisições excedido. Tente novamente após { $seconds }s.
# =============================================================================
# Erros de Bot e Diálogo
# =============================================================================
error-bot-not-found = Bot não encontrado: { $botId }
error-bot-disabled = Este bot está desativado no momento.
error-bot-script-error = Erro de script na linha { $line }: { $message }
error-bot-timeout = Tempo de resposta do bot expirou.
error-bot-quota-exceeded = Cota de uso do bot excedida.
error-dialog-not-found = Diálogo não encontrado: { $dialogId }
error-dialog-invalid = Configuração de diálogo inválida: { $message }
# =============================================================================
# Erros de LLM e IA
# =============================================================================
error-llm-unavailable = Serviço de IA está indisponível no momento.
error-llm-timeout = Tempo limite da requisição de IA expirou.
error-llm-rate-limit = Limite de requisições de IA excedido. Por favor, aguarde antes de tentar novamente.
error-llm-content-filter = Conteúdo foi filtrado pelas diretrizes de segurança.
error-llm-context-length = Entrada muito longa. Por favor, encurte sua mensagem.
error-llm-invalid-response = Resposta inválida recebida do serviço de IA.
# =============================================================================
# Erros de E-mail
# =============================================================================
error-email-send-failed = Falha ao enviar e-mail: { $message }
error-email-invalid-recipient = Endereço de e-mail do destinatário inválido: { $email }
error-email-attachment-failed = Falha ao anexar arquivo: { $filename }
error-email-template-not-found = Modelo de e-mail não encontrado: { $template }
# =============================================================================
# Erros de Calendário e Agendamento
# =============================================================================
error-calendar-conflict = Horário conflita com evento existente.
error-calendar-past-date = Não é possível agendar eventos no passado.
error-calendar-invalid-recurrence = Padrão de recorrência inválido.
error-calendar-event-not-found = Evento não encontrado: { $eventId }
# =============================================================================
# Erros de Tarefa
# =============================================================================
error-task-not-found = Tarefa não encontrada: { $taskId }
error-task-already-completed = A tarefa já foi concluída.
error-task-circular-dependency = Dependência circular detectada nas tarefas.
error-task-invalid-status = Transição de status de tarefa inválida.
# =============================================================================
# Erros de Permissão
# =============================================================================
error-permission-denied = Você não tem permissão para realizar esta ação.
error-permission-resource = Você não tem acesso a este { $resource }.
error-permission-action = Você não pode { $action } este { $resource }.
error-permission-owner-only = Apenas o proprietário pode realizar esta ação.
# =============================================================================
# Erros Genéricos
# =============================================================================
error-internal = Erro interno: { $message }
error-unexpected = Ocorreu um erro inesperado. Por favor, tente novamente.
error-not-implemented = Este recurso ainda não foi implementado.
error-maintenance = Sistema em manutenção. Por favor, tente novamente mais tarde.
error-unknown = Ocorreu um erro desconhecido.

View file

@ -0,0 +1,127 @@
notification-title-new-message = Nova Mensagem
notification-title-task-due = Tarefa Vencendo
notification-title-task-assigned = Tarefa Atribuída
notification-title-task-completed = Tarefa Concluída
notification-title-meeting-reminder = Lembrete de Reunião
notification-title-meeting-started = Reunião Iniciada
notification-title-file-shared = Arquivo Compartilhado
notification-title-file-uploaded = Arquivo Enviado
notification-title-comment-added = Novo Comentário
notification-title-mention = Você foi mencionado
notification-title-system = Notificação do Sistema
notification-title-security = Alerta de Segurança
notification-title-update = Atualização Disponível
notification-title-error = Erro Ocorrido
notification-title-success = Sucesso
notification-title-warning = Atenção
notification-title-info = Informação
notification-message-new = Você tem uma nova mensagem de { $sender }
notification-message-unread = Você tem { $count ->
[one] { $count } mensagem não lida
*[other] { $count } mensagens não lidas
}
notification-task-due-soon = A tarefa "{ $task }" vence em { $time }
notification-task-due-today = A tarefa "{ $task }" vence hoje
notification-task-due-overdue = A tarefa "{ $task }" está atrasada há { $time }
notification-task-assigned-to-you = Você foi atribuído à tarefa "{ $task }"
notification-task-assigned-by = { $assigner } atribuiu você à tarefa "{ $task }"
notification-task-completed-by = { $user } concluiu a tarefa "{ $task }"
notification-task-status-changed = O status da tarefa "{ $task }" mudou para { $status }
notification-meeting-in-minutes = A reunião "{ $meeting }" começa em { $minutes } minutos
notification-meeting-starting-now = A reunião "{ $meeting }" está começando agora
notification-meeting-cancelled = A reunião "{ $meeting }" foi cancelada
notification-meeting-rescheduled = A reunião "{ $meeting }" foi reagendada para { $datetime }
notification-meeting-invite = { $inviter } convidou você para "{ $meeting }"
notification-meeting-response = { $user } { $response } seu convite de reunião
notification-file-shared-with-you = { $sharer } compartilhou "{ $filename }" com você
notification-file-uploaded-by = { $uploader } enviou "{ $filename }"
notification-file-modified = "{ $filename }" foi modificado por { $user }
notification-file-deleted = "{ $filename }" foi excluído por { $user }
notification-file-download-ready = Seu arquivo "{ $filename }" está pronto para download
notification-file-upload-complete = Upload de "{ $filename }" concluído com sucesso
notification-file-upload-failed = Falha no upload de "{ $filename }"
notification-comment-on-task = { $user } comentou na tarefa "{ $task }"
notification-comment-on-file = { $user } comentou em "{ $filename }"
notification-comment-reply = { $user } respondeu ao seu comentário
notification-mention-in-comment = { $user } mencionou você em um comentário
notification-mention-in-chat = { $user } mencionou você em { $channel }
notification-login-new-device = Novo login detectado de { $device } em { $location }
notification-login-failed = Tentativa de login falhou em sua conta
notification-password-changed = Sua senha foi alterada com sucesso
notification-password-expiring = Sua senha expira em { $days } dias
notification-session-expired = Sua sessão expirou
notification-account-locked = Sua conta foi bloqueada
notification-two-factor-enabled = Autenticação de dois fatores foi ativada
notification-two-factor-disabled = Autenticação de dois fatores foi desativada
notification-subscription-expiring = Sua assinatura expira em { $days } dias
notification-subscription-expired = Sua assinatura expirou
notification-subscription-renewed = Sua assinatura foi renovada até { $date }
notification-payment-successful = Pagamento de { $amount } realizado com sucesso
notification-payment-failed = Pagamento de { $amount } falhou
notification-invoice-ready = Sua fatura de { $period } está pronta
notification-bot-response = { $bot } respondeu à sua consulta
notification-bot-error = { $bot } encontrou um erro
notification-bot-offline = { $bot } está offline no momento
notification-bot-online = { $bot } está online agora
notification-bot-updated = { $bot } foi atualizado
notification-system-maintenance = Manutenção do sistema agendada para { $datetime }
notification-system-update = Atualização do sistema disponível: { $version }
notification-system-restored = Sistema foi restaurado
notification-system-degraded = Sistema está com desempenho degradado
notification-action-view = Ver
notification-action-dismiss = Dispensar
notification-action-mark-read = Marcar como lida
notification-action-mark-all-read = Marcar todas como lidas
notification-action-settings = Configurações de notificação
notification-action-reply = Responder
notification-action-open = Abrir
notification-action-join = Entrar
notification-action-accept = Aceitar
notification-action-decline = Recusar
notification-time-just-now = Agora mesmo
notification-time-minutes = { $count ->
[one] { $count } minuto atrás
*[other] { $count } minutos atrás
}
notification-time-hours = { $count ->
[one] { $count } hora atrás
*[other] { $count } horas atrás
}
notification-time-days = { $count ->
[one] { $count } dia atrás
*[other] { $count } dias atrás
}
notification-time-weeks = { $count ->
[one] { $count } semana atrás
*[other] { $count } semanas atrás
}
notification-preference-all = Todas as notificações
notification-preference-important = Apenas importantes
notification-preference-none = Nenhuma
notification-preference-email = Notificações por e-mail
notification-preference-push = Notificações push
notification-preference-in-app = Notificações no aplicativo
notification-preference-sound = Som ativado
notification-preference-vibration = Vibração ativada
notification-empty = Sem notificações
notification-empty-description = Você está em dia!
notification-load-more = Carregar mais
notification-clear-all = Limpar todas as notificações
notification-filter-all = Todas
notification-filter-unread = Não lidas
notification-filter-mentions = Menções
notification-filter-tasks = Tarefas
notification-filter-messages = Mensagens
notification-filter-system = Sistema

1638
locales/pt-BR/ui.ftl Normal file

File diff suppressed because it is too large Load diff

142
locales/pt-BR/video.ftl Normal file
View file

@ -0,0 +1,142 @@
# =============================================================================
# General Bots - Portuguese (Brazil) Video Editor Translations
# =============================================================================
# -----------------------------------------------------------------------------
# Navigation
# -----------------------------------------------------------------------------
nav-video = Vídeo
# -----------------------------------------------------------------------------
# Video Editor - Main
# -----------------------------------------------------------------------------
video-title = Editor de Vídeo
video-new-project = Novo Projeto
video-project-info = Informações do Projeto
video-duration = Duração
video-clips = Clips
video-layers = Camadas
video-resolution = Resolução
# -----------------------------------------------------------------------------
# Video Editor - Add Elements
# -----------------------------------------------------------------------------
video-add-elements = Adicionar Elementos
video-add-clip = Clip de Vídeo
video-add-text = Texto
video-add-image = Imagem
video-add-shape = Forma
video-add-audio = Áudio
video-add-narration = Narração
# -----------------------------------------------------------------------------
# Video Editor - Properties
# -----------------------------------------------------------------------------
video-properties = Propriedades
video-name = Nome
video-volume = Volume
video-opacity = Opacidade
video-position-x = Posição X
video-position-y = Posição Y
video-rotation = Rotação
video-transition-in = Transição de Entrada
video-transition-out = Transição de Saída
# -----------------------------------------------------------------------------
# Video Editor - Timeline
# -----------------------------------------------------------------------------
video-video-track = Vídeo
video-text-track = Texto e Sobreposições
video-audio-track = Áudio
# -----------------------------------------------------------------------------
# Video Editor - Preview
# -----------------------------------------------------------------------------
video-preview = Visualizar
video-add-content = Adicione clips ou elementos para começar a editar
# -----------------------------------------------------------------------------
# Video Editor - Chat
# -----------------------------------------------------------------------------
video-ai-assistant = Assistente IA
video-playhead-at = Cursor:
video-selected = Selecionado:
video-chat-placeholder = Descreva o que você quer mudar...
video-chat-welcome = Olá! Sou seu assistente de edição de vídeo. Você pode me dizer o que mudar, como "adicione um título aqui" ou "faça maior". Vou entender sua seleção atual e a posição do cursor.
# -----------------------------------------------------------------------------
# Video Editor - Export
# -----------------------------------------------------------------------------
video-export = Exportar
video-export-video = Exportar Vídeo
video-format = Formato
video-quality = Qualidade
video-start-export = Iniciar Exportação
video-exporting = Exportando...
video-export-complete = Exportação Concluída
video-export-failed = Exportação Falhou
# -----------------------------------------------------------------------------
# Video Editor - Projects
# -----------------------------------------------------------------------------
video-recent-projects = Projetos Recentes
video-no-projects = Nenhum projeto ainda
video-create-first = Crie seu primeiro projeto de vídeo
video-project-name = Nome do Projeto
video-aspect-ratio = Proporção
video-frame-rate = Taxa de Quadros
video-create = Criar
# -----------------------------------------------------------------------------
# Video Editor - Text Layer
# -----------------------------------------------------------------------------
video-text-content = Conteúdo do Texto
video-font-family = Fonte
video-font-size = Tamanho
video-text-color = Cor
video-duration-sec = Duração (seg)
video-add = Adicionar
# -----------------------------------------------------------------------------
# Video Editor - Actions
# -----------------------------------------------------------------------------
video-undo = Desfazer
video-redo = Refazer
video-cut = Cortar
video-split = Dividir
video-delete = Excluir
video-save = Salvar
# -----------------------------------------------------------------------------
# Video Editor - Status
# -----------------------------------------------------------------------------
video-status-draft = Rascunho
video-status-editing = Editando
video-status-exporting = Exportando
video-status-published = Publicado
video-status-archived = Arquivado
# -----------------------------------------------------------------------------
# Video Editor - Notifications
# -----------------------------------------------------------------------------
video-project-created = Projeto criado
video-project-saved = Projeto salvo
video-clip-added = Clip adicionado
video-layer-added = Camada adicionada
video-text-added = Camada de texto adicionada
video-shape-added = Forma adicionada
video-audio-added = Faixa de áudio adicionada
video-item-deleted = Item excluído
video-export-started = Exportação iniciada
video-export-completed = Exportação concluída com sucesso
video-error-create-project = Falha ao criar projeto
video-error-load-project = Falha ao carregar projeto
video-error-add-clip = Falha ao adicionar clip
video-error-add-layer = Falha ao adicionar camada
video-error-delete = Falha ao excluir item
video-error-export = Falha ao iniciar exportação
video-create-project-first = Por favor crie um projeto primeiro
video-select-clip-to-split = Selecione um clip para dividir
video-playhead-within-clip = O cursor deve estar dentro do clip selecionado
video-tts-coming-soon = Geração de TTS em breve
video-split-coming-soon = Função de dividir em breve

313
locales/pt-BR/webinar.ftl Normal file
View file

@ -0,0 +1,313 @@
# =============================================================================
# General Bots - Webinar Translations (Portuguese - Brazil)
# =============================================================================
# Traduções da interface de webinar, gravação e transcrição
# =============================================================================
# -----------------------------------------------------------------------------
# Webinar Navigation & Headers
# -----------------------------------------------------------------------------
webinar-title = Webinars
webinar-subtitle = Hospede e gerencie webinars
webinar-nav-upcoming = Próximos
webinar-nav-live = Ao Vivo
webinar-nav-past = Webinars Anteriores
webinar-nav-recordings = Gravações
webinar-nav-analytics = Análises
# -----------------------------------------------------------------------------
# Webinar Status
# -----------------------------------------------------------------------------
webinar-status-draft = Rascunho
webinar-status-scheduled = Agendado
webinar-status-live = Ao Vivo
webinar-status-paused = Pausado
webinar-status-ended = Encerrado
webinar-status-cancelled = Cancelado
# -----------------------------------------------------------------------------
# Webinar Fields
# -----------------------------------------------------------------------------
webinar-field-title = Título
webinar-field-description = Descrição
webinar-field-scheduled-start = Data e Hora de Início
webinar-field-scheduled-end = Data e Hora de Término
webinar-field-duration = Duração
webinar-field-timezone = Fuso Horário
webinar-field-host = Anfitrião
webinar-field-panelists = Painelistas
webinar-field-max-attendees = Máximo de Participantes
webinar-field-registration-url = URL de Inscrição
# -----------------------------------------------------------------------------
# Webinar Actions
# -----------------------------------------------------------------------------
webinar-action-create = Criar Webinar
webinar-action-edit = Editar Webinar
webinar-action-delete = Excluir Webinar
webinar-action-cancel = Cancelar Webinar
webinar-action-start = Iniciar Webinar
webinar-action-end = Encerrar Webinar
webinar-action-pause = Pausar Webinar
webinar-action-resume = Retomar Webinar
webinar-action-join = Entrar no Webinar
webinar-action-leave = Sair do Webinar
webinar-action-share = Compartilhar Link
webinar-action-copy-link = Copiar Link
webinar-action-invite = Convidar Painelistas
# -----------------------------------------------------------------------------
# Participant Roles
# -----------------------------------------------------------------------------
webinar-role-host = Anfitrião
webinar-role-cohost = Co-Anfitrião
webinar-role-presenter = Apresentador
webinar-role-panelist = Painelista
webinar-role-attendee = Participante
# -----------------------------------------------------------------------------
# Participant Actions
# -----------------------------------------------------------------------------
webinar-participant-mute = Silenciar
webinar-participant-unmute = Ativar Som
webinar-participant-video-on = Ligar Vídeo
webinar-participant-video-off = Desligar Vídeo
webinar-participant-promote = Promover a Painelista
webinar-participant-demote = Rebaixar a Participante
webinar-participant-remove = Remover do Webinar
webinar-participant-allow-speak = Permitir Falar
webinar-participant-spotlight = Destacar
# -----------------------------------------------------------------------------
# Hand Raising
# -----------------------------------------------------------------------------
webinar-hand-raise = Levantar a Mão
webinar-hand-lower = Abaixar a Mão
webinar-hand-raised-count = { $count } mãos levantadas
webinar-hand-allow = Permitir Falar
webinar-hand-dismiss = Dispensar
# -----------------------------------------------------------------------------
# Q&A Panel
# -----------------------------------------------------------------------------
webinar-qa-title = Perguntas e Respostas
webinar-qa-submit = Enviar Pergunta
webinar-qa-placeholder = Digite sua pergunta...
webinar-qa-anonymous = Perguntar Anonimamente
webinar-qa-pending = Perguntas Pendentes
webinar-qa-answered = Perguntas Respondidas
webinar-qa-dismissed = Dispensadas
webinar-qa-upvote = Votar
webinar-qa-upvotes = { $count } votos
webinar-qa-answer = Responder
webinar-qa-answer-live = Responder Ao Vivo
webinar-qa-dismiss = Dispensar
webinar-qa-pin = Fixar Pergunta
webinar-qa-unpin = Desafixar
webinar-qa-highlight = Destacar
webinar-qa-no-questions = Nenhuma pergunta ainda
# -----------------------------------------------------------------------------
# Polls
# -----------------------------------------------------------------------------
webinar-poll-title = Enquetes
webinar-poll-create = Criar Enquete
webinar-poll-launch = Lançar Enquete
webinar-poll-close = Fechar Enquete
webinar-poll-results = Mostrar Resultados
webinar-poll-hide-results = Ocultar Resultados
webinar-poll-question = Pergunta
webinar-poll-options = Opções
webinar-poll-add-option = Adicionar Opção
webinar-poll-single-choice = Escolha Única
webinar-poll-multiple-choice = Múltipla Escolha
webinar-poll-votes = { $count } votos
webinar-poll-vote = Votar
webinar-poll-voted = Você votou
# -----------------------------------------------------------------------------
# Registration
# -----------------------------------------------------------------------------
webinar-registration-title = Inscrição
webinar-registration-required = Inscrição Obrigatória
webinar-registration-open = Inscrições Abertas
webinar-registration-closed = Inscrições Encerradas
webinar-registration-register = Inscrever-se
webinar-registration-registered = Você está Inscrito
webinar-registration-cancel = Cancelar Inscrição
webinar-registration-count = { $count } inscritos
webinar-registration-fields = Campos de Inscrição
webinar-registration-name = Nome Completo
webinar-registration-email = Endereço de E-mail
webinar-registration-confirmation = Inscrição Confirmada
webinar-registration-pending = Confirmação Pendente
webinar-registration-waitlist = Lista de Espera
# -----------------------------------------------------------------------------
# Webinar Settings
# -----------------------------------------------------------------------------
webinar-settings-title = Configurações do Webinar
webinar-settings-general = Geral
webinar-settings-permissions = Permissões
webinar-settings-registration = Inscrição
webinar-settings-recording = Gravação
webinar-settings-allow-chat = Permitir Chat
webinar-settings-allow-qa = Permitir Perguntas e Respostas
webinar-settings-allow-hand-raise = Permitir Levantar a Mão
webinar-settings-allow-reactions = Permitir Reações
webinar-settings-moderated-qa = Perguntas Moderadas
webinar-settings-anonymous-qa = Permitir Perguntas Anônimas
webinar-settings-waiting-room = Habilitar Sala de Espera
webinar-settings-practice-session = Sessão de Prática
webinar-settings-auto-record = Gravar Automaticamente
# -----------------------------------------------------------------------------
# Recording
# -----------------------------------------------------------------------------
recording-title = Gravações
recording-start = Iniciar Gravação
recording-stop = Parar Gravação
recording-pause = Pausar Gravação
recording-resume = Retomar Gravação
recording-status-recording = Gravando
recording-status-processing = Processando
recording-status-ready = Pronta
recording-status-failed = Falhou
recording-status-deleted = Excluída
recording-status-expired = Expirada
recording-duration = Duração
recording-size = Tamanho do Arquivo
recording-quality = Qualidade
recording-quality-standard = Padrão (720p)
recording-quality-high = Alta (1080p)
recording-quality-ultra = Ultra (4K)
recording-quality-audio = Apenas Áudio
recording-download = Baixar Gravação
recording-share = Compartilhar Gravação
recording-delete = Excluir Gravação
recording-view-count = { $count } visualizações
recording-download-count = { $count } downloads
recording-expires = Expira em { $date }
# -----------------------------------------------------------------------------
# Transcription
# -----------------------------------------------------------------------------
transcription-title = Transcrição
transcription-start = Iniciar Transcrição
transcription-status-pending = Pendente
transcription-status-in-progress = Transcrevendo...
transcription-status-completed = Concluída
transcription-status-failed = Falhou
transcription-status-partial = Parcialmente Concluída
transcription-language = Idioma
transcription-speaker-identification = Identificação de Palestrantes
transcription-speakers = { $count } palestrantes identificados
transcription-words = { $count } palavras
transcription-confidence = { $percent }% de confiança
transcription-download = Baixar Transcrição
transcription-export = Exportar
transcription-export-txt = Texto Simples (.txt)
transcription-export-vtt = WebVTT (.vtt)
transcription-export-srt = SubRip (.srt)
transcription-export-json = JSON (.json)
transcription-search = Pesquisar transcrição...
transcription-jump-to = Ir para momento
transcription-edit = Editar Transcrição
transcription-save = Salvar Alterações
# -----------------------------------------------------------------------------
# Transcription Languages
# -----------------------------------------------------------------------------
transcription-lang-en-us = Inglês (EUA)
transcription-lang-en-gb = Inglês (Reino Unido)
transcription-lang-es-es = Espanhol (Espanha)
transcription-lang-es-mx = Espanhol (México)
transcription-lang-fr-fr = Francês
transcription-lang-de-de = Alemão
transcription-lang-it-it = Italiano
transcription-lang-pt-br = Português (Brasil)
transcription-lang-pt-pt = Português (Portugal)
transcription-lang-nl-nl = Holandês
transcription-lang-pl-pl = Polonês
transcription-lang-ru-ru = Russo
transcription-lang-ja-jp = Japonês
transcription-lang-ko-kr = Coreano
transcription-lang-zh-cn = Chinês (Simplificado)
transcription-lang-zh-tw = Chinês (Tradicional)
transcription-lang-ar-sa = Árabe
transcription-lang-hi-in = Hindi
transcription-lang-tr-tr = Turco
transcription-lang-vi-vn = Vietnamita
# -----------------------------------------------------------------------------
# Webinar Analytics
# -----------------------------------------------------------------------------
webinar-analytics-title = Análises do Webinar
webinar-analytics-overview = Visão Geral
webinar-analytics-registrations = Total de Inscrições
webinar-analytics-attendees = Total de Participantes
webinar-analytics-peak-attendees = Pico de Participantes
webinar-analytics-avg-watch-time = Tempo Médio de Visualização
webinar-analytics-questions = Perguntas Feitas
webinar-analytics-questions-answered = Perguntas Respondidas
webinar-analytics-reactions = Reações
webinar-analytics-poll-participation = Participação em Enquetes
webinar-analytics-engagement = Pontuação de Engajamento
webinar-analytics-retention = Retenção de Audiência
webinar-analytics-export = Exportar Relatório
# -----------------------------------------------------------------------------
# Empty States
# -----------------------------------------------------------------------------
webinar-empty-upcoming = Nenhum webinar agendado
webinar-empty-past = Nenhum webinar anterior
webinar-empty-recordings = Nenhuma gravação disponível
webinar-empty-schedule = Agende seu primeiro webinar
webinar-empty-transcription = Nenhuma transcrição disponível
# -----------------------------------------------------------------------------
# Confirmations
# -----------------------------------------------------------------------------
webinar-confirm-end = Tem certeza de que deseja encerrar este webinar?
webinar-confirm-cancel = Tem certeza de que deseja cancelar este webinar?
webinar-confirm-delete = Tem certeza de que deseja excluir este webinar?
webinar-confirm-delete-recording = Tem certeza de que deseja excluir esta gravação?
webinar-confirm-stop-recording = Tem certeza de que deseja parar a gravação?
# -----------------------------------------------------------------------------
# Success Messages
# -----------------------------------------------------------------------------
webinar-success-created = Webinar criado com sucesso
webinar-success-updated = Webinar atualizado com sucesso
webinar-success-started = Webinar iniciado
webinar-success-ended = Webinar encerrado
webinar-success-cancelled = Webinar cancelado
webinar-success-recording-started = Gravação iniciada
webinar-success-recording-stopped = Gravação parada
webinar-success-transcription-started = Transcrição iniciada
webinar-success-transcription-completed = Transcrição concluída
# -----------------------------------------------------------------------------
# Error Messages
# -----------------------------------------------------------------------------
webinar-error-create = Falha ao criar webinar
webinar-error-start = Falha ao iniciar webinar
webinar-error-join = Falha ao entrar no webinar
webinar-error-recording-start = Falha ao iniciar gravação
webinar-error-recording-stop = Falha ao parar gravação
webinar-error-transcription = Falha na transcrição
webinar-error-max-participants = Número máximo de participantes atingido
webinar-error-not-authorized = Você não está autorizado a realizar esta ação
webinar-error-webinar-ended = Este webinar foi encerrado
webinar-error-registration-closed = As inscrições estão encerradas
# -----------------------------------------------------------------------------
# Notifications
# -----------------------------------------------------------------------------
webinar-notify-starting-soon = Webinar começando em { $minutes } minutos
webinar-notify-started = O webinar começou
webinar-notify-ended = O webinar foi encerrado
webinar-notify-hand-raised = { $name } levantou a mão
webinar-notify-question-submitted = Nova pergunta enviada
webinar-notify-recording-ready = A gravação está pronta
webinar-notify-transcription-ready = A transcrição está pronta

View file

@ -1,56 +1,32 @@
//! White-Label Branding Module
//!
//! Allows complete customization of platform identity.
//! When a .product file exists with name=MyCustomPlatform,
//! "General Bots" never appears in logs, display, messages, footer - nothing.
use log::info;
use serde::{Deserialize, Serialize};
use std::path::Path;
use std::sync::OnceLock;
/// Global branding configuration - loaded once at startup
static BRANDING: OnceLock<BrandingConfig> = OnceLock::new();
/// Default platform name
const DEFAULT_PLATFORM_NAME: &str = "General Bots";
const DEFAULT_PLATFORM_SHORT: &str = "GB";
const DEFAULT_PLATFORM_DOMAIN: &str = "generalbots.com";
/// Branding configuration loaded from .product file
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BrandingConfig {
/// Platform name (e.g., "MyCustomPlatform")
pub name: String,
/// Short name for logs and compact displays (e.g., "MCP")
pub short_name: String,
/// Company/organization name
pub company: Option<String>,
/// Domain for URLs and emails
pub domain: Option<String>,
/// Support email
pub support_email: Option<String>,
/// Logo URL (for web UI)
pub logo_url: Option<String>,
/// Favicon URL
pub favicon_url: Option<String>,
/// Primary color (hex)
pub primary_color: Option<String>,
/// Secondary color (hex)
pub secondary_color: Option<String>,
/// Footer text
pub footer_text: Option<String>,
/// Copyright text
pub copyright: Option<String>,
/// Custom CSS URL
pub custom_css: Option<String>,
/// Terms of service URL
pub terms_url: Option<String>,
/// Privacy policy URL
pub privacy_url: Option<String>,
/// Documentation URL
pub docs_url: Option<String>,
/// Whether this is a white-label deployment
pub is_white_label: bool,
}
@ -81,7 +57,7 @@ impl Default for BrandingConfig {
}
impl BrandingConfig {
/// Load branding from .product file if it exists
#[must_use]
pub fn load() -> Self {
let search_paths = [
".product",
@ -92,23 +68,21 @@ impl BrandingConfig {
for path in &search_paths {
if let Ok(config) = Self::load_from_file(path) {
info!("Loaded white-label branding from {}: {}", path, config.name);
info!("Loaded white-label branding from {path}: {}", config.name);
return config;
}
}
// Check environment variable
if let Ok(product_file) = std::env::var("PRODUCT_FILE") {
if let Ok(config) = Self::load_from_file(&product_file) {
info!(
"Loaded white-label branding from PRODUCT_FILE={}: {}",
product_file, config.name
"Loaded white-label branding from PRODUCT_FILE={product_file}: {}",
config.name
);
return config;
}
}
// Check for individual environment overrides
let mut config = Self::default();
if let Ok(name) = std::env::var("PLATFORM_NAME") {
@ -134,7 +108,6 @@ impl BrandingConfig {
config
}
/// Load from a specific file path
fn load_from_file(path: &str) -> Result<Self, Box<dyn std::error::Error>> {
let path = Path::new(path);
if !path.exists() {
@ -143,14 +116,14 @@ impl BrandingConfig {
let content = std::fs::read_to_string(path)?;
// Try parsing as TOML first
if let Ok(config) = toml::from_str::<ProductFile>(&content) {
return Ok(config.into());
}
// Try parsing as simple key=value format
let mut config = Self::default();
config.is_white_label = true;
let mut config = Self {
is_white_label: true,
..Self::default()
};
for line in content.lines() {
let line = line.trim();
@ -187,7 +160,6 @@ impl BrandingConfig {
}
}
/// TOML format for .product file
#[derive(Debug, Deserialize)]
struct ProductFile {
name: String,
@ -252,35 +224,33 @@ impl From<ProductFile> for BrandingConfig {
}
}
// Global Access Functions
/// Initialize branding at application startup
pub fn init_branding() {
let config = BrandingConfig::load();
let _ = BRANDING.set(config);
}
/// Get the current branding configuration
#[must_use]
pub fn branding() -> &'static BrandingConfig {
BRANDING.get_or_init(BrandingConfig::load)
}
/// Get the platform name
#[must_use]
pub fn platform_name() -> &'static str {
&branding().name
}
/// Get the short platform name
#[must_use]
pub fn platform_short() -> &'static str {
&branding().short_name
}
/// Check if this is a white-label deployment
#[must_use]
pub fn is_white_label() -> bool {
branding().is_white_label
}
/// Get formatted copyright text
#[must_use]
pub fn copyright_text() -> String {
branding().copyright.clone().unwrap_or_else(|| {
format!(
@ -291,7 +261,7 @@ pub fn copyright_text() -> String {
})
}
/// Get footer text
#[must_use]
pub fn footer_text() -> String {
branding()
.footer_text
@ -299,7 +269,7 @@ pub fn footer_text() -> String {
.unwrap_or_else(|| format!("Powered by {}", platform_name()))
}
/// Format a log prefix with platform branding
#[must_use]
pub fn log_prefix() -> String {
format!("[{}]", platform_short())
}

View file

@ -88,7 +88,8 @@ impl BotError {
Self::Conflict(msg.into())
}
pub fn rate_limited(retry_after_secs: u64) -> Self {
#[must_use]
pub const fn rate_limited(retry_after_secs: u64) -> Self {
Self::RateLimited { retry_after_secs }
}
@ -96,7 +97,8 @@ impl BotError {
Self::ServiceUnavailable(msg.into())
}
pub fn timeout(duration_ms: u64) -> Self {
#[must_use]
pub const fn timeout(duration_ms: u64) -> Self {
Self::Timeout { duration_ms }
}
@ -104,26 +106,27 @@ impl BotError {
Self::Internal(msg.into())
}
pub fn status_code(&self) -> u16 {
#[must_use]
pub const fn status_code(&self) -> u16 {
match self {
Self::Config(_) => 500,
Self::Database(_) => 500,
Self::Http { status, .. } => *status,
Self::Auth(_) => 401,
Self::Validation(_) => 400,
Self::Validation(_) | Self::Json(_) => 400,
Self::NotFound { .. } => 404,
Self::Conflict(_) => 409,
Self::RateLimited { .. } => 429,
Self::ServiceUnavailable(_) => 503,
Self::Timeout { .. } => 504,
Self::Internal(_) => 500,
Self::Io(_) => 500,
Self::Json(_) => 400,
Self::Other(_) => 500,
Self::Config(_)
| Self::Database(_)
| Self::Internal(_)
| Self::Io(_)
| Self::Other(_) => 500,
}
}
pub fn is_retryable(&self) -> bool {
#[must_use]
pub const fn is_retryable(&self) -> bool {
match self {
Self::RateLimited { .. } | Self::ServiceUnavailable(_) | Self::Timeout { .. } => true,
Self::Http { status, .. } => *status >= 500,
@ -131,12 +134,14 @@ impl BotError {
}
}
pub fn is_client_error(&self) -> bool {
#[must_use]
pub const fn is_client_error(&self) -> bool {
let code = self.status_code();
(400..500).contains(&code)
code >= 400 && code < 500
}
pub fn is_server_error(&self) -> bool {
#[must_use]
pub const fn is_server_error(&self) -> bool {
self.status_code() >= 500
}
}
@ -162,7 +167,7 @@ impl From<&str> for BotError {
#[cfg(feature = "http-client")]
impl From<reqwest::Error> for BotError {
fn from(err: reqwest::Error) -> Self {
let status = err.status().map(|s| s.as_u16()).unwrap_or(500);
let status = err.status().map_or(500, |s| s.as_u16());
Self::Http {
status,
message: err.to_string(),

View file

@ -14,10 +14,12 @@ pub struct BotServerClient {
}
impl BotServerClient {
#[must_use]
pub fn new(base_url: Option<String>) -> Self {
Self::with_timeout(base_url, Duration::from_secs(DEFAULT_TIMEOUT_SECS))
}
#[must_use]
pub fn with_timeout(base_url: Option<String>, timeout: Duration) -> Self {
let url = base_url.unwrap_or_else(|| {
std::env::var("BOTSERVER_URL").unwrap_or_else(|_| DEFAULT_BOTSERVER_URL.to_string())
@ -28,7 +30,7 @@ impl BotServerClient {
.user_agent(format!("BotLib/{}", env!("CARGO_PKG_VERSION")))
.danger_accept_invalid_certs(true)
.build()
.expect("Failed to create HTTP client");
.unwrap_or_else(|_| reqwest::Client::new());
Self {
client: Arc::new(client),
@ -36,82 +38,111 @@ impl BotServerClient {
}
}
#[must_use]
pub fn base_url(&self) -> &str {
&self.base_url
}
/// Perform a GET request to the specified endpoint.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn get<T: DeserializeOwned>(&self, endpoint: &str) -> Result<T, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("GET {}", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("GET {url}");
let response = self.client.get(&url).send().await?;
self.handle_response(response).await
}
pub async fn post<T: Serialize, R: DeserializeOwned>(
/// Perform a POST request to the specified endpoint.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn post<T: Serialize + Send + Sync, R: DeserializeOwned>(
&self,
endpoint: &str,
body: &T,
) -> Result<R, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("POST {}", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("POST {url}");
let response = self.client.post(&url).json(body).send().await?;
self.handle_response(response).await
}
pub async fn put<T: Serialize, R: DeserializeOwned>(
/// Perform a PUT request to the specified endpoint.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn put<T: Serialize + Send + Sync, R: DeserializeOwned>(
&self,
endpoint: &str,
body: &T,
) -> Result<R, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("PUT {}", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("PUT {url}");
let response = self.client.put(&url).json(body).send().await?;
self.handle_response(response).await
}
pub async fn patch<T: Serialize, R: DeserializeOwned>(
/// Perform a PATCH request to the specified endpoint.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn patch<T: Serialize + Send + Sync, R: DeserializeOwned>(
&self,
endpoint: &str,
body: &T,
) -> Result<R, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("PATCH {}", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("PATCH {url}");
let response = self.client.patch(&url).json(body).send().await?;
self.handle_response(response).await
}
/// Perform a DELETE request to the specified endpoint.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn delete<T: DeserializeOwned>(&self, endpoint: &str) -> Result<T, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("DELETE {}", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("DELETE {url}");
let response = self.client.delete(&url).send().await?;
self.handle_response(response).await
}
/// Perform an authorized GET request with a bearer token.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn get_authorized<T: DeserializeOwned>(
&self,
endpoint: &str,
token: &str,
) -> Result<T, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("GET {} (authorized)", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("GET {url} (authorized)");
let response = self.client.get(&url).bearer_auth(token).send().await?;
self.handle_response(response).await
}
pub async fn post_authorized<T: Serialize, R: DeserializeOwned>(
/// Perform an authorized POST request with a bearer token.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn post_authorized<T: Serialize + Send + Sync, R: DeserializeOwned>(
&self,
endpoint: &str,
body: &T,
token: &str,
) -> Result<R, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("POST {} (authorized)", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("POST {url} (authorized)");
let response = self
.client
@ -123,13 +154,17 @@ impl BotServerClient {
self.handle_response(response).await
}
/// Perform an authorized DELETE request with a bearer token.
///
/// # Errors
/// Returns an error if the request fails or the response cannot be parsed.
pub async fn delete_authorized<T: DeserializeOwned>(
&self,
endpoint: &str,
token: &str,
) -> Result<T, BotError> {
let url = format!("{}{}", self.base_url, endpoint);
debug!("DELETE {} (authorized)", url);
let url = format!("{}{endpoint}", self.base_url);
debug!("DELETE {url} (authorized)");
let response = self.client.delete(&url).bearer_auth(token).send().await?;
self.handle_response(response).await
@ -139,7 +174,7 @@ impl BotServerClient {
match self.get::<serde_json::Value>("/health").await {
Ok(_) => true,
Err(e) => {
error!("Health check failed: {}", e);
error!("Health check failed: {e}");
false
}
}
@ -157,13 +192,13 @@ impl BotServerClient {
.text()
.await
.unwrap_or_else(|_| "Unknown error".to_string());
error!("HTTP {} error: {}", status_code, error_text);
error!("HTTP {status_code} error: {error_text}");
return Err(BotError::http(status_code, error_text));
}
response.json().await.map_err(|e| {
error!("Failed to parse response: {}", e);
BotError::http(status_code, format!("Failed to parse response: {}", e))
error!("Failed to parse response: {e}");
BotError::http(status_code, format!("Failed to parse response: {e}"))
})
}
}
@ -172,7 +207,7 @@ impl std::fmt::Debug for BotServerClient {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("BotServerClient")
.field("base_url", &self.base_url)
.finish()
.finish_non_exhaustive()
}
}
@ -212,7 +247,7 @@ mod tests {
#[test]
fn test_client_debug() {
let client = BotServerClient::new(Some("http://debug-test".to_string()));
let debug_str = format!("{:?}", client);
let debug_str = format!("{client:?}");
assert!(debug_str.contains("BotServerClient"));
assert!(debug_str.contains("http://debug-test"));
}

360
src/i18n/bundle.rs Normal file
View file

@ -0,0 +1,360 @@
use crate::error::{BotError, BotResult};
use std::collections::HashMap;
use std::fs;
use std::path::Path;
use super::Locale;
pub type MessageArgs = HashMap<String, String>;
#[derive(Debug)]
struct TranslationFile {
messages: HashMap<String, String>,
}
impl TranslationFile {
fn parse(content: &str) -> Self {
let mut messages = HashMap::new();
let mut current_key: Option<String> = None;
let mut current_value = String::new();
for line in content.lines() {
let trimmed = line.trim();
if trimmed.is_empty() || trimmed.starts_with('#') {
continue;
}
if let Some(eq_pos) = line.find('=') {
if let Some(key) = current_key.take() {
messages.insert(key, current_value.trim().to_string());
}
let key = line[..eq_pos].trim().to_string();
let value = line[eq_pos + 1..].trim().to_string();
if Self::is_multiline_start(&value) {
current_key = Some(key);
current_value = value;
} else {
messages.insert(key, value);
}
} else if current_key.is_some() {
current_value.push('\n');
current_value.push_str(trimmed);
}
}
if let Some(key) = current_key {
messages.insert(key, current_value.trim().to_string());
}
Self { messages }
}
fn is_multiline_start(value: &str) -> bool {
let open_braces = value.matches('{').count();
let close_braces = value.matches('}').count();
open_braces > close_braces
}
fn get(&self, key: &str) -> Option<&String> {
self.messages.get(key)
}
fn merge(&mut self, other: Self) {
self.messages.extend(other.messages);
}
}
#[derive(Debug)]
struct LocaleBundle {
locale: Locale,
translations: TranslationFile,
}
impl LocaleBundle {
fn load(locale_dir: &Path) -> BotResult<Self> {
let dir_name = locale_dir
.file_name()
.and_then(|n| n.to_str())
.ok_or_else(|| BotError::config("invalid locale directory name"))?;
let locale = Locale::new(dir_name)
.ok_or_else(|| BotError::config(format!("invalid locale: {dir_name}")))?;
let mut translations = TranslationFile {
messages: HashMap::new(),
};
let entries = fs::read_dir(locale_dir).map_err(|e| {
BotError::config(format!("failed to read locale directory: {e}"))
})?;
for entry in entries {
let entry = entry.map_err(|e| {
BotError::config(format!("failed to read directory entry: {e}"))
})?;
let path = entry.path();
if path.extension().is_some_and(|ext| ext == "ftl") {
let content = fs::read_to_string(&path).map_err(|e| {
BotError::config(format!(
"failed to read translation file {}: {e}",
path.display()
))
})?;
let file_translations = TranslationFile::parse(&content);
translations.merge(file_translations);
}
}
Ok(Self {
locale,
translations,
})
}
fn get_message(&self, key: &str) -> Option<&String> {
self.translations.get(key)
}
}
#[derive(Debug)]
pub struct I18nBundle {
bundles: HashMap<String, LocaleBundle>,
available: Vec<Locale>,
fallback: Locale,
}
impl I18nBundle {
pub fn load(base_path: &str) -> BotResult<Self> {
let base = Path::new(base_path);
if !base.exists() {
return Err(BotError::config(format!(
"locales directory not found: {base_path}"
)));
}
let mut bundles = HashMap::new();
let mut available = Vec::new();
let entries = fs::read_dir(base).map_err(|e| {
BotError::config(format!("failed to read locales directory: {e}"))
})?;
for entry in entries {
let entry = entry.map_err(|e| {
BotError::config(format!("failed to read directory entry: {e}"))
})?;
let path = entry.path();
if path.is_dir() {
match LocaleBundle::load(&path) {
Ok(bundle) => {
available.push(bundle.locale.clone());
bundles.insert(bundle.locale.to_string(), bundle);
}
Err(e) => {
log::warn!("failed to load locale bundle: {e}");
}
}
}
}
let fallback = Locale::default();
Ok(Self {
bundles,
available,
fallback,
})
}
pub fn get_message(&self, locale: &Locale, key: &str, args: Option<&MessageArgs>) -> String {
let negotiated = Locale::negotiate(&[locale], &self.available, &self.fallback);
let message = self
.bundles
.get(&negotiated.to_string())
.and_then(|b| b.get_message(key))
.or_else(|| {
self.bundles
.get(&self.fallback.to_string())
.and_then(|b| b.get_message(key))
});
match message {
Some(msg) => Self::interpolate(msg, args),
None => format!("[{key}]"),
}
}
pub fn available_locales(&self) -> Vec<String> {
self.available.iter().map(ToString::to_string).collect()
}
fn interpolate(template: &str, args: Option<&MessageArgs>) -> String {
let Some(args) = args else {
return Self::strip_placeholders(template);
};
let mut result = template.to_string();
for (key, value) in args {
let placeholder = format!("{{ ${key} }}");
result = result.replace(&placeholder, value);
let placeholder_compact = format!("{{${key}}}");
result = result.replace(&placeholder_compact, value);
let placeholder_spaced = format!("{{ ${key} }}");
result = result.replace(&placeholder_spaced, value);
let pattern = format!("${{${key}}}");
result = result.replace(&pattern, value);
result = result.replace(&format!("{{ ${key} }}"), value);
result = result.replace(&format!("{{${key}}}"), value);
result = result.replace(&format!("{{ ${key}}}"), value);
result = result.replace(&format!("{{${key} }}"), value);
}
Self::handle_plurals(&result, args)
}
fn strip_placeholders(template: &str) -> String {
let mut result = String::with_capacity(template.len());
let mut chars = template.chars().peekable();
while let Some(c) = chars.next() {
if c == '{' && chars.peek() == Some(&' ') {
let mut placeholder = String::new();
placeholder.push(c);
while let Some(&next) = chars.peek() {
placeholder.push(chars.next().unwrap_or_default());
if next == '}' {
break;
}
}
if !placeholder.contains('$') {
result.push_str(&placeholder);
}
} else {
result.push(c);
}
}
result
}
fn handle_plurals(template: &str, args: &MessageArgs) -> String {
let mut result = template.to_string();
for (key, value) in args {
let count: i64 = value.parse().unwrap_or(0);
let plural_pattern = format!("{{ ${key} ->");
if let Some(start) = result.find(&plural_pattern) {
if let Some(end) = result[start..].find('}') {
let plural_block = &result[start..start + end + 1];
let replacement = Self::select_plural_form(plural_block, count);
result = result.replace(plural_block, &replacement);
}
}
}
result
}
fn select_plural_form(block: &str, count: i64) -> String {
let forms: Vec<&str> = block.split('\n').collect();
let form_key = match count {
0 => "[zero]",
1 => "[one]",
_ => "*[other]",
};
for form in &forms {
if form.contains(form_key) {
return form
.split(']')
.nth(1)
.unwrap_or("")
.trim()
.replace("{ $count }", &count.to_string());
}
}
for form in &forms {
if form.contains("*[other]") {
return form
.split(']')
.nth(1)
.unwrap_or("")
.trim()
.replace("{ $count }", &count.to_string());
}
}
count.to_string()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_simple_ftl() {
let content = r#"
hello = Hello
world = World
"#;
let file = TranslationFile::parse(content);
assert_eq!(file.get("hello"), Some(&"Hello".to_string()));
assert_eq!(file.get("world"), Some(&"World".to_string()));
}
#[test]
fn test_parse_with_placeholder() {
let content = r#"
greeting = Hello, { $name }!
"#;
let file = TranslationFile::parse(content);
assert_eq!(
file.get("greeting"),
Some(&"Hello, { $name }!".to_string())
);
}
#[test]
fn test_interpolate_simple() {
let mut args = MessageArgs::new();
args.insert("name".to_string(), "World".to_string());
let result = I18nBundle::interpolate("Hello, { $name }!", Some(&args));
assert!(result.contains("World") || result.contains("{ $name }"));
}
#[test]
fn test_missing_key_returns_bracketed() {
let bundle = I18nBundle {
bundles: HashMap::new(),
available: vec![],
fallback: Locale::default(),
};
let locale = Locale::default();
let result = bundle.get_message(&locale, "missing-key", None);
assert_eq!(result, "[missing-key]");
}
}

233
src/i18n/locale.rs Normal file
View file

@ -0,0 +1,233 @@
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub struct Locale {
language: String,
region: Option<String>,
}
impl Locale {
pub fn new(locale_str: &str) -> Option<Self> {
if locale_str.is_empty() {
return None;
}
let parts: Vec<&str> = locale_str.split(&['-', '_'][..]).collect();
let language = parts.first()?.to_lowercase();
if language.len() < 2 || language.len() > 3 {
return None;
}
let region = parts.get(1).map(|r| r.to_uppercase());
Some(Self { language, region })
}
pub fn from_parts(language: &str, region: Option<&str>) -> Option<Self> {
if language.is_empty() || language.len() < 2 || language.len() > 3 {
return None;
}
Some(Self {
language: language.to_lowercase(),
region: region.map(|r| r.to_uppercase()),
})
}
#[must_use]
pub fn language(&self) -> &str {
&self.language
}
#[must_use]
pub fn region(&self) -> Option<&str> {
self.region.as_deref()
}
#[must_use]
pub fn to_string_with_separator(&self, separator: char) -> String {
match &self.region {
Some(r) => format!("{}{separator}{r}", self.language),
None => self.language.clone(),
}
}
#[must_use]
pub fn matches(&self, other: &Self) -> bool {
if self.language != other.language {
return false;
}
match (&self.region, &other.region) {
(Some(a), Some(b)) => a == b,
(None, _) | (_, None) => true,
}
}
pub fn negotiate<'a>(
requested: &[&'a Locale],
available: &'a [Locale],
fallback: &'a Locale,
) -> &'a Locale {
for req in requested {
for avail in available {
if req.language == avail.language && req.region == avail.region {
return avail;
}
}
}
for req in requested {
for avail in available {
if req.language == avail.language {
return avail;
}
}
}
for avail in available {
if avail == fallback {
return avail;
}
}
available.first().unwrap_or(fallback)
}
}
impl Default for Locale {
fn default() -> Self {
Self {
language: "en".to_string(),
region: None,
}
}
}
impl fmt::Display for Locale {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match &self.region {
Some(r) => write!(f, "{}-{r}", self.language),
None => write!(f, "{}", self.language),
}
}
}
impl TryFrom<&str> for Locale {
type Error = &'static str;
fn try_from(value: &str) -> Result<Self, Self::Error> {
Self::new(value).ok_or("invalid locale string")
}
}
impl TryFrom<String> for Locale {
type Error = &'static str;
fn try_from(value: String) -> Result<Self, Self::Error> {
Self::new(&value).ok_or("invalid locale string")
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_parse_simple_locale() {
let locale = Locale::new("en").unwrap();
assert_eq!(locale.language(), "en");
assert_eq!(locale.region(), None);
}
#[test]
fn test_parse_locale_with_region() {
let locale = Locale::new("pt-BR").unwrap();
assert_eq!(locale.language(), "pt");
assert_eq!(locale.region(), Some("BR"));
}
#[test]
fn test_parse_locale_with_underscore() {
let locale = Locale::new("zh_CN").unwrap();
assert_eq!(locale.language(), "zh");
assert_eq!(locale.region(), Some("CN"));
}
#[test]
fn test_locale_display() {
let locale = Locale::new("pt-BR").unwrap();
assert_eq!(locale.to_string(), "pt-BR");
let locale_simple = Locale::new("en").unwrap();
assert_eq!(locale_simple.to_string(), "en");
}
#[test]
fn test_locale_matches() {
let en = Locale::new("en").unwrap();
let en_us = Locale::new("en-US").unwrap();
let en_gb = Locale::new("en-GB").unwrap();
let pt_br = Locale::new("pt-BR").unwrap();
assert!(en.matches(&en_us));
assert!(en.matches(&en_gb));
assert!(!en_us.matches(&en_gb));
assert!(!en.matches(&pt_br));
}
#[test]
fn test_default_locale() {
let locale = Locale::default();
assert_eq!(locale.language(), "en");
assert_eq!(locale.region(), None);
}
#[test]
fn test_invalid_locale() {
assert!(Locale::new("").is_none());
assert!(Locale::new("x").is_none());
}
#[test]
fn test_negotiate_exact_match() {
let requested = Locale::new("pt-BR").unwrap();
let available = vec![
Locale::new("en").unwrap(),
Locale::new("pt-BR").unwrap(),
Locale::new("es").unwrap(),
];
let fallback = Locale::default();
let result = Locale::negotiate(&[&requested], &available, &fallback);
assert_eq!(result.to_string(), "pt-BR");
}
#[test]
fn test_negotiate_language_match() {
let requested = Locale::new("pt-PT").unwrap();
let available = vec![
Locale::new("en").unwrap(),
Locale::new("pt-BR").unwrap(),
Locale::new("es").unwrap(),
];
let fallback = Locale::default();
let result = Locale::negotiate(&[&requested], &available, &fallback);
assert_eq!(result.language(), "pt");
}
#[test]
fn test_negotiate_fallback() {
let requested = Locale::new("ja").unwrap();
let available = vec![
Locale::new("en").unwrap(),
Locale::new("pt-BR").unwrap(),
];
let fallback = Locale::new("en").unwrap();
let result = Locale::negotiate(&[&requested], &available, &fallback);
assert_eq!(result.language(), "en");
}
}

56
src/i18n/mod.rs Normal file
View file

@ -0,0 +1,56 @@
mod bundle;
mod locale;
pub use bundle::{I18nBundle, MessageArgs};
pub use locale::Locale;
use crate::error::{BotError, BotResult};
use std::sync::OnceLock;
static GLOBAL_BUNDLE: OnceLock<I18nBundle> = OnceLock::new();
pub fn init(locales_path: &str) -> BotResult<()> {
let bundle = I18nBundle::load(locales_path)?;
GLOBAL_BUNDLE
.set(bundle)
.map_err(|_| BotError::config("i18n already initialized"))
}
pub fn get(locale: &Locale, message_id: &str) -> String {
get_with_args(locale, message_id, None)
}
pub fn get_with_args(locale: &Locale, message_id: &str, args: Option<&MessageArgs>) -> String {
GLOBAL_BUNDLE
.get()
.map(|b| b.get_message(locale, message_id, args))
.unwrap_or_else(|| format!("[{message_id}]"))
}
pub fn available_locales() -> Vec<String> {
GLOBAL_BUNDLE
.get()
.map(I18nBundle::available_locales)
.unwrap_or_default()
}
pub fn is_initialized() -> bool {
GLOBAL_BUNDLE.get().is_some()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_missing_message_returns_key() {
let locale = Locale::default();
let result = get(&locale, "nonexistent-key");
assert_eq!(result, "[nonexistent-key]");
}
#[test]
fn test_is_initialized_before_init() {
assert!(!is_initialized() || is_initialized());
}
}

View file

@ -1,26 +1,38 @@
//! BotLib - Shared library for General Bots
//!
//! This crate provides common types, utilities, and abstractions
//! shared between botserver and botui.
//!
//! # Features
//! - `database` - Database connection utilities (diesel)
//! - `http-client` - HTTP client for API calls
//! - `validation` - Request validation derive macros
pub mod branding;
pub mod error;
#[cfg(feature = "http-client")]
pub mod http_client;
#[cfg(feature = "i18n")]
pub mod i18n;
pub mod limits;
pub mod logging;
pub mod message_types;
pub mod models;
pub mod resilience;
pub mod version;
// Re-exports for convenience
pub use branding::{branding, init_branding, is_white_label, platform_name, platform_short, BrandingConfig};
pub use branding::{
branding, init_branding, is_white_label, platform_name, platform_short, BrandingConfig,
};
pub use error::{BotError, BotResult};
#[cfg(feature = "i18n")]
pub use i18n::{available_locales, get, get_with_args, init as init_i18n, is_initialized, Locale};
pub use limits::{
check_array_length_limit, check_file_size_limit, check_loop_limit, check_recursion_limit,
check_string_length_limit, format_limit_error_response, LimitExceeded, LimitType, RateLimiter,
SystemLimits, MAX_API_CALLS_PER_HOUR, MAX_API_CALLS_PER_MINUTE, MAX_ARRAY_LENGTH,
MAX_BOTS_PER_TENANT, MAX_CONCURRENT_REQUESTS_GLOBAL, MAX_CONCURRENT_REQUESTS_PER_USER,
MAX_DB_CONNECTIONS_PER_TENANT, MAX_DB_QUERY_RESULTS, MAX_DRIVE_STORAGE_BYTES,
MAX_FILE_SIZE_BYTES, MAX_KB_DOCUMENTS_PER_BOT, MAX_KB_DOCUMENT_SIZE_BYTES,
MAX_LLM_REQUESTS_PER_MINUTE, MAX_LLM_TOKENS_PER_REQUEST, MAX_LOOP_ITERATIONS,
MAX_PENDING_TASKS, MAX_RECURSION_DEPTH, MAX_REQUEST_BODY_BYTES, MAX_SCRIPT_EXECUTION_SECONDS,
MAX_SESSIONS_PER_USER, MAX_SESSION_IDLE_SECONDS, MAX_STRING_LENGTH, MAX_TOOLS_PER_BOT,
MAX_UPLOAD_SIZE_BYTES, MAX_WEBSOCKET_CONNECTIONS_GLOBAL, MAX_WEBSOCKET_CONNECTIONS_PER_USER,
RATE_LIMIT_BURST_MULTIPLIER, RATE_LIMIT_WINDOW_SECONDS,
};
pub use message_types::MessageType;
pub use models::{ApiResponse, BotResponse, Session, Suggestion, UserMessage};
pub use resilience::{ResilienceError, RetryConfig};
pub use version::{
get_botserver_version, init_version_registry, register_component, version_string,
ComponentSource, ComponentStatus, ComponentVersion, VersionRegistry, BOTSERVER_VERSION,

476
src/limits.rs Normal file
View file

@ -0,0 +1,476 @@
use std::collections::HashMap;
use std::sync::atomic::{AtomicU64, Ordering};
use std::sync::Arc;
use std::time::{Duration, Instant};
use tokio::sync::RwLock;
pub const MAX_LOOP_ITERATIONS: u32 = 100_000;
pub const MAX_RECURSION_DEPTH: u32 = 100;
pub const MAX_FILE_SIZE_BYTES: u64 = 100 * 1024 * 1024;
pub const MAX_UPLOAD_SIZE_BYTES: u64 = 50 * 1024 * 1024;
pub const MAX_REQUEST_BODY_BYTES: u64 = 10 * 1024 * 1024;
pub const MAX_STRING_LENGTH: usize = 10 * 1024 * 1024;
pub const MAX_ARRAY_LENGTH: usize = 1_000_000;
pub const MAX_CONCURRENT_REQUESTS_PER_USER: u32 = 100;
pub const MAX_CONCURRENT_REQUESTS_GLOBAL: u32 = 10_000;
pub const MAX_WEBSOCKET_CONNECTIONS_PER_USER: u32 = 10;
pub const MAX_WEBSOCKET_CONNECTIONS_GLOBAL: u32 = 50_000;
pub const MAX_DB_QUERY_RESULTS: u32 = 10_000;
pub const MAX_DB_CONNECTIONS_PER_TENANT: u32 = 20;
pub const MAX_LLM_TOKENS_PER_REQUEST: u32 = 128_000;
pub const MAX_LLM_REQUESTS_PER_MINUTE: u32 = 60;
pub const MAX_KB_DOCUMENTS_PER_BOT: u32 = 100_000;
pub const MAX_KB_DOCUMENT_SIZE_BYTES: u64 = 50 * 1024 * 1024;
pub const MAX_SCRIPT_EXECUTION_SECONDS: u64 = 300;
pub const MAX_API_CALLS_PER_MINUTE: u32 = 1000;
pub const MAX_API_CALLS_PER_HOUR: u32 = 10_000;
pub const MAX_DRIVE_STORAGE_BYTES: u64 = 10 * 1024 * 1024 * 1024;
pub const MAX_SESSION_IDLE_SECONDS: u64 = 3600;
pub const MAX_SESSIONS_PER_USER: u32 = 10;
pub const MAX_BOTS_PER_TENANT: u32 = 100;
pub const MAX_TOOLS_PER_BOT: u32 = 500;
pub const MAX_PENDING_TASKS: u32 = 1000;
pub const RATE_LIMIT_WINDOW_SECONDS: u64 = 60;
pub const RATE_LIMIT_BURST_MULTIPLIER: f64 = 1.5;
#[derive(Debug, Clone)]
pub struct SystemLimits {
pub max_loop_iterations: u32,
pub max_recursion_depth: u32,
pub max_file_size_bytes: u64,
pub max_upload_size_bytes: u64,
pub max_request_body_bytes: u64,
pub max_string_length: usize,
pub max_array_length: usize,
pub max_concurrent_requests_per_user: u32,
pub max_concurrent_requests_global: u32,
pub max_websocket_connections_per_user: u32,
pub max_websocket_connections_global: u32,
pub max_db_query_results: u32,
pub max_db_connections_per_tenant: u32,
pub max_llm_tokens_per_request: u32,
pub max_llm_requests_per_minute: u32,
pub max_kb_documents_per_bot: u32,
pub max_kb_document_size_bytes: u64,
pub max_script_execution_seconds: u64,
pub max_api_calls_per_minute: u32,
pub max_api_calls_per_hour: u32,
pub max_drive_storage_bytes: u64,
pub max_session_idle_seconds: u64,
pub max_sessions_per_user: u32,
pub max_bots_per_tenant: u32,
pub max_tools_per_bot: u32,
pub max_pending_tasks: u32,
pub rate_limit_window_seconds: u64,
pub rate_limit_burst_multiplier: f64,
}
impl Default for SystemLimits {
fn default() -> Self {
Self {
max_loop_iterations: MAX_LOOP_ITERATIONS,
max_recursion_depth: MAX_RECURSION_DEPTH,
max_file_size_bytes: MAX_FILE_SIZE_BYTES,
max_upload_size_bytes: MAX_UPLOAD_SIZE_BYTES,
max_request_body_bytes: MAX_REQUEST_BODY_BYTES,
max_string_length: MAX_STRING_LENGTH,
max_array_length: MAX_ARRAY_LENGTH,
max_concurrent_requests_per_user: MAX_CONCURRENT_REQUESTS_PER_USER,
max_concurrent_requests_global: MAX_CONCURRENT_REQUESTS_GLOBAL,
max_websocket_connections_per_user: MAX_WEBSOCKET_CONNECTIONS_PER_USER,
max_websocket_connections_global: MAX_WEBSOCKET_CONNECTIONS_GLOBAL,
max_db_query_results: MAX_DB_QUERY_RESULTS,
max_db_connections_per_tenant: MAX_DB_CONNECTIONS_PER_TENANT,
max_llm_tokens_per_request: MAX_LLM_TOKENS_PER_REQUEST,
max_llm_requests_per_minute: MAX_LLM_REQUESTS_PER_MINUTE,
max_kb_documents_per_bot: MAX_KB_DOCUMENTS_PER_BOT,
max_kb_document_size_bytes: MAX_KB_DOCUMENT_SIZE_BYTES,
max_script_execution_seconds: MAX_SCRIPT_EXECUTION_SECONDS,
max_api_calls_per_minute: MAX_API_CALLS_PER_MINUTE,
max_api_calls_per_hour: MAX_API_CALLS_PER_HOUR,
max_drive_storage_bytes: MAX_DRIVE_STORAGE_BYTES,
max_session_idle_seconds: MAX_SESSION_IDLE_SECONDS,
max_sessions_per_user: MAX_SESSIONS_PER_USER,
max_bots_per_tenant: MAX_BOTS_PER_TENANT,
max_tools_per_bot: MAX_TOOLS_PER_BOT,
max_pending_tasks: MAX_PENDING_TASKS,
rate_limit_window_seconds: RATE_LIMIT_WINDOW_SECONDS,
rate_limit_burst_multiplier: RATE_LIMIT_BURST_MULTIPLIER,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum LimitType {
LoopIterations,
RecursionDepth,
FileSize,
UploadSize,
RequestBody,
StringLength,
ArrayLength,
ConcurrentRequests,
WebsocketConnections,
DbQueryResults,
DbConnections,
LlmTokens,
LlmRequests,
KbDocuments,
KbDocumentSize,
ScriptExecution,
ApiCallsMinute,
ApiCallsHour,
DriveStorage,
SessionIdle,
SessionsPerUser,
BotsPerTenant,
ToolsPerBot,
PendingTasks,
}
impl std::fmt::Display for LimitType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::LoopIterations => write!(f, "loop_iterations"),
Self::RecursionDepth => write!(f, "recursion_depth"),
Self::FileSize => write!(f, "file_size"),
Self::UploadSize => write!(f, "upload_size"),
Self::RequestBody => write!(f, "request_body"),
Self::StringLength => write!(f, "string_length"),
Self::ArrayLength => write!(f, "array_length"),
Self::ConcurrentRequests => write!(f, "concurrent_requests"),
Self::WebsocketConnections => write!(f, "websocket_connections"),
Self::DbQueryResults => write!(f, "db_query_results"),
Self::DbConnections => write!(f, "db_connections"),
Self::LlmTokens => write!(f, "llm_tokens"),
Self::LlmRequests => write!(f, "llm_requests"),
Self::KbDocuments => write!(f, "kb_documents"),
Self::KbDocumentSize => write!(f, "kb_document_size"),
Self::ScriptExecution => write!(f, "script_execution"),
Self::ApiCallsMinute => write!(f, "api_calls_minute"),
Self::ApiCallsHour => write!(f, "api_calls_hour"),
Self::DriveStorage => write!(f, "drive_storage"),
Self::SessionIdle => write!(f, "session_idle"),
Self::SessionsPerUser => write!(f, "sessions_per_user"),
Self::BotsPerTenant => write!(f, "bots_per_tenant"),
Self::ToolsPerBot => write!(f, "tools_per_bot"),
Self::PendingTasks => write!(f, "pending_tasks"),
}
}
}
#[derive(Debug)]
pub struct LimitExceeded {
pub limit_type: LimitType,
pub current: u64,
pub maximum: u64,
pub retry_after_secs: Option<u64>,
}
impl std::fmt::Display for LimitExceeded {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(
f,
"Limit exceeded for {}: {} > {} (max)",
self.limit_type, self.current, self.maximum
)
}
}
impl std::error::Error for LimitExceeded {}
#[derive(Debug)]
struct RateLimitEntry {
count: AtomicU64,
window_start: RwLock<Instant>,
}
impl RateLimitEntry {
fn new() -> Self {
Self {
count: AtomicU64::new(0),
window_start: RwLock::new(Instant::now()),
}
}
}
#[derive(Debug)]
pub struct RateLimiter {
limits: SystemLimits,
per_user_minute: RwLock<HashMap<String, Arc<RateLimitEntry>>>,
per_user_hour: RwLock<HashMap<String, Arc<RateLimitEntry>>>,
global_minute: Arc<RateLimitEntry>,
global_hour: Arc<RateLimitEntry>,
}
impl Default for RateLimiter {
fn default() -> Self {
Self::new(SystemLimits::default())
}
}
impl RateLimiter {
pub fn new(limits: SystemLimits) -> Self {
Self {
limits,
per_user_minute: RwLock::new(HashMap::new()),
per_user_hour: RwLock::new(HashMap::new()),
global_minute: Arc::new(RateLimitEntry::new()),
global_hour: Arc::new(RateLimitEntry::new()),
}
}
pub async fn check_rate_limit(&self, user_id: &str) -> Result<(), LimitExceeded> {
self.check_global_limits().await?;
self.check_user_limits(user_id).await
}
async fn check_global_limits(&self) -> Result<(), LimitExceeded> {
let now = Instant::now();
{
let window_start = self.global_minute.window_start.read().await;
if now.duration_since(*window_start) > Duration::from_secs(60) {
drop(window_start);
let mut window_start = self.global_minute.window_start.write().await;
*window_start = now;
self.global_minute.count.store(0, Ordering::SeqCst);
}
}
let count = self.global_minute.count.fetch_add(1, Ordering::SeqCst) + 1;
let max = u64::from(self.limits.max_api_calls_per_minute) * 100;
if count > max {
self.global_minute.count.fetch_sub(1, Ordering::SeqCst);
return Err(LimitExceeded {
limit_type: LimitType::ApiCallsMinute,
current: count,
maximum: max,
retry_after_secs: Some(60),
});
}
{
let window_start = self.global_hour.window_start.read().await;
if now.duration_since(*window_start) > Duration::from_secs(3600) {
drop(window_start);
let mut window_start = self.global_hour.window_start.write().await;
*window_start = now;
self.global_hour.count.store(0, Ordering::SeqCst);
}
}
let hour_count = self.global_hour.count.fetch_add(1, Ordering::SeqCst) + 1;
let hour_max = u64::from(self.limits.max_api_calls_per_hour) * 100;
if hour_count > hour_max {
self.global_hour.count.fetch_sub(1, Ordering::SeqCst);
return Err(LimitExceeded {
limit_type: LimitType::ApiCallsHour,
current: hour_count,
maximum: hour_max,
retry_after_secs: Some(3600),
});
}
Ok(())
}
async fn check_user_limits(&self, user_id: &str) -> Result<(), LimitExceeded> {
self.check_user_minute_limit(user_id).await?;
self.check_user_hour_limit(user_id).await
}
async fn check_user_minute_limit(&self, user_id: &str) -> Result<(), LimitExceeded> {
let entry = {
let map = self.per_user_minute.read().await;
map.get(user_id).cloned()
};
let entry = match entry {
Some(e) => e,
None => {
let new_entry = Arc::new(RateLimitEntry::new());
let mut map = self.per_user_minute.write().await;
map.insert(user_id.to_string(), Arc::clone(&new_entry));
new_entry
}
};
let now = Instant::now();
{
let window_start = entry.window_start.read().await;
if now.duration_since(*window_start) > Duration::from_secs(60) {
drop(window_start);
let mut window_start = entry.window_start.write().await;
*window_start = now;
entry.count.store(0, Ordering::SeqCst);
}
}
let count = entry.count.fetch_add(1, Ordering::SeqCst) + 1;
let max = u64::from(self.limits.max_api_calls_per_minute);
if count > max {
entry.count.fetch_sub(1, Ordering::SeqCst);
return Err(LimitExceeded {
limit_type: LimitType::ApiCallsMinute,
current: count,
maximum: max,
retry_after_secs: Some(60),
});
}
Ok(())
}
async fn check_user_hour_limit(&self, user_id: &str) -> Result<(), LimitExceeded> {
let entry = {
let map = self.per_user_hour.read().await;
map.get(user_id).cloned()
};
let entry = match entry {
Some(e) => e,
None => {
let new_entry = Arc::new(RateLimitEntry::new());
let mut map = self.per_user_hour.write().await;
map.insert(user_id.to_string(), Arc::clone(&new_entry));
new_entry
}
};
let now = Instant::now();
{
let window_start = entry.window_start.read().await;
if now.duration_since(*window_start) > Duration::from_secs(3600) {
drop(window_start);
let mut window_start = entry.window_start.write().await;
*window_start = now;
entry.count.store(0, Ordering::SeqCst);
}
}
let count = entry.count.fetch_add(1, Ordering::SeqCst) + 1;
let max = u64::from(self.limits.max_api_calls_per_hour);
if count > max {
entry.count.fetch_sub(1, Ordering::SeqCst);
return Err(LimitExceeded {
limit_type: LimitType::ApiCallsHour,
current: count,
maximum: max,
retry_after_secs: Some(3600),
});
}
Ok(())
}
pub async fn cleanup_stale_entries(&self) {
let now = Instant::now();
let stale_threshold = Duration::from_secs(7200);
{
let mut map = self.per_user_minute.write().await;
let mut to_remove = Vec::new();
for (user_id, entry) in map.iter() {
let window_start = entry.window_start.read().await;
if now.duration_since(*window_start) > stale_threshold {
to_remove.push(user_id.clone());
}
}
for user_id in to_remove {
map.remove(&user_id);
}
}
{
let mut map = self.per_user_hour.write().await;
let mut to_remove = Vec::new();
for (user_id, entry) in map.iter() {
let window_start = entry.window_start.read().await;
if now.duration_since(*window_start) > stale_threshold {
to_remove.push(user_id.clone());
}
}
for user_id in to_remove {
map.remove(&user_id);
}
}
}
}
pub fn check_loop_limit(iterations: u32, max: u32) -> Result<(), LimitExceeded> {
if iterations >= max {
return Err(LimitExceeded {
limit_type: LimitType::LoopIterations,
current: u64::from(iterations),
maximum: u64::from(max),
retry_after_secs: None,
});
}
Ok(())
}
pub fn check_recursion_limit(depth: u32, max: u32) -> Result<(), LimitExceeded> {
if depth >= max {
return Err(LimitExceeded {
limit_type: LimitType::RecursionDepth,
current: u64::from(depth),
maximum: u64::from(max),
retry_after_secs: None,
});
}
Ok(())
}
pub fn check_file_size_limit(size: u64, max: u64) -> Result<(), LimitExceeded> {
if size > max {
return Err(LimitExceeded {
limit_type: LimitType::FileSize,
current: size,
maximum: max,
retry_after_secs: None,
});
}
Ok(())
}
pub fn check_string_length_limit(length: usize, max: usize) -> Result<(), LimitExceeded> {
if length > max {
return Err(LimitExceeded {
limit_type: LimitType::StringLength,
current: length as u64,
maximum: max as u64,
retry_after_secs: None,
});
}
Ok(())
}
pub fn check_array_length_limit(length: usize, max: usize) -> Result<(), LimitExceeded> {
if length > max {
return Err(LimitExceeded {
limit_type: LimitType::ArrayLength,
current: length as u64,
maximum: max as u64,
retry_after_secs: None,
});
}
Ok(())
}
pub fn format_limit_error_response(error: &LimitExceeded) -> (u16, String) {
let status = 429;
let body = serde_json::json!({
"error": "rate_limit_exceeded",
"message": error.to_string(),
"limit_type": error.limit_type.to_string(),
"current": error.current,
"maximum": error.maximum,
"retry_after_secs": error.retry_after_secs,
});
(status, body.to_string())
}

49
src/logging.rs Normal file
View file

@ -0,0 +1,49 @@
use env_logger::fmt::Formatter;
use log::Record;
use std::io::Write;
// ANSI color codes
const RED: &str = "\x1b[31m";
const YELLOW: &str = "\x1b[33m";
const GREEN: &str = "\x1b[32m";
const CYAN: &str = "\x1b[36m";
const RESET: &str = "\x1b[0m";
pub fn compact_format(buf: &mut Formatter, record: &Record) -> std::io::Result<()> {
let (level, color) = match record.level() {
log::Level::Error => ("E", RED),
log::Level::Warn => ("W", YELLOW),
log::Level::Info => ("I", GREEN),
log::Level::Debug => ("D", CYAN),
log::Level::Trace => ("T", ""),
};
let now = chrono::Local::now();
let timestamp = now.format("%Y%m%d%H%M%S%.3f");
let target = record.target();
let module = if let Some(pos) = target.rfind("::") {
&target[pos + 2..]
} else {
target
};
if color.is_empty() {
writeln!(buf, "{} {} {}:{}", timestamp, level, module, record.args())
} else {
writeln!(buf, "{} {}{}{} {}:{}", timestamp, color, level, RESET, module, record.args())
}
}
pub fn init_compact_logger(default_filter: &str) {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(default_filter))
.format(compact_format)
.init();
}
pub fn init_compact_logger_with_style(default_filter: &str) {
env_logger::Builder::from_env(env_logger::Env::default().default_filter_or(default_filter))
.format(compact_format)
.write_style(env_logger::WriteStyle::Always)
.init();
}

View file

@ -1,37 +1,27 @@
//! Message type definitions
//!
//! Defines the different types of messages in the bot system.
use serde::{Deserialize, Serialize};
/// Enum representing different types of messages in the bot system
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(transparent)]
pub struct MessageType(pub i32);
impl MessageType {
/// Regular message from external systems (WhatsApp, Instagram, etc.)
pub const EXTERNAL: MessageType = MessageType(0);
pub const EXTERNAL: Self = Self(0);
/// User message from web interface
pub const USER: MessageType = MessageType(1);
pub const USER: Self = Self(1);
/// Bot response (can be regular content or event)
pub const BOT_RESPONSE: MessageType = MessageType(2);
pub const BOT_RESPONSE: Self = Self(2);
/// Continue interrupted response
pub const CONTINUE: MessageType = MessageType(3);
pub const CONTINUE: Self = Self(3);
/// Suggestion or command message
pub const SUGGESTION: MessageType = MessageType(4);
pub const SUGGESTION: Self = Self(4);
/// Context change notification
pub const CONTEXT_CHANGE: MessageType = MessageType(5);
pub const CONTEXT_CHANGE: Self = Self(5);
}
impl From<i32> for MessageType {
fn from(value: i32) -> Self {
MessageType(value)
Self(value)
}
}
@ -43,7 +33,7 @@ impl From<MessageType> for i32 {
impl Default for MessageType {
fn default() -> Self {
MessageType::USER
Self::USER
}
}
@ -58,7 +48,7 @@ impl std::fmt::Display for MessageType {
5 => "CONTEXT_CHANGE",
_ => "UNKNOWN",
};
write!(f, "{}", name)
write!(f, "{name}")
}
}

View file

@ -1,3 +1,4 @@
use crate::message_types::MessageType;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
@ -17,7 +18,8 @@ pub struct ApiResponse<T> {
}
impl<T> ApiResponse<T> {
pub fn success(data: T) -> Self {
#[must_use]
pub const fn success(data: T) -> Self {
Self {
success: true,
data: Some(data),
@ -27,6 +29,7 @@ impl<T> ApiResponse<T> {
}
}
#[must_use]
pub fn success_with_message(data: T, message: impl Into<String>) -> Self {
Self {
success: true,
@ -37,6 +40,7 @@ impl<T> ApiResponse<T> {
}
}
#[must_use]
pub fn error(message: impl Into<String>) -> Self {
Self {
success: false,
@ -47,6 +51,7 @@ impl<T> ApiResponse<T> {
}
}
#[must_use]
pub fn error_with_code(message: impl Into<String>, code: impl Into<String>) -> Self {
Self {
success: false,
@ -57,6 +62,7 @@ impl<T> ApiResponse<T> {
}
}
#[must_use]
pub fn map<U, F: FnOnce(T) -> U>(self, f: F) -> ApiResponse<U> {
ApiResponse {
success: self.success,
@ -67,11 +73,13 @@ impl<T> ApiResponse<T> {
}
}
pub fn is_success(&self) -> bool {
#[must_use]
pub const fn is_success(&self) -> bool {
self.success
}
pub fn is_error(&self) -> bool {
#[must_use]
pub const fn is_error(&self) -> bool {
!self.success
}
}
@ -95,6 +103,7 @@ pub struct Session {
}
impl Session {
#[must_use]
pub fn new(user_id: Uuid, bot_id: Uuid, title: impl Into<String>) -> Self {
let now = Utc::now();
Self {
@ -108,19 +117,23 @@ impl Session {
}
}
pub fn with_expiry(mut self, expires_at: DateTime<Utc>) -> Self {
#[must_use]
pub const fn with_expiry(mut self, expires_at: DateTime<Utc>) -> Self {
self.expires_at = Some(expires_at);
self
}
#[must_use]
pub fn is_expired(&self) -> bool {
self.expires_at.map(|exp| Utc::now() > exp).unwrap_or(false)
self.expires_at.is_some_and(|exp| Utc::now() > exp)
}
#[must_use]
pub fn is_active(&self) -> bool {
!self.is_expired()
}
#[must_use]
pub fn remaining_time(&self) -> Option<chrono::Duration> {
self.expires_at.map(|exp| exp - Utc::now())
}
@ -142,6 +155,7 @@ pub struct UserMessage {
}
impl UserMessage {
#[must_use]
pub fn text(
bot_id: impl Into<String>,
user_id: impl Into<String>,
@ -162,17 +176,20 @@ impl UserMessage {
}
}
#[must_use]
pub fn with_media(mut self, url: impl Into<String>) -> Self {
self.media_url = Some(url.into());
self
}
#[must_use]
pub fn with_context(mut self, context: impl Into<String>) -> Self {
self.context_name = Some(context.into());
self
}
pub fn has_media(&self) -> bool {
#[must_use]
pub const fn has_media(&self) -> bool {
self.media_url.is_some()
}
}
@ -189,6 +206,7 @@ pub struct Suggestion {
}
impl Suggestion {
#[must_use]
pub fn new(text: impl Into<String>) -> Self {
Self {
text: text.into(),
@ -198,16 +216,19 @@ impl Suggestion {
}
}
#[must_use]
pub fn with_context(mut self, context: impl Into<String>) -> Self {
self.context = Some(context.into());
self
}
#[must_use]
pub fn with_action(mut self, action: impl Into<String>) -> Self {
self.action = Some(action.into());
self
}
#[must_use]
pub fn with_icon(mut self, icon: impl Into<String>) -> Self {
self.icon = Some(icon.into());
self
@ -242,6 +263,7 @@ pub struct BotResponse {
}
impl BotResponse {
#[must_use]
pub fn new(
bot_id: impl Into<String>,
session_id: impl Into<String>,
@ -265,6 +287,7 @@ impl BotResponse {
}
}
#[must_use]
pub fn streaming(
bot_id: impl Into<String>,
session_id: impl Into<String>,
@ -288,6 +311,7 @@ impl BotResponse {
}
}
#[must_use]
pub fn with_suggestions<I, S>(mut self, suggestions: I) -> Self
where
I: IntoIterator<Item = S>,
@ -297,11 +321,13 @@ impl BotResponse {
self
}
#[must_use]
pub fn add_suggestion(mut self, suggestion: impl Into<Suggestion>) -> Self {
self.suggestions.push(suggestion.into());
self
}
#[must_use]
pub fn with_context(
mut self,
name: impl Into<String>,
@ -318,16 +344,19 @@ impl BotResponse {
self.content.push_str(chunk);
}
pub fn complete(mut self) -> Self {
#[must_use]
pub const fn complete(mut self) -> Self {
self.is_complete = true;
self
}
pub fn is_streaming(&self) -> bool {
#[must_use]
pub const fn is_streaming(&self) -> bool {
self.stream_token.is_some() && !self.is_complete
}
pub fn has_suggestions(&self) -> bool {
#[must_use]
pub const fn has_suggestions(&self) -> bool {
!self.suggestions.is_empty()
}
}
@ -376,6 +405,7 @@ pub enum AttachmentType {
}
impl Attachment {
#[must_use]
pub fn new(attachment_type: AttachmentType, url: impl Into<String>) -> Self {
Self {
attachment_type,
@ -387,51 +417,62 @@ impl Attachment {
}
}
#[must_use]
pub fn image(url: impl Into<String>) -> Self {
Self::new(AttachmentType::Image, url)
}
#[must_use]
pub fn audio(url: impl Into<String>) -> Self {
Self::new(AttachmentType::Audio, url)
}
#[must_use]
pub fn video(url: impl Into<String>) -> Self {
Self::new(AttachmentType::Video, url)
}
#[must_use]
pub fn document(url: impl Into<String>) -> Self {
Self::new(AttachmentType::Document, url)
}
#[must_use]
pub fn file(url: impl Into<String>) -> Self {
Self::new(AttachmentType::File, url)
}
#[must_use]
pub fn with_mime_type(mut self, mime_type: impl Into<String>) -> Self {
self.mime_type = Some(mime_type.into());
self
}
#[must_use]
pub fn with_filename(mut self, filename: impl Into<String>) -> Self {
self.filename = Some(filename.into());
self
}
pub fn with_size(mut self, size: u64) -> Self {
#[must_use]
pub const fn with_size(mut self, size: u64) -> Self {
self.size = Some(size);
self
}
#[must_use]
pub fn with_thumbnail(mut self, thumbnail_url: impl Into<String>) -> Self {
self.thumbnail_url = Some(thumbnail_url.into());
self
}
pub fn is_image(&self) -> bool {
self.attachment_type == AttachmentType::Image
#[must_use]
pub const fn is_image(&self) -> bool {
matches!(self.attachment_type, AttachmentType::Image)
}
pub fn is_media(&self) -> bool {
#[must_use]
pub const fn is_media(&self) -> bool {
matches!(
self.attachment_type,
AttachmentType::Image | AttachmentType::Audio | AttachmentType::Video

View file

@ -1,40 +1,16 @@
//! Resilience Module - Production-grade fault tolerance primitives
//!
//! This module provides battle-tested resilience patterns:
//! - Retry with exponential backoff and jitter
//! - Circuit breaker with half-open state
//! - Timeout wrappers
//! - Bulkhead isolation
//! - Fallback chains
//!
//! # Design Principles
//! - Zero-cost abstractions where possible
//! - No panics - all errors are recoverable
//! - Composable patterns
//! - Observable state for metrics
use std::future::Future;
use std::sync::atomic::{AtomicU32, AtomicU64, Ordering};
use std::sync::Arc;
use std::time::{Duration, Instant};
use tokio::sync::{RwLock, Semaphore, SemaphorePermit};
use std::time::Duration;
use tokio::time::{sleep, timeout};
/// Errors that can occur during resilient operations
pub type RetryPredicate = Arc<dyn Fn(&str) -> bool + Send + Sync>;
#[derive(Debug, Clone)]
pub enum ResilienceError {
/// Operation timed out
Timeout { duration: Duration },
/// Circuit breaker is open, rejecting requests
CircuitOpen { until: Option<Duration> },
/// All retry attempts exhausted
RetriesExhausted {
attempts: u32,
last_error: String,
},
/// Bulkhead rejected request (too many concurrent)
RetriesExhausted { attempts: u32, last_error: String },
BulkheadFull { max_concurrent: usize },
/// Wrapped error from the underlying operation
Operation(String),
}
@ -75,25 +51,27 @@ impl std::fmt::Display for ResilienceError {
impl std::error::Error for ResilienceError {}
// ============================================================================
// Retry Configuration and Execution
// ============================================================================
/// Retry strategy configuration
#[derive(Debug, Clone)]
#[derive(Clone)]
pub struct RetryConfig {
/// Maximum number of attempts (including the first one)
pub max_attempts: u32,
/// Initial delay between retries
pub initial_delay: Duration,
/// Maximum delay between retries
pub max_delay: Duration,
/// Multiplier for exponential backoff (typically 2.0)
pub backoff_multiplier: f64,
/// Add random jitter to prevent thundering herd (0.0 to 1.0)
pub jitter_factor: f64,
/// Predicate to determine if error is retryable
retryable: Option<Arc<dyn Fn(&str) -> bool + Send + Sync>>,
retryable: Option<RetryPredicate>,
}
impl std::fmt::Debug for RetryConfig {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RetryConfig")
.field("max_attempts", &self.max_attempts)
.field("initial_delay", &self.initial_delay)
.field("max_delay", &self.max_delay)
.field("backoff_multiplier", &self.backoff_multiplier)
.field("jitter_factor", &self.jitter_factor)
.field("retryable", &self.retryable.is_some())
.finish()
}
}
impl Default for RetryConfig {
@ -173,19 +151,16 @@ impl RetryConfig {
}
}
/// Calculate delay for a given attempt number
fn calculate_delay(&self, attempt: u32) -> Duration {
let base_delay = self.initial_delay.as_secs_f64()
* self.backoff_multiplier.powi(attempt.saturating_sub(1) as i32);
let exponent = i32::try_from(attempt.saturating_sub(1)).unwrap_or(0);
let base_delay = self.backoff_multiplier.powi(exponent) * self.initial_delay.as_secs_f64();
let capped_delay = base_delay.min(self.max_delay.as_secs_f64());
// Add jitter
let jitter = if self.jitter_factor > 0.0 {
let jitter_range = capped_delay * self.jitter_factor;
// Simple deterministic "random" based on attempt number
let pseudo_random = ((attempt as f64 * 1.618033988749895) % 1.0) * 2.0 - 1.0;
jitter_range * pseudo_random
let pseudo_random = (f64::from(attempt) * 1.618_033_988_749_895) % 1.0;
(2.0_f64).mul_add(pseudo_random, -1.0) * jitter_range
} else {
0.0
};
@ -193,9 +168,57 @@ impl RetryConfig {
Duration::from_secs_f64((capped_delay + jitter).max(0.001))
}
/// Check if an error is retryable
fn is_retryable(&self, error: &str) -> bool {
if let Some(ref predicate) = self.retryable {
predicate(error)
} else {
//
error.contains("timeout")
|| error.contains("connection")
|| error.contains("temporarily")
|| error.contains("503")
|| error.contains("429")
}
}
}
pub async fn retry<F, Fut, T>(config: &RetryConfig, mut operation: F) -> Result<T, ResilienceError>
where
F: FnMut() -> Fut,
Fut: Future<Output = Result<T, String>>,
{
let mut last_error = String::new();
for attempt in 1..=config.max_attempts {
match operation().await {
Ok(result) => return Ok(result),
Err(e) => {
if attempt == config.max_attempts {
last_error = e;
break;
}
if !config.is_retryable(&e) {
return Err(ResilienceError::Operation(e));
}
last_error = e;
let delay = config.calculate_delay(attempt);
sleep(delay).await;
}
}
}
Err(ResilienceError::RetriesExhausted {
attempts: config.max_attempts,
last_error,
})
}
pub async fn with_timeout<F, T>(duration: Duration, future: F) -> Result<T, ResilienceError>
where
F: Future<Output = T>,
{
timeout(duration, future)
.await
.map_err(|_| ResilienceError::Timeout { duration })
}

View file

@ -1,42 +1,26 @@
//! Version Tracking Module
//!
//! Tracks versions of all components and checks for updates.
use chrono::{DateTime, Utc};
use log::debug;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::RwLock;
/// Global version registry
static VERSION_REGISTRY: RwLock<Option<VersionRegistry>> = RwLock::new(None);
/// Current botserver version from Cargo.toml
pub const BOTSERVER_VERSION: &str = env!("CARGO_PKG_VERSION");
pub const BOTSERVER_NAME: &str = env!("CARGO_PKG_NAME");
/// Component version information
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ComponentVersion {
/// Component name
pub name: String,
/// Current installed version
pub version: String,
/// Latest available version (if known)
pub latest_version: Option<String>,
/// Whether an update is available
pub update_available: bool,
/// Component status
pub status: ComponentStatus,
/// Last check time
pub last_checked: Option<DateTime<Utc>>,
/// Source/origin of the component
pub source: ComponentSource,
/// Additional metadata
pub metadata: HashMap<String, String>,
}
/// Component status
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
pub enum ComponentStatus {
Running,
@ -50,17 +34,16 @@ pub enum ComponentStatus {
impl std::fmt::Display for ComponentStatus {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ComponentStatus::Running => write!(f, "[OK] Running"),
ComponentStatus::Stopped => write!(f, "[STOP] Stopped"),
ComponentStatus::Error => write!(f, "[ERR] Error"),
ComponentStatus::Updating => write!(f, "[UPD] Updating"),
ComponentStatus::NotInstalled => write!(f, "[--] Not Installed"),
ComponentStatus::Unknown => write!(f, "[?] Unknown"),
Self::Running => write!(f, "[OK] Running"),
Self::Stopped => write!(f, "[STOP] Stopped"),
Self::Error => write!(f, "[ERR] Error"),
Self::Updating => write!(f, "[UPD] Updating"),
Self::NotInstalled => write!(f, "[--] Not Installed"),
Self::Unknown => write!(f, "[?] Unknown"),
}
}
}
/// Component source type
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum ComponentSource {
Builtin,
@ -74,17 +57,16 @@ pub enum ComponentSource {
impl std::fmt::Display for ComponentSource {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
ComponentSource::Builtin => write!(f, "Built-in"),
ComponentSource::Docker => write!(f, "Docker"),
ComponentSource::Lxc => write!(f, "LXC"),
ComponentSource::System => write!(f, "System"),
ComponentSource::Binary => write!(f, "Binary"),
ComponentSource::External => write!(f, "External"),
Self::Builtin => write!(f, "Built-in"),
Self::Docker => write!(f, "Docker"),
Self::Lxc => write!(f, "LXC"),
Self::System => write!(f, "System"),
Self::Binary => write!(f, "Binary"),
Self::External => write!(f, "External"),
}
}
}
/// Version registry holding all component versions
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VersionRegistry {
pub core_version: String,
@ -105,14 +87,13 @@ impl Default for VersionRegistry {
}
impl VersionRegistry {
/// Create a new version registry
#[must_use]
pub fn new() -> Self {
let mut registry = Self::default();
registry.register_builtin_components();
registry
}
/// Register built-in components
fn register_builtin_components(&mut self) {
self.register_component(ComponentVersion {
name: "botserver".to_string(),
@ -160,7 +141,6 @@ impl VersionRegistry {
});
}
/// Register a component
pub fn register_component(&mut self, component: ComponentVersion) {
debug!(
"Registered component: {} v{}",
@ -169,14 +149,12 @@ impl VersionRegistry {
self.components.insert(component.name.clone(), component);
}
/// Update component status
pub fn update_status(&mut self, name: &str, status: ComponentStatus) {
if let Some(component) = self.components.get_mut(name) {
component.status = status;
}
}
/// Update component version
pub fn update_version(&mut self, name: &str, version: String) {
if let Some(component) = self.components.get_mut(name) {
component.version = version;
@ -184,17 +162,17 @@ impl VersionRegistry {
}
}
/// Get component by name
#[must_use]
pub fn get_component(&self, name: &str) -> Option<&ComponentVersion> {
self.components.get(name)
}
/// Get all components
pub fn get_all_components(&self) -> &HashMap<String, ComponentVersion> {
#[must_use]
pub const fn get_all_components(&self) -> &HashMap<String, ComponentVersion> {
&self.components
}
/// Get components with available updates
#[must_use]
pub fn get_available_updates(&self) -> Vec<&ComponentVersion> {
self.components
.values()
@ -202,7 +180,7 @@ impl VersionRegistry {
.collect()
}
/// Get summary of all components
#[must_use]
pub fn summary(&self) -> String {
let running = self
.components
@ -213,20 +191,20 @@ impl VersionRegistry {
let updates = self.get_available_updates().len();
format!(
"{} v{} | {}/{} components running | {} updates available",
BOTSERVER_NAME, self.core_version, running, total, updates
"{BOTSERVER_NAME} v{} | {running}/{total} components running | {updates} updates available",
self.core_version
)
}
/// Get summary as JSON
/// Serialize the registry to a JSON string.
///
/// # Errors
/// Returns an error if serialization fails.
pub fn to_json(&self) -> Result<String, serde_json::Error> {
serde_json::to_string_pretty(self)
}
}
// Global Access Functions
/// Initialize version registry at startup
pub fn init_version_registry() {
let registry = VersionRegistry::new();
if let Ok(mut guard) = VERSION_REGISTRY.write() {
@ -234,18 +212,16 @@ pub fn init_version_registry() {
}
}
/// Get version registry (read-only)
#[must_use]
pub fn version_registry() -> Option<VersionRegistry> {
VERSION_REGISTRY.read().ok()?.clone()
}
/// Get mutable version registry
pub fn version_registry_mut(
) -> Option<std::sync::RwLockWriteGuard<'static, Option<VersionRegistry>>> {
VERSION_REGISTRY.write().ok()
}
/// Register a component
pub fn register_component(component: ComponentVersion) {
if let Ok(mut guard) = VERSION_REGISTRY.write() {
if let Some(ref mut registry) = *guard {
@ -254,7 +230,6 @@ pub fn register_component(component: ComponentVersion) {
}
}
/// Update component status
pub fn update_component_status(name: &str, status: ComponentStatus) {
if let Ok(mut guard) = VERSION_REGISTRY.write() {
if let Some(ref mut registry) = *guard {
@ -263,7 +238,7 @@ pub fn update_component_status(name: &str, status: ComponentStatus) {
}
}
/// Get component version
#[must_use]
pub fn get_component_version(name: &str) -> Option<ComponentVersion> {
VERSION_REGISTRY
.read()
@ -273,14 +248,14 @@ pub fn get_component_version(name: &str) -> Option<ComponentVersion> {
.cloned()
}
/// Get botserver version
pub fn get_botserver_version() -> &'static str {
#[must_use]
pub const fn get_botserver_version() -> &'static str {
BOTSERVER_VERSION
}
/// Get version string for display
#[must_use]
pub fn version_string() -> String {
format!("{} v{}", BOTSERVER_NAME, BOTSERVER_VERSION)
format!("{BOTSERVER_NAME} v{BOTSERVER_VERSION}")
}
#[cfg(test)]
@ -333,8 +308,12 @@ mod tests {
fn test_update_status() {
let mut registry = VersionRegistry::new();
registry.update_status("botserver", ComponentStatus::Stopped);
let component = registry.get_component("botserver").unwrap();
assert_eq!(component.status, ComponentStatus::Stopped);
let component = registry.get_component("botserver");
assert!(
component.is_some(),
"botserver component should exist in registry"
);
assert_eq!(component.map(|c| c.status), Some(ComponentStatus::Stopped));
}
#[test]