Перейти к содержимому
Zone of Games Forum
SerGEAnt

Сообщение добавлено пользователем SerGEAnt

Рекомендованные сообщения

5 часов назад, Chillstream сказал:

Надеюсь в ближайшее время сделаю, там прикол в движке, что надо строку делать где-то не больше 63 символа, либо текст не влезет в колонку в игре eysvDGD.png 

Накидал скрипт на html для валидации длины строк.
X9HyqOl.png

Пример работы:

qmVRpsx.png

 

Можно щёлкнуть по строке для редактирования, попытаться сократить и сохранить.

Wd3Qxlm.png

Там будет видно, улучшилась ситуация или нет. Если всё нормально — можно нажать кнопку копировать и скопировать себе в таблицу или туда, где вы там проводите редактуру. Будут скопированы все строки из блока (ячейки).

Также можно нажать кнопку “Сохранить всё”, чтобы сохранить все отредактированные строки на рабочий стол в txt файл.

Le6DHPC.png

Затем содержимое файла можно скопировать и вставить на таблицу.

 

Скрытый текст

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Валидатор длины текста</title>
    <style>
        body {
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f5f5f5;
            color: #333;
        }
        h1 {
            color: #2c3e50;
            text-align: center;
            margin-bottom: 30px;
        }
        .container {
            display: flex;
            gap: 30px;
            margin: 0 auto;
            max-width: 1200px;
            background: white;
            padding: 25px;
            border-radius: 10px;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
        }
        textarea {
            width: 100%;
            height: 400px;
            font-family: 'Consolas', monospace;
            padding: 15px;
            border: 1px solid #ddd;
            border-radius: 5px;
            resize: vertical;
            font-size: 14px;
            line-height: 1.5;
        }
        .controls {
            display: flex;
            flex-direction: column;
            gap: 15px;
            min-width: 250px;
        }
        .control-group {
            display: flex;
            flex-direction: column;
            gap: 5px;
        }
        label {
            font-weight: 600;
            color: #2c3e50;
        }
        input[type="number"] {
            width: 100%;
            padding: 10px;
            border: 1px solid #ddd;
            border-radius: 5px;
            font-size: 16px;
        }
        button {
            padding: 12px 20px;
            background-color: #3498db;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
            font-weight: 600;
            transition: background-color 0.3s;
        }
        button:hover {
            background-color: #2980b9;
        }
        #output {
            margin-top: 30px;
            max-width: 1200px;
            margin-left: auto;
            margin-right: auto;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            background: white;
            box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
            border-radius: 5px;
            overflow: hidden;
        }
        td, th {
            border: 1px solid #e0e0e0;
            padding: 12px 15px;
            vertical-align: top;
        }
        th {
            background-color: #3498db;
            color: white;
            text-align: left;
        }
        .exceeded {
            background-color: #ffebee;
        }
        .highlight {
            box-shadow: inset 0 0 0 2px #e74c3c;
        }
        .line-number {
            color: #7f8c8d;
            font-size: 0.85em;
            display: block;
            margin-bottom: 5px;
        }
        .block-separator {
            background-color: #3498db;
            height: 3px;
        }
        .block-separator td {
            padding: 0;
        }
        pre {
            margin: 0;
            white-space: pre-wrap;
            font-family: 'Consolas', monospace;
            font-size: 14px;
        }
        .nav-bar {
            position: fixed;
            bottom: 20px;
            left: 50%;
            transform: translateX(-50%);
            background: white;
            padding: 10px 20px;
            border-radius: 50px;
            box-shadow: 0 2px 15px rgba(0, 0, 0, 0.2);
            display: flex;
            gap: 15px;
            z-index: 1000;
            opacity: 0;
            transition: opacity 0.3s;
        }
        .nav-bar.visible {
            opacity: 1;
        }
        .nav-button {
            padding: 8px 15px;
            background-color: #3498db;
            color: white;
            border: none;
            border-radius: 20px;
            cursor: pointer;
            font-weight: 600;
            transition: all 0.3s;
        }
        .nav-button:hover {
            background-color: #2980b9;
            transform: translateY(-2px);
        }
        .nav-button:disabled {
            background-color: #bdc3c7;
            cursor: not-allowed;
            transform: none;
        }
        .counter {
            padding: 8px 15px;
            font-weight: 600;
            color: #2c3e50;
        }
        .valid-part {
            background-color: #e8f5e9;
        }
        .excess-part {
            background-color: #ffcdd2;
            text-decoration: underline wavy red;
        }
        .stats-panel {
            background: white;
            padding: 15px;
            border-radius: 8px;
            box-shadow: 0 2px 5px rgba(0,0,0,0.1);
            margin-bottom: 20px;
            display: flex;
            flex-wrap: wrap;
            gap: 20px;
        }
        .stat-item {
            min-width: 120px;
        }
        .stat-value {
            font-size: 24px;
            font-weight: bold;
            color: #2c3e50;
        }
        .stat-label {
            font-size: 14px;
            color: #7f8c8d;
        }
        .toggle-normal {
            margin: 10px 0;
            padding: 8px 12px;
            background: #ecf0f1;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .collapsed .normal-row {
            display: none;
        }
        .summary-row {
            background-color: #f8f9fa;
            font-weight: bold;
        }
        .editable {
            cursor: pointer;
        }
        .editable:hover {
            background-color: #f0f7ff !important;
        }
        .edit-textarea {
            width: 100%;
            min-height: 100px;
            font-family: 'Consolas', monospace;
            padding: 10px;
            border: 2px solid #3498db;
            border-radius: 5px;
            resize: vertical;
            font-size: 14px;
            line-height: 1.5;
        }
        .edit-buttons {
            display: flex;
            gap: 10px;
            margin-top: 10px;
        }
        .edit-button {
            padding: 5px 10px;
            font-size: 14px;
            border-radius: 4px;
        }
        .save-button {
            background-color: #2ecc71;
            color: white;
        }
        .cancel-button {
            background-color: #e74c3c;
            color: white;
        }
        .copy-block-btn {
            background-color: #95a5a6;
            color: white;
            border: none;
            border-radius: 4px;
            padding: 4px 8px;
            font-size: 12px;
            cursor: pointer;
            margin-left: 10px;
            transition: background-color 0.3s;
        }
        .copy-block-btn:hover {
            background-color: #7f8c8d;
        }
        .copy-block-btn::before {
            content: "⏏";
            margin-right: 4px;
        }
        .block-actions {
            display: flex;
            justify-content: space-between;
            align-items: center;
        }
        .save-all-btn {
            background-color: #27ae60;
        }
        .save-all-btn:hover {
            background-color: #219653;
        }
    </style>
