{"id":21524,"date":"2026-07-02T15:08:32","date_gmt":"2026-07-02T15:08:32","guid":{"rendered":"https:\/\/marketplace-marketplace.com\/?page_id=21524"},"modified":"2026-07-02T17:06:42","modified_gmt":"2026-07-02T17:06:42","slug":"translate","status":"publish","type":"page","link":"https:\/\/marketplace-marketplace.com\/index.php\/translate\/","title":{"rendered":"translate"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"21524\" class=\"elementor elementor-21524\" data-elementor-settings=\"[]\">\n\t\t\t\t\t\t\t<div class=\"elementor-section-wrap\">\n\t\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b720846 elementor-section-full_width elementor-section-height-default elementor-section-height-default\" data-id=\"b720846\" data-element_type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-39bc19d\" data-id=\"39bc19d\" data-element_type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0004ed2 elementor-widget elementor-widget-html\" data-id=\"0004ed2\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t<!DOCTYPE html>\r\n<html lang=\"en\">\r\n<head>\r\n<meta charset=\"UTF-8\">\r\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n<title>Marketplace Translate - Universal Language Translator<\/title>\r\n<link rel=\"stylesheet\" href=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/font-awesome\/6.4.0\/css\/all.min.css\">\r\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap\" rel=\"stylesheet\">\r\n<style>\r\n\/* ============================================\r\nROOT VARIABLES\r\n============================================ *\/\r\n:root {\r\n--primary: #6366f1;\r\n--primary-dark: #4f46e5;\r\n--primary-light: #818cf8;\r\n--secondary: #10b981;\r\n--danger: #ef4444;\r\n--warning: #f59e0b;\r\n--info: #3b82f6;\r\n--dark: #0f172a;\r\n--darker: #020617;\r\n--light: #f8fafc;\r\n--gray: #64748b;\r\n--gray-light: #94a3b8;\r\n--border: #1e293b;\r\n--card-bg: #1e293b;\r\n--shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\r\n--radius: 20px;\r\n--transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);\r\n}\r\n\r\n* {\r\nmargin: 0;\r\npadding: 0;\r\nbox-sizing: border-box;\r\n}\r\n\r\nbody {\r\nfont-family: 'Inter', sans-serif;\r\nbackground: linear-gradient(135deg, var(--darker), var(--dark));\r\nmin-height: 100vh;\r\ndisplay: flex;\r\nalign-items: center;\r\njustify-content: center;\r\npadding: 20px;\r\ncolor: var(--light);\r\n}\r\n\r\n\/* ============================================\r\nTRANSLATE ICON - LEFT SIDE\r\n============================================ *\/\r\n.translate-icon-container {\r\nposition: fixed;\r\nbottom: 30px;\r\nleft: 30px;\r\nz-index: 9999;\r\ndisplay: flex;\r\nflex-direction: column;\r\nalign-items: flex-start;\r\ngap: 10px;\r\n}\r\n\r\n.translate-icon {\r\ndisplay: inline-flex;\r\nalign-items: center;\r\njustify-content: center;\r\nwidth: 64px;\r\nheight: 64px;\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\nborder-radius: 50%;\r\ncolor: white;\r\nfont-size: 28px;\r\nbox-shadow: 0 10px 30px rgba(99, 102, 241, 0.4);\r\ntransition: var(--transition);\r\ncursor: pointer;\r\nposition: relative;\r\nborder: none;\r\ntext-decoration: none;\r\n}\r\n\r\n.translate-icon:hover {\r\ntransform: translateY(-3px) scale(1.05);\r\nbox-shadow: 0 15px 40px rgba(99, 102, 241, 0.5);\r\n}\r\n\r\n.translate-icon .pulse {\r\nposition: absolute;\r\ninset: -4px;\r\nborder-radius: 50%;\r\nborder: 2px solid var(--primary);\r\nanimation: pulseRing 2s ease-in-out infinite;\r\nopacity: 0;\r\n}\r\n\r\n@keyframes pulseRing {\r\n0% { transform: scale(1); opacity: 0.6; }\r\n100% { transform: scale(1.4); opacity: 0; }\r\n}\r\n\r\n.translate-icon .badge {\r\nposition: absolute;\r\ntop: -8px;\r\nright: -8px;\r\nbackground: var(--danger);\r\ncolor: white;\r\nfont-size: 10px;\r\nfont-weight: 700;\r\npadding: 3px 8px;\r\nborder-radius: 20px;\r\nmin-width: 22px;\r\ntext-align: center;\r\n}\r\n\r\n.translate-icon .tooltip {\r\nposition: absolute;\r\nleft: 74px;\r\nbackground: var(--card-bg);\r\ncolor: var(--light);\r\npadding: 8px 16px;\r\nborder-radius: 8px;\r\nfont-size: 13px;\r\nfont-weight: 500;\r\nwhite-space: nowrap;\r\nopacity: 0;\r\ntransform: translateX(-10px);\r\ntransition: var(--transition);\r\npointer-events: none;\r\nborder: 1px solid var(--border);\r\nbox-shadow: var(--shadow);\r\n}\r\n\r\n.translate-icon:hover .tooltip {\r\nopacity: 1;\r\ntransform: translateX(0);\r\n}\r\n\r\n\/* ============================================\r\nTRANSLATE WIDGET\r\n============================================ *\/\r\n.translate-widget {\r\nwidth: 100%;\r\nmax-width: 960px;\r\nmax-height: 90vh;\r\noverflow-y: auto;\r\nbackground: var(--card-bg);\r\nborder-radius: var(--radius);\r\nborder: 1px solid var(--border);\r\npadding: 30px;\r\nbox-shadow: var(--shadow);\r\nposition: relative;\r\nanimation: widgetIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\ndisplay: none;\r\n}\r\n\r\n.translate-widget::-webkit-scrollbar {\r\nwidth: 6px;\r\n}\r\n.translate-widget::-webkit-scrollbar-track {\r\nbackground: transparent;\r\n}\r\n.translate-widget::-webkit-scrollbar-thumb {\r\nbackground: var(--primary);\r\nborder-radius: 3px;\r\n}\r\n\r\n.translate-widget.active {\r\ndisplay: block;\r\n}\r\n\r\n@keyframes widgetIn {\r\nfrom { opacity: 0; transform: translateY(30px) scale(0.95); }\r\nto { opacity: 1; transform: translateY(0) scale(1); }\r\n}\r\n\r\n.translate-widget::before {\r\ncontent: '';\r\nposition: absolute;\r\ntop: -50%;\r\nright: -50%;\r\nwidth: 100%;\r\nheight: 100%;\r\nbackground: radial-gradient(circle, rgba(99, 102, 241, 0.05), transparent 70%);\r\npointer-events: none;\r\n}\r\n\r\n\/* ============================================\r\nWIDGET HEADER\r\n============================================ *\/\r\n.widget-header {\r\ndisplay: flex;\r\nalign-items: center;\r\njustify-content: space-between;\r\nmargin-bottom: 25px;\r\nflex-wrap: wrap;\r\ngap: 15px;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.widget-brand {\r\ndisplay: flex;\r\nalign-items: center;\r\ngap: 14px;\r\n}\r\n\r\n.widget-icon-box {\r\nwidth: 52px;\r\nheight: 52px;\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\nborder-radius: 14px;\r\ndisplay: flex;\r\nalign-items: center;\r\njustify-content: center;\r\nfont-size: 24px;\r\ncolor: white;\r\nbox-shadow: 0 4px 15px rgba(99, 102, 241, 0.3);\r\ntransition: var(--transition);\r\ncursor: pointer;\r\n}\r\n\r\n.widget-icon-box:hover {\r\ntransform: rotate(-10deg) scale(1.05);\r\n}\r\n\r\n.widget-title {\r\nfont-size: 22px;\r\nfont-weight: 800;\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\n-webkit-background-clip: text;\r\n-webkit-text-fill-color: transparent;\r\n}\r\n\r\n.widget-subtitle {\r\nfont-size: 13px;\r\ncolor: var(--gray);\r\n-webkit-text-fill-color: var(--gray);\r\n}\r\n\r\n.widget-actions {\r\ndisplay: flex;\r\ngap: 10px;\r\nflex-wrap: wrap;\r\n}\r\n\r\n.widget-btn {\r\npadding: 10px 18px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 10px;\r\ncolor: var(--gray);\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nfont-size: 14px;\r\ndisplay: flex;\r\nalign-items: center;\r\ngap: 8px;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.widget-btn:hover {\r\nbackground: rgba(99, 102, 241, 0.1);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\ntransform: translateY(-2px);\r\n}\r\n\r\n.widget-btn.primary {\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\ncolor: white;\r\nborder: none;\r\n}\r\n\r\n.widget-btn.primary:hover {\r\nbox-shadow: 0 10px 25px rgba(99, 102, 241, 0.3);\r\n}\r\n\r\n.widget-btn.danger {\r\nbackground: rgba(239, 68, 68, 0.1);\r\nborder-color: var(--danger);\r\ncolor: var(--danger);\r\n}\r\n\r\n.widget-btn.danger:hover {\r\nbackground: rgba(239, 68, 68, 0.2);\r\n}\r\n\r\n.widget-btn.success {\r\nbackground: rgba(16, 185, 129, 0.1);\r\nborder-color: var(--secondary);\r\ncolor: var(--secondary);\r\n}\r\n\r\n.widget-btn.success:hover {\r\nbackground: rgba(16, 185, 129, 0.2);\r\n}\r\n\r\n.widget-close {\r\nbackground: none;\r\nborder: none;\r\ncolor: var(--gray);\r\nfont-size: 24px;\r\ncursor: pointer;\r\ntransition: var(--transition);\r\npadding: 5px;\r\n}\r\n\r\n.widget-close:hover {\r\ncolor: var(--danger);\r\ntransform: rotate(90deg);\r\n}\r\n\r\n\/* ============================================\r\nLANGUAGE SELECTOR\r\n============================================ *\/\r\n.language-selector {\r\ndisplay: grid;\r\ngrid-template-columns: 1fr auto 1fr;\r\ngap: 15px;\r\nalign-items: end;\r\nmargin-bottom: 25px;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.language-group {\r\nposition: relative;\r\n}\r\n\r\n.language-group label {\r\ndisplay: block;\r\nfont-size: 12px;\r\nfont-weight: 600;\r\ncolor: var(--gray);\r\ntext-transform: uppercase;\r\nletter-spacing: 1px;\r\nmargin-bottom: 8px;\r\n}\r\n\r\n.language-select {\r\nwidth: 100%;\r\npadding: 14px 20px;\r\npadding-right: 40px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 12px;\r\ncolor: var(--light);\r\nfont-size: 15px;\r\nfont-weight: 500;\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nappearance: none;\r\n-webkit-appearance: none;\r\nbackground-image: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2364748b' d='M6 8L1 3h10z'\/%3E%3C\/svg%3E\");\r\nbackground-repeat: no-repeat;\r\nbackground-position: right 16px center;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.language-select:focus {\r\noutline: none;\r\nborder-color: var(--primary);\r\nbox-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\r\n}\r\n\r\n.language-select option {\r\nbackground: var(--card-bg);\r\ncolor: var(--light);\r\npadding: 10px;\r\n}\r\n\r\n.language-select:hover {\r\nborder-color: var(--primary);\r\n}\r\n\r\n.language-select:disabled {\r\nopacity: 0.5;\r\ncursor: not-allowed;\r\n}\r\n\r\n.detect-btn {\r\nposition: absolute;\r\nright: 12px;\r\nbottom: 12px;\r\nbackground: none;\r\nborder: none;\r\ncolor: var(--gray);\r\ncursor: pointer;\r\nfont-size: 16px;\r\npadding: 4px 8px;\r\nborder-radius: 6px;\r\ntransition: var(--transition);\r\n}\r\n\r\n.detect-btn:hover {\r\ncolor: var(--primary);\r\nbackground: rgba(99, 102, 241, 0.1);\r\n}\r\n\r\n.swap-btn {\r\npadding: 12px 16px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 12px;\r\ncolor: var(--gray);\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nfont-size: 18px;\r\nmargin-bottom: 2px;\r\n}\r\n\r\n.swap-btn:hover {\r\nbackground: rgba(99, 102, 241, 0.1);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\ntransform: rotate(180deg);\r\n}\r\n\r\n\/* ============================================\r\nQUICK TRANSLATE BAR\r\n============================================ *\/\r\n.quick-translate-bar {\r\ndisplay: flex;\r\nflex-wrap: wrap;\r\ngap: 8px;\r\nmargin-bottom: 20px;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.quick-translate-btn {\r\npadding: 8px 16px;\r\nbackground: rgba(15, 23, 42, 0.6);\r\nborder: 1px solid var(--border);\r\nborder-radius: 8px;\r\ncolor: var(--gray);\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nfont-size: 13px;\r\nfont-family: 'Inter', sans-serif;\r\ndisplay: flex;\r\nalign-items: center;\r\ngap: 6px;\r\n}\r\n\r\n.quick-translate-btn:hover {\r\nbackground: rgba(99, 102, 241, 0.1);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\n}\r\n\r\n.quick-translate-btn.active {\r\nbackground: rgba(99, 102, 241, 0.15);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\n}\r\n\r\n\/* ============================================\r\nTEXT AREAS\r\n============================================ *\/\r\n.text-area-container {\r\nposition: relative;\r\nmargin-bottom: 20px;\r\nz-index: 1;\r\n}\r\n\r\n.text-area {\r\nwidth: 100%;\r\nmin-height: 180px;\r\npadding: 20px;\r\npadding-bottom: 50px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 12px;\r\ncolor: var(--light);\r\nfont-size: 16px;\r\nfont-family: 'Inter', sans-serif;\r\nresize: vertical;\r\ntransition: var(--transition);\r\nline-height: 1.7;\r\nword-wrap: break-word;\r\nwhite-space: pre-wrap;\r\n}\r\n\r\n.text-area:focus {\r\noutline: none;\r\nborder-color: var(--primary);\r\nbox-shadow: 0 0 0 3px rgba(99, 102, 241, 0.1);\r\n}\r\n\r\n.text-area::placeholder {\r\ncolor: var(--gray-light);\r\n}\r\n\r\n.text-area.output {\r\nbackground: rgba(15, 23, 42, 0.5);\r\nmin-height: 180px;\r\ncolor: var(--light);\r\n}\r\n\r\n.text-area.output:focus {\r\nborder-color: var(--border);\r\nbox-shadow: none;\r\n}\r\n\r\n\/* RTL Support *\/\r\n.text-area.rtl {\r\ndirection: rtl;\r\ntext-align: right;\r\n}\r\n\r\n.text-area.ltr {\r\ndirection: ltr;\r\ntext-align: left;\r\n}\r\n\r\n.text-actions {\r\nposition: absolute;\r\nbottom: 12px;\r\nright: 12px;\r\ndisplay: flex;\r\ngap: 8px;\r\n}\r\n\r\n.text-action-btn {\r\npadding: 8px 12px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 8px;\r\ncolor: var(--gray);\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nfont-size: 13px;\r\ndisplay: flex;\r\nalign-items: center;\r\ngap: 6px;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.text-action-btn:hover {\r\nbackground: rgba(99, 102, 241, 0.1);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\n}\r\n\r\n.char-count {\r\nposition: absolute;\r\nbottom: 12px;\r\nleft: 12px;\r\nfont-size: 12px;\r\ncolor: var(--gray);\r\n}\r\n\r\n\/* ============================================\r\nTRANSLATE BUTTON\r\n============================================ *\/\r\n.translate-btn {\r\nwidth: 100%;\r\npadding: 18px;\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\ncolor: white;\r\nborder: none;\r\nborder-radius: 12px;\r\nfont-size: 18px;\r\nfont-weight: 700;\r\ncursor: pointer;\r\ntransition: var(--transition);\r\ndisplay: flex;\r\nalign-items: center;\r\njustify-content: center;\r\ngap: 12px;\r\nmargin-bottom: 20px;\r\nfont-family: 'Inter', sans-serif;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.translate-btn:hover {\r\ntransform: translateY(-2px);\r\nbox-shadow: 0 10px 30px rgba(99, 102, 241, 0.3);\r\n}\r\n\r\n.translate-btn:active {\r\ntransform: translateY(0);\r\n}\r\n\r\n.translate-btn:disabled {\r\nopacity: 0.5;\r\ncursor: not-allowed;\r\ntransform: none;\r\n}\r\n\r\n.translate-btn .spinner {\r\ndisplay: inline-block;\r\nwidth: 20px;\r\nheight: 20px;\r\nborder: 3px solid rgba(255, 255, 255, 0.3);\r\nborder-top: 3px solid white;\r\nborder-radius: 50%;\r\nanimation: spin 0.8s linear infinite;\r\n}\r\n\r\n@keyframes spin {\r\n0% { transform: rotate(0deg); }\r\n100% { transform: rotate(360deg); }\r\n}\r\n\r\n\/* ============================================\r\nFEATURES BAR\r\n============================================ *\/\r\n.features-bar {\r\ndisplay: grid;\r\ngrid-template-columns: repeat(auto-fit, minmax(130px, 1fr));\r\ngap: 12px;\r\nmargin-bottom: 20px;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.feature-item {\r\ndisplay: flex;\r\nalign-items: center;\r\ngap: 10px;\r\npadding: 12px 16px;\r\nbackground: rgba(15, 23, 42, 0.6);\r\nborder-radius: 10px;\r\nborder: 1px solid var(--border);\r\ntransition: var(--transition);\r\ncursor: pointer;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.feature-item:hover {\r\nbackground: rgba(99, 102, 241, 0.05);\r\nborder-color: var(--primary);\r\n}\r\n\r\n.feature-item.active {\r\nborder-color: var(--primary);\r\nbackground: rgba(99, 102, 241, 0.1);\r\n}\r\n\r\n.feature-icon {\r\nfont-size: 18px;\r\ncolor: var(--primary);\r\n}\r\n\r\n.feature-label {\r\nfont-size: 13px;\r\nfont-weight: 500;\r\ncolor: var(--gray);\r\n}\r\n\r\n\/* ============================================\r\nHISTORY SECTION\r\n============================================ *\/\r\n.history-section {\r\nmargin-top: 20px;\r\nborder-top: 1px solid var(--border);\r\npadding-top: 20px;\r\nposition: relative;\r\nz-index: 1;\r\n}\r\n\r\n.history-header {\r\ndisplay: flex;\r\njustify-content: space-between;\r\nalign-items: center;\r\nmargin-bottom: 15px;\r\n}\r\n\r\n.history-title {\r\nfont-size: 14px;\r\nfont-weight: 600;\r\ncolor: var(--gray);\r\n}\r\n\r\n.history-list {\r\nmax-height: 150px;\r\noverflow-y: auto;\r\n}\r\n\r\n.history-list::-webkit-scrollbar {\r\nwidth: 4px;\r\n}\r\n.history-list::-webkit-scrollbar-track {\r\nbackground: transparent;\r\n}\r\n.history-list::-webkit-scrollbar-thumb {\r\nbackground: var(--primary);\r\nborder-radius: 2px;\r\n}\r\n\r\n.history-item {\r\ndisplay: flex;\r\njustify-content: space-between;\r\nalign-items: center;\r\npadding: 10px 15px;\r\nbackground: rgba(15, 23, 42, 0.6);\r\nborder-radius: 8px;\r\nmargin-bottom: 8px;\r\nfont-size: 14px;\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nword-wrap: break-word;\r\n}\r\n\r\n.history-item:hover {\r\nbackground: rgba(99, 102, 241, 0.05);\r\n}\r\n\r\n.history-item .source {\r\ncolor: var(--gray);\r\nmax-width: 200px;\r\noverflow: hidden;\r\ntext-overflow: ellipsis;\r\nwhite-space: nowrap;\r\n}\r\n\r\n.history-item .target {\r\ncolor: var(--light);\r\nmax-width: 200px;\r\noverflow: hidden;\r\ntext-overflow: ellipsis;\r\nwhite-space: nowrap;\r\n}\r\n\r\n.history-item .lang-pair {\r\nfont-size: 11px;\r\ncolor: var(--gray);\r\npadding: 2px 10px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder-radius: 20px;\r\n}\r\n\r\n.no-history {\r\ncolor: var(--gray);\r\ntext-align: center;\r\npadding: 20px;\r\nfont-size: 14px;\r\n}\r\n\r\n\/* ============================================\r\nTOAST NOTIFICATION\r\n============================================ *\/\r\n.toast {\r\nposition: fixed;\r\nbottom: 100px;\r\nleft: 30px;\r\nbackground: var(--card-bg);\r\nborder: 1px solid var(--border);\r\nborder-radius: 12px;\r\npadding: 15px 25px;\r\nmin-width: 280px;\r\nmax-width: 450px;\r\nopacity: 0;\r\ntransform: translateY(20px);\r\ntransition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);\r\nz-index: 10000;\r\nbox-shadow: var(--shadow);\r\ntext-align: center;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.toast.show {\r\nopacity: 1;\r\ntransform: translateY(0);\r\n}\r\n\r\n.toast.success { border-left: 4px solid var(--secondary); }\r\n.toast.error { border-left: 4px solid var(--danger); }\r\n.toast.info { border-left: 4px solid var(--primary); }\r\n.toast.warning { border-left: 4px solid var(--warning); }\r\n\r\n\/* ============================================\r\nMARKETPLACE BADGE\r\n============================================ *\/\r\n.marketplace-badge {\r\ndisplay: inline-flex;\r\nalign-items: center;\r\ngap: 8px;\r\npadding: 6px 14px;\r\nbackground: rgba(251, 191, 36, 0.1);\r\nborder: 1px solid rgba(251, 191, 36, 0.3);\r\nborder-radius: 20px;\r\ncolor: var(--warning);\r\nfont-size: 12px;\r\nfont-weight: 600;\r\n}\r\n\r\n\/* ============================================\r\nMODAL OVERLAY\r\n============================================ *\/\r\n.modal-overlay {\r\nposition: fixed;\r\ntop: 0;\r\nleft: 0;\r\nwidth: 100%;\r\nheight: 100%;\r\nbackground: rgba(0, 0, 0, 0.7);\r\nz-index: 10001;\r\ndisplay: none;\r\nalign-items: center;\r\njustify-content: center;\r\nbackdrop-filter: blur(10px);\r\n}\r\n\r\n.modal-overlay.active {\r\ndisplay: flex;\r\n}\r\n\r\n.modal-content {\r\nbackground: var(--card-bg);\r\nborder-radius: var(--radius);\r\npadding: 30px;\r\nmax-width: 500px;\r\nwidth: 90%;\r\nborder: 1px solid var(--border);\r\nbox-shadow: var(--shadow);\r\nmax-height: 80vh;\r\noverflow-y: auto;\r\n}\r\n\r\n.modal-content h3 {\r\nmargin-bottom: 20px;\r\nfont-size: 20px;\r\n}\r\n\r\n.modal-content .form-group {\r\nmargin-bottom: 15px;\r\n}\r\n\r\n.modal-content .form-group label {\r\ndisplay: block;\r\nmargin-bottom: 5px;\r\nfont-weight: 600;\r\nfont-size: 14px;\r\ncolor: var(--gray);\r\n}\r\n\r\n.modal-content .form-group input,\r\n.modal-content .form-group select {\r\nwidth: 100%;\r\npadding: 12px;\r\nbackground: rgba(15, 23, 42, 0.8);\r\nborder: 1px solid var(--border);\r\nborder-radius: 10px;\r\ncolor: var(--light);\r\nfont-size: 14px;\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.modal-content .form-group input:focus,\r\n.modal-content .form-group select:focus {\r\noutline: none;\r\nborder-color: var(--primary);\r\n}\r\n\r\n.modal-actions {\r\ndisplay: flex;\r\ngap: 10px;\r\nmargin-top: 20px;\r\n}\r\n\r\n.modal-actions button {\r\nflex: 1;\r\npadding: 12px;\r\nborder: none;\r\nborder-radius: 10px;\r\nfont-weight: 600;\r\ncursor: pointer;\r\ntransition: var(--transition);\r\nfont-family: 'Inter', sans-serif;\r\n}\r\n\r\n.modal-actions .btn-primary {\r\nbackground: linear-gradient(135deg, var(--primary), #8b5cf6);\r\ncolor: white;\r\n}\r\n\r\n.modal-actions .btn-primary:hover {\r\ntransform: translateY(-2px);\r\nbox-shadow: 0 10px 25px rgba(99, 102, 241, 0.3);\r\n}\r\n\r\n.modal-actions .btn-secondary {\r\nbackground: rgba(15, 23, 42, 0.8);\r\ncolor: var(--gray);\r\nborder: 1px solid var(--border);\r\n}\r\n\r\n.modal-actions .btn-secondary:hover {\r\nbackground: rgba(99, 102, 241, 0.1);\r\nborder-color: var(--primary);\r\ncolor: var(--primary);\r\n}\r\n\r\n\/* ============================================\r\nFLOATING MODE\r\n============================================ *\/\r\n.translate-widget.floating {\r\nposition: fixed;\r\nbottom: 100px;\r\nleft: 30px;\r\nmax-width: 480px;\r\nmax-height: 80vh;\r\noverflow-y: auto;\r\nz-index: 9999;\r\nanimation: floatIn 0.5s cubic-bezier(0.4, 0, 0.2, 1);\r\nwidth: 90%;\r\n}\r\n\r\n@keyframes floatIn {\r\nfrom { opacity: 0; transform: translateY(30px) scale(0.9); }\r\nto { opacity: 1; transform: translateY(0) scale(1); }\r\n}\r\n\r\n.translate-widget.floating .widget-header { margin-bottom: 15px; }\r\n.translate-widget.floating .widget-title { font-size: 18px; }\r\n.translate-widget.floating .widget-icon-box { width: 40px; height: 40px; font-size: 18px; }\r\n.translate-widget.floating .text-area { min-height: 100px; font-size: 14px; }\r\n.translate-widget.floating .text-area.output { min-height: 100px; }\r\n.translate-widget.floating .language-select { font-size: 13px; padding: 10px 16px; }\r\n.translate-widget.floating .translate-btn { padding: 14px; font-size: 15px; }\r\n.translate-widget.floating .history-section { display: none; }\r\n.translate-widget.floating .features-bar { display: none; }\r\n.translate-widget.floating .quick-translate-bar { display: none; }\r\n\r\n\/* ============================================\r\nFULLSCREEN MODE\r\n============================================ *\/\r\n.translate-widget.fullscreen {\r\nposition: fixed;\r\ntop: 0;\r\nleft: 0;\r\nwidth: 100%;\r\nheight: 100%;\r\nmax-width: 100%;\r\nmax-height: 100%;\r\nborder-radius: 0;\r\nz-index: 10000;\r\npadding: 40px;\r\n}\r\n\r\n.translate-widget.fullscreen .text-area {\r\nmin-height: 300px;\r\n}\r\n.translate-widget.fullscreen .text-area.output {\r\nmin-height: 300px;\r\n}\r\n\r\n\/* ============================================\r\nRESPONSIVE\r\n============================================ *\/\r\n@media (max-width: 768px) {\r\n.translate-widget {\r\npadding: 20px;\r\nborder-radius: 16px;\r\nmax-height: 95vh;\r\n}\r\n\r\n.widget-header {\r\nflex-direction: column;\r\nalign-items: flex-start;\r\n}\r\n\r\n.widget-actions {\r\nwidth: 100%;\r\njustify-content: flex-start;\r\n}\r\n\r\n.language-selector {\r\ngrid-template-columns: 1fr;\r\ngap: 10px;\r\n}\r\n\r\n.swap-btn {\r\nmargin-top: 0;\r\npadding: 10px;\r\njustify-self: center;\r\nwidth: 100%;\r\nmax-width: 60px;\r\n}\r\n\r\n.swap-btn:hover {\r\ntransform: rotate(90deg);\r\n}\r\n\r\n.features-bar {\r\ngrid-template-columns: repeat(2, 1fr);\r\n}\r\n\r\n.text-area {\r\nmin-height: 140px;\r\n}\r\n.text-area.output {\r\nmin-height: 140px;\r\n}\r\n\r\n.history-item {\r\nflex-wrap: wrap;\r\ngap: 8px;\r\n}\r\n\r\n.history-item .source,\r\n.history-item .target {\r\nmax-width: 100%;\r\nwhite-space: normal;\r\n}\r\n\r\n.translate-icon-container {\r\nbottom: 20px;\r\nleft: 20px;\r\n}\r\n\r\n.translate-icon {\r\nwidth: 54px;\r\nheight: 54px;\r\nfont-size: 24px;\r\n}\r\n\r\n.toast {\r\nleft: 20px;\r\nright: 20px;\r\nbottom: 80px;\r\nmin-width: auto;\r\nmax-width: none;\r\n}\r\n}\r\n\r\n@media (max-width: 480px) {\r\n.translate-widget {\r\npadding: 15px;\r\nborder-radius: 12px;\r\nmargin: 10px;\r\n}\r\n\r\n.widget-title {\r\nfont-size: 18px;\r\n}\r\n\r\n.widget-icon-box {\r\nwidth: 40px;\r\nheight: 40px;\r\nfont-size: 18px;\r\n}\r\n\r\n.features-bar {\r\ngrid-template-columns: 1fr 1fr;\r\n}\r\n\r\n.feature-item {\r\npadding: 10px 12px;\r\nfont-size: 12px;\r\n}\r\n\r\n.text-area {\r\nmin-height: 120px;\r\nfont-size: 14px;\r\npadding: 15px;\r\n}\r\n\r\n.translate-btn {\r\nfont-size: 16px;\r\npadding: 15px;\r\n}\r\n\r\n.translate-icon-container {\r\nbottom: 15px;\r\nleft: 15px;\r\n}\r\n\r\n.translate-icon {\r\nwidth: 48px;\r\nheight: 48px;\r\nfont-size: 20px;\r\n}\r\n\r\n.quick-translate-bar {\r\ngap: 5px;\r\n}\r\n\r\n.quick-translate-btn {\r\npadding: 6px 12px;\r\nfont-size: 12px;\r\n}\r\n}\r\n<\/style>\r\n<\/head>\r\n<body>\r\n\r\n<!-- ==========================================\r\nTRANSLATE ICON - LEFT SIDE\r\n========================================== -->\r\n<div class=\"translate-icon-container\" id=\"translateIconContainer\">\r\n<button class=\"translate-icon\" id=\"translateIcon\" title=\"Translate this page\">\r\n<span class=\"pulse\"><\/span>\r\n<i class=\"fas fa-language\"><\/i>\r\n<span class=\"badge\" id=\"langBadge\">EN<\/span>\r\n<span class=\"tooltip\">Translate<\/span>\r\n<\/button>\r\n<\/div>\r\n\r\n<!-- ==========================================\r\nTOAST NOTIFICATION - LEFT SIDE\r\n========================================== -->\r\n<div class=\"toast\" id=\"toast\"><\/div>\r\n\r\n<!-- ==========================================\r\nMODAL OVERLAY\r\n========================================== -->\r\n<div class=\"modal-overlay\" id=\"modalOverlay\">\r\n<div class=\"modal-content\" id=\"modalContent\">\r\n<!-- Dynamic content -->\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- ==========================================\r\nTRANSLATE WIDGET\r\n========================================== -->\r\n<div class=\"translate-widget\" id=\"translateWidget\">\r\n<!-- Header -->\r\n<div class=\"widget-header\">\r\n<div class=\"widget-brand\">\r\n<div class=\"widget-icon-box\">\r\n<i class=\"fas fa-language\"><\/i>\r\n<\/div>\r\n<div class=\"widget-title-group\">\r\n<div class=\"widget-title\">Marketplace Translate<\/div>\r\n<div class=\"widget-subtitle\">\r\nUniversal Language Translator\r\n<span class=\"marketplace-badge\" style=\"margin-left: 10px;\">\r\n<i class=\"fas fa-store\"><\/i>\r\nmarketplace-marketplace.com\r\n<\/span>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<div class=\"widget-actions\">\r\n<button class=\"widget-btn\" id=\"fullscreenBtn\" title=\"Toggle fullscreen\">\r\n<i class=\"fas fa-expand\"><\/i>\r\n<\/button>\r\n<button class=\"widget-btn\" id=\"clearBtn\" title=\"Clear all\">\r\n<i class=\"fas fa-eraser\"><\/i>\r\nClear\r\n<\/button>\r\n<button class=\"widget-btn\" id=\"copyBtn\" title=\"Copy translation\">\r\n<i class=\"fas fa-copy\"><\/i>\r\nCopy\r\n<\/button>\r\n<button class=\"widget-btn primary\" id=\"swapLanguagesBtn\">\r\n<i class=\"fas fa-arrows-alt-h\"><\/i>\r\nSwap\r\n<\/button>\r\n<button class=\"widget-btn\" id=\"toggleFloatingBtn\" title=\"Toggle floating mode\">\r\n<i class=\"fas fa-window-restore\"><\/i>\r\n<\/button>\r\n<button class=\"widget-btn\" id=\"toggleDarkModeBtn\" title=\"Toggle dark mode\">\r\n<i class=\"fas fa-moon\"><\/i>\r\n<\/button>\r\n<button class=\"widget-close\" id=\"closeWidgetBtn\" title=\"Close\">\r\n<i class=\"fas fa-times\"><\/i>\r\n<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- Quick Translate Bar -->\r\n<div class=\"quick-translate-bar\" id=\"quickTranslateBar\">\r\n<button class=\"quick-translate-btn active\" data-lang=\"en\" data-flag=\"\ud83c\uddec\ud83c\udde7\">English<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"es\" data-flag=\"\ud83c\uddea\ud83c\uddf8\">Spanish<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"fr\" data-flag=\"\ud83c\uddeb\ud83c\uddf7\">French<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"de\" data-flag=\"\ud83c\udde9\ud83c\uddea\">German<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"zh\" data-flag=\"\ud83c\udde8\ud83c\uddf3\">Chinese<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"ja\" data-flag=\"\ud83c\uddef\ud83c\uddf5\">Japanese<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"ar\" data-flag=\"\ud83c\udde6\ud83c\uddea\">Arabic<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"ru\" data-flag=\"\ud83c\uddf7\ud83c\uddfa\">Russian<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"pt\" data-flag=\"\ud83c\uddf5\ud83c\uddf9\">Portuguese<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"it\" data-flag=\"\ud83c\uddee\ud83c\uddf9\">Italian<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"hi\" data-flag=\"\ud83c\uddee\ud83c\uddf3\">Hindi<\/button>\r\n<button class=\"quick-translate-btn\" data-lang=\"ko\" data-flag=\"\ud83c\uddf0\ud83c\uddf7\">Korean<\/button>\r\n<\/div>\r\n\r\n<!-- Language Selector -->\r\n<div class=\"language-selector\">\r\n<div class=\"language-group\">\r\n<label for=\"sourceLanguage\">Source Language<\/label>\r\n<select class=\"language-select\" id=\"sourceLanguage\">\r\n<!-- Populated by JavaScript -->\r\n<\/select>\r\n<button class=\"detect-btn\" id=\"detectLanguageBtn\" title=\"Detect language\">\r\n<i class=\"fas fa-microphone\"><\/i>\r\n<\/button>\r\n<\/div>\r\n\r\n<button class=\"swap-btn\" id=\"swapBtn\" title=\"Swap languages\">\r\n<i class=\"fas fa-arrow-right-arrow-left\"><\/i>\r\n<\/button>\r\n\r\n<div class=\"language-group\">\r\n<label for=\"targetLanguage\">Target Language<\/label>\r\n<select class=\"language-select\" id=\"targetLanguage\">\r\n<!-- Populated by JavaScript -->\r\n<\/select>\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- Text Areas -->\r\n<div class=\"text-area-container\">\r\n<textarea class=\"text-area\" id=\"sourceText\" placeholder=\"Enter text to translate...\"><\/textarea>\r\n<div class=\"char-count\" id=\"charCount\">0 \/ 5000<\/div>\r\n<div class=\"text-actions\">\r\n<button class=\"text-action-btn\" id=\"speakSourceBtn\" title=\"Listen to source text\">\r\n<i class=\"fas fa-volume-up\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"clearSourceBtn\" title=\"Clear source text\">\r\n<i class=\"fas fa-times\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"pasteSourceBtn\" title=\"Paste from clipboard\">\r\n<i class=\"fas fa-paste\"><\/i>\r\n<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- Translate Button -->\r\n<button class=\"translate-btn\" id=\"translateBtn\">\r\n<i class=\"fas fa-language\"><\/i>\r\nTranslate\r\n<span id=\"translateBtnSpinner\" style=\"display: none;\">\r\n<span class=\"spinner\"><\/span>\r\n<\/span>\r\n<\/button>\r\n\r\n<!-- Output -->\r\n<div class=\"text-area-container\">\r\n<textarea class=\"text-area output\" id=\"targetText\" placeholder=\"Translation will appear here...\" readonly><\/textarea>\r\n<div class=\"text-actions\">\r\n<button class=\"text-action-btn\" id=\"speakTargetBtn\" title=\"Listen to translation\">\r\n<i class=\"fas fa-volume-up\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"copyTargetBtn\" title=\"Copy translation\">\r\n<i class=\"fas fa-copy\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"clearTargetBtn\" title=\"Clear translation\">\r\n<i class=\"fas fa-times\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"saveTranslationBtn\" title=\"Save translation\">\r\n<i class=\"fas fa-save\"><\/i>\r\n<\/button>\r\n<button class=\"text-action-btn\" id=\"fixEncodingBtn\" title=\"Fix URL encoding\" style=\"background: rgba(251, 191, 36, 0.1); border-color: var(--warning); color: var(--warning);\">\r\n<i class=\"fas fa-wrench\"><\/i>\r\nFix\r\n<\/button>\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- Features Bar -->\r\n<div class=\"features-bar\">\r\n<div class=\"feature-item active\" id=\"autoDetectFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-bolt\"><\/i><\/span>\r\n<span class=\"feature-label\">Auto-Detect<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"historyFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-history\"><\/i><\/span>\r\n<span class=\"feature-label\">History<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"favoritesFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-star\"><\/i><\/span>\r\n<span class=\"feature-label\">Favorites<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"phoneticFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-font\"><\/i><\/span>\r\n<span class=\"feature-label\">Phonetic<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"translateToFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-globe\"><\/i><\/span>\r\n<span class=\"feature-label\">Translate To<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"marketplaceTranslateFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-store\"><\/i><\/span>\r\n<span class=\"feature-label\">Marketplace Mode<\/span>\r\n<\/div>\r\n<div class=\"feature-item\" id=\"cleanEncodingFeature\">\r\n<span class=\"feature-icon\"><i class=\"fas fa-broom\"><\/i><\/span>\r\n<span class=\"feature-label\">Clean Encoding<\/span>\r\n<\/div>\r\n<\/div>\r\n\r\n<!-- History Section -->\r\n<div class=\"history-section\" id=\"historySection\">\r\n<div class=\"history-header\">\r\n<span class=\"history-title\"><i class=\"fas fa-history\"><\/i> Translation History<\/span>\r\n<div style=\"display: flex; gap: 10px;\">\r\n<button class=\"widget-btn\" id=\"exportHistoryBtn\" style=\"padding: 6px 12px; font-size: 12px;\">\r\n<i class=\"fas fa-download\"><\/i>\r\nExport\r\n<\/button>\r\n<button class=\"widget-btn danger\" id=\"clearHistoryBtn\" style=\"padding: 6px 12px; font-size: 12px;\">\r\n<i class=\"fas fa-trash\"><\/i>\r\nClear All\r\n<\/button>\r\n<\/div>\r\n<\/div>\r\n<div class=\"history-list\" id=\"historyList\">\r\n<div class=\"no-history\">No translation history yet<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n<\/div>\r\n\r\n<!-- ==========================================\r\nCOMPLETE JAVASCRIPT\r\n========================================== -->\r\n<script>\r\n\/\/ ============================================\r\n\/\/ AMB TRANSLATE - COMPLETE UNIVERSAL TRANSLATOR\r\n\/\/ ============================================\r\n\r\nclass AmbTranslate {\r\nconstructor() {\r\n\/\/ ============================================\r\n\/\/ 100+ LANGUAGES WITH FLAGS\r\n\/\/ ============================================\r\nthis.languages = [\r\n{ code: 'af', name: 'Afrikaans', native: 'Afrikaans', flag: '\ud83c\uddff\ud83c\udde6' },\r\n{ code: 'sq', name: 'Albanian', native: 'Shqip', flag: '\ud83c\udde6\ud83c\uddf1' },\r\n{ code: 'am', name: 'Amharic', native: '\u12a0\u121b\u122d\u129b', flag: '\ud83c\uddea\ud83c\uddf9' },\r\n{ code: 'ar', name: 'Arabic', native: '\u0627\u0644\u0639\u0631\u0628\u064a\u0629', flag: '\ud83c\udde6\ud83c\uddea' },\r\n{ code: 'hy', name: 'Armenian', native: '\u0540\u0561\u0575\u0565\u0580\u0565\u0576', flag: '\ud83c\udde6\ud83c\uddf2' },\r\n{ code: 'az', name: 'Azerbaijani', native: 'Az\u0259rbaycanca', flag: '\ud83c\udde6\ud83c\uddff' },\r\n{ code: 'eu', name: 'Basque', native: 'Euskara', flag: '\ud83c\uddea\ud83c\uddf8' },\r\n{ code: 'be', name: 'Belarusian', native: '\u0411\u0435\u043b\u0430\u0440\u0443\u0441\u043a\u0430\u044f', flag: '\ud83c\udde7\ud83c\uddfe' },\r\n{ code: 'bn', name: 'Bengali', native: '\u09ac\u09be\u0982\u09b2\u09be', flag: '\ud83c\udde7\ud83c\udde9' },\r\n{ code: 'bs', name: 'Bosnian', native: 'Bosanski', flag: '\ud83c\udde7\ud83c\udde6' },\r\n{ code: 'bg', name: 'Bulgarian', native: '\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438', flag: '\ud83c\udde7\ud83c\uddec' },\r\n{ code: 'ca', name: 'Catalan', native: 'Catal\u00e0', flag: '\ud83c\uddea\ud83c\uddf8' },\r\n{ code: 'ceb', name: 'Cebuano', native: 'Cebuano', flag: '\ud83c\uddf5\ud83c\udded' },\r\n{ code: 'ny', name: 'Chichewa', native: 'Chichewa', flag: '\ud83c\uddf2\ud83c\uddfc' },\r\n{ code: 'zh', name: 'Chinese (Simplified)', native: '\u7b80\u4f53\u4e2d\u6587', flag: '\ud83c\udde8\ud83c\uddf3' },\r\n{ code: 'zh-TW', name: 'Chinese (Traditional)', native: '\u7e41\u9ad4\u4e2d\u6587', flag: '\ud83c\uddf9\ud83c\uddfc' },\r\n{ code: 'co', name: 'Corsican', native: 'Corsu', flag: '\ud83c\uddeb\ud83c\uddf7' },\r\n{ code: 'hr', name: 'Croatian', native: 'Hrvatski', flag: '\ud83c\udded\ud83c\uddf7' },\r\n{ code: 'cs', name: 'Czech', native: '\u010ce\u0161tina', flag: '\ud83c\udde8\ud83c\uddff' },\r\n{ code: 'da', name: 'Danish', native: 'Dansk', flag: '\ud83c\udde9\ud83c\uddf0' },\r\n{ code: 'nl', name: 'Dutch', native: 'Nederlands', flag: '\ud83c\uddf3\ud83c\uddf1' },\r\n{ code: 'en', name: 'English', native: 'English', flag: '\ud83c\uddec\ud83c\udde7' },\r\n{ code: 'eo', name: 'Esperanto', native: 'Esperanto', flag: '\ud83c\udf0d' },\r\n{ code: 'et', name: 'Estonian', native: 'Eesti', flag: '\ud83c\uddea\ud83c\uddea' },\r\n{ code: 'tl', name: 'Filipino', native: 'Filipino', flag: '\ud83c\uddf5\ud83c\udded' },\r\n{ code: 'fi', name: 'Finnish', native: 'Suomi', flag: '\ud83c\uddeb\ud83c\uddee' },\r\n{ code: 'fr', name: 'French', native: 'Fran\u00e7ais', flag: '\ud83c\uddeb\ud83c\uddf7' },\r\n{ code: 'fy', name: 'Frisian', native: 'Frysk', flag: '\ud83c\uddf3\ud83c\uddf1' },\r\n{ code: 'gl', name: 'Galician', native: 'Galego', flag: '\ud83c\uddea\ud83c\uddf8' },\r\n{ code: 'ka', name: 'Georgian', native: '\u10e5\u10d0\u10e0\u10d7\u10e3\u10da\u10d8', flag: '\ud83c\uddec\ud83c\uddea' },\r\n{ code: 'de', name: 'German', native: 'Deutsch', flag: '\ud83c\udde9\ud83c\uddea' },\r\n{ code: 'el', name: 'Greek', native: '\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac', flag: '\ud83c\uddec\ud83c\uddf7' },\r\n{ code: 'gu', name: 'Gujarati', native: '\u0a97\u0ac1\u0a9c\u0ab0\u0abe\u0aa4\u0ac0', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'ht', name: 'Haitian Creole', native: 'Krey\u00f2l Ayisyen', flag: '\ud83c\udded\ud83c\uddf9' },\r\n{ code: 'ha', name: 'Hausa', native: 'Hausa', flag: '\ud83c\uddf3\ud83c\uddec' },\r\n{ code: 'haw', name: 'Hawaiian', native: '\u02bb\u014clelo Hawai\u02bbi', flag: '\ud83c\uddfa\ud83c\uddf8' },\r\n{ code: 'iw', name: 'Hebrew', native: '\u05e2\u05d1\u05e8\u05d9\u05ea', flag: '\ud83c\uddee\ud83c\uddf1' },\r\n{ code: 'hi', name: 'Hindi', native: '\u0939\u093f\u0928\u094d\u0926\u0940', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'hmn', name: 'Hmong', native: 'Hmoob', flag: '\ud83c\udde8\ud83c\uddf3' },\r\n{ code: 'hu', name: 'Hungarian', native: 'Magyar', flag: '\ud83c\udded\ud83c\uddfa' },\r\n{ code: 'is', name: 'Icelandic', native: '\u00cdslenska', flag: '\ud83c\uddee\ud83c\uddf8' },\r\n{ code: 'ig', name: 'Igbo', native: 'Igbo', flag: '\ud83c\uddf3\ud83c\uddec' },\r\n{ code: 'id', name: 'Indonesian', native: 'Bahasa Indonesia', flag: '\ud83c\uddee\ud83c\udde9' },\r\n{ code: 'ga', name: 'Irish', native: 'Gaeilge', flag: '\ud83c\uddee\ud83c\uddea' },\r\n{ code: 'it', name: 'Italian', native: 'Italiano', flag: '\ud83c\uddee\ud83c\uddf9' },\r\n{ code: 'ja', name: 'Japanese', native: '\u65e5\u672c\u8a9e', flag: '\ud83c\uddef\ud83c\uddf5' },\r\n{ code: 'jw', name: 'Javanese', native: 'Basa Jawa', flag: '\ud83c\uddee\ud83c\udde9' },\r\n{ code: 'kn', name: 'Kannada', native: '\u0c95\u0ca8\u0ccd\u0ca8\u0ca1', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'kk', name: 'Kazakh', native: '\u049a\u0430\u0437\u0430\u049b\u0448\u0430', flag: '\ud83c\uddf0\ud83c\uddff' },\r\n{ code: 'km', name: 'Khmer', native: '\u1797\u17b6\u179f\u17b6\u1781\u17d2\u1798\u17c2\u179a', flag: '\ud83c\uddf0\ud83c\udded' },\r\n{ code: 'ko', name: 'Korean', native: '\ud55c\uad6d\uc5b4', flag: '\ud83c\uddf0\ud83c\uddf7' },\r\n{ code: 'ku', name: 'Kurdish (Kurmanji)', native: 'Kurd\u00ee', flag: '\ud83c\uddf9\ud83c\uddf7' },\r\n{ code: 'ky', name: 'Kyrgyz', native: '\u041a\u044b\u0440\u0433\u044b\u0437\u0447\u0430', flag: '\ud83c\uddf0\ud83c\uddec' },\r\n{ code: 'lo', name: 'Lao', native: '\u0e9e\u0eb2\u0eaa\u0eb2\u0ea5\u0eb2\u0ea7', flag: '\ud83c\uddf1\ud83c\udde6' },\r\n{ code: 'la', name: 'Latin', native: 'Latina', flag: '\ud83c\udfdb\ufe0f' },\r\n{ code: 'lv', name: 'Latvian', native: 'Latvie\u0161u', flag: '\ud83c\uddf1\ud83c\uddfb' },\r\n{ code: 'lt', name: 'Lithuanian', native: 'Lietuvi\u0173', flag: '\ud83c\uddf1\ud83c\uddf9' },\r\n{ code: 'lb', name: 'Luxembourgish', native: 'L\u00ebtzebuergesch', flag: '\ud83c\uddf1\ud83c\uddfa' },\r\n{ code: 'mk', name: 'Macedonian', native: '\u041c\u0430\u043a\u0435\u0434\u043e\u043d\u0441\u043a\u0438', flag: '\ud83c\uddf2\ud83c\uddf0' },\r\n{ code: 'mg', name: 'Malagasy', native: 'Malagasy', flag: '\ud83c\uddf2\ud83c\uddec' },\r\n{ code: 'ms', name: 'Malay', native: 'Bahasa Melayu', flag: '\ud83c\uddf2\ud83c\uddfe' },\r\n{ code: 'ml', name: 'Malayalam', native: '\u0d2e\u0d32\u0d2f\u0d3e\u0d33\u0d02', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'mt', name: 'Maltese', native: 'Malti', flag: '\ud83c\uddf2\ud83c\uddf9' },\r\n{ code: 'mi', name: 'Maori', native: 'M\u0101ori', flag: '\ud83c\uddf3\ud83c\uddff' },\r\n{ code: 'mr', name: 'Marathi', native: '\u092e\u0930\u093e\u0920\u0940', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'mn', name: 'Mongolian', native: '\u041c\u043e\u043d\u0433\u043e\u043b', flag: '\ud83c\uddf2\ud83c\uddf3' },\r\n{ code: 'my', name: 'Myanmar (Burmese)', native: '\u1019\u103c\u1014\u103a\u1019\u102c\u1005\u102c', flag: '\ud83c\uddf2\ud83c\uddf2' },\r\n{ code: 'ne', name: 'Nepali', native: '\u0928\u0947\u092a\u093e\u0932\u0940', flag: '\ud83c\uddf3\ud83c\uddf5' },\r\n{ code: 'no', name: 'Norwegian', native: 'Norsk', flag: '\ud83c\uddf3\ud83c\uddf4' },\r\n{ code: 'or', name: 'Odia (Oriya)', native: '\u0b13\u0b21\u0b3c\u0b3f\u0b06', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'ps', name: 'Pashto', native: '\u067e\u069a\u062a\u0648', flag: '\ud83c\udde6\ud83c\uddeb' },\r\n{ code: 'fa', name: 'Persian', native: '\u0641\u0627\u0631\u0633\u06cc', flag: '\ud83c\uddee\ud83c\uddf7' },\r\n{ code: 'pl', name: 'Polish', native: 'Polski', flag: '\ud83c\uddf5\ud83c\uddf1' },\r\n{ code: 'pt', name: 'Portuguese', native: 'Portugu\u00eas', flag: '\ud83c\uddf5\ud83c\uddf9' },\r\n{ code: 'pa', name: 'Punjabi', native: '\u0a2a\u0a70\u0a1c\u0a3e\u0a2c\u0a40', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'ro', name: 'Romanian', native: 'Rom\u00e2n\u0103', flag: '\ud83c\uddf7\ud83c\uddf4' },\r\n{ code: 'ru', name: 'Russian', native: '\u0420\u0443\u0441\u0441\u043a\u0438\u0439', flag: '\ud83c\uddf7\ud83c\uddfa' },\r\n{ code: 'sm', name: 'Samoan', native: 'Gagana Samoa', flag: '\ud83c\uddfc\ud83c\uddf8' },\r\n{ code: 'gd', name: 'Scots Gaelic', native: 'G\u00e0idhlig', flag: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f' },\r\n{ code: 'sr', name: 'Serbian', native: '\u0421\u0440\u043f\u0441\u043a\u0438', flag: '\ud83c\uddf7\ud83c\uddf8' },\r\n{ code: 'st', name: 'Sesotho', native: 'Sesotho', flag: '\ud83c\uddf1\ud83c\uddf8' },\r\n{ code: 'sn', name: 'Shona', native: 'Shona', flag: '\ud83c\uddff\ud83c\uddfc' },\r\n{ code: 'sd', name: 'Sindhi', native: '\u0633\u0646\u068c\u064a', flag: '\ud83c\uddf5\ud83c\uddf0' },\r\n{ code: 'si', name: 'Sinhala', native: '\u0dc3\u0dd2\u0d82\u0dc4\u0dbd', flag: '\ud83c\uddf1\ud83c\uddf0' },\r\n{ code: 'sk', name: 'Slovak', native: 'Sloven\u010dina', flag: '\ud83c\uddf8\ud83c\uddf0' },\r\n{ code: 'sl', name: 'Slovenian', native: 'Sloven\u0161\u010dina', flag: '\ud83c\uddf8\ud83c\uddee' },\r\n{ code: 'so', name: 'Somali', native: 'Soomaali', flag: '\ud83c\uddf8\ud83c\uddf4' },\r\n{ code: 'es', name: 'Spanish', native: 'Espa\u00f1ol', flag: '\ud83c\uddea\ud83c\uddf8' },\r\n{ code: 'su', name: 'Sundanese', native: 'Basa Sunda', flag: '\ud83c\uddee\ud83c\udde9' },\r\n{ code: 'sw', name: 'Swahili', native: 'Kiswahili', flag: '\ud83c\uddf9\ud83c\uddff' },\r\n{ code: 'sv', name: 'Swedish', native: 'Svenska', flag: '\ud83c\uddf8\ud83c\uddea' },\r\n{ code: 'tg', name: 'Tajik', native: '\u0422\u043e\u04b7\u0438\u043a\u04e3', flag: '\ud83c\uddf9\ud83c\uddef' },\r\n{ code: 'ta', name: 'Tamil', native: '\u0ba4\u0bae\u0bbf\u0bb4\u0bcd', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'te', name: 'Telugu', native: '\u0c24\u0c46\u0c32\u0c41\u0c17\u0c41', flag: '\ud83c\uddee\ud83c\uddf3' },\r\n{ code: 'th', name: 'Thai', native: '\u0e44\u0e17\u0e22', flag: '\ud83c\uddf9\ud83c\udded' },\r\n{ code: 'tr', name: 'Turkish', native: 'T\u00fcrk\u00e7e', flag: '\ud83c\uddf9\ud83c\uddf7' },\r\n{ code: 'uk', name: 'Ukrainian', native: '\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430', flag: '\ud83c\uddfa\ud83c\udde6' },\r\n{ code: 'ur', name: 'Urdu', native: '\u0627\u0631\u062f\u0648', flag: '\ud83c\uddf5\ud83c\uddf0' },\r\n{ code: 'ug', name: 'Uyghur', native: '\u0626\u06c7\u064a\u063a\u06c7\u0631\u0686\u06d5', flag: '\ud83c\udde8\ud83c\uddf3' },\r\n{ code: 'uz', name: 'Uzbek', native: 'O\u02bbzbekcha', flag: '\ud83c\uddfa\ud83c\uddff' },\r\n{ code: 'vi', name: 'Vietnamese', native: 'Ti\u1ebfng Vi\u1ec7t', flag: '\ud83c\uddfb\ud83c\uddf3' },\r\n{ code: 'cy', name: 'Welsh', native: 'Cymraeg', flag: '\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f' },\r\n{ code: 'xh', name: 'Xhosa', native: 'IsiXhosa', flag: '\ud83c\uddff\ud83c\udde6' },\r\n{ code: 'yi', name: 'Yiddish', native: '\u05d9\u05d9\u05d3\u05d9\u05e9', flag: '\ud83c\uddee\ud83c\uddf1' },\r\n{ code: 'yo', name: 'Yoruba', native: 'Yor\u00f9b\u00e1', flag: '\ud83c\uddf3\ud83c\uddec' },\r\n{ code: 'zu', name: 'Zulu', native: 'IsiZulu', flag: '\ud83c\uddff\ud83c\udde6' }\r\n];\r\n\r\n\/\/ ============================================\r\n\/\/ STATE\r\n\/\/ ============================================\r\nthis.state = {\r\nsourceLanguage: 'en',\r\ntargetLanguage: 'es',\r\nsourceText: '',\r\ntargetText: '',\r\nhistory: [],\r\nfavorites: [],\r\nsavedTranslations: [],\r\nisFloating: false,\r\nisFullscreen: false,\r\nisDarkMode: true,\r\nautoDetect: true,\r\nisTranslating: false,\r\nisOpen: false,\r\nmarketplaceMode: false,\r\nrtlLanguages: ['ar', 'iw', 'fa', 'ur', 'ps', 'sd', 'ug', 'yi'],\r\ncleanEncoding: true\r\n};\r\n\r\n\/\/ ============================================\r\n\/\/ DOM ELEMENTS\r\n\/\/ ============================================\r\nthis.elements = {};\r\n\r\n\/\/ ============================================\r\n\/\/ API ENDPOINTS\r\n\/\/ ============================================\r\nthis.apiEndpoint = 'https:\/\/translate.googleapis.com\/translate_a\/single';\r\nthis.fallbackEndpoint = 'https:\/\/api.mymemory.translated.net\/get';\r\n\r\n\/\/ ============================================\r\n\/\/ INITIALIZE\r\n\/\/ ============================================\r\nthis.init();\r\n}\r\n\r\ninit() {\r\nconsole.log('\ud83c\udf10 Amb Translate - Complete Universal Translator with Encoding Fix (Left Side)');\r\nthis.setupElements();\r\nthis.populateLanguages();\r\nthis.setupEventListeners();\r\nthis.loadState();\r\nthis.updateUI();\r\nthis.updateLanguageBadge();\r\nthis.showToast('\ud83c\udf10 Translate ready! Click the icon to translate.', 'info');\r\nthis.detectBrowserLanguage();\r\nthis.initSpeechSynthesis();\r\n}\r\n\r\nsetupElements() {\r\nthis.elements = {\r\nsourceLanguage: document.getElementById('sourceLanguage'),\r\ntargetLanguage: document.getElementById('targetLanguage'),\r\nsourceText: document.getElementById('sourceText'),\r\ntargetText: document.getElementById('targetText'),\r\ntranslateBtn: document.getElementById('translateBtn'),\r\nswapBtn: document.getElementById('swapBtn'),\r\nswapLanguagesBtn: document.getElementById('swapLanguagesBtn'),\r\nclearBtn: document.getElementById('clearBtn'),\r\ncopyBtn: document.getElementById('copyBtn'),\r\ncopyTargetBtn: document.getElementById('copyTargetBtn'),\r\nclearSourceBtn: document.getElementById('clearSourceBtn'),\r\nclearTargetBtn: document.getElementById('clearTargetBtn'),\r\nspeakSourceBtn: document.getElementById('speakSourceBtn'),\r\nspeakTargetBtn: document.getElementById('speakTargetBtn'),\r\ndetectLanguageBtn: document.getElementById('detectLanguageBtn'),\r\npasteSourceBtn: document.getElementById('pasteSourceBtn'),\r\nsaveTranslationBtn: document.getElementById('saveTranslationBtn'),\r\nfixEncodingBtn: document.getElementById('fixEncodingBtn'),\r\ncharCount: document.getElementById('charCount'),\r\nhistoryList: document.getElementById('historyList'),\r\nclearHistoryBtn: document.getElementById('clearHistoryBtn'),\r\nexportHistoryBtn: document.getElementById('exportHistoryBtn'),\r\ntoast: document.getElementById('toast'),\r\nwidget: document.getElementById('translateWidget'),\r\nicon: document.getElementById('translateIcon'),\r\niconContainer: document.getElementById('translateIconContainer'),\r\ntoggleFloatingBtn: document.getElementById('toggleFloatingBtn'),\r\ntoggleDarkModeBtn: document.getElementById('toggleDarkModeBtn'),\r\nfullscreenBtn: document.getElementById('fullscreenBtn'),\r\ncloseWidgetBtn: document.getElementById('closeWidgetBtn'),\r\ntranslateBtnSpinner: document.getElementById('translateBtnSpinner'),\r\nautoDetectFeature: document.getElementById('autoDetectFeature'),\r\nhistoryFeature: document.getElementById('historyFeature'),\r\nfavoritesFeature: document.getElementById('favoritesFeature'),\r\nphoneticFeature: document.getElementById('phoneticFeature'),\r\ntranslateToFeature: document.getElementById('translateToFeature'),\r\nmarketplaceTranslateFeature: document.getElementById('marketplaceTranslateFeature'),\r\ncleanEncodingFeature: document.getElementById('cleanEncodingFeature'),\r\nlangBadge: document.getElementById('langBadge'),\r\nquickTranslateBtns: document.querySelectorAll('.quick-translate-btn'),\r\nmodalOverlay: document.getElementById('modalOverlay'),\r\nmodalContent: document.getElementById('modalContent'),\r\nhistorySection: document.getElementById('historySection')\r\n};\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ LANGUAGE POPULATION\r\n\/\/ ============================================\r\npopulateLanguages() {\r\nconst sourceSelect = this.elements.sourceLanguage;\r\nconst targetSelect = this.elements.targetLanguage;\r\n\r\nsourceSelect.innerHTML = '';\r\ntargetSelect.innerHTML = '';\r\n\r\nthis.languages.forEach(lang => {\r\nconst option1 = document.createElement('option');\r\noption1.value = lang.code;\r\noption1.textContent = `${lang.flag} ${lang.native} (${lang.name})`;\r\nsourceSelect.appendChild(option1);\r\n\r\nconst option2 = document.createElement('option');\r\noption2.value = lang.code;\r\noption2.textContent = `${lang.flag} ${lang.native} (${lang.name})`;\r\ntargetSelect.appendChild(option2);\r\n});\r\n\r\nsourceSelect.value = this.state.sourceLanguage || 'en';\r\ntargetSelect.value = this.state.targetLanguage || 'es';\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ EVENT LISTENERS\r\n\/\/ ============================================\r\nsetupEventListeners() {\r\n\/\/ Icon toggle\r\nthis.elements.icon.addEventListener('click', () => this.toggleWidget());\r\n\r\n\/\/ Translate\r\nthis.elements.translateBtn.addEventListener('click', () => this.translate());\r\n\r\n\/\/ Fix encoding\r\nthis.elements.fixEncodingBtn.addEventListener('click', () => this.fixEncoding());\r\n\r\n\/\/ Enter key\r\nthis.elements.sourceText.addEventListener('keydown', (e) => {\r\nif (e.key === 'Enter' && !e.shiftKey) {\r\ne.preventDefault();\r\nthis.translate();\r\n}\r\n});\r\n\r\n\/\/ Auto-translate\r\nlet debounceTimer;\r\nthis.elements.sourceText.addEventListener('input', (e) => {\r\nclearTimeout(debounceTimer);\r\nconst text = e.target.value;\r\nthis.updateCharCount(text);\r\nthis.state.sourceText = text;\r\nthis.detectRTL(text);\r\n\r\nif (this.state.autoDetect && text.length > 2) {\r\ndebounceTimer = setTimeout(() => this.translate(), 700);\r\n}\r\n});\r\n\r\n\/\/ Language change\r\nthis.elements.sourceLanguage.addEventListener('change', (e) => {\r\nthis.state.sourceLanguage = e.target.value;\r\nthis.updateLanguageBadge();\r\nif (this.state.sourceText) this.translate();\r\n});\r\n\r\nthis.elements.targetLanguage.addEventListener('change', (e) => {\r\nthis.state.targetLanguage = e.target.value;\r\nif (this.state.sourceText) this.translate();\r\nthis.updateQuickTranslateButtons();\r\n});\r\n\r\n\/\/ Quick translate buttons\r\nthis.elements.quickTranslateBtns.forEach(btn => {\r\nbtn.addEventListener('click', () => {\r\nconst lang = btn.dataset.lang;\r\nthis.elements.targetLanguage.value = lang;\r\nthis.state.targetLanguage = lang;\r\nthis.updateQuickTranslateButtons();\r\nif (this.state.sourceText) this.translate();\r\nthis.showToast(`\ud83c\udf10 Translating to ${lang.toUpperCase()}...`, 'info');\r\n});\r\n});\r\n\r\n\/\/ Swap\r\nthis.elements.swapBtn.addEventListener('click', () => this.swapLanguages());\r\nthis.elements.swapLanguagesBtn.addEventListener('click', () => this.swapLanguages());\r\n\r\n\/\/ Clear\r\nthis.elements.clearBtn.addEventListener('click', () => this.clearAll());\r\nthis.elements.clearSourceBtn.addEventListener('click', () => this.clearSource());\r\nthis.elements.clearTargetBtn.addEventListener('click', () => this.clearTarget());\r\n\r\n\/\/ Copy\r\nthis.elements.copyBtn.addEventListener('click', () => this.copyTranslation());\r\nthis.elements.copyTargetBtn.addEventListener('click', () => this.copyTranslation());\r\n\r\n\/\/ Paste\r\nthis.elements.pasteSourceBtn.addEventListener('click', () => this.pasteFromClipboard());\r\n\r\n\/\/ Save\r\nthis.elements.saveTranslationBtn.addEventListener('click', () => this.saveTranslation());\r\n\r\n\/\/ Speak\r\nthis.elements.speakSourceBtn.addEventListener('click', () => this.speakText('source'));\r\nthis.elements.speakTargetBtn.addEventListener('click', () => this.speakText('target'));\r\n\r\n\/\/ Detect\r\nthis.elements.detectLanguageBtn.addEventListener('click', () => this.detectLanguage());\r\n\r\n\/\/ History\r\nthis.elements.clearHistoryBtn.addEventListener('click', () => this.clearHistory());\r\nthis.elements.exportHistoryBtn.addEventListener('click', () => this.exportHistory());\r\n\r\n\/\/ Features\r\nthis.elements.autoDetectFeature.addEventListener('click', () => this.toggleAutoDetect());\r\nthis.elements.historyFeature.addEventListener('click', () => this.toggleHistory());\r\nthis.elements.favoritesFeature.addEventListener('click', () => this.showFavorites());\r\nthis.elements.phoneticFeature.addEventListener('click', () => this.showPhonetic());\r\nthis.elements.translateToFeature.addEventListener('click', () => this.showTranslateToMenu());\r\nthis.elements.marketplaceTranslateFeature.addEventListener('click', () => this.toggleMarketplaceMode());\r\nthis.elements.cleanEncodingFeature.addEventListener('click', () => this.toggleCleanEncoding());\r\n\r\n\/\/ Mode toggles\r\nthis.elements.toggleFloatingBtn.addEventListener('click', () => this.toggleFloatingMode());\r\nthis.elements.fullscreenBtn.addEventListener('click', () => this.toggleFullscreen());\r\nthis.elements.toggleDarkModeBtn.addEventListener('click', () => this.toggleDarkMode());\r\n\r\n\/\/ Close\r\nthis.elements.closeWidgetBtn.addEventListener('click', () => this.closeWidget());\r\n\r\n\/\/ Modal close\r\ndocument.addEventListener('click', (e) => {\r\nif (e.target === this.elements.modalOverlay) {\r\nthis.closeModal();\r\n}\r\n});\r\n\r\n\/\/ Save state\r\nwindow.addEventListener('beforeunload', () => this.saveState());\r\n\r\n\/\/ Keyboard shortcuts\r\ndocument.addEventListener('keydown', (e) => {\r\nif (e.ctrlKey && e.key === 'Enter') {\r\ne.preventDefault();\r\nthis.translate();\r\n}\r\nif (e.key === 'Escape' && this.state.isOpen) {\r\nthis.closeWidget();\r\n}\r\nif (e.ctrlKey && e.shiftKey && e.key === 'T') {\r\ne.preventDefault();\r\nthis.toggleWidget();\r\n}\r\n});\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ FIX ENCODING - KEY FEATURE\r\n\/\/ ============================================\r\nfixEncoding() {\r\nconst targetText = this.elements.targetText.value;\r\nif (!targetText) {\r\nthis.showToast('No text to fix encoding', 'info');\r\nreturn;\r\n}\r\n\r\nlet fixedText = targetText;\r\n\r\ntry {\r\nfixedText = decodeURIComponent(fixedText);\r\n} catch (e) {}\r\n\r\nconst replacements = {\r\n'%22': '\"', '%27': \"'\", '%2C': ',', '%2E': '.', '%2F': '\/',\r\n'%3A': ':', '%3B': ';', '%3D': '=', '%3F': '?', '%40': '@',\r\n'%20': ' ', '%0A': '\\n', '%0D': '\\r', '%0D%0A': '\\n',\r\n'%2B': '+', '%2D': '-', '%5B': '[', '%5D': ']', '%7B': '{',\r\n'%7D': '}', '%7C': '|', '%5C': '\\\\', '%5E': '^', '%60': '`',\r\n'%7E': '~', '%21': '!', '%23': '#', '%24': '$', '%25': '%',\r\n'%26': '&', '%28': '(', '%29': ')', '%2A': '*', '%3C': '<',\r\n'%3E': '>', '%5F': '_'\r\n};\r\n\r\nfor (const [encoded, decoded] of Object.entries(replacements)) {\r\nfixedText = fixedText.split(encoded).join(decoded);\r\n}\r\n\r\nconst htmlEntities = {\r\n'&quot;': '\"', '&apos;': \"'\", '&amp;': '&', '&lt;': '<',\r\n'&gt;': '>', '&nbsp;': ' ', '&copy;': '\u00a9', '&reg;': '\u00ae',\r\n'&trade;': '\u2122', '&euro;': '\u20ac', '&pound;': '\u00a3', '&yen;': '\u00a5',\r\n'&cent;': '\u00a2', '&bull;': '\u2022', '&hellip;': '\u2026', '&mdash;': '\u2014',\r\n'&ndash;': '\u2013'\r\n};\r\n\r\nfor (const [encoded, decoded] of Object.entries(htmlEntities)) {\r\nfixedText = fixedText.split(encoded).join(decoded);\r\n}\r\n\r\nfixedText = fixedText.replace(\/\\s+\/g, ' ');\r\nfixedText = fixedText.replace(\/\\\\n\/g, '\\n');\r\nfixedText = fixedText.replace(\/\\\\r\/g, '');\r\nfixedText = fixedText.replace(\/\\\\t\/g, ' ');\r\nfixedText = fixedText.replace(\/%[0-9A-Fa-f]{2}\/g, (match) => {\r\ntry { return decodeURIComponent(match); } catch { return match; }\r\n});\r\n\r\nfixedText = fixedText.trim();\r\n\r\nthis.elements.targetText.value = fixedText;\r\nthis.state.targetText = fixedText;\r\n\r\nthis.showToast('\u2705 Encoding fixed!', 'success');\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ TRANSLATION ENGINE WITH ENCODING FIX\r\n\/\/ ============================================\r\nasync translate() {\r\nconst sourceText = this.elements.sourceText.value.trim();\r\nconst sourceLang = this.elements.sourceLanguage.value;\r\nconst targetLang = this.elements.targetLanguage.value;\r\n\r\nif (!sourceText) {\r\nthis.showToast('Please enter text to translate', 'info');\r\nreturn;\r\n}\r\n\r\nif (sourceLang === targetLang) {\r\nthis.elements.targetText.value = sourceText;\r\nthis.state.targetText = sourceText;\r\nthis.addToHistory(sourceText, sourceText, sourceLang, targetLang);\r\nreturn;\r\n}\r\n\r\nthis.state.isTranslating = true;\r\nthis.elements.translateBtn.disabled = true;\r\nthis.elements.translateBtnSpinner.style.display = 'inline-block';\r\nthis.elements.translateBtn.querySelector('i').style.display = 'none';\r\n\r\ntry {\r\nlet translation = '';\r\nlet source = 'google';\r\n\r\ntry {\r\nconst url = new URL(this.apiEndpoint);\r\nurl.searchParams.append('client', 'gtx');\r\nurl.searchParams.append('sl', sourceLang);\r\nurl.searchParams.append('tl', targetLang);\r\nurl.searchParams.append('dt', 't');\r\nurl.searchParams.append('q', sourceText);\r\n\r\nconst response = await fetch(url.toString());\r\nconst data = await response.json();\r\n\r\nif (data && data[0]) {\r\ntranslation = data[0].map(item => item[0]).join('');\r\n} else {\r\nthrow new Error('No translation received');\r\n}\r\n} catch (googleError) {\r\nconsole.warn('Google Translate failed, using fallback:', googleError);\r\nsource = 'mymemory';\r\nconst fallbackUrl = new URL(this.fallbackEndpoint);\r\nfallbackUrl.searchParams.append('q', sourceText);\r\nfallbackUrl.searchParams.append('langpair', `${sourceLang}|${targetLang}`);\r\n\r\nconst fallbackResponse = await fetch(fallbackUrl.toString());\r\nconst fallbackData = await fallbackResponse.json();\r\nif (fallbackData.responseData && fallbackData.responseData.translatedText) {\r\ntranslation = fallbackData.responseData.translatedText;\r\n} else {\r\nthrow new Error('No translation from fallback service');\r\n}\r\n}\r\n\r\nif (this.state.cleanEncoding) {\r\ntranslation = this.cleanTranslation(translation);\r\n}\r\n\r\nthis.elements.targetText.value = translation;\r\nthis.state.targetText = translation;\r\nthis.addToHistory(sourceText, translation, sourceLang, targetLang);\r\nthis.detectRTL(translation, 'target');\r\n\r\nconst sourceLabel = source === 'google' ? 'Google Translate' : 'MyMemory (Fallback)';\r\nthis.showToast(`\u2705 Translation complete (${sourceLabel})`, 'success');\r\n\r\n} catch (error) {\r\nconsole.error('Translation error:', error);\r\nthis.elements.targetText.value = '\u26a0\ufe0f Translation service unavailable. Please try again later.';\r\nthis.showToast('\u274c Translation error: ' + error.message, 'error');\r\n} finally {\r\nthis.state.isTranslating = false;\r\nthis.elements.translateBtn.disabled = false;\r\nthis.elements.translateBtnSpinner.style.display = 'none';\r\nthis.elements.translateBtn.querySelector('i').style.display = 'inline-block';\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ CLEAN TRANSLATION - Remove URL Encodings\r\n\/\/ ============================================\r\ncleanTranslation(text) {\r\nif (!text) return text;\r\n\r\nlet cleaned = text;\r\n\r\nconst encodingMap = {\r\n'%22': '\"', '%27': \"'\", '%2C': ',', '%2E': '.', '%2F': '\/',\r\n'%3A': ':', '%3B': ';', '%3D': '=', '%3F': '?', '%40': '@',\r\n'%20': ' ', '%0A': '\\n', '%0D': '\\r', '%0D%0A': '\\n',\r\n'%2B': '+', '%2D': '-', '%5B': '[', '%5D': ']', '%7B': '{',\r\n'%7D': '}', '%7C': '|', '%5C': '\\\\', '%5E': '^', '%60': '`',\r\n'%7E': '~', '%21': '!', '%23': '#', '%24': '$', '%25': '%',\r\n'%26': '&', '%28': '(', '%29': ')', '%2A': '*', '%3C': '<',\r\n'%3E': '>', '%5F': '_'\r\n};\r\n\r\nfor (const [encoded, decoded] of Object.entries(encodingMap)) {\r\ncleaned = cleaned.split(encoded).join(decoded);\r\n}\r\n\r\nconst htmlMap = {\r\n'&quot;': '\"', '&apos;': \"'\", '&amp;': '&', '&lt;': '<',\r\n'&gt;': '>', '&nbsp;': ' ', '&copy;': '\u00a9', '&reg;': '\u00ae',\r\n'&trade;': '\u2122', '&euro;': '\u20ac', '&pound;': '\u00a3', '&yen;': '\u00a5',\r\n'&cent;': '\u00a2', '&bull;': '\u2022', '&hellip;': '\u2026', '&mdash;': '\u2014',\r\n'&ndash;': '\u2013'\r\n};\r\n\r\nfor (const [encoded, decoded] of Object.entries(htmlMap)) {\r\ncleaned = cleaned.split(encoded).join(decoded);\r\n}\r\n\r\ncleaned = cleaned.replace(\/\\\\n\/g, '\\n');\r\ncleaned = cleaned.replace(\/\\\\r\/g, '');\r\ncleaned = cleaned.replace(\/\\\\t\/g, ' ');\r\ncleaned = cleaned.replace(\/\\\\\"\/g, '\"');\r\ncleaned = cleaned.replace(\/\\\\'\/g, \"'\");\r\ncleaned = cleaned.replace(\/%[0-9A-Fa-f]{2}\/g, (match) => {\r\ntry { return decodeURIComponent(match); } catch { return match; }\r\n});\r\ncleaned = cleaned.replace(\/\\s+\/g, ' ');\r\ncleaned = cleaned.replace(\/ \\n\/g, '\\n');\r\ncleaned = cleaned.replace(\/\\n \/g, '\\n');\r\n\r\nreturn cleaned.trim();\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ TOGGLE CLEAN ENCODING\r\n\/\/ ============================================\r\ntoggleCleanEncoding() {\r\nthis.state.cleanEncoding = !this.state.cleanEncoding;\r\nthis.elements.cleanEncodingFeature.classList.toggle('active', this.state.cleanEncoding);\r\nthis.showToast(`\ud83e\uddf9 Clean Encoding ${this.state.cleanEncoding ? 'enabled' : 'disabled'}`, 'info');\r\nif (this.state.targetText && this.state.cleanEncoding) {\r\nconst cleaned = this.cleanTranslation(this.state.targetText);\r\nthis.elements.targetText.value = cleaned;\r\nthis.state.targetText = cleaned;\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ LANGUAGE DETECTION\r\n\/\/ ============================================\r\nasync detectLanguage() {\r\nconst text = this.elements.sourceText.value.trim();\r\nif (!text) {\r\nthis.showToast('Please enter text to detect language', 'info');\r\nreturn;\r\n}\r\n\r\ntry {\r\nconst url = new URL('https:\/\/translate.googleapis.com\/translate_a\/single');\r\nurl.searchParams.append('client', 'gtx');\r\nurl.searchParams.append('dt', 'ld');\r\nurl.searchParams.append('q', text);\r\n\r\nconst response = await fetch(url.toString());\r\nconst data = await response.json();\r\n\r\nif (data && data[2]) {\r\nconst detectedLang = data[2][0][0][0];\r\nconst confidence = data[2][0][0][1] || 0;\r\n\r\nconst lang = this.languages.find(l => l.code === detectedLang);\r\nif (lang) {\r\nthis.elements.sourceLanguage.value = detectedLang;\r\nthis.state.sourceLanguage = detectedLang;\r\nthis.updateLanguageBadge();\r\nthis.showToast(`\ud83d\udd0d Detected: ${lang.flag} ${lang.native} (${lang.name}) - ${Math.round(confidence * 100)}% confidence`, 'success');\r\nif (this.state.sourceText) this.translate();\r\n} else {\r\nthis.showToast(`\ud83d\udd0d Detected language: ${detectedLang}`, 'info');\r\n}\r\n} else {\r\nthis.showToast('Could not detect language', 'info');\r\n}\r\n} catch (error) {\r\nconsole.error('Language detection error:', error);\r\nthis.showToast('Language detection failed', 'error');\r\n}\r\n}\r\n\r\ndetectBrowserLanguage() {\r\nconst browserLang = navigator.language.split('-')[0];\r\nconst supported = this.languages.find(l => l.code === browserLang);\r\nif (supported && browserLang !== 'en') {\r\nthis.elements.targetLanguage.value = browserLang;\r\nthis.state.targetLanguage = browserLang;\r\nthis.updateLanguageBadge();\r\nthis.updateQuickTranslateButtons();\r\n}\r\n}\r\n\r\ndetectRTL(text, type = 'source') {\r\nconst rtlChars = \/[\\u0600-\\u06FF\\u0750-\\u077F\\u0590-\\u05FF\\uFB1D-\\uFDFD\\uFE70-\\uFEFF]\/g;\r\nconst isRTL = rtlChars.test(text);\r\nconst element = type === 'source' ? this.elements.sourceText : this.elements.targetText;\r\nif (isRTL) {\r\nelement.classList.add('rtl');\r\nelement.classList.remove('ltr');\r\n} else {\r\nelement.classList.add('ltr');\r\nelement.classList.remove('rtl');\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ HISTORY MANAGEMENT\r\n\/\/ ============================================\r\naddToHistory(source, target, sourceLang, targetLang) {\r\nconst entry = {\r\nid: Date.now(),\r\nsource,\r\ntarget,\r\nsourceLang,\r\ntargetLang,\r\ntimestamp: new Date().toISOString()\r\n};\r\n\r\nthis.state.history.unshift(entry);\r\nif (this.state.history.length > 100) {\r\nthis.state.history.pop();\r\n}\r\n\r\nthis.renderHistory();\r\nthis.saveState();\r\n}\r\n\r\nrenderHistory() {\r\nconst list = this.elements.historyList;\r\nlist.innerHTML = '';\r\n\r\nif (this.state.history.length === 0) {\r\nlist.innerHTML = '<div class=\"no-history\">No translation history yet<\/div>';\r\nreturn;\r\n}\r\n\r\nthis.state.history.slice(0, 20).forEach(entry => {\r\nconst item = document.createElement('div');\r\nitem.className = 'history-item';\r\nitem.innerHTML = `\r\n<span class=\"source\">${this.truncateText(entry.source, 30)}<\/span>\r\n<span class=\"lang-pair\">${entry.sourceLang} \u2192 ${entry.targetLang}<\/span>\r\n<span class=\"target\">${this.truncateText(entry.target, 30)}<\/span>\r\n`;\r\nitem.addEventListener('click', () => {\r\nthis.elements.sourceText.value = entry.source;\r\nthis.elements.targetText.value = entry.target;\r\nthis.elements.sourceLanguage.value = entry.sourceLang;\r\nthis.elements.targetLanguage.value = entry.targetLang;\r\nthis.state.sourceLanguage = entry.sourceLang;\r\nthis.state.targetLanguage = entry.targetLang;\r\nthis.updateCharCount(entry.source);\r\nthis.updateLanguageBadge();\r\nthis.detectRTL(entry.source, 'source');\r\nthis.detectRTL(entry.target, 'target');\r\nthis.updateQuickTranslateButtons();\r\nthis.showToast('\ud83d\udcdc History entry loaded!', 'info');\r\n});\r\nlist.appendChild(item);\r\n});\r\n}\r\n\r\nclearHistory() {\r\nif (this.state.history.length === 0) {\r\nthis.showToast('History is already empty', 'info');\r\nreturn;\r\n}\r\nif (confirm('Clear all translation history?')) {\r\nthis.state.history = [];\r\nthis.renderHistory();\r\nthis.saveState();\r\nthis.showToast('\ud83d\uddd1\ufe0f History cleared', 'success');\r\n}\r\n}\r\n\r\nexportHistory() {\r\nif (this.state.history.length === 0) {\r\nthis.showToast('No history to export', 'info');\r\nreturn;\r\n}\r\n\r\nconst data = JSON.stringify(this.state.history, null, 2);\r\nconst blob = new Blob([data], { type: 'application\/json' });\r\nconst url = URL.createObjectURL(blob);\r\nconst a = document.createElement('a');\r\na.href = url;\r\na.download = `translations_${new Date().toISOString().slice(0,10)}.json`;\r\na.click();\r\nURL.revokeObjectURL(url);\r\nthis.showToast('\ud83d\udce5 History exported successfully!', 'success');\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ SAVE TRANSLATION\r\n\/\/ ============================================\r\nsaveTranslation() {\r\nconst source = this.elements.sourceText.value.trim();\r\nconst target = this.elements.targetText.value.trim();\r\nif (!source || !target) {\r\nthis.showToast('No translation to save', 'info');\r\nreturn;\r\n}\r\n\r\nconst saved = {\r\nid: Date.now(),\r\nsource,\r\ntarget,\r\nsourceLang: this.state.sourceLanguage,\r\ntargetLang: this.state.targetLanguage,\r\ntimestamp: new Date().toISOString()\r\n};\r\n\r\nthis.state.savedTranslations.unshift(saved);\r\nif (this.state.savedTranslations.length > 50) {\r\nthis.state.savedTranslations.pop();\r\n}\r\n\r\nthis.saveState();\r\nthis.showToast('\ud83d\udcbe Translation saved to favorites!', 'success');\r\n}\r\n\r\nshowFavorites() {\r\nif (this.state.savedTranslations.length === 0) {\r\nthis.showToast('No saved translations yet', 'info');\r\nreturn;\r\n}\r\n\r\nlet content = `<h3>\u2b50 Saved Translations<\/h3>`;\r\nthis.state.savedTranslations.slice(0, 10).forEach(item => {\r\ncontent += `\r\n<div style=\"padding: 10px; background: rgba(15,23,42,0.6); border-radius: 8px; margin-bottom: 10px;\">\r\n<div style=\"color: var(--gray); font-size: 12px;\">${item.sourceLang} \u2192 ${item.targetLang}<\/div>\r\n<div><strong>${this.truncateText(item.source, 40)}<\/strong><\/div>\r\n<div style=\"color: var(--primary);\">${this.truncateText(item.target, 40)}<\/div>\r\n<\/div>\r\n`;\r\n});\r\ncontent += `\r\n<div class=\"modal-actions\">\r\n<button class=\"btn-secondary\" onclick=\"ambTranslate.closeModal()\">Close<\/button>\r\n<\/div>\r\n`;\r\n\r\nthis.showModal(content);\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ PHONETIC TRANSLATION\r\n\/\/ ============================================\r\nshowPhonetic() {\r\nconst text = this.elements.targetText.value || this.elements.sourceText.value;\r\nif (!text) {\r\nthis.showToast('Please translate something first', 'info');\r\nreturn;\r\n}\r\n\r\nconst phonetic = this.simplePhonetic(text);\r\nlet content = `\r\n<h3>\ud83d\udd24 Phonetic Transcription<\/h3>\r\n<div style=\"padding: 15px; background: rgba(15,23,42,0.6); border-radius: 10px; margin-bottom: 20px;\">\r\n<div style=\"color: var(--gray); font-size: 12px; margin-bottom: 5px;\">Original:<\/div>\r\n<div>${this.truncateText(text, 100)}<\/div>\r\n<div style=\"color: var(--gray); font-size: 12px; margin-top: 10px; margin-bottom: 5px;\">Phonetic:<\/div>\r\n<div style=\"color: var(--primary); font-family: 'Courier New', monospace;\">${phonetic}<\/div>\r\n<\/div>\r\n<div class=\"modal-actions\">\r\n<button class=\"btn-secondary\" onclick=\"ambTranslate.closeModal()\">Close<\/button>\r\n<\/div>\r\n`;\r\n\r\nthis.showModal(content);\r\n}\r\n\r\nsimplePhonetic(text) {\r\nconst map = {\r\n'a': '\u00e6', 'e': '\u025b', 'i': '\u026a', 'o': '\u0252', 'u': '\u028c',\r\n'th': '\u00f0', 'sh': '\u0283', 'ch': 't\u0283', 'ng': '\u014b'\r\n};\r\nlet result = text.toLowerCase();\r\nfor (const [key, value] of Object.entries(map)) {\r\nresult = result.replace(new RegExp(key, 'g'), value);\r\n}\r\nreturn result;\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ MARKETPLACE MODE\r\n\/\/ ============================================\r\ntoggleMarketplaceMode() {\r\nthis.state.marketplaceMode = !this.state.marketplaceMode;\r\nthis.elements.marketplaceTranslateFeature.classList.toggle('active', this.state.marketplaceMode);\r\nif (this.state.marketplaceMode) {\r\nthis.elements.sourceText.placeholder = '\ud83c\udfea Enter product description, reviews, or marketplace content...';\r\nthis.showToast('\ud83c\udfea Marketplace Mode enabled - Optimized for product translations', 'success');\r\n} else {\r\nthis.elements.sourceText.placeholder = 'Enter text to translate...';\r\nthis.showToast('\ud83c\udf10 Marketplace Mode disabled', 'info');\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ TRANSLATE TO MENU\r\n\/\/ ============================================\r\nshowTranslateToMenu() {\r\nlet content = `\r\n<h3>\ud83c\udf10 Translate To<\/h3>\r\n<div class=\"form-group\">\r\n<input type=\"text\" id=\"langSearchInput\" placeholder=\"Search language...\" style=\"width:100%; padding:12px; background:rgba(15,23,42,0.8); border:1px solid var(--border); border-radius:10px; color:var(--light); font-size:14px;\">\r\n<\/div>\r\n<div class=\"form-group\">\r\n<select id=\"quickTargetLangSelect\" style=\"width:100%; padding:12px; background:rgba(15,23,42,0.8); border:1px solid var(--border); border-radius:10px; color:var(--light); font-size:14px; max-height:300px;\">\r\n${this.languages.map(l => `<option value=\"${l.code}\" ${l.code === this.state.targetLanguage ? 'selected' : ''}>${l.flag} ${l.native} (${l.name})<\/option>`).join('')}\r\n<\/select>\r\n<\/div>\r\n<div class=\"modal-actions\">\r\n<button class=\"btn-primary\" id=\"quickTranslateConfirm\">Translate<\/button>\r\n<button class=\"btn-secondary\" onclick=\"ambTranslate.closeModal()\">Cancel<\/button>\r\n<\/div>\r\n`;\r\n\r\nthis.showModal(content);\r\n\r\nconst searchInput = document.getElementById('langSearchInput');\r\nconst select = document.getElementById('quickTargetLangSelect');\r\nif (searchInput) {\r\nsearchInput.addEventListener('input', (e) => {\r\nconst query = e.target.value.toLowerCase();\r\nconst options = select.options;\r\nfor (let i = 0; i < options.length; i++) {\r\nconst text = options[i].text.toLowerCase();\r\noptions[i].style.display = text.includes(query) ? '' : 'none';\r\n}\r\n});\r\n}\r\n\r\ndocument.getElementById('quickTranslateConfirm').addEventListener('click', () => {\r\nconst lang = select.value;\r\nthis.elements.targetLanguage.value = lang;\r\nthis.state.targetLanguage = lang;\r\nthis.updateQuickTranslateButtons();\r\nthis.translate();\r\nthis.closeModal();\r\nthis.showToast(`\ud83c\udf10 Translating to ${lang.toUpperCase()}...`, 'info');\r\n});\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ UTILITY FUNCTIONS\r\n\/\/ ============================================\r\nswapLanguages() {\r\nconst sourceLang = this.elements.sourceLanguage.value;\r\nconst targetLang = this.elements.targetLanguage.value;\r\nconst sourceText = this.elements.sourceText.value;\r\nconst targetText = this.elements.targetText.value;\r\n\r\nthis.elements.sourceLanguage.value = targetLang;\r\nthis.elements.targetLanguage.value = sourceLang;\r\nthis.state.sourceLanguage = targetLang;\r\nthis.state.targetLanguage = sourceLang;\r\n\r\nthis.elements.sourceText.value = targetText;\r\nthis.elements.targetText.value = sourceText;\r\nthis.state.sourceText = targetText;\r\nthis.state.targetText = sourceText;\r\n\r\nthis.updateCharCount(targetText);\r\nthis.updateLanguageBadge();\r\nthis.updateQuickTranslateButtons();\r\nthis.detectRTL(targetText, 'source');\r\nthis.detectRTL(sourceText, 'target');\r\nthis.showToast('\ud83d\udd04 Languages swapped!', 'success');\r\n}\r\n\r\nclearAll() {\r\nthis.clearSource();\r\nthis.clearTarget();\r\nthis.showToast('\ud83e\uddf9 Cleared all', 'info');\r\n}\r\n\r\nclearSource() {\r\nthis.elements.sourceText.value = '';\r\nthis.state.sourceText = '';\r\nthis.updateCharCount('');\r\nthis.elements.sourceText.focus();\r\nthis.elements.sourceText.classList.remove('rtl', 'ltr');\r\n}\r\n\r\nclearTarget() {\r\nthis.elements.targetText.value = '';\r\nthis.state.targetText = '';\r\nthis.elements.targetText.classList.remove('rtl', 'ltr');\r\n}\r\n\r\nasync copyTranslation() {\r\nconst text = this.elements.targetText.value;\r\nif (!text) {\r\nthis.showToast('Nothing to copy', 'info');\r\nreturn;\r\n}\r\n\r\nconst copyText = this.state.cleanEncoding ? this.cleanTranslation(text) : text;\r\n\r\ntry {\r\nawait navigator.clipboard.writeText(copyText);\r\nthis.showToast('\ud83d\udccb Copied to clipboard!', 'success');\r\n} catch {\r\nconst textarea = document.createElement('textarea');\r\ntextarea.value = copyText;\r\ndocument.body.appendChild(textarea);\r\ntextarea.select();\r\ndocument.execCommand('copy');\r\ndocument.body.removeChild(textarea);\r\nthis.showToast('\ud83d\udccb Copied to clipboard!', 'success');\r\n}\r\n}\r\n\r\nasync pasteFromClipboard() {\r\ntry {\r\nconst text = await navigator.clipboard.readText();\r\nthis.elements.sourceText.value = text;\r\nthis.state.sourceText = text;\r\nthis.updateCharCount(text);\r\nthis.detectRTL(text, 'source');\r\nif (this.state.autoDetect) this.translate();\r\nthis.showToast('\ud83d\udccb Pasted from clipboard!', 'success');\r\n} catch {\r\nthis.showToast('Unable to paste from clipboard', 'error');\r\n}\r\n}\r\n\r\nspeakText(type) {\r\nconst text = type === 'source'\r\n? this.elements.sourceText.value\r\n: this.elements.targetText.value;\r\n\r\nif (!text) {\r\nthis.showToast('No text to speak', 'info');\r\nreturn;\r\n}\r\n\r\nconst speakText = this.state.cleanEncoding ? this.cleanTranslation(text) : text;\r\n\r\nconst lang = type === 'source'\r\n? this.elements.sourceLanguage.value\r\n: this.elements.targetLanguage.value;\r\n\r\nif (!window.speechSynthesis) {\r\nthis.showToast('Speech synthesis not supported', 'error');\r\nreturn;\r\n}\r\n\r\nwindow.speechSynthesis.cancel();\r\n\r\nconst utterance = new SpeechSynthesisUtterance(speakText);\r\nutterance.lang = lang;\r\nutterance.rate = 0.9;\r\nutterance.pitch = 1;\r\n\r\nconst voices = window.speechSynthesis.getVoices();\r\nconst voice = voices.find(v => v.lang.startsWith(lang)) || voices[0];\r\nif (voice) utterance.voice = voice;\r\n\r\nwindow.speechSynthesis.speak(utterance);\r\nthis.showToast(`\ud83d\udd0a Speaking ${type} text...`, 'info');\r\n}\r\n\r\ninitSpeechSynthesis() {\r\nif (window.speechSynthesis) {\r\nwindow.speechSynthesis.getVoices();\r\nwindow.speechSynthesis.onvoiceschanged = () => {\r\nwindow.speechSynthesis.getVoices();\r\n};\r\n}\r\n}\r\n\r\ntruncateText(text, maxLength) {\r\nif (!text) return '';\r\nreturn text.length > maxLength ? text.substring(0, maxLength) + '...' : text;\r\n}\r\n\r\nupdateCharCount(text) {\r\nconst count = text.length;\r\nthis.elements.charCount.textContent = `${count} \/ 5000`;\r\nif (count > 4500) {\r\nthis.elements.charCount.style.color = 'var(--warning)';\r\n} else if (count > 4800) {\r\nthis.elements.charCount.style.color = 'var(--danger)';\r\n} else {\r\nthis.elements.charCount.style.color = 'var(--gray)';\r\n}\r\n}\r\n\r\nupdateLanguageBadge() {\r\nconst lang = this.languages.find(l => l.code === this.state.sourceLanguage);\r\nif (lang) {\r\nthis.elements.langBadge.textContent = lang.code.toUpperCase();\r\n}\r\n}\r\n\r\nupdateQuickTranslateButtons() {\r\nthis.elements.quickTranslateBtns.forEach(btn => {\r\nbtn.classList.toggle('active', btn.dataset.lang === this.state.targetLanguage);\r\n});\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ FEATURE TOGGLES\r\n\/\/ ============================================\r\ntoggleAutoDetect() {\r\nthis.state.autoDetect = !this.state.autoDetect;\r\nthis.elements.autoDetectFeature.classList.toggle('active', this.state.autoDetect);\r\nthis.showToast(`\u26a1 Auto-detect ${this.state.autoDetect ? 'enabled' : 'disabled'}`, 'info');\r\n}\r\n\r\ntoggleHistory() {\r\nconst isVisible = this.elements.historySection.style.display !== 'none';\r\nthis.elements.historySection.style.display = isVisible ? 'none' : 'block';\r\nthis.elements.historyFeature.classList.toggle('active', !isVisible);\r\nthis.showToast(`\ud83d\udcdc History ${isVisible ? 'hidden' : 'shown'}`, 'info');\r\n}\r\n\r\ntoggleFloatingMode() {\r\nthis.state.isFloating = !this.state.isFloating;\r\nthis.elements.widget.classList.toggle('floating', this.state.isFloating);\r\nthis.elements.toggleFloatingBtn.innerHTML = this.state.isFloating\r\n? '<i class=\"fas fa-compress\"><\/i>'\r\n: '<i class=\"fas fa-window-restore\"><\/i>';\r\nthis.showToast(this.state.isFloating ? '\ud83d\udccc Floating mode enabled' : '\ud83d\udccc Floating mode disabled', 'info');\r\n}\r\n\r\ntoggleFullscreen() {\r\nthis.state.isFullscreen = !this.state.isFullscreen;\r\nthis.elements.widget.classList.toggle('fullscreen', this.state.isFullscreen);\r\nthis.elements.fullscreenBtn.innerHTML = this.state.isFullscreen\r\n? '<i class=\"fas fa-compress\"><\/i>'\r\n: '<i class=\"fas fa-expand\"><\/i>';\r\nthis.showToast(this.state.isFullscreen ? '\ud83d\udda5\ufe0f Fullscreen mode enabled' : '\ud83d\udda5\ufe0f Fullscreen mode disabled', 'info');\r\n}\r\n\r\ntoggleDarkMode() {\r\nthis.state.isDarkMode = !this.state.isDarkMode;\r\nif (this.state.isDarkMode) {\r\nthis.enableDarkMode();\r\n} else {\r\nthis.enableLightMode();\r\n}\r\nthis.showToast(this.state.isDarkMode ? '\ud83c\udf19 Dark mode enabled' : '\u2600\ufe0f Light mode enabled', 'info');\r\n}\r\n\r\nenableDarkMode() {\r\nconst root = document.documentElement;\r\nroot.style.setProperty('--card-bg', '#1e293b');\r\nroot.style.setProperty('--dark', '#0f172a');\r\nroot.style.setProperty('--darker', '#020617');\r\nroot.style.setProperty('--light', '#f8fafc');\r\nroot.style.setProperty('--border', '#1e293b');\r\nroot.style.setProperty('--gray', '#64748b');\r\nthis.elements.toggleDarkModeBtn.innerHTML = '<i class=\"fas fa-moon\"><\/i>';\r\nthis.state.isDarkMode = true;\r\n}\r\n\r\nenableLightMode() {\r\nconst root = document.documentElement;\r\nroot.style.setProperty('--card-bg', '#f1f5f9');\r\nroot.style.setProperty('--dark', '#e2e8f0');\r\nroot.style.setProperty('--darker', '#cbd5e1');\r\nroot.style.setProperty('--light', '#0f172a');\r\nroot.style.setProperty('--border', '#cbd5e1');\r\nroot.style.setProperty('--gray', '#475569');\r\nthis.elements.toggleDarkModeBtn.innerHTML = '<i class=\"fas fa-sun\"><\/i>';\r\nthis.state.isDarkMode = false;\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ WIDGET TOGGLE\r\n\/\/ ============================================\r\ntoggleWidget() {\r\nthis.state.isOpen ? this.closeWidget() : this.openWidget();\r\n}\r\n\r\nopenWidget() {\r\nthis.state.isOpen = true;\r\nthis.elements.widget.classList.add('active');\r\nthis.elements.icon.style.transform = 'scale(0.9)';\r\nsetTimeout(() => this.elements.sourceText.focus(), 300);\r\nthis.showToast('\ud83c\udf10 Translation widget opened', 'info');\r\n}\r\n\r\ncloseWidget() {\r\nthis.state.isOpen = false;\r\nthis.elements.widget.classList.remove('active');\r\nthis.elements.icon.style.transform = 'scale(1)';\r\nif (this.state.isFullscreen) {\r\nthis.elements.widget.classList.remove('fullscreen');\r\nthis.state.isFullscreen = false;\r\nthis.elements.fullscreenBtn.innerHTML = '<i class=\"fas fa-expand\"><\/i>';\r\n}\r\nthis.saveState();\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ MODAL MANAGEMENT\r\n\/\/ ============================================\r\nshowModal(content) {\r\nthis.elements.modalContent.innerHTML = content;\r\nthis.elements.modalOverlay.classList.add('active');\r\n}\r\n\r\ncloseModal() {\r\nthis.elements.modalOverlay.classList.remove('active');\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ STATE MANAGEMENT\r\n\/\/ ============================================\r\nsaveState() {\r\nconst state = {\r\nsourceLanguage: this.state.sourceLanguage,\r\ntargetLanguage: this.state.targetLanguage,\r\nsourceText: this.state.sourceText,\r\nhistory: this.state.history,\r\nsavedTranslations: this.state.savedTranslations,\r\nautoDetect: this.state.autoDetect,\r\nisFloating: this.state.isFloating,\r\nisDarkMode: this.state.isDarkMode,\r\nmarketplaceMode: this.state.marketplaceMode,\r\ncleanEncoding: this.state.cleanEncoding\r\n};\r\ntry {\r\nlocalStorage.setItem('amb_translate_state', JSON.stringify(state));\r\n} catch (e) {\r\nconsole.warn('Could not save state:', e);\r\n}\r\n}\r\n\r\nloadState() {\r\ntry {\r\nconst saved = localStorage.getItem('amb_translate_state');\r\nif (saved) {\r\nconst state = JSON.parse(saved);\r\nthis.state.sourceLanguage = state.sourceLanguage || 'en';\r\nthis.state.targetLanguage = state.targetLanguage || 'es';\r\nthis.state.sourceText = state.sourceText || '';\r\nthis.state.history = state.history || [];\r\nthis.state.savedTranslations = state.savedTranslations || [];\r\nthis.state.autoDetect = state.autoDetect !== undefined ? state.autoDetect : true;\r\nthis.state.isFloating = state.isFloating || false;\r\nthis.state.isDarkMode = state.isDarkMode !== undefined ? state.isDarkMode : true;\r\nthis.state.marketplaceMode = state.marketplaceMode || false;\r\nthis.state.cleanEncoding = state.cleanEncoding !== undefined ? state.cleanEncoding : true;\r\n\r\nthis.elements.sourceLanguage.value = this.state.sourceLanguage;\r\nthis.elements.targetLanguage.value = this.state.targetLanguage;\r\nthis.elements.sourceText.value = this.state.sourceText;\r\nthis.updateCharCount(this.state.sourceText);\r\nthis.renderHistory();\r\n\r\nif (this.state.isDarkMode) {\r\nthis.enableDarkMode();\r\n} else {\r\nthis.enableLightMode();\r\n}\r\n\r\nif (this.state.isFloating) {\r\nthis.elements.widget.classList.add('floating');\r\nthis.elements.toggleFloatingBtn.innerHTML = '<i class=\"fas fa-compress\"><\/i>';\r\n}\r\n\r\nif (this.state.marketplaceMode) {\r\nthis.elements.marketplaceTranslateFeature.classList.add('active');\r\nthis.elements.sourceText.placeholder = '\ud83c\udfea Enter product description, reviews, or marketplace content...';\r\n}\r\n\r\nif (this.state.cleanEncoding) {\r\nthis.elements.cleanEncodingFeature.classList.add('active');\r\n}\r\n\r\nthis.updateQuickTranslateButtons();\r\nthis.elements.autoDetectFeature.classList.toggle('active', this.state.autoDetect);\r\n\r\nif (this.state.sourceText && this.state.autoDetect) {\r\nsetTimeout(() => this.translate(), 500);\r\n}\r\n}\r\n} catch (error) {\r\nconsole.error('Error loading state:', error);\r\n}\r\n}\r\n\r\nupdateUI() {\r\nthis.renderHistory();\r\nthis.updateCharCount(this.elements.sourceText.value);\r\nthis.elements.autoDetectFeature.classList.toggle('active', this.state.autoDetect);\r\nthis.updateLanguageBadge();\r\nthis.updateQuickTranslateButtons();\r\nthis.elements.cleanEncodingFeature.classList.toggle('active', this.state.cleanEncoding);\r\nif (this.state.sourceText) {\r\nthis.detectRTL(this.state.sourceText, 'source');\r\n}\r\nif (this.state.targetText) {\r\nthis.detectRTL(this.state.targetText, 'target');\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ TOAST NOTIFICATION\r\n\/\/ ============================================\r\nshowToast(message, type = 'info') {\r\nconst toast = this.elements.toast;\r\ntoast.textContent = message;\r\ntoast.className = `toast ${type}`;\r\ntoast.classList.add('show');\r\n\r\nclearTimeout(this.toastTimeout);\r\nthis.toastTimeout = setTimeout(() => {\r\ntoast.classList.remove('show');\r\n}, 4000);\r\n}\r\n}\r\n\r\n\/\/ ============================================\r\n\/\/ INITIALIZE\r\n\/\/ ============================================\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\nwindow.ambTranslate = new AmbTranslate();\r\n\r\nif (window.location.hostname.includes('marketplace-marketplace.com')) {\r\nsetTimeout(() => {\r\nwindow.ambTranslate.showToast('\ud83c\udfea Welcome to Marketplace! Click the translate icon to translate any content.', 'info');\r\n}, 1500);\r\n}\r\n});\r\n\r\n\/\/ ============================================\r\n\/\/ GLOBAL API\r\n\/\/ ============================================\r\nwindow.AmbTranslateWidget = {\r\ninit: function(options = {}) {\r\nif (!window.ambTranslate) {\r\ndocument.addEventListener('DOMContentLoaded', () => {\r\nwindow.ambTranslate = new AmbTranslate();\r\nthis.applyOptions(options);\r\n});\r\n} else {\r\nthis.applyOptions(options);\r\n}\r\nreturn window.ambTranslate;\r\n},\r\n\r\napplyOptions: function(options) {\r\nif (!window.ambTranslate) return;\r\nif (options.sourceLang) {\r\ndocument.getElementById('sourceLanguage').value = options.sourceLang;\r\nwindow.ambTranslate.state.sourceLanguage = options.sourceLang;\r\n}\r\nif (options.targetLang) {\r\ndocument.getElementById('targetLanguage').value = options.targetLang;\r\nwindow.ambTranslate.state.targetLanguage = options.targetLang;\r\nwindow.ambTranslate.updateQuickTranslateButtons();\r\n}\r\nif (options.autoOpen) {\r\nwindow.ambTranslate.openWidget();\r\n}\r\nif (options.floating) {\r\nwindow.ambTranslate.toggleFloatingMode();\r\n}\r\nif (options.fullscreen) {\r\nwindow.ambTranslate.toggleFullscreen();\r\n}\r\nif (options.placeholder) {\r\ndocument.getElementById('sourceText').placeholder = options.placeholder;\r\n}\r\nif (options.marketplaceMode) {\r\nwindow.ambTranslate.toggleMarketplaceMode();\r\n}\r\nif (options.cleanEncoding !== undefined) {\r\nwindow.ambTranslate.state.cleanEncoding = options.cleanEncoding;\r\nwindow.ambTranslate.elements.cleanEncodingFeature.classList.toggle('active', options.cleanEncoding);\r\n}\r\nif (options.darkMode !== undefined) {\r\nif (options.darkMode) {\r\nwindow.ambTranslate.enableDarkMode();\r\n} else {\r\nwindow.ambTranslate.enableLightMode();\r\n}\r\n}\r\nwindow.ambTranslate.updateUI();\r\n},\r\n\r\ntranslate: function(text, sourceLang, targetLang) {\r\nif (window.ambTranslate) {\r\ndocument.getElementById('sourceText').value = text;\r\nif (sourceLang) document.getElementById('sourceLanguage').value = sourceLang;\r\nif (targetLang) document.getElementById('targetLanguage').value = targetLang;\r\nwindow.ambTranslate.translate();\r\n}\r\n},\r\n\r\nfixEncoding: function(text) {\r\nif (window.ambTranslate) {\r\nif (text) {\r\ndocument.getElementById('targetText').value = text;\r\nwindow.ambTranslate.state.targetText = text;\r\n}\r\nwindow.ambTranslate.fixEncoding();\r\n}\r\n},\r\n\r\nsetLanguage: function(sourceLang, targetLang) {\r\nif (window.ambTranslate) {\r\nif (sourceLang) {\r\ndocument.getElementById('sourceLanguage').value = sourceLang;\r\nwindow.ambTranslate.state.sourceLanguage = sourceLang;\r\n}\r\nif (targetLang) {\r\ndocument.getElementById('targetLanguage').value = targetLang;\r\nwindow.ambTranslate.state.targetLanguage = targetLang;\r\nwindow.ambTranslate.updateQuickTranslateButtons();\r\n}\r\nwindow.ambTranslate.updateLanguageBadge();\r\n}\r\n},\r\n\r\nopen: function() {\r\nif (window.ambTranslate) window.ambTranslate.openWidget();\r\n},\r\n\r\nclose: function() {\r\nif (window.ambTranslate) window.ambTranslate.closeWidget();\r\n},\r\n\r\ndetectLanguage: function(text) {\r\nif (window.ambTranslate) {\r\nif (text) document.getElementById('sourceText').value = text;\r\nwindow.ambTranslate.detectLanguage();\r\n}\r\n},\r\n\r\ngetHistory: function() {\r\nreturn window.ambTranslate ? window.ambTranslate.state.history : [];\r\n},\r\n\r\nclearHistory: function() {\r\nif (window.ambTranslate) window.ambTranslate.clearHistory();\r\n},\r\n\r\ngetFavorites: function() {\r\nreturn window.ambTranslate ? window.ambTranslate.state.savedTranslations : [];\r\n},\r\n\r\nexportData: function() {\r\nif (window.ambTranslate) {\r\nconst data = {\r\nhistory: window.ambTranslate.state.history,\r\nfavorites: window.ambTranslate.state.savedTranslations,\r\nsettings: {\r\nsourceLanguage: window.ambTranslate.state.sourceLanguage,\r\ntargetLanguage: window.ambTranslate.state.targetLanguage,\r\ntheme: window.ambTranslate.state.isDarkMode ? 'dark' : 'light',\r\ncleanEncoding: window.ambTranslate.state.cleanEncoding,\r\nmarketplaceMode: window.ambTranslate.state.marketplaceMode\r\n}\r\n};\r\nconst blob = new Blob([JSON.stringify(data, null, 2)], { type: 'application\/json' });\r\nconst url = URL.createObjectURL(blob);\r\nconst a = document.createElement('a');\r\na.href = url;\r\na.download = `amb_translate_backup_${new Date().toISOString().slice(0,10)}.json`;\r\na.click();\r\nURL.revokeObjectURL(url);\r\n}\r\n},\r\n\r\nimportData: function(jsonData) {\r\ntry {\r\nconst data = typeof jsonData === 'string' ? JSON.parse(jsonData) : jsonData;\r\nif (window.ambTranslate) {\r\nif (data.history) window.ambTranslate.state.history = data.history;\r\nif (data.favorites) window.ambTranslate.state.savedTranslations = data.favorites;\r\nif (data.settings) {\r\nif (data.settings.sourceLanguage) window.ambTranslate.state.sourceLanguage = data.settings.sourceLanguage;\r\nif (data.settings.targetLanguage) window.ambTranslate.state.targetLanguage = data.settings.targetLanguage;\r\nif (data.settings.cleanEncoding !== undefined) {\r\nwindow.ambTranslate.state.cleanEncoding = data.settings.cleanEncoding;\r\nwindow.ambTranslate.elements.cleanEncodingFeature.classList.toggle('active', data.settings.cleanEncoding);\r\n}\r\n}\r\nwindow.ambTranslate.renderHistory();\r\nwindow.ambTranslate.saveState();\r\nwindow.ambTranslate.showToast('\u2705 Data imported successfully!', 'success');\r\n}\r\n} catch (e) {\r\nconsole.error('Import error:', e);\r\nwindow.ambTranslate.showToast('\u274c Invalid data format', 'error');\r\n}\r\n},\r\n\r\ndestroy: function() {\r\nif (window.ambTranslate) {\r\nwindow.ambTranslate.closeWidget();\r\nwindow.ambTranslate = null;\r\n}\r\n}\r\n};\r\n\r\nconsole.log('\ud83c\udf10 Amb Translate v2.0 - Left Side with Encoding Fix!');\r\nconsole.log('\ud83d\udcd6 Usage: AmbTranslateWidget.init({ sourceLang: \"en\", targetLang: \"es\", cleanEncoding: true })');\r\nconsole.log('\ud83d\udca1 Click the translate icon on the bottom left!');\r\nconsole.log('\ud83d\udd27 To fix encoding issues: AmbTranslateWidget.fixEncoding(yourText)');\r\nconsole.log('\u2328\ufe0f Shortcuts: Ctrl+Enter to translate, Ctrl+Shift+T to toggle');\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Marketplace Translate &#8211; Universal Language Translator EN Translate Marketplace Translate Universal Language Translator marketplace-marketplace.com Clear Copy Swap English Spanish French German Chinese Japanese Arabic Russian Portuguese Italian Hindi Korean Source Language Target Language 0 \/ 5000 Translate Fix Auto-Detect History Favorites Phonetic Translate To Marketplace Mode Clean Encoding Translation History Export Clear All No translation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-21524","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/pages\/21524","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/comments?post=21524"}],"version-history":[{"count":19,"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/pages\/21524\/revisions"}],"predecessor-version":[{"id":21557,"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/pages\/21524\/revisions\/21557"}],"wp:attachment":[{"href":"https:\/\/marketplace-marketplace.com\/index.php\/wp-json\/wp\/v2\/media?parent=21524"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}