Перейти к содержимому
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

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Universal312

      Оригинальное название: Fall of Porcupine 
      Год выпуска:  15 июн. 2023
      Жанр: Приключение, Инди
      Разработчик:Critical Rabbit
      Выпущено: Assemble Entertaiment
      Язык: Английский, немецкий, французский
      -----------------------------------------------------------------------------------------------------------
      Системные требования:
      Минимальные:
      64-разрядные процессор и операционная система
      ОС:Windows 7 (64-битная)
      Процессор:Четырехъядерный процессор Intel i5
      Оперативная память:4 GB ОЗУ
      Видеокарта:Intel HD 4000
      DirectX: Версии 11
      Место на диске:6 ГБ
      -----------------------------------------------------------------------------------------------------------
      Об игре:
      Fall of Porcupine — это уникальное сюжетное приключение. Столкновение работы и повседневной жизни — захватывающее отражение нездоровой системы здравоохранения. Окунитесь в захватывающую историю Финли и его друзей в любовно иллюстрированном мире и раскройте самые мрачные тайны Дикобраза и его жителей

      Отправляйтесь в город Дикобраз и отправляйтесь в любимую жизнь Финли, нового неоперившегося врача, пополнившего ряды больницы святой Урсулы. По мере того, как времена года в маленьком городке меняются, и жизнь начинает бурлить, вы скоро поймете, что вещи не всегда такие, какими кажутся: не все честны с собой и другими, индустрия здравоохранения не так знаменита, как казалось в медицинской школы, и баланс между работой и личной жизнью, к которому стремится Финли, может быть недостижим.
      Исследуйте прекрасный и разнообразный мир
      Не только в старой больнице есть что открыть, но и в самом маленьком городке Дикобраз. Найдите время, чтобы встретиться с жителями деревни и выпить с ними пива в местном пабе, отправиться в близлежащий лес или провести время с друзьями.
      Закаленные профессионалы, милые друзья
      Туповатый главврач, самоотверженная медсестра, умные друзья Финли и многие другие жители населяют маленький городок Дикобраз. Участвуйте в забавных, глубоких, а иногда и серьезных диалогах, в которых вы сможете выбирать ответы и влиять на ваши отношения.
      Продемонстрируйте свои навыки и эмпатию
      У вас даже нет времени посмотреть на часы, потому что ваши пациенты ждут! Выясните, что с ними не так, во время разговоров и лечите их в различных мини-играх, которые бросают вам вызов логике, скорости и навыкам.
      Разоблачение социальной несправедливости и структурных проблем
      На первый взгляд, маленький городок — это теплое, дружелюбное место, где все знают и приветствуют друг друга. Но если вы проживете там какое-то время, вы заподозрите, что не все так честны, как притворяются, особенно в нездоровой системе здравоохранения.
      -----------------------------------------------------------------------------------------------------------









      Представляю Вашему вниманию очередную годноту-милоту!
      Однако как это обычно бывает, особенно в столько не простое время — в ней отсутствует локализация (хотя как мне кажется текста там не очень много). 
      Подумал, что может кого из переводчиков/студий заинтересует данный проект или они возьмут его себе на заметку.
      Обзоры в стиме — положительные! Там же сейчас можно поиграть и в демо-версию данной игры! 
    • Автор: 0wn3df1x
      Yet Another Killing Game

      Метки: Приключение, Визуальная новелла, Аниме, Тайна, Триллер Разработчик: Team YAKG Издатель: Jun Kakeru Дата выхода: 31.01.2025

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

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

    • Этодругин подъехал? Значит если часть книги напишет другой человек, то это отсебятина и книга без нее не потеряет своей полноты, а если часть игры делает другая команда то вы не понимаете этодругое? Вот тогда вам еще один пример, есть такая книга Рубеж от Г.Л.Олди (это псевдоним если вы не в курсе, под ним скрываются ажно 2 автора), так вот эта книга была своеобразным экспериментом где разные части книги написали разные люди, их там было пять человек насколько я помню. Единого руководства там не было, каждый писал как хотел и это очень хорошо видно. Но это не сборник разных историй это именно что одна цельная история. Книга кстати очень неплохая рекомендую, но по вашей логике это просто набор отсебятины выходит. И кстати какую ее часть стоит считать именно той самой полной книгой без отсебятины?  
    • Игра из раннего доступа по определению не может быть полной/завершенной версией. Сама концепция раннего доступа об этом говорит. Пример изначально порочен. 
    • Июль 2025, все ещё ждём...
    • Ты когда отвечаешь, ты другие посты читаешь?  Видимо нет. Полноценность обсуждает. А если у игры открытая концовка? Тебе так важны титры в конце, чтобы считать игру “полноценной?” ) В Hundred Line Akademy, есть полноценные руты, а есть руты, которые сделаны на отвали, они скипают время без безбожно, в них запрещены активности, и концовки просто галочка. Какая теперь игра где половина рутов нормальная, а половина нет? Полноценная? Нет? Еще один человек со мной субьективность обсуждает свою. Интересно почему. Из чего следует, что ты не ответил на вопрос. Есть версия где есть все DLC добавляющие и есть версия, где есть просто базовая версия без DLC. Какая версия полная? Та — в которой есть весь контент существующий.  Да я уже запарился повторять простую истину. Полная версия, та которая имеет весь существующий контент на данный момент.  Если контента нету, то у вас полная версия на руках. Не важно, что есть там в игре концовка или нет. Вообще не имеет никакого значения, закончена там сюжетка и есть ли там вообще сюжет. Полная версия просто включает в себя весь контент для игры. А не означает законченность сюжетной ветки. У некоторых игр к слову говоря вообще нет сюжета,как будешь их судить?) Ты как и некоторые тут люди говорят об огрызке не удовлетворяющим их ожидания по качеству продукта, а я все это время говорю про обьем. Потому что качество — субьективно. Какую прямоту, ты почему то только понимаешь реверсивную ситуацию, когда у тебя был контент и потом его отобрали — тогда ты понимаешь, что игра не полная у тебя. А в обратную сторону почему то никак. Представим что игра стартует в раннем доступе, с каждой новой версией добавляется контент в игру. У тебя версия 0.3 — сейчас доступна только 0.3. Игра не в релизе. Но у тебя на руках полная версия. У тебя версия 0.3 — сейчас доступна версия 0.7 Игра не в релизе. У тебя на руках уже не полная версия.  У тебя версия 0.7 — сейчас доступна версия 0.7 Игра не в релизе. У тебя на руках полная версия. У тебя на руках 0.7 версия - сейчас доступна 1.0. Игра в релизе. У тебя на руках не полная версия. У тебя на руках релизная версия. 1.0. — сейчас доступна версия 1.0. Игра в релизе. У тебя на руках полная версия. У тебя на руках релизная версия 1.0. — сейчас доступна версия 2.0. В которую разраб добавил новый бесплатный контент и выпустил  платные DLC. У тебя на руках не полная версия. У тебя на руках версия 2.0 со всеми DLC — сейчас доступна версия 2.0. В которую разраб добавил новый бесплатный контент и выпустил  платные DLC. У тебя на руках полная версия.   Понятно? Я прошел всю игру, причем я пересмотрел все сцены на английском и на том говне переводе, что тут выложили.  Я у тебя попросил показать текст, который сообщил тебе причину конфликта между сектантами. Ты не смог. Текста там такого нет. В английском их обвиняют в сговоре с врагом. В русском — нет ни слова про это. Но ты всё понял. Телепат не иначе. 
    • @Wiltonicol прошел пол игры на SWITCH и текст работает нормально за исключением некоторых косячков, из того что заметил.  - описание сейвов слишком мелкое, практически не читаемое - надписи на кнопках (например ПРИОСТАНОВИТЬ во время исследования) вылазит за кнопку - названия игр в КПК перестали отображаться после пары запусков
    • Второй сезон официально даже субтитрами не перевели.
    • не могу скачать русификатор. Нет кнопки скачать. Кто знает в чем причина? Любой русификатор не скачивается,просто нет кнопки скачать
    • Поделитесь русификатором, плиз)
    • там вроде стример Jesusavgn даже готов заплатить за перевод) может все-таки кто сможет?
    • Русификатор Persona5: The Phantom X @SerGEAnt
  • Изменения статусов

    • Дмитрий Соснов  »  Tirniel

      Привет! ты разбираешься в компьютерном железе, сможешь помочь с советом по апгрейду старого компа?
      · 1 ответ
    • SHAMAH

      Куда вход на сайт убрали и ЗАЧЕМ? Хотел файл скачать, там только медленная загрузка и “зарегистрируйтесь”. Все. Пришлось вручную страницу входа прописывать.
      · 0 ответов
    • Nosferatu  »  behar

      Добрый вечер.
      Подскажите пожалуйста, у вас не осталось случайно исходников для фикса на широкоформатные мониторы для игры Vampire The Masquerade Redemption?
      Если да, то не могли бы вы ими поделиться, а если нет, то прошу прощенья что побеспокоил.
      Заранее спасибо.
      · 0 ответов
    • AlcoKolyic  »  makc_ar

      Здраствуйте! Извините, а можно попросить ссылку на место где можно взять перевод (патч или образ игры с переводом) El Shaddai: Ascension of the Metatron для ps3, пожалуйста? А то в теме к этой игре у меня не получилось найти работающие ссылки… Первая ведет в группу в которой удалены большинство постов, а пост с этой игрой ведет на сайт https://psnext.ru который сейчас не имеет отношения к видеоиграм. 
      · 0 ответов
    • oleg72  »  Boor

      https://www.skidrowcodex.net/fate-reawakened-goldberg/
      · 0 ответов
  • Лучшие авторы


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

×