</head>
<body>
    <h1>Валидатор длины текста</h1>
    
    <div class="container">
        <textarea id="inputText" placeholder="Вставьте текст для проверки здесь..."></textarea>
        <div class="controls">
            <div class="control-group">
                <label for="maxLength">Максимальная длина строки:</label>
                <input type="number" id="maxLength" value="63" min="1">
            </div>
            <button id="processBtn" onclick="processText()">Проверить текст</button>
            <button id="saveAllBtn" class="save-all-btn" onclick="saveAllText()" style="display: none;">Сохранить всё (TXT)</button>
            <div class="control-group">
                <small>Примечание: программа учитывает текст без форматирования</small>
            </div>
        </div>
    </div>
    
    <div id="output"></div>
    <div id="statsPanel" class="stats-panel" style="display: none;"></div>
    
    <div class="nav-bar" id="navBar">
        <button class="nav-button" id="prevButton" onclick="navigateExceeded(-1)">← Назад</button>
        <span class="counter" id="counter">0/0</span>
        <button class="nav-button" id="nextButton" onclick="navigateExceeded(1)">Вперёд →</button>
    </div>

    <script>
        let exceededElements = [];
        let currentExceededIndex = -1;
        let allResults = [];
        let isCollapsed = false;
        
        function processText() {
            const inputText = document.getElementById('inputText').value;
            const maxLength = parseInt(document.getElementById('maxLength').value);
            const blocks = splitBlocks(inputText);
            allResults = analyzeBlocks(blocks, maxLength);
            displayStats(allResults, maxLength);
            displayResults(allResults);
            initNavigation();
            document.getElementById('saveAllBtn').style.display = 'block';
        }
        
        function splitBlocks(text) {
            const lines = text.split(/\r?\n/);
            let blocks = [];
            let currentBlock = [];
            let inQuotes = false;
            
            for (let line of lines) {
                // Убрали trim(), чтобы сохранять пустые строки внутри блоков
                const startsWithQuote = line.startsWith('"') && !inQuotes;
                const endsWithQuote = line.endsWith('"') && !line.endsWith('\\"');
                
                if (startsWithQuote) inQuotes = true;
                if (endsWithQuote) inQuotes = false;
                
                if (inQuotes || currentBlock.length > 0) {
                    currentBlock.push(line.replace(/\\"/g, '"'));
                    if (!inQuotes) {
                        const fullBlock = currentBlock.join('\n').replace(/^"(.*)"$/, '$1');
                        blocks.push(fullBlock);
                        currentBlock = [];
                    }
                } else {
                    // Добавляем строку в блок только если она не пустая ИЛИ если мы внутри блока
                    if (line.trim() !== '' || currentBlock.length > 0) {
                        blocks.push(line);
                    }
                }
            }
            
            return blocks;
        }
        
        function cleanText(text) {
            return text
                .replace(/\\[A-Za-z]\[\d+\]/g, '')
                .replace(/\\[A-Za-z]/g, '')
                .replace(/\\[}.]/g, '');
        }
        
        function analyzeBlocks(blocks, maxLength) {
            return blocks.map(block => {
                const lines = block.includes('\n') ? block.split('\n') : [block];
                return lines.map(line => {
                    const cleaned = cleanText(line);
                    const length = cleaned.length;
                    return {
                        original: line,
                        cleaned: cleaned,
                        length: length,
                        exceeded: length > maxLength,
                        diff: Math.max(0, length - maxLength)
                    };
                });
            });
        }
        
        function displayStats(results, maxLength) {
            const statsPanel = document.getElementById('statsPanel');
            statsPanel.style.display = 'block';
            
            let totalLines = 0;
            let exceededLines = 0;
            let maxExceed = 0;
            let totalExceed = 0;
            
            results.forEach(block => {
                block.forEach(line => {
                    totalLines++;
                    if (line.exceeded) {
                        exceededLines++;
                        totalExceed += line.diff;
                        if (line.diff > maxExceed) {
                            maxExceed = line.diff;
                        }
                    }
                });
            });
            
            const percentExceeded = totalLines > 0 ? (exceededLines / totalLines * 100).toFixed(1) : 0;
            const avgExceed = exceededLines > 0 ? (totalExceed / exceededLines).toFixed(1) : 0;
            
            statsPanel.innerHTML = `
                <div class="stat-item">
                    <div class="stat-value">${totalLines}</div>
                    <div class="stat-label">Всего строк</div>
                </div>
                <div class="stat-item">
                    <div class="stat-value">${exceededLines} <small>(${percentExceeded}%)</small></div>
                    <div class="stat-label">Превышений</div>
                </div>
                <div class="stat-item">
                    <div class="stat-value">${maxExceed}</div>
                    <div class="stat-label">Макс. превышение</div>
                </div>
                <div class="stat-item">
                    <div class="stat-value">${avgExceed}</div>
                    <div class="stat-label">Среднее превышение</div>
                </div>
                <div class="stat-item">
                    <div class="stat-value">${maxLength}</div>
                    <div class="stat-label">Лимит длины</div>
                </div>
                <button class="toggle-normal" onclick="toggleNormalRows()">
                    ${isCollapsed ? 'Показать все строки' : 'Скрыть нормальные строки'}
                </button>
            `;
        }
        
        function displayResults(results) {
            const output = document.getElementById('output');
            let html = `
                <table id="resultsTable" class="${isCollapsed ? 'collapsed' : ''}">
                    <thead>
                        <tr>
                            <th>Текст</th>
                            <th style="width: 80px;">Длина</th>
                            <th style="width: 80px;">Превышение</th>
                        </tr>
                    </thead>
                    <tbody>
            `;
            
            let blockCount = 0;
            results.forEach((block, blockIndex) => {
                let blockExceeded = false;
                let blockLines = 0;
                let blockExceededLines = 0;
                
                block.forEach(line => {
                    blockLines++;
                    if (line.exceeded) blockExceededLines++;
                });
                
                if (blockExceededLines > 0) blockCount++;
                
                // Собираем полный текст блока для копирования
                const fullBlockText = block.map(line => line.original).join('\n');
                
                html += `
                    <tr class="block-separator">
                        <td colspan="3"></td>
                    </tr>
                    <tr class="summary-row ${blockExceededLines === 0 ? 'normal-row' : ''}">
                        <td colspan="3">
                            <div class="block-actions">
                                <span>Блок ${blockIndex + 1}: ${blockLines} строк, ${blockExceededLines} превышений</span>
                                <button class="copy-block-btn" onclick="copyBlockText(${blockIndex})" title="Копировать весь блок">Копировать</button>
                            </div>
                        </td>
                    </tr>
                `;
                
                block.forEach((line, lineIndex) => {
                    const maxLen = parseInt(document.getElementById('maxLength').value);
                    const safeText = escapeHtml(line.original);
                    const safeCleaned = escapeHtml(line.cleaned);
                    
                    let highlighted = safeCleaned;
                    if (line.exceeded) {
                        highlighted = `<span class="valid-part">${safeCleaned.substring(0, maxLen)}</span>` +
                                       `<span class="excess-part">${safeCleaned.substring(maxLen)}</span>`;
                    }
                    
                    html += `
                        <tr class="${line.exceeded ? 'exceeded' : 'normal-row'} editable" 
                            id="row-${blockIndex}-${lineIndex}"
                            data-block="${blockIndex}"
                            data-line="${lineIndex}"
                            onclick="startEditLine(this, ${blockIndex}, ${lineIndex})">
                            <td>
                                <span class="line-number">Блок ${blockIndex + 1}, строка ${lineIndex + 1}</span>
                                <pre>${highlighted}</pre>
                            </td>
                            <td>${line.length}</td>
                            <td>${line.exceeded ? `+${line.diff}` : ''}</td>
                        </tr>
                    `;
                });
            });
            
            html += `
                    </tbody>
                </table>
            `;
            
            output.innerHTML = html;
        }
        
        function copyBlockText(blockIndex) {
            const blockText = allResults[blockIndex].map(line => line.original).join('\n');
            navigator.clipboard.writeText(blockText).then(() => {
                // Визуальная обратная связь
                const buttons = document.querySelectorAll('.copy-block-btn');
                const originalText = buttons[blockIndex].textContent;
                buttons[blockIndex].textContent = 'Скопировано!';
                buttons[blockIndex].style.backgroundColor = '#2ecc71';
                
                setTimeout(() => {
                    buttons[blockIndex].textContent = originalText;
                    buttons[blockIndex].style.backgroundColor = '#95a5a6';
                }, 2000);
            }).catch(err => {
                console.error('Ошибка копирования: ', err);
                alert('Не удалось скопировать текст');
            });
        }
        
        function startEditLine(rowElement, blockIndex, lineIndex) {
            // Если уже в режиме редактирования - игнорируем клик
            if (rowElement.querySelector('.edit-textarea')) return;
        
            const lineData = allResults[blockIndex][lineIndex];
            const originalContent = rowElement.innerHTML; // Получаем исходный HTML
        
            // Сохраняем исходный HTML в data-атрибут
            rowElement.setAttribute('data-original-content', originalContent);
        
            rowElement.classList.remove('editable');
            rowElement.innerHTML = `
                <td colspan="3">
                    <span class="line-number">Блок ${blockIndex + 1}, строка ${lineIndex + 1}</span>
                    <textarea class="edit-textarea" id="edit-${blockIndex}-${lineIndex}">${escapeHtml(lineData.original)}</textarea>
                    <div class="edit-buttons">
                        <button class="edit-button save-button" onclick="saveEditedLine(this, ${blockIndex}, ${lineIndex})">Сохранить</button>
                        <button class="edit-button cancel-button" onclick="cancelEditLine(this, ${blockIndex}, ${lineIndex})">Отмена</button> 
                    </div>
                </td>
            `;
        
            // Фокусируем textarea и устанавливаем курсор в конец
            const textarea = rowElement.querySelector('.edit-textarea');
            textarea.focus();
            textarea.selectionStart = textarea.selectionEnd = textarea.value.length;
        
            // Остановка всплытия события, чтобы не срабатывали другие обработчики
            event.stopPropagation();
        }
        
        function saveEditedLine(button, blockIndex, lineIndex) {
            const rowElement = button.closest('tr');
            const textarea = rowElement.querySelector('.edit-textarea');
            const newText = textarea.value;
            
            // Обновляем данные в allResults
            allResults[blockIndex][lineIndex].original = newText;
            allResults[blockIndex][lineIndex].cleaned = cleanText(newText);
            
            // Пересчитываем длину и превышение
            const maxLength = parseInt(document.getElementById('maxLength').value);
            const cleaned = allResults[blockIndex][lineIndex].cleaned;
            const length = cleaned.length;
            
            allResults[blockIndex][lineIndex].length = length;
            allResults[blockIndex][lineIndex].exceeded = length > maxLength;
            allResults[blockIndex][lineIndex].diff = Math.max(0, length - maxLength);
            
            // Перерисовываем только эту строку
            updateSingleRow(rowElement, blockIndex, lineIndex);
            
            // Обновляем статистику
            updateStats();
            
            // Остановка всплытия события
            event.stopPropagation();
        }
        
        function cancelEditLine(button, blockIndex, lineIndex) {
            const rowElement = button.closest('tr');

            // Получаем исходный HTML из data-атрибута
            const originalContent = rowElement.getAttribute('data-original-content');

            if (originalContent !== null) { 
                 rowElement.innerHTML = originalContent;
                 rowElement.classList.add('editable');
                 // Удаляем data-атрибут после использования
                 rowElement.removeAttribute('data-original-content');
            } else {
                 console.error("Не удалось восстановить оригинальное содержимое строки.");
                 // В качестве запасного варианта, можно попробовать перерисовать строку из данных
                 // updateSingleRow(rowElement, blockIndex, lineIndex); 
            }

            // Остановка всплытия события
            event.stopPropagation();
        }
        
        function updateSingleRow(rowElement, blockIndex, lineIndex) {
            const lineData = allResults[blockIndex][lineIndex];
            const maxLen = parseInt(document.getElementById('maxLength').value);
            const safeText = escapeHtml(lineData.original);
            const safeCleaned = escapeHtml(lineData.cleaned);
            
            let highlighted = safeCleaned;
            if (lineData.exceeded) {
                highlighted = `<span class="valid-part">${safeCleaned.substring(0, maxLen)}</span>` +
                               `<span class="excess-part">${safeCleaned.substring(maxLen)}</span>`;
            }
            
            rowElement.className = lineData.exceeded ? 'exceeded editable' : 'editable';
            rowElement.setAttribute('onclick', `startEditLine(this, ${blockIndex}, ${lineIndex})`);
            rowElement.innerHTML = `
                <td>
                    <span class="line-number">Блок ${blockIndex + 1}, строка ${lineIndex + 1}</span>
                    <pre>${highlighted}</pre>
                </td>
                <td>${lineData.length}</td>
                <td>${lineData.exceeded ? `+${lineData.diff}` : ''}</td>
            `;
            
            // Обновляем навигацию по превышениям без автоматического перехода
            initNavigation(false);
        }
        
        function updateStats() {
            const maxLength = parseInt(document.getElementById('maxLength').value);
            displayStats(allResults, maxLength);
        }
        
        function toggleNormalRows() {
            isCollapsed = !isCollapsed;
            const table = document.getElementById('resultsTable');
            if (table) {
                table.classList.toggle('collapsed', isCollapsed);
            }
            document.querySelector('.toggle-normal').textContent = 
                isCollapsed ? 'Показать все строки' : 'Скрыть нормальные строки';
        }
        
        function initNavigation(shouldNavigate = true) {
            exceededElements = Array.from(document.querySelectorAll('.exceeded'));
            updateCounter();
            
            if (exceededElements.length > 0) {
                document.getElementById('navBar').classList.add('visible');
                if (shouldNavigate && currentExceededIndex === -1) {
                    navigateExceeded(1); // Перейти к первому превышению
                }
            } else {
                document.getElementById('navBar').classList.remove('visible');
                currentExceededIndex = -1;
            }
        }
        
        function navigateExceeded(direction) {
            if (exceededElements.length === 0) return;
            
            // Снять выделение с текущего элемента
            if (currentExceededIndex >= 0 && currentExceededIndex < exceededElements.length) {
                exceededElements[currentExceededIndex].classList.remove('highlight');
            }
            
            // Вычислить новый индекс
            let newIndex = currentExceededIndex + direction;
            
            if (newIndex < 0) {
                newIndex = exceededElements.length - 1;
            } else if (newIndex >= exceededElements.length) {
                newIndex = 0;
            }
            
            currentExceededIndex = newIndex;
            
            // Применить выделение к новому элементу
            exceededElements[currentExceededIndex].classList.add('highlight');
            
            // Прокрутить к элементу
            exceededElements[currentExceededIndex].scrollIntoView({
                behavior: 'smooth',
                block: 'center'
            });
            
            updateCounter();
        }
        
        function updateCounter() {
            const counter = document.getElementById('counter');
            if (exceededElements.length > 0) {
                counter.textContent = `${currentExceededIndex + 1}/${exceededElements.length}`;
            } else {
                counter.textContent = '0/0';
            }
            
            // Обновить состояние кнопок
            document.getElementById('prevButton').disabled = exceededElements.length === 0;
            document.getElementById('nextButton').disabled = exceededElements.length === 0;
        }
        
        function escapeHtml(unsafe) {
            if (!unsafe) return '';
            return unsafe
                .replace(/&/g, "&amp;")
                .replace(/</g, "&lt;")
                .replace(/>/g, "&gt;")
                .replace(/"/g, "&quot;")
                .replace(/'/g, "&#039;");
        }
        
        function saveAllText() {
            // Собираем все строки из всех блоков
            let fullText = '';
            
            allResults.forEach((block, blockIndex) => {
                block.forEach((line, lineIndex) => {
                    fullText += line.original;
                    // Добавляем перенос только если это не последняя строка в блоке
                    if (lineIndex < block.length - 1) {
                        fullText += '\n';
                    }
                });
                // Добавляем перенос между блоками, но не после последнего блока
                if (blockIndex < allResults.length - 1) {
                    fullText += '\n';
                }
            });
            
            // Создаем Blob с текстом
            const blob = new Blob([fullText], { type: 'text/plain;charset=utf-8' });
            
            // Создаем временную ссылку для скачивания
            const url = URL.createObjectURL(blob);
            const a = document.createElement('a');
            a.href = url;
            a.download = 'edited_text.txt';
            
            // Добавляем ссылку в документ и эмулируем клик
            document.body.appendChild(a);
            a.click();
            
            // Удаляем ссылку и освобождаем память
            setTimeout(() => {
                document.body.removeChild(a);
                URL.revokeObjectURL(url);
            }, 100);
        }
    </script>
</body>
</html>

 

Сохраните код на рабочий стол в какой-нибудь index.html и открывайте в любом браузере.

  • +1 1

Поделиться сообщением


Ссылка на сообщение

@0wn3df1x мне говорили, что вроде есть плагин, но не факт, что он подойдёт для моей версии, что за плагин и где взять не сказали,  спасибо за выше скрипт, он работает, но есть одна проблема, что он сохраняет в txt и если я выделю, тот текст который там 6126 строк и вставлю, не прокатит, потому-что структура у проги аля excel, то есть колонки, а их всего 4358.
Мне тут чатгпт написал код для редактирования excel, вроде работает, посмотрел по твоему скрипту и говорит идеально 61 символ, щас попробую в этом коде поменять на 61

Поделиться сообщением


Ссылка на сообщение
3 минуты назад, Chillstream сказал:

@0wn3df1x мне говорили, что вроде есть плагин, но не факт, что он подойдёт для моей версии, что за плагин и где взять не сказали,  спасибо за выше скрипт, он работает, но есть одна проблема, что он сохраняет в txt и если я выделю, тот текст который там 6126 строк и вставлю, не прокатит, потому-что структура у проги аля excel, то есть колонки, а их всего 4358.
Мне тут чатгпт написал код для редактирования excel, вроде работает, посмотрел по твоему скрипту и говорит идеально 61 символ, щас попробую в этом коде поменять на 61

Мой скрипт заточен под форматирование из Google-таблиц (в экселе должна быть та же система).

То есть, допустим, в таблице могут быть две ячейки

Первая ячейка в одну строку
Вторая ячейка
в двух строках


Когда мы копируем текст из таблицы в буфер обмена, то мы получаем эти строки в таком виде:

Первая ячейка в одну строку
"Вторая ячейка
в двух строках"


Т.е. при копировании в буфер обмена у второй ячейки, внутри которой было две строки, в начале и в конце добавилась кавычка. Таким образом Google-таблицы и Excel понимает, что при вставке
”Первая ячейка в одну строку” — пойдёт в первую ячейку
А
”Вторая ячейка
в двух строках”
Пойдёт в следующую ячейку в цельном виде. Если бы не было кавычек, вместо двух ячеек получилось бы три ячейки с тремя строками.
 



А так всё от той программы для реимпорта зависит.
Если в неё нельзя вставить текст целиком, можно править и вставлять исправленное построчно. 

Поделиться сообщением


Ссылка на сообщение

оказывается реально работает такой перенос, буду знать.

если сегодня получится доделать текст, сюда заливать русификатор без тестирования, мне кажется плохая идея. так что либо я сам поиграю, либо дам кому-нибудь поиграть и знакомых и посмотрю.

  • +1 3

Поделиться сообщением


Ссылка на сообщение
10 часов назад, Chillstream сказал:

Короче тестеров особо не нашлось, я сам лично устал его делать), я так побегал, вроде играется) надо уже более глубоко, кто поиграет сказать, какие есть ошибки. В игре некоторые слова будут на английском, это звуки, но могут встретится и не переведенные реально слова, напишите когда наберется исправлю. и насчет ошибок мешающим прохождение, вдруг такое будет.
pRQIlWp.png

ipHtrmT.png

9w4j7d6.png
@SerGEAnt скачать русификатор: https://workupload.com/file/KkQa47UUD22 

установка: кинуть data и font в папку игры где .exe

Некоторые вещи при подъеме их откуда либо почему то не имеют русского перевода. К примеру подобрав из мусорки Cheeze stix(не переведено, но вроде бы озночает Сырные палочки) они пишутся на английском а в инвентаре написанны по русски.

 

Поделиться сообщением


Ссылка на сообщение

То что пока бросается в глаза и мой вариант для исправления

Подвеска для зубов - Подвеска из зубов
Батончик мюсли - Мюсли батончик
Опыт за бой отображается странно “30 получено ОПТ %”
Пистолетная пуля - Патрон для пистолета
Гильза от дробовика - Патрон для Дробовика
Старая игровая приставка - Консоль прошлого поколения
Старинная игровая приставка - Ретро консоль
"Спиртовая" доска - Спиритическая доска
Цвет игрового идентификатора - Портативная консоль
Покраска - Сумка для холста
Сморщенная голова - Сушеная голова
Ртутный диск - Диск "Меркурий"
Фигура Армейского парня - Солдатик
Коробка сока - Банка Апельсиновой колы
Банка Лимонного напитка - Банка Лимонада
Карамель - Конфетка
Батончик Гранулы - Батончик “Козинак”

Поделиться сообщением


Ссылка на сообщение

Старая газета. С тех пор как это началось. - Старая газета. До момента, как всё это началось.
Кажется, она застряла. Вы не можете её открыть. - Похоже её заклинило. Ты не можешь её открыть.
Он заклинило. Вы не можете её открыть. - Похоже её заклинило. Ты не можешь её открыть.
Винтовочная пуля - Патрон для винтовки
Пуля малого калибра для SMG - Патрон для ПП
Банка из-под колы - Банка Колы
Энергетический напиток - Энергетик
Тонизирующее средство - Тоник
Клейкая лента - Скотч
 

Поделиться сообщением


Ссылка на сообщение

нормально ты тут написал), насчет опыта я заметил, но не нашел где исправлять, насчет сырных палочек вроде я оставил английский вариант, например в начале есть подбор в комнате на английском, это красный тег, нельзя переводить, остальное гляну.

