{"id":8931,"date":"2026-01-24T11:58:13","date_gmt":"2026-01-24T08:58:13","guid":{"rendered":"https:\/\/1.cbm.ua\/?p=8931"},"modified":"2026-02-03T18:27:17","modified_gmt":"2026-02-03T15:27:17","slug":"%d0%b4%d0%be%d1%81%d1%82%d1%83%d0%bf%d0%bd%d1%8b%d0%b5-%d0%b3%d0%be%d0%bb%d0%be%d1%81%d0%b0-%d0%b4%d0%bb%d1%8f-%d0%be%d0%b7%d0%b2%d1%83%d1%87%d0%ba%d0%b8","status":"publish","type":"post","link":"https:\/\/1.cbm.ua\/?p=8931","title":{"rendered":"\ud83c\udfaf\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u043a\u0438. \u041f\u0440\u043e\u043c\u0442\u0430 \u0432 8-\u0438 \u0418\u0418 (ChatGPT; Gemini; Claude; Grok; Copilot; Mistral; Qwen; Deepseek)"},"content":{"rendered":"\n<p><\/p>\n\n\n\n<details class=\"wp-block-details\"><summary><mark style=\"background-color:var(--nv-light-bg)\" class=\"has-inline-color has-nv-c-2-color is-layout-flow wp-block-details-is-layout-flow\"><strong>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/strong><\/mark>.<\/summary>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0438\u0441\u043a\u0443\u0441\u0442\u0432\u0435\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u0435\u043a\u0442 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u044b \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044f. <br>\u041d\u0430\u0436\u043c\u0438\u0442\u0435 &#171;\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 \u25b6&#187; \u043f\u043e\u044f\u0432\u044f\u0442\u0441\u044f \u043f\u043e\u043b\u0435. \u0417\u0430\u043f\u043e\u043b\u043d\u0438 \u0438\u0437 \u0438 \u043d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;<strong>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442<\/strong>&#187; \u0432 \u0442\u0435\u0431\u044f \u043d\u0430 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d \u0442\u0435\u043a\u0441\u0442 \u0441 \u043f\u0440\u043e\u043c\u0442\u043e\u043c. \u0422\u0435\u0431\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043d\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0439 \u0418\u0418 \u0438 \u0432\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u043c\u0442 (\u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u0435\u0448\u044c \u043d\u0430\u0436\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u044b\u0435 \u0442\u0430\u043c Gemini, GPT \u0438 \u0442.\u0434.) \u041a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u0448 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0418\u0418 \u0441\u043f\u0440\u043e\u0441\u0442\u043e \u0432\u0441\u0442\u0430\u0432\u044c \u043f\u0440\u043e\u043c\u0442\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443 \u0442\u0435\u0431\u044f \u0443\u0434\u0435 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435. \u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e \u043a\u0430\u043a \u0418\u0418 \u0432\u0435\u0440\u043d\u0435\u0442 \u043e\u0442\u0432\u0435\u0442 \u0441 \u0435\u043f\u0435\u0432\u043e\u0434\u0430\u043c\u0438 \u0432\u0435\u0440\u043d\u0438\u0441\u044c \u043d\u0430 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0432\u0442\u0430\u0432\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442. \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0431\u0443\u0434\u0435\u0442 \u0432 \u0442\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435:<br>{ &#8216;ru&#8217;: &#8216;\u042f \u0442\u043e\u0431\u043e\u044e \u043e\u0434\u043d\u043e\u0439 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u0431\u043e\u043b\u0435\u043d. \u042f \u0445\u043e\u0442\u0435\u043b \u0441\u043a\u0430\u0437\u0430\u0442\u044c, \u0447\u0442\u043e \u0442\u044b \u043c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043d\u0440\u0430\u0432\u0438\u0448\u044c\u0441\u044f.&#8217;, &#8216;de&#8217;: &#8216;Ich bin nach dir allein v\u00f6llig krank vor Liebe. Ich wollte sagen, dass du mir sehr gef\u00e4llst.&#8217;, &#8216;uk&#8217;: &#8216;\u042f \u0442\u043e\u0431\u043e\u044e \u043e\u0434\u043d\u0456\u0454\u044e \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0445\u0432\u043e\u0440\u0438\u0439. \u042f \u0445\u043e\u0442\u0456\u0432 \u0441\u043a\u0430\u0437\u0430\u0442\u0438, \u0449\u043e \u0442\u0438 \u043c\u0435\u043d\u0456 \u0434\u0443\u0436\u0435 \u043f\u043e\u0434\u043e\u0431\u0430\u0454\u0448\u0441\u044f.&#8217; }<br>\u041d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 &#171;<strong>\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044f<\/strong>&#187; \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u044b \u043c\u043e\u0436\u0435\u0448 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0438 \u0435\u0435 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u044b \u043d\u0430 \u0436\u0435\u043b\u0430\u0435\u043c\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043a\u0430\u043a \u0437\u0432\u0443\u0447\u0430\u0442 \u0433\u043e\u043b\u043e\u0441\u0430 \u043d\u0430 \u0444\u0430\u0449\u0435\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. \u042d\u0442\u0438 \u0433\u043e\u043b\u043e\u0441\u0430 \u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0431\u0449\u0438\u0439 \u0432\u0430\u0441 \u0442\u0435\u043a\u0441\u0442.<br>\u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u044f\u0437\u044b\u043a \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0432 \u043f\u043e\u043b\u0435 \u0424\u0438\u043b\u044c\u0442\u0440 \u0447\u0430\u0441\u0442\u044c \u0442\u0435\u043a\u0441\u0442\u0430 \u0438\u0437 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: ame \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f\u0443 &#171;en-US (American English \/ \u0430\u043c\u0435\u0440\u0438\u043a\u0430\u043d\u0441\u043a\u0438\u0439 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439)&#187;<br>\u0412 \u043f\u043e\u043b\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u044d\u0442\u043e\u043c \u044f\u0437\u044b\u0435 \u0438 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0437\u0432\u0443\u0447\u0430\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u043c \u0438\u0437 \u044f\u0437\u044b\u043a\u043e\u0432.<br>\u0414\u043b\u044f \u0440\u0443\u0441\u0441\u043a\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 \u0432 \u0441\u043b\u043e\u0432\u0430\u0445 \u0434\u043b\u044f \u0431\u0443\u043a\u0432 \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044f  \u0442\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 (U+0301 \u2014 \u00e1, \u00e9, \u0438\u0301, \u00f3, \u00fd, \u044b\u0301, \u044d\u0301, \u044e\u0301, \u044f\u0301 \u00c1, \u00c9, \u0418\u0301, \u00d3, \u00dd, \u042b\u0301, \u042d\u0301, \u042e\u0301, \u042f\u0301). <br>\ud83d\udd0a\u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0301\u044e \u0440\u0443\u043a\u0438 &#8212; <a href=\"https:\/\/1.cbm.ua\/?p=8715\">https:\/\/1.cbm.ua\/?p=8715<\/a> (\u043f\u043e\u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0442\u0443\u0442)<br>\ud83d\udd0a\u043f\u043e\u0442\u043e\u043c \u043c\u043e\u0301\u044e \u0440\u0443\u0301\u043a\u0438<br>\u0415\u0441\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043d\u0430 \u043d\u0435\u043a\u0441\u0442 \u0441 \u0443\u0434\u0430\u0440\u0435\u043d\u0438\u044f\u043c\u0438. \u041f\u043e\u0437\u0434\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u0433\u0434\u0435 \u0432\u044b \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0442\u0435\u043a\u0441\u0442 \u0441 \u0443\u0434\u0430\u0440\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n\n\n\n<p><\/p>\n<\/details>\n\n\n\n<!DOCTYPE html>\n<html lang=\"ru\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430<\/title>\n    <style>\n        * {\n            box-sizing: border-box;\n        }\n        body {\n            font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n            max-width: 900px;\n            margin: 0 auto;\n            padding: 20px;\n            background: #f5f5f5;\n        }\n        h1 {\n            color: #333;\n        }\n        .voice-list {\n            background: white;\n            border-radius: 8px;\n            padding: 20px;\n            box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n        }\n        .voice-item {\n            display: flex;\n            gap: 10px;\n            padding: 8px 12px;\n            border-bottom: 1px solid #eee;\n            align-items: center;\n        }\n        .voice-item:last-child {\n            border-bottom: none;\n        }\n        .voice-name {\n            flex: 1;\n            font-weight: 400;\n        }\n        .voice-badges {\n            display: flex;\n            gap: 6px;\n        }\n        .lang-group {\n            margin-bottom: 20px;\n            border: 1px solid #e0e0e0;\n            border-radius: 8px;\n            overflow: hidden;\n        }\n        .lang-header {\n            background: #f0f0f0;\n            padding: 12px 16px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            cursor: pointer;\n        }\n        .lang-header:hover {\n            background: #e8e8e8;\n        }\n        .lang-code {\n            font-weight: 600;\n            font-size: 1.1em;\n        }\n        .lang-count {\n            color: #666;\n            font-size: 0.9em;\n        }\n        .lang-voices {\n            background: white;\n        }\n        .lang-text-input {\n            padding: 10px 12px;\n            border-bottom: 1px solid #eee;\n            background: #fafafa;\n        }\n        .lang-text-input textarea {\n            width: 100%;\n            padding: 8px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 0.9em;\n            font-family: inherit;\n            resize: vertical;\n            box-sizing: border-box;\n            margin-bottom: 8px;\n        }\n        .btn-system {\n            background: #43a047;\n            margin-bottom: 5px;\n        }\n        .btn-system:hover {\n            background: #388e3c;\n        }\n        .btn-stop {\n            background: #e53935;\n            margin-left: 5px;\n        }\n        .btn-stop:hover {\n            background: #c62828;\n        }\n        .btn-stop:disabled {\n            background: #ccc;\n            cursor: not-allowed;\n        }\n        .badge {\n            font-size: 0.75em;\n            padding: 2px 8px;\n            border-radius: 12px;\n            background: #e3f2fd;\n            color: #1976d2;\n        }\n        .badge.local {\n            background: #e8f5e9;\n            color: #388e3c;\n        }\n        button {\n            padding: 6px 12px;\n            border: none;\n            background: #1976d2;\n            color: white;\n            border-radius: 4px;\n            cursor: pointer;\n            font-size: 0.85em;\n            transition: background 0.2s;\n        }\n        button:hover {\n            background: #1565c0;\n        }\n        .filter {\n            margin-bottom: 20px;\n            display: flex;\n            flex-wrap: wrap;\n            gap: 10px;\n            align-items: center;\n        }\n        .filter input {\n            padding: 10px;\n            flex: 1;\n            min-width: 200px;\n            max-width: 300px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 1em;\n        }\n        .count {\n            color: #666;\n            margin-bottom: 15px;\n        }\n        .no-support {\n            color: #d32f2f;\n            padding: 20px;\n            text-align: center;\n        }\n        \/* \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f *\/\n        .playing-indicator {\n            display: inline-flex;\n            align-items: center;\n            gap: 6px;\n            padding: 4px 10px;\n            background: #e3f2fd;\n            border-radius: 4px;\n            font-size: 0.85em;\n            color: #1976d2;\n            margin-left: 10px;\n        }\n        .playing-indicator .pulse {\n            width: 8px;\n            height: 8px;\n            background: #1976d2;\n            border-radius: 50%;\n            animation: pulse 1s infinite;\n        }\n        @keyframes pulse {\n            0%, 100% { opacity: 1; transform: scale(1); }\n            50% { opacity: 0.5; transform: scale(0.8); }\n        }\n        .voice-item.playing {\n            background: #e3f2fd;\n        }\n        .lang-group.playing .lang-header {\n            background: #bbdefb;\n        }\n        \/* AI Section *\/\n        .ai-section {\n            margin-bottom: 25px;\n            border: 1px solid #e0e0e0;\n            border-radius: 8px;\n            overflow: hidden;\n        }\n        .ai-header {\n            background: #f0f0f0;\n            padding: 12px 16px;\n            display: flex;\n            justify-content: space-between;\n            align-items: center;\n            cursor: pointer;\n        }\n        .ai-header:hover {\n            background: #e8e8e8;\n        }\n        \/* \u0410\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u043f\u0440\u0438\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044f *\/\n        .ai-header.attention {\n            animation: attention-pulse 0.6s ease-in-out 3;\n        }\n        @keyframes attention-pulse {\n            0%, 100% { \n                background: #f0f0f0;\n                transform: scale(1);\n            }\n            50% { \n                background: #bbdefb;\n                transform: scale(1.01);\n                box-shadow: 0 0 12px rgba(25, 118, 210, 0.4);\n            }\n        }\n        .toggle-icon.attention {\n            animation: arrow-bounce 0.5s ease-in-out 6;\n        }\n        @keyframes arrow-bounce {\n            0%, 100% { transform: translateX(0); }\n            50% { transform: translateX(5px); }\n        }\n        .ai-header h3 {\n            margin: 0;\n            color: #333;\n        }\n        .toggle-icon {\n            font-size: 2.9em;\n            transition: transform 0.2s;\n        }\n        .toggle-icon.open {\n            transform: rotate(90deg);\n        }\n        .ai-content {\n            padding: 20px;\n            border-top: 1px solid #e0e0e0;\n        }\n        .ai-form {\n            margin-bottom: 20px;\n        }\n        .form-row {\n            margin-bottom: 15px;\n        }\n        .form-row label {\n            display: block;\n            margin-bottom: 6px;\n            font-weight: 500;\n            color: #333;\n        }\n        .form-row select, .form-row textarea {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-size: 1em;\n            font-family: inherit;\n            box-sizing: border-box;\n        }\n        .lang-checkboxes {\n            display: flex;\n            flex-wrap: wrap;\n            gap: 8px;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            background: #fafafa;\n            max-height: 150px;\n            overflow-y: auto;\n        }\n        .lang-checkboxes label {\n            display: flex;\n            align-items: center;\n            gap: 4px;\n            font-weight: normal;\n            font-size: 0.9em;\n            white-space: nowrap;\n            margin-bottom: 0;\n            cursor: pointer;\n        }\n        .checkbox-row label {\n            display: flex;\n            align-items: center;\n            gap: 6px;\n            font-weight: normal;\n            cursor: pointer;\n        }\n        .checkbox-row input[type=\"checkbox\"] {\n            width: 18px;\n            height: 18px;\n            cursor: pointer;\n        }\n        .btn-primary {\n            background: #1976d2;\n            padding: 10px 20px;\n            font-size: 1em;\n        }\n        .btn-secondary {\n            background: #757575;\n        }\n        .btn-secondary:hover {\n            background: #616161;\n        }\n        .ai-links {\n            margin: 15px 2px;\n            padding: 2px 2px;\n        }\n        .ai-links p {\n            margin: 0 0 8px 0;\n            font-size: 0.9em;\n            color: #555;\n        }\n        .ai-link {\n            display: inline-block;\n            padding: 8px 16px;\n            margin-right: 10px;\n            margin-bottom: 10px;\n            background: #4CAF50;\n            color: white;\n            text-decoration: none;\n            border-radius: 4px;\n            font-size: 0.9em;\n            transition: background 0.2s;\n        }\n        .ai-link:hover {\n            background: #43A047;\n        }\n        .prompt-box, .paste-box {\n            margin-bottom: 15px;\n        }\n        .prompt-box p, .paste-box p {\n            margin: 0 0 8px 0;\n            font-size: 0.9em;\n            color: #555;\n        }\n        .prompt-box textarea, .paste-box textarea {\n            width: 100%;\n            padding: 10px;\n            border: 1px solid #ddd;\n            border-radius: 4px;\n            font-family: monospace;\n            font-size: 0.85em;\n            resize: vertical;\n            box-sizing: border-box;\n            background: #fafafa;\n        }\n        .paste-box textarea {\n            background: white;\n        }\n        .prompt-box button, .paste-box button {\n            margin-top: 8px;\n        }\n        #fill-status {\n            margin-left: 10px;\n            font-size: 0.9em;\n        }\n        #fill-status.success {\n            color: #388e3c;\n        }\n        #fill-status.error {\n            color: #d32f2f;\n        }\n        \/* \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f *\/\n        .global-controls {\n            position: fixed;\n            top: 0;\n            left: 0;\n            right: 0;\n            z-index: 2147483647;\n            background: linear-gradient(135deg, #1976d2 0%, #1565c0 100%);\n            color: white;\n            padding: 14px 20px;\n            border-bottom: none;\n            display: none;\n            align-items: center;\n            justify-content: center;\n            gap: 15px;\n            box-shadow: 0 4px 12px rgba(25, 118, 210, 0.4);\n        }\n        .global-controls.active {\n            display: flex;\n        }\n        .global-controls .playing-indicator {\n            background: rgba(255,255,255,0.2);\n            color: white;\n        }\n        .global-controls .playing-indicator .pulse {\n            background: white;\n        }\n        .global-controls .btn-stop {\n            background: rgba(255,255,255,0.2);\n            border: 1px solid rgba(255,255,255,0.3);\n        }\n        .global-controls .btn-stop:hover {\n            background: rgba(255,255,255,0.3);\n        }\n        \/* \u041e\u0442\u0441\u0442\u0443\u043f \u0434\u043b\u044f body \u043a\u043e\u0433\u0434\u0430 \u043f\u0430\u043d\u0435\u043b\u044c \u0430\u043a\u0442\u0438\u0432\u043d\u0430 *\/\n        body.playing-active {\n            padding-top: 60px;\n        }\n        .global-controls .now-playing {\n            flex: 1;\n            font-size: 0.95em;\n            color: white;\n            overflow: hidden;\n            text-overflow: ellipsis;\n            white-space: nowrap;\n            font-weight: 500;\n        }\n        \/* \u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430 *\/\n        #diagnostics {\n            display: none;\n            background: #fff3cd;\n            padding: 15px;\n            border-radius: 8px;\n            margin-bottom: 15px;\n            font-family: monospace;\n            font-size: 12px;\n            white-space: pre-wrap;\n            max-height: 400px;\n            overflow-y: auto;\n        }\n        \/* \u0418\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f *\/\n        .save-indicator {\n            font-size: 0.8em;\n            color: #388e3c;\n            margin-left: 8px;\n            opacity: 0;\n            transition: opacity 0.3s;\n        }\n        .save-indicator.show {\n            opacity: 1;\n        }\n    <\/style>\n<\/head>\n<body>\n    <h1>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u043a\u0438<\/h1>\n    <h3>\u0412\u0435\u0440\u0441\u0438\u044f-25012026-3<\/h3>\n    \n    <div class=\"voice-list\">\n        <!-- \u0413\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043d\u0442\u0440\u043e\u043b \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u044f -->\n        <div class=\"global-controls\" id=\"global-controls\">\n            <div class=\"playing-indicator\">\n                <span class=\"pulse\"><\/span>\n                <span>\u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/span>\n            <\/div>\n            <div class=\"now-playing\" id=\"now-playing\"><\/div>\n            <button class=\"btn-stop\" id=\"global-stop\">\u23f9 \u0421\u0442\u043e\u043f<\/button>\n        <\/div>\n        \n        <div class=\"ai-section\">\n            <div class=\"ai-header\" id=\"ai-header\">\n                <h3>\u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 (ChatGPT; Gemini; Claude; Grok; Copilot; Mistral; Qwen; Deepseek)<\/h3>\n                <span class=\"toggle-icon\" id=\"ai-toggle-icon\">\u25b6<\/span>\n            <\/div>\n            <div class=\"ai-content\" id=\"ai-content\" style=\"display: none;\">\n                <div class=\"ai-form\">\n                    <div class=\"form-row\">\n                        <label for=\"source-lang\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u044f\u0437\u044b\u043a:<\/label>\n                        <select id=\"source-lang\">\n                            <option value=\"ru\">\u0420\u0443\u0441\u0441\u043a\u0438\u0439<\/option>\n                            <option value=\"en\">English<\/option>\n                            <option value=\"de\">Deutsch<\/option>\n                            <option value=\"fr\">Fran\u00e7ais<\/option>\n                            <option value=\"es\">Espa\u00f1ol<\/option>\n                            <option value=\"it\">Italiano<\/option>\n                            <option value=\"pt\">Portugu\u00eas<\/option>\n                            <option value=\"pl\">Polski<\/option>\n                            <option value=\"uk\">\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430<\/option>\n                            <option value=\"ja\">\u65e5\u672c\u8a9e<\/option>\n                            <option value=\"zh\">\u4e2d\u6587<\/option>\n                            <option value=\"ko\">\ud55c\uad6d\uc5b4<\/option>\n                            <option value=\"ar\">\u0627\u0644\u0639\u0631\u0628\u064a\u0629<\/option>\n                            <option value=\"hi\">\u0939\u093f\u0928\u094d\u0926\u0940<\/option>\n                            <option value=\"tr\">T\u00fcrk\u00e7e<\/option>\n                            <option value=\"nl\">Nederlands<\/option>\n                            <option value=\"sv\">Svenska<\/option>\n                            <option value=\"da\">Dansk<\/option>\n                            <option value=\"no\">Norsk<\/option>\n                            <option value=\"fi\">Suomi<\/option>\n                            <option value=\"cs\">\u010ce\u0161tina<\/option>\n                            <option value=\"el\">\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac<\/option>\n                            <option value=\"he\">\u05e2\u05d1\u05e8\u05d9\u05ea<\/option>\n                            <option value=\"th\">\u0e44\u0e17\u0e22<\/option>\n                            <option value=\"vi\">Ti\u1ebfng Vi\u1ec7t<\/option>\n                            <option value=\"id\">Bahasa Indonesia<\/option>\n                            <option value=\"ms\">Bahasa Melayu<\/option>\n                            <option value=\"ro\">Rom\u00e2n\u0103<\/option>\n                            <option value=\"hu\">Magyar<\/option>\n                            <option value=\"sk\">Sloven\u010dina<\/option>\n                            <option value=\"bg\">\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438<\/option>\n                            <option value=\"hr\">Hrvatski<\/option>\n                            <option value=\"sl\">Sloven\u0161\u010dina<\/option>\n                            <option value=\"sr\">\u0421\u0440\u043f\u0441\u043a\u0438<\/option>\n                            <option value=\"ca\">Catal\u00e0<\/option>\n                            <option value=\"eu\">Euskara<\/option>\n                            <option value=\"gl\">Galego<\/option>\n                        <\/select>\n                    <\/div>\n                    \n                    <div class=\"form-row\">\n                        <label for=\"source-phrase\">\u0424\u0440\u0430\u0437\u0430:<\/label>\n                        <textarea id=\"source-phrase\" rows=\"2\" placeholder=\"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430...\"><\/textarea>\n                    <\/div>\n                    \n                    <div class=\"form-row checkbox-row\">\n                        <label><input type=\"checkbox\" id=\"check-errors\" checked> \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 (\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0442)<\/label>\n                    <\/div>\n                    \n                    <div class=\"form-row\">\n                        <label>\u042f\u0437\u044b\u043a\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430: <span class=\"save-indicator\" id=\"save-indicator\">\u2713 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e<\/span><\/label>\n                        <div class=\"lang-checkboxes\" id=\"target-langs\">\n                            <label><input type=\"checkbox\" value=\"ru\"> \u0420\u0443\u0441\u0441\u043a\u0438\u0439<\/label>\n                            <label><input type=\"checkbox\" value=\"uk\"> \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430<\/label>\n                            <label><input type=\"checkbox\" value=\"en\"> English<\/label>\n                            <label><input type=\"checkbox\" value=\"de\"> Deutsch<\/label>\n                            <label><input type=\"checkbox\" value=\"fr\"> Fran\u00e7ais<\/label>\n                            <label><input type=\"checkbox\" value=\"es\"> Espa\u00f1ol<\/label>\n                            <label><input type=\"checkbox\" value=\"it\"> Italiano<\/label>\n                            <label><input type=\"checkbox\" value=\"pt\"> Portugu\u00eas<\/label>\n                            <label><input type=\"checkbox\" value=\"pl\"> Polski<\/label>\n                            <label><input type=\"checkbox\" value=\"ja\"> \u65e5\u672c\u8a9e<\/label>\n                            <label><input type=\"checkbox\" value=\"zh\"> \u4e2d\u6587<\/label>\n                            <label><input type=\"checkbox\" value=\"ko\"> \ud55c\uad6d\uc5b4<\/label>\n                            <label><input type=\"checkbox\" value=\"ar\"> \u0627\u0644\u0639\u0631\u0628\u064a\u0629<\/label>\n                            <label><input type=\"checkbox\" value=\"hi\"> \u0939\u093f\u0928\u094d\u0926\u0940<\/label>\n                            <label><input type=\"checkbox\" value=\"tr\"> T\u00fcrk\u00e7e<\/label>\n                            <label><input type=\"checkbox\" value=\"nl\"> Nederlands<\/label>\n                            <label><input type=\"checkbox\" value=\"sv\"> Svenska<\/label>\n                            <label><input type=\"checkbox\" value=\"da\"> Dansk<\/label>\n                            <label><input type=\"checkbox\" value=\"no\"> Norsk<\/label>\n                            <label><input type=\"checkbox\" value=\"fi\"> Suomi<\/label>\n                            <label><input type=\"checkbox\" value=\"cs\"> \u010ce\u0161tina<\/label>\n                            <label><input type=\"checkbox\" value=\"el\"> \u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac<\/label>\n                            <label><input type=\"checkbox\" value=\"he\"> \u05e2\u05d1\u05e8\u05d9\u05ea<\/label>\n                            <label><input type=\"checkbox\" value=\"th\"> \u0e44\u0e17\u0e22<\/label>\n                            <label><input type=\"checkbox\" value=\"vi\"> Ti\u1ebfng Vi\u1ec7t<\/label>\n                            <label><input type=\"checkbox\" value=\"id\"> Bahasa Indonesia<\/label>\n                            <label><input type=\"checkbox\" value=\"ms\"> Bahasa Melayu<\/label>\n                            <label><input type=\"checkbox\" value=\"ro\"> Rom\u00e2n\u0103<\/label>\n                            <label><input type=\"checkbox\" value=\"hu\"> Magyar<\/label>\n                            <label><input type=\"checkbox\" value=\"sk\"> Sloven\u010dina<\/label>\n                            <label><input type=\"checkbox\" value=\"bg\"> \u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438<\/label>\n                            <label><input type=\"checkbox\" value=\"hr\"> Hrvatski<\/label>\n                            <label><input type=\"checkbox\" value=\"sl\"> Sloven\u0161\u010dina<\/label>\n                            <label><input type=\"checkbox\" value=\"sr\"> \u0421\u0440\u043f\u0441\u043a\u0438<\/label>\n                            <label><input type=\"checkbox\" value=\"ca\"> Catal\u00e0<\/label>\n                            <label><input type=\"checkbox\" value=\"eu\"> Euskara<\/label>\n                            <label><input type=\"checkbox\" value=\"gl\"> Galego<\/label>\n                        <\/div>\n                    <\/div>\n                    \n                    <div class=\"form-row\">\n                        <button id=\"generate-prompt-btn\" class=\"btn-primary\">\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442 (+ \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u044c\u0441\u044f \u0432 \u0431\u0443\u0444\u0435\u0440.)<\/button> \u041f\u0440\u043e\u0441\u043d\u043e \u043d\u0430\u0436\u043c\u0438 \u043a\u043d\u043e\u043f\u043a\u0443 \u0418\u0418 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c \u0442\u0443\u0434\u0430 \u043f\u0440\u043e\u043c\u0442, \u043f\u043e\u0442\u043e\u043c \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0439 \u043e\u0442\u0432\u0435\u0442 \u0438 \u0432\u0435\u0440\u043d\u0438 \u0435\u0433\u043e \u0441\u044e\u0434\u0430 \u0438 \u0432\u0441\u0442\u0430\u0432\u044c \u0432 \u043f\u043e\u043b\u0435 \u043d\u0438\u0436\u0435.\n                    <\/div>\n                <\/div>\n                \n                <div class=\"prompt-box\">\n                    <p>\u041f\u0440\u043e\u043c\u043f\u0442 \u0434\u043b\u044f \u0418\u0418:<\/p>\n                    <textarea id=\"ai-prompt\" rows=\"10\" readonly placeholder=\"\u041d\u0430\u0436\u043c\u0438\u0442\u0435 '\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u043c\u043f\u0442' \u0447\u0442\u043e\u0431\u044b \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u043a\u0441\u0442...\"><\/textarea>\n                <\/div>\n                \n                <div class=\"ai-links\">\n                    <p>\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0418\u0418:<\/p>\n                    <a href=\"https:\/\/chatgpt.com\/\" target=\"_blank\" class=\"ai-link\">ChatGPT<\/a>\n                    <a href=\"https:\/\/gemini.google.com\/\" target=\"_blank\" class=\"ai-link\">Gemini<\/a>\n                    <a href=\"https:\/\/claude.ai\/\" target=\"_blank\" class=\"ai-link\">Claude<\/a>\n                    <a href=\"https:\/\/grok.com\/\" target=\"_blank\" class=\"ai-link\">Grok<\/a>\n                    <a href=\"https:\/\/copilot.microsoft.com\/\" target=\"_blank\" class=\"ai-link\">Copilot<\/a>\n                    <a href=\"https:\/\/chat.mistral.ai\/chat\/\" target=\"_blank\" class=\"ai-link\">Mistral<\/a>\n                    <a href=\"https:\/\/chat.qwen.ai\/\" target=\"_blank\" class=\"ai-link\">Qwen<\/a>\n                    <a href=\"https:\/\/chat.deepseek.com\/\" target=\"_blank\" class=\"ai-link\">Deepseek<\/a>\n                <\/div>\n                \n                <div class=\"paste-box\">\n                    <p>\u0412\u0441\u0442\u0430\u0432\u044c \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0418\u0418 \u0441\u044e\u0434\u0430:<\/p>\n                    <textarea id=\"ai-response\" rows=\"6\" placeholder=\"{'ru': '\u041f\u0440\u0438\u0432\u0435\u0442', 'en': 'Hello', 'de': 'Hallo'}\"><\/textarea>\n                    <button id=\"paste-btn\">\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430<\/button>\n                    <button id=\"fill-btn\">\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044f<\/button>\n                    <button id=\"show-all-btn\" class=\"btn-secondary\">\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438<\/button>\n                    <span id=\"fill-status\"><\/span>\n                <\/div>\n            <\/div>\n        <\/div>\n        \n        <div class=\"filter\">\n            <input type=\"text\" id=\"filter\" placeholder=\"\u0424\u0438\u043b\u044c\u0442\u0440 \u043f\u043e \u044f\u0437\u044b\u043a\u0443 \u0438\u043b\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044e...\">\n            <button id=\"diagnostics-btn\" class=\"btn-secondary\">\u0414\u0438\u0430\u0433\u043d\u043e\u0441\u0442\u0438\u043a\u0430<\/button>\n        <\/div>\n        <div id=\"diagnostics\"><\/div>\n        <div class=\"count\" id=\"count\"><\/div>\n        <div id=\"voices\"><\/div>\n    <\/div>\n    <script>\n        \/\/ ============================================\n        \/\/ \u0413\u041b\u041e\u0411\u0410\u041b\u042c\u041d\u041e\u0415 \u0421\u041e\u0421\u0422\u041e\u042f\u041d\u0418\u0415\n        \/\/ ============================================\n        const state = {\n            allVoices: [],\n            voiceCache: {},\n            isPlaying: false,\n            currentUtterance: null,\n            currentVoiceElement: null,\n            currentGroupElement: null,\n            voicesLoaded: false,\n            db: null\n        };\n        \n        \/\/ ============================================\n        \/\/ INDEXEDDB\n        \/\/ ============================================\n        const DB_NAME = 'VoicesAppDB';\n        const DB_VERSION = 1;\n        const STORE_NAME = 'settings';\n        const SETTINGS_KEY = 'selectedLanguages';\n        \n        \/\/ \u042f\u0437\u044b\u043a\u0438 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e (\u0435\u0441\u043b\u0438 \u0432 \u0411\u0414 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442)\n        const DEFAULT_SELECTED_LANGS = ['ru', 'uk', 'en', 'de'];\n        \n        function openDB() {\n            return new Promise((resolve, reject) => {\n                const request = indexedDB.open(DB_NAME, DB_VERSION);\n                \n                request.onerror = () => {\n                    console.error('IndexedDB error:', request.error);\n                    reject(request.error);\n                };\n                \n                request.onsuccess = () => {\n                    state.db = request.result;\n                    resolve(state.db);\n                };\n                \n                request.onupgradeneeded = (event) => {\n                    const db = event.target.result;\n                    if (!db.objectStoreNames.contains(STORE_NAME)) {\n                        db.createObjectStore(STORE_NAME, { keyPath: 'key' });\n                    }\n                };\n            });\n        }\n        \n        function saveSelectedLangs(langs) {\n            return new Promise((resolve, reject) => {\n                if (!state.db) {\n                    reject(new Error('DB not initialized'));\n                    return;\n                }\n                \n                const transaction = state.db.transaction([STORE_NAME], 'readwrite');\n                const store = transaction.objectStore(STORE_NAME);\n                \n                const request = store.put({\n                    key: SETTINGS_KEY,\n                    value: langs,\n                    updatedAt: new Date().toISOString()\n                });\n                \n                request.onsuccess = () => {\n                    showSaveIndicator();\n                    resolve();\n                };\n                \n                request.onerror = () => {\n                    console.error('Save error:', request.error);\n                    reject(request.error);\n                };\n            });\n        }\n        \n        function loadSelectedLangs() {\n            return new Promise((resolve, reject) => {\n                if (!state.db) {\n                    resolve(DEFAULT_SELECTED_LANGS);\n                    return;\n                }\n                \n                const transaction = state.db.transaction([STORE_NAME], 'readonly');\n                const store = transaction.objectStore(STORE_NAME);\n                const request = store.get(SETTINGS_KEY);\n                \n                request.onsuccess = () => {\n                    if (request.result && request.result.value) {\n                        resolve(request.result.value);\n                    } else {\n                        resolve(DEFAULT_SELECTED_LANGS);\n                    }\n                };\n                \n                request.onerror = () => {\n                    console.error('Load error:', request.error);\n                    resolve(DEFAULT_SELECTED_LANGS);\n                };\n            });\n        }\n        \n        function showSaveIndicator() {\n            const indicator = document.getElementById('save-indicator');\n            indicator.classList.add('show');\n            setTimeout(() => {\n                indicator.classList.remove('show');\n            }, 1500);\n        }\n        \n        function applySelectedLangs(langs) {\n            const checkboxes = document.querySelectorAll('#target-langs input[type=\"checkbox\"]');\n            checkboxes.forEach(cb => {\n                cb.checked = langs.includes(cb.value);\n            });\n        }\n        \n        function getSelectedLangs() {\n            const langs = [];\n            document.querySelectorAll('#target-langs input:checked').forEach(cb => {\n                langs.push(cb.value);\n            });\n            return langs;\n        }\n        \n        \/\/ Debounce \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f\n        let saveTimeout = null;\n        function debouncedSave() {\n            if (saveTimeout) {\n                clearTimeout(saveTimeout);\n            }\n            saveTimeout = setTimeout(() => {\n                const langs = getSelectedLangs();\n                saveSelectedLangs(langs).catch(err => {\n                    console.error('Failed to save:', err);\n                });\n            }, 300);\n        }\n        \n        \/\/ ============================================\n        \/\/ \u041a\u041e\u041d\u0421\u0422\u0410\u041d\u0422\u042b\n        \/\/ ============================================\n        const DEFAULT_TEXTS = {\n            'ru': '\u041f\u0440\u0438\u0432\u0435\u0442! \u042d\u0442\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.',\n            'en': 'Hello! This is a test message.',\n            'de': 'Hallo! Das ist eine Testnachricht.',\n            'fr': 'Bonjour! Ceci est un message de test.',\n            'es': 'Hola! Este es un mensaje de prueba.',\n            'it': 'Ciao! Questo \u00e8 un messaggio di prova.',\n            'pt': 'Ol\u00e1! Esta \u00e9 uma mensagem de teste.',\n            'pl': 'Cze\u015b\u0107! To jest wiadomo\u015b\u0107 testowa.',\n            'uk': '\u041f\u0440\u0438\u0432\u0456\u0442! \u0426\u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u0435 \u043f\u043e\u0432\u0456\u0434\u043e\u043c\u043b\u0435\u043d\u043d\u044f.',\n            'ja': '\u3053\u3093\u306b\u3061\u306f\uff01\u3053\u308c\u306f\u30c6\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u3067\u3059\u3002',\n            'zh': '\u4f60\u597d\uff01\u8fd9\u662f\u4e00\u6761\u6d4b\u8bd5\u6d88\u606f\u3002',\n            'ko': '\uc548\ub155\ud558\uc138\uc694! \ud14c\uc2a4\ud2b8 \uba54\uc2dc\uc9c0\uc785\ub2c8\ub2e4.',\n            'ar': '\u0645\u0631\u062d\u0628\u0627! \u0647\u0630\u0647 \u0631\u0633\u0627\u0644\u0629 \u0627\u062e\u062a\u0628\u0627\u0631.',\n            'hi': '\u0928\u092e\u0938\u094d\u0924\u0947! \u092f\u0939 \u090f\u0915 \u092a\u0930\u0940\u0915\u094d\u0937\u0923 \u0938\u0902\u0926\u0947\u0936 \u0939\u0948\u0964',\n            'tr': 'Merhaba! Bu bir test mesaj\u0131d\u0131r.',\n            'nl': 'Hallo! Dit is een testbericht.',\n            'sv': 'Hej! Det h\u00e4r \u00e4r ett testmeddelande.',\n            'da': 'Hej! Dette er en testbesked.',\n            'no': 'Hei! Dette er en testmelding.',\n            'fi': 'Hei! T\u00e4m\u00e4 on testiviesti.',\n            'cs': 'Ahoj! Toto je testovac\u00ed zpr\u00e1va.',\n            'el': '\u0393\u03b5\u03b9\u03b1! \u0391\u03c5\u03c4\u03cc \u03b5\u03af\u03bd\u03b1\u03b9 \u03ad\u03bd\u03b1 \u03b4\u03bf\u03ba\u03b9\u03bc\u03b1\u03c3\u03c4\u03b9\u03ba\u03cc \u03bc\u03ae\u03bd\u03c5\u03bc\u03b1.',\n            'he': '\u05e9\u05dc\u05d5\u05dd! \u05d6\u05d5\u05d4\u05d9 \u05d4\u05d5\u05d3\u05e2\u05ea \u05d1\u05d3\u05d9\u05e7\u05d4.',\n            'th': '\u0e2a\u0e27\u0e31\u0e2a\u0e14\u0e35! \u0e19\u0e35\u0e48\u0e04\u0e37\u0e2d\u0e02\u0e49\u0e2d\u0e04\u0e27\u0e32\u0e21\u0e17\u0e14\u0e2a\u0e2d\u0e1a',\n            'vi': 'Xin ch\u00e0o! \u0110\u00e2y l\u00e0 tin nh\u1eafn th\u1eed nghi\u1ec7m.',\n            'id': 'Halo! Ini adalah pesan percobaan.',\n            'ms': 'Halo! Ini adalah mesej ujian.',\n            'ro': 'Bun\u0103! Acesta este un mesaj de test.',\n            'hu': 'Hell\u00f3! Ez egy teszt\u00fczenet.',\n            'sk': 'Ahoj! Toto je testovacia spr\u00e1va.',\n            'bg': '\u0417\u0434\u0440\u0430\u0432\u0435\u0439! \u0422\u043e\u0432\u0430 \u0435 \u0442\u0435\u0441\u0442\u043e\u0432\u043e \u0441\u044a\u043e\u0431\u0449\u0435\u043d\u0438\u0435.',\n            'hr': 'Bok! Ovo je testna poruka.',\n            'sl': '\u017divjo! To je testno sporo\u010dilo.',\n            'sr': '\u0417\u0434\u0440\u0430\u0432\u043e! \u041e\u0432\u043e \u0458\u0435 \u0442\u0435\u0441\u0442\u043d\u0430 \u043f\u043e\u0440\u0443\u043a\u0430.',\n            'ca': 'Hola! Aquest \u00e9s un missatge de prova.',\n            'eu': 'Kaixo! Hau proba mezu bat da.',\n            'gl': 'Ola! Esta \u00e9 unha mensaxe de proba.'\n        };\n        \n        const PREFERRED_VOICES = {\n            'en': ['Google US English 1 (Natural)', 'Google US English', 'Google UK English Female', 'Microsoft David'],\n            'de': ['Google Deutsch', 'GoogleTranslate German', 'Microsoft Stefan', 'Microsoft Katja'],\n            'ru': ['Google \u0440\u0443\u0441\u0441\u043a\u0438\u0439', 'GoogleTranslate Russian', 'Microsoft Pavel', 'Microsoft Irina'],\n            'uk': ['Google \u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430', 'GoogleTranslate Ukrainian', 'Microsoft Ostap', 'Microsoft Polina'],\n            'fr': ['Google fran\u00e7ais', 'GoogleTranslate French', 'Microsoft Paul', 'Microsoft Julie'],\n            'es': ['Google espa\u00f1ol', 'GoogleTranslate Spanish', 'Microsoft Helena', 'Microsoft Pablo'],\n            'it': ['Google italiano', 'GoogleTranslate Italian', 'Microsoft Cosimo', 'Microsoft Elsa'],\n            'pl': ['Google polski', 'GoogleTranslate Polish', 'Microsoft Paulina', 'Microsoft Marek'],\n            'pt': ['Google portugu\u00eas', 'GoogleTranslate Portuguese', 'Microsoft Maria', 'Microsoft Daniel'],\n            'ja': ['Google \u65e5\u672c\u8a9e', 'GoogleTranslate Japanese', 'Microsoft Nanami', 'Microsoft Keita'],\n            'zh': ['Google \u4e2d\u6587', 'GoogleTranslate Chinese', 'Microsoft Xiaoxiao', 'Microsoft Yunyang'],\n            'ko': ['Google \ud55c\uad6d\uc5b4', 'GoogleTranslate Korean', 'Microsoft SunHi', 'Microsoft InJoon']\n        };\n        \n        \/\/ ============================================\n        \/\/ \u0423\u0422\u0418\u041b\u0418\u0422\u042b\n        \/\/ ============================================\n        \n        function escapeHtml(text) {\n            const div = document.createElement('div');\n            div.textContent = text;\n            return div.innerHTML;\n        }\n        \n        function normalizeLangCode(lang) {\n            return lang.toLowerCase().split(\/[-_]\/)[0];\n        }\n        \n        function showStatus(message, isError = false) {\n            const status = document.getElementById('fill-status');\n            status.textContent = message;\n            status.className = isError ? 'error' : 'success';\n            if (!isError) {\n                setTimeout(() => status.textContent = '', 3000);\n            }\n        }\n        \n        function parseAiResponse(text) {\n            let clean = text\n                .replace(\/^```json\\s*\/i, '')\n                .replace(\/^```\\s*\/i, '')\n                .replace(\/\\s*```$\/i, '')\n                .trim();\n            \n            try {\n                return JSON.parse(clean);\n            } catch (e) {}\n            \n            try {\n                clean = clean\n                    .replace(\/^{\\s*'\/m, '{\"')\n                    .replace(\/'\\s*}$\/m, '\"}')\n                    .replace(\/'\\s*:\\s*'\/g, '\":\"')\n                    .replace(\/'\\s*,\\s*'\/g, '\",\"')\n                    .replace(\/\"\\s*:\\s*'\/g, '\":\"')\n                    .replace(\/'\\s*,\\s*\"\/g, '\",\"');\n                \n                return JSON.parse(clean);\n            } catch (e) {\n                throw new Error('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c JSON. \u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0444\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u0418\u0418.');\n            }\n        }\n        \n        \/\/ ============================================\n        \/\/ \u0423\u041f\u0420\u0410\u0412\u041b\u0415\u041d\u0418\u0415 \u0412\u041e\u0421\u041f\u0420\u041e\u0418\u0417\u0412\u0415\u0414\u0415\u041d\u0418\u0415\u041c\n        \/\/ ============================================\n        \n        function updatePlayingUI(voiceName = null, groupElement = null, voiceElement = null) {\n            const globalControls = document.getElementById('global-controls');\n            const nowPlaying = document.getElementById('now-playing');\n            \n            document.querySelectorAll('.voice-item.playing').forEach(el => el.classList.remove('playing'));\n            document.querySelectorAll('.lang-group.playing').forEach(el => el.classList.remove('playing'));\n            \n            if (state.isPlaying && voiceName) {\n                globalControls.classList.add('active');\n                document.body.classList.add('playing-active');\n                nowPlaying.textContent = voiceName;\n                \n                if (voiceElement) {\n                    voiceElement.classList.add('playing');\n                    state.currentVoiceElement = voiceElement;\n                }\n                if (groupElement) {\n                    groupElement.classList.add('playing');\n                    state.currentGroupElement = groupElement;\n                }\n            } else {\n                globalControls.classList.remove('active');\n                document.body.classList.remove('playing-active');\n                nowPlaying.textContent = '';\n                state.currentVoiceElement = null;\n                state.currentGroupElement = null;\n            }\n        }\n        \n        function stopSpeech() {\n            speechSynthesis.cancel();\n            state.isPlaying = false;\n            state.currentUtterance = null;\n            updatePlayingUI();\n        }\n        \n        function speak(text, voice, lang, voiceName, groupElement = null, voiceElement = null) {\n            stopSpeech();\n            \n            const utterance = new SpeechSynthesisUtterance(text);\n            if (voice) {\n                utterance.voice = voice;\n            }\n            utterance.lang = lang;\n            utterance.rate = 0.9;\n            \n            utterance.onstart = () => {\n                state.isPlaying = true;\n                updatePlayingUI(voiceName, groupElement, voiceElement);\n            };\n            \n            utterance.onend = () => {\n                state.isPlaying = false;\n                updatePlayingUI();\n            };\n            \n            utterance.onerror = (e) => {\n                if (e.error !== 'canceled') {\n                    console.error('Speech error:', e);\n                }\n                state.isPlaying = false;\n                updatePlayingUI();\n            };\n            \n            state.currentUtterance = utterance;\n            speechSynthesis.speak(utterance);\n        }\n        \n        \/\/ ============================================\n        \/\/ \u0413\u041e\u041b\u041e\u0421\u0410\n        \/\/ ============================================\n        \n        function getVoice(lang) {\n            const langCode = normalizeLangCode(lang);\n            \n            if (state.voiceCache[langCode]) {\n                return state.voiceCache[langCode];\n            }\n            \n            const voices = speechSynthesis.getVoices();\n            const preferred = PREFERRED_VOICES[langCode] || [];\n            \n            for (const name of preferred) {\n                const found = voices.find(v => v.name === name);\n                if (found) {\n                    state.voiceCache[langCode] = found;\n                    return found;\n                }\n            }\n            \n            const fallback = voices.find(v => normalizeLangCode(v.lang) === langCode);\n            if (fallback) {\n                state.voiceCache[langCode] = fallback;\n            }\n            \n            return fallback || null;\n        }\n        \n        function testVoice(index, lang) {\n            const voice = state.allVoices[index];\n            const textArea = document.getElementById('text-' + lang);\n            const text = textArea ? textArea.value.trim() : 'Test message';\n            \n            const voiceItem = document.querySelector(`.voice-item[data-voice-index=\"${index}\"]`);\n            const langGroup = voiceItem?.closest('.lang-group');\n            \n            speak(text, voice, lang, voice.name, langGroup, voiceItem);\n        }\n        \n        function testSystemVoice(lang) {\n            const langCode = normalizeLangCode(lang);\n            \n            let textArea = document.getElementById('text-' + lang);\n            if (!textArea) {\n                const allTextareas = document.querySelectorAll('textarea[id^=\"text-\"]');\n                for (const ta of allTextareas) {\n                    if (normalizeLangCode(ta.id.replace('text-', '')) === langCode) {\n                        textArea = ta;\n                        break;\n                    }\n                }\n            }\n            \n            const text = textArea ? textArea.value.trim() : 'Test message';\n            const voice = getVoice(lang);\n            const langGroup = textArea?.closest('.lang-group');\n            \n            speak(text, voice, lang, voice?.name || `\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 (${lang})`, langGroup);\n        }\n        \n        function loadVoices() {\n            const container = document.getElementById('voices');\n            const countEl = document.getElementById('count');\n            \n            if (!('speechSynthesis' in window)) {\n                container.innerHTML = '<div class=\"no-support\">Speech Synthesis API \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u044d\u0442\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435<\/div>';\n                return;\n            }\n            \n            state.allVoices = speechSynthesis.getVoices();\n            \n            if (state.allVoices.length === 0) {\n                container.innerHTML = '<div class=\"no-support\">\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0433\u043e\u043b\u043e\u0441\u043e\u0432...<\/div>';\n                return;\n            }\n            \n            state.voicesLoaded = true;\n            state.voiceCache = {};\n            \n            const grouped = {};\n            state.allVoices.forEach((voice, index) => {\n                const lang = voice.lang;\n                if (!grouped[lang]) {\n                    grouped[lang] = [];\n                }\n                grouped[lang].push({ voice, index });\n            });\n            \n            const sortedLangs = Object.keys(grouped).sort((a, b) => a.localeCompare(b));\n            \n            const langNamesRu = new Intl.DisplayNames(['ru'], { type: 'language' });\n            const langNamesEn = new Intl.DisplayNames(['en'], { type: 'language' });\n            \n            countEl.textContent = `\u041d\u0430\u0439\u0434\u0435\u043d\u043e \u0433\u043e\u043b\u043e\u0441\u043e\u0432: ${state.allVoices.length}, \u044f\u0437\u044b\u043a\u043e\u0432: ${sortedLangs.length}`;\n            \n            const html = sortedLangs.map(lang => {\n                let langNameRu = '', langNameEn = '';\n                try {\n                    langNameEn = langNamesEn.of(lang) || langNamesEn.of(lang.split('-')[0]) || '';\n                    langNameRu = langNamesRu.of(lang) || langNamesRu.of(lang.split('-')[0]) || '';\n                } catch(e) {}\n                \n                let langLabel = lang;\n                if (langNameEn && langNameRu) {\n                    langLabel = `${lang} (${langNameEn} \/ ${langNameRu})`;\n                } else if (langNameEn) {\n                    langLabel = `${lang} (${langNameEn})`;\n                }\n                \n                const langCode = normalizeLangCode(lang);\n                const defaultText = DEFAULT_TEXTS[langCode] || DEFAULT_TEXTS['en'];\n                \n                return `\n                <div class=\"lang-group\" data-lang=\"${escapeHtml(lang.toLowerCase())}\" data-label=\"${escapeHtml(langLabel.toLowerCase())}\">\n                    <div class=\"lang-header\">\n                        <span class=\"lang-code\">${escapeHtml(langLabel)}<\/span>\n                        <span class=\"lang-count\">${grouped[lang].length} \u0433\u043e\u043b\u043e\u0441(\u043e\u0432)<\/span>\n                    <\/div>\n                    <div class=\"lang-voices\">\n                        <div class=\"lang-text-input\">\n                            <textarea id=\"text-${escapeHtml(lang)}\" rows=\"1\" placeholder=\"\u0422\u0435\u043a\u0441\u0442 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u043a\u0438...\">${escapeHtml(defaultText)}<\/textarea>\n                            <button class=\"btn-system\" data-lang=\"${escapeHtml(lang)}\" title=\"\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043b\u0443\u0447\u0448\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0433\u043e\u043b\u043e\u0441\">\u25b6 \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0433\u043e\u043b\u043e\u0441<\/button>\n                        <\/div>\n                        ${grouped[lang].map(({ voice, index }) => `\n                            <div class=\"voice-item\" data-voice-index=\"${index}\" data-search=\"${escapeHtml(voice.name.toLowerCase())} ${escapeHtml(voice.lang.toLowerCase())}\">\n                                <div class=\"voice-name\">${escapeHtml(voice.name)}<\/div>\n                                <div class=\"voice-badges\">\n                                    <span class=\"badge ${voice.localService ? 'local' : ''}\">${voice.localService ? '\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439' : '\u0421\u0435\u0442\u0435\u0432\u043e\u0439'}<\/span>\n                                    ${voice.default ? '<span class=\"badge\">\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e<\/span>' : ''}\n                                <\/div>\n                                <button class=\"btn-test-voice\" data-index=\"${index}\" data-lang=\"${escapeHtml(lang)}\">\u0422\u0435\u0441\u0442<\/button>\n                            <\/div>\n                        `).join('')}\n                    <\/div>\n                <\/div>\n            `}).join('');\n            \n            container.innerHTML = html;\n            \n            filterBySelectedLangs();\n        }\n        \n        \/\/ ============================================\n        \/\/ \u0424\u0418\u041b\u042c\u0422\u0420\u0410\u0426\u0418\u042f\n        \/\/ ============================================\n        \n        function filterBySelectedLangs() {\n            if (!state.voicesLoaded) return;\n            \n            const targetLangsContainer = document.getElementById('target-langs');\n            const selectedLangs = new Set();\n            \n            targetLangsContainer.querySelectorAll('input:checked').forEach(cb => {\n                selectedLangs.add(cb.value.toLowerCase());\n            });\n            \n            document.querySelectorAll('.lang-group').forEach(group => {\n                const groupLang = normalizeLangCode(group.dataset.lang);\n                group.style.display = selectedLangs.has(groupLang) ? 'block' : 'none';\n            });\n        }\n        \n        function filterBySearch(search) {\n            const searchLower = search.toLowerCase();\n            \n            document.querySelectorAll('.lang-group').forEach(group => {\n                const label = group.dataset.label;\n                group.style.display = label.includes(searchLower) ? 'block' : 'none';\n            });\n        }\n        \n        \/\/ ============================================\n        \/\/ AI \u0421\u0415\u041a\u0426\u0418\u042f\n        \/\/ ============================================\n        \n        function toggleAiSection() {\n            const content = document.getElementById('ai-content');\n            const icon = document.getElementById('ai-toggle-icon');\n            const isHidden = content.style.display === 'none';\n            \n            content.style.display = isHidden ? 'block' : 'none';\n            icon.classList.toggle('open', isHidden);\n        }\n        \n        function generatePrompt() {\n            const sourceLang = document.getElementById('source-lang');\n            const sourceLangText = sourceLang.options[sourceLang.selectedIndex].text;\n            const sourceLangCode = sourceLang.value;\n            const phrase = document.getElementById('source-phrase').value.trim();\n            const checkErrors = document.getElementById('check-errors').checked;\n            \n            if (!phrase) {\n                alert('\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0444\u0440\u0430\u0437\u0443 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430');\n                return;\n            }\n            \n            const targetLangs = [];\n            document.querySelectorAll('#target-langs input:checked').forEach(cb => {\n                const label = cb.parentElement.textContent.trim();\n                targetLangs.push({code: cb.value, name: label});\n            });\n            \n            if (targetLangs.length === 0) {\n                alert('\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u044f\u0437\u044b\u043a \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430');\n                return;\n            }\n            \n            const langCodes = targetLangs.map(l => l.code).join(', ');\n            const langNames = targetLangs.map(l => l.name).join(', ');\n            const exampleLines = targetLangs.slice(0, 3).map(l => `'${l.code}': '\u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043d\u0430 ${l.name}'`).join(',\\n');\n            \n            let errorCheckInstruction = '';\n            if (checkErrors) {\n                errorCheckInstruction = `\n\u0412\u0410\u0416\u041d\u041e: \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0443\u044e \u0444\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0440\u0444\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0438 \u0433\u0440\u0430\u043c\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. \u0415\u0441\u043b\u0438 \u043d\u0430\u0439\u0434\u0451\u0448\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u2014 \u0438\u0441\u043f\u0440\u0430\u0432\u044c \u0438\u0445 \u043f\u0435\u0440\u0435\u0434 \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u043e\u043c. \u0412 JSON \u0432\u0435\u0440\u043d\u0438 \u0443\u0436\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0444\u0440\u0430\u0437\u044b \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435.`;\n            }\n            \n            const prompt = `\u041f\u0435\u0440\u0435\u0432\u0435\u0434\u0438 \u0444\u0440\u0430\u0437\u0443 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0435 \u044f\u0437\u044b\u043a\u0438. \u0412\u0435\u0440\u043d\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0422\u041e\u041b\u042c\u041a\u041e \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 JSON \u0431\u0435\u0437 markdown, \u0431\u0435\u0437 \\`json, \u043f\u0440\u043e\u0441\u0442\u043e \u0447\u0438\u0441\u0442\u044b\u0439 JSON. \u0412\u0410\u0416\u041d\u041e: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u041e\u0414\u0418\u041d\u0410\u0420\u041d\u042b\u0415 \u043a\u0430\u0432\u044b\u0447\u043a\u0438!${errorCheckInstruction}\n\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u044f\u0437\u044b\u043a: ${sourceLangText}\n\u0424\u0440\u0430\u0437\u0430: ${phrase}\n\u042f\u0437\u044b\u043a\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430: ${langNames}\n\u0424\u043e\u0440\u043c\u0430\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 (\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0439, \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438!):\n{\n'${sourceLangCode}': '${checkErrors ? '\u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u0430\u044f \u0444\u0440\u0430\u0437\u0430 \u043d\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u043c \u044f\u0437\u044b\u043a\u0435' : phrase}',\n${exampleLines}\n}\n\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438 \u043a\u043e\u0434\u044b \u044f\u0437\u044b\u043a\u043e\u0432: ${langCodes}`;\n            \n            document.getElementById('ai-prompt').value = prompt;\n            \n            navigator.clipboard.writeText(prompt).then(() => {\n                showStatus('\u041f\u0440\u043e\u043c\u043f\u0442 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430!');\n            }).catch(() => {\n                showStatus('\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0431\u0443\u0444\u0435\u0440', true);\n            });\n        }\n        \n        function fillFields() {\n            const responseText = document.getElementById('ai-response').value.trim();\n            \n            if (!responseText) {\n                showStatus('\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u043e\u0442\u0432\u0435\u0442 \u043e\u0442 \u0418\u0418', true);\n                return;\n            }\n            \n            try {\n                const translations = parseAiResponse(responseText);\n                let filledCount = 0;\n                \n                document.querySelectorAll('.lang-group').forEach(group => {\n                    group.style.display = 'none';\n                });\n                \n                for (const [langCode, text] of Object.entries(translations)) {\n                    const searchLangCode = normalizeLangCode(langCode);\n                    \n                    document.querySelectorAll('textarea[id^=\"text-\"]').forEach(textarea => {\n                        const textareaLangCode = normalizeLangCode(textarea.id.replace('text-', ''));\n                        \n                        if (textareaLangCode === searchLangCode) {\n                            textarea.value = text;\n                            filledCount++;\n                            \n                            const group = textarea.closest('.lang-group');\n                            if (group) {\n                                group.style.display = 'block';\n                            }\n                        }\n                    });\n                }\n                \n                if (filledCount > 0) {\n                    showStatus(`\u0417\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043e \u043f\u043e\u043b\u0435\u0439: ${filledCount}`);\n                } else {\n                    showStatus('\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u043e\u043b\u0435\u0439', true);\n                    document.querySelectorAll('.lang-group').forEach(group => {\n                        group.style.display = 'block';\n                    });\n                }\n                \n            } catch (e) {\n                showStatus(e.message || '\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 JSON', true);\n                console.error('Parse error:', e);\n            }\n        }\n        \n        function showAllGroups() {\n            document.querySelectorAll('.lang-group').forEach(group => {\n                group.style.display = 'block';\n            });\n            showStatus('\u041f\u043e\u043a\u0430\u0437\u0430\u043d\u044b \u0432\u0441\u0435 \u044f\u0437\u044b\u043a\u0438');\n        }\n        \n        async function pasteFromClipboard() {\n            try {\n                const text = await navigator.clipboard.readText();\n                document.getElementById('ai-response').value = text;\n                showStatus('\u0422\u0435\u043a\u0441\u0442 \u0432\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430');\n            } catch (err) {\n                showStatus('\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430', true);\n            }\n        }\n        \n        \/\/ ============================================\n        \/\/ \u0414\u0418\u0410\u0413\u041d\u041e\u0421\u0422\u0418\u041a\u0410\n        \/\/ ============================================\n        \n        function runDiagnostics() {\n            const diag = document.getElementById('diagnostics');\n            diag.style.display = diag.style.display === 'none' ? 'block' : 'none';\n            \n            if (diag.style.display === 'none') return;\n            \n            const voices = speechSynthesis.getVoices();\n            const ua = navigator.userAgent;\n            const isAndroid = \/Android\/i.test(ua);\n            const isIOS = \/iPhone|iPad|iPod\/i.test(ua);\n            \n            let info = `=== \u0414\u0418\u0410\u0413\u041d\u041e\u0421\u0422\u0418\u041a\u0410 ===\\n`;\n            info += `\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e: ${isAndroid ? 'Android' : isIOS ? 'iOS' : 'Desktop'}\\n`;\n            info += `User Agent: ${ua}\\n`;\n            info += `IndexedDB: ${state.db ? 'OK' : '\u041d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d'}\\n`;\n            info += `\\n=== \u0421\u041e\u0425\u0420\u0410\u041d\u0401\u041d\u041d\u042b\u0415 \u042f\u0417\u042b\u041a\u0418 ===\\n`;\n            info += `${getSelectedLangs().join(', ')}\\n`;\n            info += `\\n=== \u0413\u041e\u041b\u041e\u0421\u0410 (${voices.length}) ===\\n`;\n            \n            voices.forEach((v, i) => {\n                info += `${i + 1}. ${v.name} | lang: ${v.lang} | local: ${v.localService}\\n`;\n            });\n            \n            navigator.clipboard.writeText(info).then(() => {\n                diag.innerHTML = `<b>\u2713 \u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u043e \u0432 \u0431\u0443\u0444\u0435\u0440 \u043e\u0431\u043c\u0435\u043d\u0430!<\/b>\\n\\n${escapeHtml(info)}\\n<button class=\"btn-secondary diag-test\" data-lang=\"de-DE\">\u0422\u0435\u0441\u0442 DE<\/button> <button class=\"btn-secondary diag-test\" data-lang=\"en-US\">\u0422\u0435\u0441\u0442 EN<\/button> <button class=\"btn-secondary diag-test\" data-lang=\"ru-RU\">\u0422\u0435\u0441\u0442 RU<\/button> <button class=\"btn-secondary\" id=\"close-diag\">\u0417\u0430\u043a\u0440\u044b\u0442\u044c<\/button>`;\n            }).catch(() => {\n                diag.innerHTML = `${escapeHtml(info)}\\n<button class=\"btn-secondary diag-test\" data-lang=\"de-DE\">\u0422\u0435\u0441\u0442 DE<\/button> <button class=\"btn-secondary diag-test\" data-lang=\"en-US\">\u0422\u0435\u0441\u0442 EN<\/button> <button class=\"btn-secondary diag-test\" data-lang=\"ru-RU\">\u0422\u0435\u0441\u0442 RU<\/button> <button class=\"btn-secondary\" id=\"close-diag\">\u0417\u0430\u043a\u0440\u044b\u0442\u044c<\/button>`;\n            });\n        }\n        \n        function testLangOnly(lang) {\n            const texts = {\n                'de-DE': 'Hallo, das ist ein Test.',\n                'en-US': 'Hello, this is a test.',\n                'ru-RU': '\u041f\u0440\u0438\u0432\u0435\u0442, \u044d\u0442\u043e \u0442\u0435\u0441\u0442.'\n            };\n            \n            speak(texts[lang] || 'Test', null, lang, `\u0422\u0435\u0441\u0442 ${lang}`);\n        }\n        \n        \/\/ ============================================\n        \/\/ \u0418\u041d\u0418\u0426\u0418\u0410\u041b\u0418\u0417\u0410\u0426\u0418\u042f\n        \/\/ ============================================\n        \n        function initEventListeners() {\n            document.getElementById('ai-header').addEventListener('click', toggleAiSection);\n            document.getElementById('generate-prompt-btn').addEventListener('click', generatePrompt);\n            document.getElementById('paste-btn').addEventListener('click', pasteFromClipboard);\n            document.getElementById('fill-btn').addEventListener('click', fillFields);\n            document.getElementById('show-all-btn').addEventListener('click', showAllGroups);\n            \n            document.getElementById('filter').addEventListener('input', (e) => {\n                filterBySearch(e.target.value);\n            });\n            \n            \/\/ \u042f\u0437\u044b\u043a\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430 - \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u043f\u0440\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438\n            document.getElementById('target-langs').addEventListener('change', () => {\n                filterBySelectedLangs();\n                debouncedSave();\n            });\n            \n            document.getElementById('diagnostics-btn').addEventListener('click', runDiagnostics);\n            document.getElementById('global-stop').addEventListener('click', stopSpeech);\n            \n            document.getElementById('voices').addEventListener('click', (e) => {\n                const target = e.target;\n                \n                if (target.classList.contains('btn-test-voice')) {\n                    const index = parseInt(target.dataset.index);\n                    const lang = target.dataset.lang;\n                    testVoice(index, lang);\n                }\n                \n                if (target.classList.contains('btn-system')) {\n                    testSystemVoice(target.dataset.lang);\n                }\n            });\n            \n            document.getElementById('diagnostics').addEventListener('click', (e) => {\n                if (e.target.classList.contains('diag-test')) {\n                    testLangOnly(e.target.dataset.lang);\n                }\n                if (e.target.id === 'close-diag') {\n                    document.getElementById('diagnostics').style.display = 'none';\n                }\n            });\n        }\n        \n        function initVoices() {\n            let attempts = 0;\n            const maxAttempts = 50;\n            \n            function tryLoad() {\n                const voices = speechSynthesis.getVoices();\n                if (voices.length > 0) {\n                    loadVoices();\n                } else if (attempts < maxAttempts) {\n                    attempts++;\n                    setTimeout(tryLoad, 100);\n                } else {\n                    document.getElementById('voices').innerHTML = \n                        '<div class=\"no-support\">\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u0430. \u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/div>';\n                }\n            }\n            \n            speechSynthesis.onvoiceschanged = loadVoices;\n            \n            tryLoad();\n        }\n        \n        function showAttentionHint() {\n            const aiHeader = document.getElementById('ai-header');\n            const toggleIcon = document.getElementById('ai-toggle-icon');\n            \n            setTimeout(() => {\n                aiHeader.classList.add('attention');\n                toggleIcon.classList.add('attention');\n                \n                setTimeout(() => {\n                    aiHeader.classList.remove('attention');\n                    toggleIcon.classList.remove('attention');\n                }, 3600);\n            }, 800);\n        }\n        \n        \/\/ \u0417\u0430\u043f\u0443\u0441\u043a\n        document.addEventListener('DOMContentLoaded', async () => {\n            \/\/ \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c IndexedDB\n            try {\n                await openDB();\n                const savedLangs = await loadSelectedLangs();\n                applySelectedLangs(savedLangs);\n            } catch (err) {\n                console.error('IndexedDB init failed:', err);\n                \/\/ \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\n                applySelectedLangs(DEFAULT_SELECTED_LANGS);\n            }\n            \n            initEventListeners();\n            initVoices();\n            showAttentionHint();\n        });\n    <\/script>\n<\/body>\n<\/html>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n\n\n\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u044c  \u2014 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u043f\u043e\u043c\u0435\u0447\u0435\u043d\u044b \u043a\u0430\u043a \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435, \u043d\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u041d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0440\u0430\u0437\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u043b\u044f \u043d\u0438\u0445 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0442\u0430\u044c\u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e. \u0422\u0430\u043a\u0436\u0435 \u043a \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0433\u043e\u043b\u043e\u0441\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043a\u043b\u044e\u0447\u0438 \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d\u0438 \u043f\u043b\u0430\u0442\u043d\u044b\u0435.<\/p>\n\n\n\n<p><strong>\u041f\u0440\u0438\u0447\u0438\u043d\u044b:<\/strong><\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430<\/strong> \u2014 \u0433\u043e\u043b\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 \u00ab\u0421\u0435\u0442\u0435\u0432\u043e\u0439\u00bb \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c Google. \u0418\u043d\u043e\u0433\u0434\u0430 \u043e\u043d\u0438 \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0438\u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439.<\/li>\n\n\n\n<li><strong>Chrome OS \u0433\u043e\u043b\u043e\u0441\u0430<\/strong> \u2014 \u044d\u0442\u043e \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f Chromebook, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0432 \u0441\u043f\u0438\u0441\u043a\u0435, \u043d\u043e \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 Windows.<\/li>\n\n\n\n<li><strong>Google Natural \u0433\u043e\u043b\u043e\u0441\u0430<\/strong> \u2014 \u044d\u0442\u043e \u043d\u043e\u0432\u044b\u0435 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430, \u043e\u043d\u0438 \u0447\u0430\u0441\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u043c\u043e\u0433\u0443\u0442 \u043c\u043e\u043b\u0447\u0430 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/li>\n<\/ol>\n\n\n\n<p><strong>\u041a\u0430\u043a\u0438\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430\u0434\u0451\u0436\u043d\u043e:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Microsoft<\/strong> \u0433\u043e\u043b\u043e\u0441\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u00abMicrosoft David\u00bb, \u00abMicrosoft Zira\u00bb) \u2014 \u044d\u0442\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 Windows, \u043e\u043d\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 Windows, \u043d\u043e \u0438\u0445 \u043d\u0435\u0442 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435, \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u0440\u0443\u0433\u0438\u0435 \u0433\u043e\u043b\u043e\u0441\u0430.<\/li>\n\n\n\n<li>\u0413\u043e\u043b\u043e\u0441\u0430 \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 <strong>\u00ab\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439\u00bb<\/strong> \u2014 \u043e\u043d\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435.<\/li>\n\n\n\n<li>\u041c\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0431\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0438\u0432\u0430\u0442\u044c \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430. \u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0437\u0432\u0443\u0447\u0430 \u043f\u043b\u0430\u0442\u043d\u044b\u0435. \u0425\u043e\u0440\u043e\u0448\u043e \u0437\u0432\u0443\u0447\u0430\u0442 \u0433\u043e\u043b\u043e\u0441\u0430 \u043e\u0442 \u0413\u0443\u0433\u043b \u043d\u0430 \u043c\u043d\u043e\u0433\u0438\u0445 \u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445 \u0435\u0441\u043b\u0438 \u0432\u044b \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 Chrom \u043e\u0442 \u0433\u0443\u0433\u043b, \u043d\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435 \u0438\u0445 \u0443\u0436\u0435 \u0442\u0430\u043c \u043d\u0435 \u0431\u0443\u0434\u0435\u0442.<\/li>\n<\/ul>\n\n\n\n<p>\u0425\u043e\u0447\u0435\u0448\u044c, \u0434\u043e\u0431\u0430\u0432\u043b\u044e \u0444\u0438\u043b\u044c\u0442\u0440 \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430? \u0418\u043b\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u043d\u0434\u0438\u043a\u0430\u0442\u043e\u0440 \u043e\u0448\u0438\u0431\u043a\u0438 \u0435\u0441\u043b\u0438 \u0433\u043e\u043b\u043e\u0441 \u043d\u0435 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0451\u043b\u0441\u044f?<\/p>\n\n\n\n<p><\/p>\n\n\n\n<p><\/p>\n\n\n\n<details class=\"wp-block-details is-layout-flow wp-block-details-is-layout-flow\"><summary>\u0418\u0418 \u041f\u041e<\/summary>\n<p><a href=\"https:\/\/claude.ai\/chat\/92c6711f-126b-4b91-9e6f-580004e221ab\">https:\/\/claude.ai\/chat\/92c6711f-126b-4b91-9e6f-580004e221ab<\/a><\/p>\n<\/details>\n","protected":false},"excerpt":{"rendered":"<p>\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u043a\u0438 \u0412\u0435\u0440\u0441\u0438\u044f-25012026-3 \u0412\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u23f9 \u0421\u0442\u043e\u043f \u0418\u0441\u043a\u0443\u0441\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u043b\u043b\u0435\u043a\u0442 (ChatGPT; Gemini; Claude; Grok; Copilot; Mistral; Qwen; Deepseek) \u25b6 \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u044f\u0437\u044b\u043a: \u0420\u0443\u0441\u0441\u043a\u0438\u0439EnglishDeutschFran\u00e7aisEspa\u00f1olItalianoPortugu\u00easPolski\u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430\u65e5\u672c\u8a9e\u4e2d\u6587\ud55c\uad6d\uc5b4\u0627\u0644\u0639\u0631\u0628\u064a\u0629\u0939\u093f\u0928\u094d\u0926\u0940T\u00fcrk\u00e7eNederlandsSvenskaDanskNorskSuomi\u010ce\u0161tina\u0395\u03bb\u03bb\u03b7\u03bd\u03b9\u03ba\u03ac\u05e2\u05d1\u05e8\u05d9\u05ea\u0e44\u0e17\u0e22Ti\u1ebfng Vi\u1ec7tBahasa IndonesiaBahasa MelayuRom\u00e2n\u0103MagyarSloven\u010dina\u0411\u044a\u043b\u0433\u0430\u0440\u0441\u043a\u0438HrvatskiSloven\u0161\u010dina\u0421\u0440\u043f\u0441\u043a\u0438Catal\u00e0EuskaraGalego \u0424\u0440\u0430\u0437\u0430: \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0444\u0440\u0430\u0437\u0443 \u043d\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 (\u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u0432 \u043f\u0440\u043e\u043c\u0442) \u042f\u0437\u044b\u043a\u0438 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0430: \u2713 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043e \u0420\u0443\u0441\u0441\u043a\u0438\u0439 \u0423\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u0430 English Deutsch Fran\u00e7ais Espa\u00f1ol Italiano Portugu\u00eas Polski \u65e5\u672c\u8a9e \u4e2d\u6587 \ud55c\uad6d\uc5b4 \u0627\u0644\u0639\u0631\u0628\u064a\u0629 \u0939\u093f\u0928\u094d\u0926\u0940 T\u00fcrk\u00e7e&hellip;&nbsp;<a href=\"https:\/\/1.cbm.ua\/?p=8931\" rel=\"bookmark\">\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 &raquo;<span class=\"screen-reader-text\">\ud83c\udfaf\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u0433\u043e\u043b\u043e\u0441\u0430 \u0434\u043b\u044f \u043e\u0437\u0432\u0443\u0447\u043a\u0438. \u041f\u0440\u043e\u043c\u0442\u0430 \u0432 8-\u0438 \u0418\u0418 (ChatGPT; Gemini; Claude; Grok; Copilot; Mistral; Qwen; Deepseek)<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":9013,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"neve_meta_sidebar":"","neve_meta_container":"","neve_meta_enable_content_width":"","neve_meta_content_width":0,"neve_meta_title_alignment":"","neve_meta_author_avatar":"","neve_post_elements_order":"","neve_meta_disable_header":"","neve_meta_disable_footer":"","neve_meta_disable_title":"","footnotes":""},"categories":[205,194,184,138,6],"tags":[],"class_list":["post-8931","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category--tts","category-spr-jk_pwa-1","category--script","category-138","category-js"],"_links":{"self":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/8931","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=8931"}],"version-history":[{"count":58,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/8931\/revisions"}],"predecessor-version":[{"id":9238,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/posts\/8931\/revisions\/9238"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=\/wp\/v2\/media\/9013"}],"wp:attachment":[{"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=8931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=8931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/1.cbm.ua\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=8931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}