Изменено пользователем Chillstream
  • +1 1

Поделиться сообщением


Ссылка на сообщение

Здравствуйте! Наткнулся на такие баги: нельзя передать товарищу в маске что-то покушать. Меню с выбором еды пустое  2. После победы над копией художника (той, которая атакует при разговоре) выскакивает ошибка  (не может найти какой-то файл пнг)

Поделиться сообщением


Ссылка на сообщение

@Malkovichi вот я и боялся, что такое выскочит, скинь скрин на че жалуется, насчет нельзя дать покушать, вот тут я честно не знаю даже где исправлять скинь сейв и диалог посмотрю может там чёто нарушено.

@CoffeeD  насчёт переводов сверху, почему juice box это апельсиновый сок? или painting — сумка для холста?

Изменено пользователем Chillstream

Поделиться сообщением


Ссылка на сообщение

так выше исправил текст и у меня есть мысля изза чего все ломается.

Поделиться сообщением


Ссылка на сообщение

Сейчас восстановлю, гляну. Просто я помню, что я брал orange cola can

Всё я понял. Перевод каким-то макаром поменял иконку. Там действительно “Сок” (но он апельсиновый =))

Ещё один момент. Полосы хп, выносливости и патронов, имеют длинну в соотношении слов. 

image.png

Когда там было слово “Патроны”  (или что там было не помню). Полоски были в 1 мм.

Может быть записать как “ХП” “ВНС” “ПТРН”?

Да, это действительно “Картина”. т.е. после использования Сумки для холста. Ну и Покраска в — Картину исправить =)

Поделиться сообщением


Ссылка на сообщение

да я просто думаю, как так, вроде написано Juice Box и еще момент, насчет приставок, там написано

Old game Console если мы переводим — консоль прошлого поколения
A very old game console. The controllers resemble TV remotes.  — тогда тут “очень старая консоль прошлого поколения?”

/console

птрн исправил, мне нужен какой нить баг, понять суть, где ошибка происходит, насчет вын и оз нормально же, я везде исправил где видел, а так придётся опть весь текст менять обратно на хп) 

Изменено пользователем Chillstream

Поделиться сообщением


Ссылка на сообщение

Мб “Консоль прошлого поколения” и “Винтажная консоль”?

Поделиться сообщением


Ссылка на сообщение

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: SerGEAnt
      The Dark Pictures: House of Ashes

      Метки: Решения с последствиями, Хоррор, Несколько концовок, Хоррор на выживание, Психологический хоррор Платформы: PC XONE PS4 Разработчик: Supermassive Games Издатель: Bandai Namco Games Серия: The Dark Pictures Дата выхода: 22 октября 2021 года Русский язык: Интерфейс, Озвучка, Субтитры Отзывы Steam: 6037 отзывов, 88% положительных
    • Автор: SerGEAnt
      The Legend of Nayuta: Boundless Trails

      Метки: Ролевая игра, Ролевой экшен, Японская ролевая игра, Слэшер, Аниме Платформы: PC PS4 SW Разработчик: Nihon Falcom, PH3 Издатель: NIS America Серия: The Legend of Heroes Дата выхода: 11 декабря 2021 года Отзывы Steam: 144 отзывов, 93% положительных

  • Продвигаемые темы

  • Последние сообщения

    • @SaimonFinix в моём переводе уже готовы. Как закончу с неписями и переносом строк, так выложу и здесь тоже.
    • Релиз текстового перевода демо версии "Соник и Мировые кольца"! С радостью сообщаем, что проект всё ещё в активной разработке и Вы можете уже пощупать наши старания в данной демке.
      Игра запускается без проблем как на эмуляторе, так и на прошитых консолях. Внутри вас ожидает приятный сюрприз!
      Скачать можно в нашей группе ВК или в ТГ канале! ⚡Напоминаем, что при поддержке от 500 руб, вы попадëте в титры игры, на которые мы делаем полный дубляж.
      А поддержать можно как раз "Соник и Мировые кольца" вместе с "Соник и Тёмный рыцарь", а также "Sonic Heroes", "Shadow The Hedgehog" и "Соник Бум - Восстание Лирика".⚡ Ссылку можете увидеть в нашей группе ВК.  
    • После выбора: Новая игра — Выбор сложности — Пустые строчки, хотя должно отображать (Новая игра или Новая игра с преимуществом)     Original: New game или New game - Head Start    При выборе дополнения Интермиссия аналогично      Original: New game или New game - Head Start    
    • Ремастер это оригинал который подчистили, подправили, может подкорректировали что то что посчитали неуместным. Случай ГТА Триллгия и Обливион это тоже ремастер. Они просто оригинал конвертнули или поверх оригинала надели костюмчик. Но это все еще оригинал с чисткой шероховатостей Ремейк может быть дословным или переосмыслением. Когда с нуля пересобирали идею. Например Сони следала дословный ремейк Одних из нас. Все с нуля перерисовали и создали. Да, это можно назвать ленивым/безопасным ремейком, но все же ремейк. Хотя без сомнений РЕ2,3,4 куда ближе к понятию полноценного ремейка. 
    • А что с ним? Его разработали заново с нуля, с полной переозвучкой всех диалогов и переработкой механик? Угу, не хватило ЕА.
    • что именно? поясни, если ошибся я, признаю, не проблема… верно не будет, потому как ты сам выше пишешь другое… зачем что-то подгонять под “удобное”? переосмысление игры \ механик — ремейк. поднять чуть картинку (текстуры) и добавить совместимость — ремастер. зачем усложнять и добавлять путаницу? как быть в такой логике с Oblivion? =) я так же бэклоги закрываю старые, и то, что было интересно 10 лет назад, уже играется не так интересно… а старые игры, которые мне нравились много лет назад, я стараюсь не трогать, пусть в памяти они будут — великолепными но не достаточно, что бы убедить компанию продолжить... и вновь Oblivion… =) просто как пример
    •   Так всё же кто-то из Dogubomb , или сам Tonda Ros ответил вам ?  И я бы посмотрел на локализацию двух текстур географических карт в Classroom’e Grade 4 )
    • Мне тоже геншин вообще не понравился. А эта норм. Ну тут бюджет просто влитый нереально. 4 качественных озвучки, практически на каждый диалог, даже на доп миссии. Качественные анимации, персонажи у которых 80000-100000 полигонов.  Дизайн локаций и оптимизации это прямо моё почтение. То что ты видел на скрине, это не просто вид на несуществующие обьекты как в экспедиции 33, это все реально локация по которой походить можно. И при этом фпс стремится в небеса. При этом там нет коридоров, и маршруты путешествий ты можешь менять сам. Ты практически в любом месте локации можешь построить зиплайн, и путешествовать катаясь по троссам, где нельзя пройти пешком. Так же в игре есть полноценный режим из игры “факторио”. Есть элементы из дарксоулса где игроки тебе могут оставлять послания на земле, что типо “Впереди, Прыжок, То что надо”. Типо там впереди есть скрытый вкусный лут. Так же от других игроков у тебя на локации могут появляться чужие зиплайны и турели. Например хочешь закрыть “разлом”, там могут стоять как чужие турели тебе в помощь, так и свои собственные можешь поставить у меня конечно необходимости не было в этом, я прокачал Чэнь Цяньюй так что она всех выносит), в игре саундтрек как из масс эффекта, куча разных пазлов. Там даже есть русский мужик “Ok let us start operation УТЮГ!” Что забавно, там есть перевод русских слов на русский. Утюг, там перевели как “прижигание” хД. Вот что плохо сделано это сюжет, и второстепенные персонажи. Сюжет тянут, ну потому что рассчитывают в долгую тянуть проект. Второстепенных персонажей которые выделяются мало, а вот невзрачных которые не выделяются никак целая толпа. Это прямо беда всех проектов, до сих пор от этого никак не уйдут. Донат как я уже выше писал, никак не влияет ни на прокачку персонажей, ни на режим фактории, ни на сюжет...я не донатил ничего, и практически прошел игру, у меня всегда персонажи на максимально возможной прокачке были. Ну если ты конечно не решишь качать вообще всех возможных персонажей в игре, даже которых ты использовать не будешь, тогда да, тебе не хватит ресурсов.
    • Пока не знаем, смотря что будет готово раньше — локализация или финальный апдейт игры.
    • Адаптировал перевод под крайнюю версию v1.1.4.7863 (Билд 21345112) от 30 Декабря 2025  https://disk.yandex.ru/d/NJX7H9OEj0L6Vg Копировать по пути: Grimlord\Content\Paks.
  • Изменения статусов

    • TerryBogard  »  Siberian GRemlin

      C&C: RA: Retaliation (ПК) не работает.
      · 0 ответов
    • Алекс Лев  »  SerGEAnt

      Привет, Сержант. Прошу разрулить ситуэйшн и урезонить некоторых людей, оскорбивших мою личность. Пожалуйста, для этого прочтите нашу переписку с Ленивым. Примите меры, будьте добры, мною составлена бумага, ждущая вашей электронной подписи, для подачи её в суд. Если не желаете судебных разборок (а я пойду дальше, если меры не будут приняты), оскорбившие меня люди должны понести необходимое по вашему же Договору наказание. Спасибо.
      · 1 ответ
    • Antony1203  »  SerGEAnt

      Добрый вечер! С Новым Годом. Нашел на просторах сети русскую озвучку Halo Infinite, которая отсутствует на моем любимом сайте  Протестил. Все работает. Подскажите, как можно передать? Спасибо.
      · 2 ответа
    • Albeoris

      Демка вышла. Работаем.
      · 0 ответов
    • maddante665  »  parabelum

      https://disk.yandex.ru/d/A7W9aHwW7wLTjg
      ссылка на торрент , в нем архив с игрой.
      единстенное в геймпасее папка TotalChaos_Data так, а в стиме Total Chaos_Data, но если пробел убрать в архиве с ркссификатором все равно не работает, ломаются надписи , просто прозрачные. я пробовал только текст .
      · 1 ответ
  • Лучшие авторы


Zone of Games © 2003–2026 | Реклама на сайте.

×