BookTranslator
BookTranslator

Come tradurre un file TXT di grandi dimensioni: codifica, capitoli e interruzioni di riga

Correggi la codifica, contrassegna i capitoli e rimuovi le interruzioni di riga fisse prima di tradurre un lungo file .txt. Con file di esempio, un verificatore gratuito e un test su 9 esecuzioni.

BookTranslator

BookTranslator Team

17 min di lettura

Per tradurre un file TXT di grandi dimensioni, prepara tre cose prima di caricarlo ovunque. Primo, assicurati che il testo sia decodificato correttamente e salvalo come UTF-8. Secondo, metti ogni titolo di capitolo su una riga a sé, con una riga vuota prima e dopo. Terzo, se il file va a capo a larghezza fissa, unisci quelle righe in modo che ogni paragrafo sia una sola riga, con una riga vuota tra i paragrafi. Poi traduci l'intero file e, successivamente, confronta il numero di paragrafi e di capitoli tra l'originale e la traduzione.

Un file di testo semplice non ha stili, né intestazioni, né metadati. Tutto ciò che uno strumento di traduzione sa sulla sua struttura deriva dai byte e dalle interruzioni di riga. Ecco perché gli stessi tre problemi continuano a ripresentarsi: i byte vengono letti con la codifica sbagliata, i capitoli non si distinguono dalle righe normali, oppure le interruzioni di riga non dicono nulla su dove finisce una frase.

Abbiamo creato file di esempio in quattro codifiche, scritto un verificatore gratuito e tradotto un racconto breve con interruzioni di riga fisse in cinese semplificato nove volte con un modello locale. Il modello ha gestito bene le interruzioni fisse quando vedeva l'intero file. Ha spezzato le frasi e attribuito l'azione di un personaggio a un altro in tutte e tre le esecuzioni in cui il file era stato suddiviso in parti in base al numero di righe.

Lista di controllo rapida

ControlloCome deve apparireCome risolvere
CodificaLe prime righe si leggono correttamente; il file è UTF-8Riapri con la codifica corretta, poi salva come UTF-8
Byte order markNessuno, o uno di cui sei a conoscenzaSalva come "UTF-8" anziché "UTF-8 con BOM" se uno strumento dà problemi
Titoli dei capitoliOgnuno da solo su una riga, con una riga vuota prima e dopoCorreggi i pochi titoli che si fondono con il testo
ParagrafiUna riga vuota tra i paragrafiAggiungi righe vuote dove i paragrafi iniziano solo con un rientro
Interruzioni di riga fisseOgni paragrafo è una sola riga lungaUnisci le righe all'interno dei paragrafi, ma lascia stare versi, lettere ed elenchi
Fine rigaUno stile uniformeConverti le vecchie terminazioni CR del Mac; LF e CRLF vanno bene entrambe
Testo danneggiatoNessun carattere �Procurati una copia migliore. La conversione non può recuperare i caratteri persi

Il checker riporta ogni riga e corregge la codifica, il byte order mark, le terminazioni di riga e l'a capo forzato. I titoli dei capitoli e le righe vuote mancanti spetta a te sistemarli a mano. Esegui python3 check_txt.py inspect yourfile.txt per vedere il report, e python3 check_txt.py convert yourfile.txt clean.txt --unwrap per scrivere una copia UTF-8 con i paragrafi uniti. Richiede solo Python 3 e non modifica mai il file originale.

Passo 1: Imposta correttamente la codifica

Un file TXT è una sequenza di byte. La codifica è la regola che trasforma quei byte in caratteri, e il file non dice quale regola sia stata usata. Se un programma indovina male, ottieni mojibake: testo illeggibile o, peggio, testo che sembra a posto ma non è ciò che era stato scritto.

Ecco la stessa frase cinese, 最后一班渡轮 ("l'ultimo traghetto"), letta con la regola sbagliata. Le abbiamo generate con i codec integrati di Python, e puoi riprodurle con i file di esempio.

Salvato comeLetto comeCosa vedi
GB18030Windows-1252×îºóÒ»°à¶ÉÂÖ
GB18030UTF-8���һ�����
UTF-8GBK鏈�鍚庝竴鐝�娓¤疆
Shift_JIS (giapponese 最後のフェリー)GBK嵟屻偺僼僃儕乕

L'ultima riga è quella pericolosa. I byte giapponesi letti come cinesi producono veri caratteri cinesi, senza errori e senza �. Uno strumento di traduzione li tradurrà volentieri, e il risultato sarà un nonsenso con una buona grammatica.

Il nostro checker mostra perché non puoi fidarti di "si è aperto senza errori". Quando lo abbiamo eseguito sul campione Shift_JIS, due codifiche hanno decodificato l'intero file senza un solo errore:

encoding: unknown (not UTF-8)
these legacy encodings decode without errors; read the previews,
because a wrong one can still produce real-looking characters:
  gb18030  戞堦榖丂嵟屻偺僼僃儕乕
  cp932    第一話 最後のフェリー

Solo la seconda riga è giapponese. La prima è una sequenza di rari caratteri cinesi che nessuno ha scritto. Sul campione cinese GB18030, cinque codifiche hanno decodificato senza errori, e solo una di esse, GB18030, mostrava il titolo del capitolo 第一章 最后一班渡轮. Quindi la regola è semplice: decidi la codifica leggendo le prime righe, non in base al fatto che un programma si sia lamentato.

Dove di solito si sbagliano le ipotesi:

  • Il testo cinese proveniente da vecchi sistemi Windows o da siti cinesi è spesso in GBK o GB18030. GB18030 copre tutto ciò che copre GBK, e lo Standard di codifica WHATWG, seguito dai browser, va oltre: afferma che "il decoder di GBK è il decoder di gb18030". Se un file è in GBK, aprirlo come GB18030 funziona.
  • Il cinese tradizionale di Taiwan o Hong Kong è spesso in Big5.
  • Il giapponese è spesso in Shift_JIS, o nella versione estesa di Microsoft, che Windows e Python chiamano cp932.
  • Il coreano è spesso in EUC-KR.
  • Un file pieno di byte NUL, o uno in cui ogni altro carattere sembra vuoto, è di solito UTF-16 senza byte order mark.

Un byte order mark (BOM) è un breve codice invisibile all'inizio di un file che annuncia UTF-8, UTF-16 o UTF-32. Quando è presente, fidati di esso. Lo stesso standard afferma che "il byte order mark è più autorevole di qualsiasi altra cosa". Il nostro checker legge prima il BOM e indovina solo quando non c'è.

Salva il file come UTF-8

Una volta che il testo si legge correttamente, salvalo come UTF-8. Lo standard WHATWG chiama UTF-8 "la codifica più appropriata per lo scambio di Unicode", ed è la scelta più sicura per qualsiasi strumento di traduzione.

C'è una seconda ragione che conta in particolare per la traduzione. Le codifiche legacy coprono solo i caratteri della propria regione. Shift_JIS non ha un codice per 这, il primo carattere di 这是最后一班渡轮, e nemmeno Big5 ce l'ha, perché è un carattere cinese semplificato. Windows-1252 non può memorizzare il cirillico. Se il file tradotto deve essere riscritto nella codifica legacy originale, la lingua di destinazione potrebbe non adattarsi. Il traduttore TXT di BookTranslator dichiara di rilevare automaticamente le codifiche comuni e di restituire il file tradotto "con la stessa codifica dell'input", quindi partire da UTF-8 elimina del tutto il problema.

Puoi convertire in un editor di testo (apri con la codifica giusta, poi "Salva come" UTF-8), con iconv -f GB18030 -t UTF-8 in.txt > out.txt su macOS o Linux, oppure con il checker:

python3 check_txt.py convert book.txt book-utf8.txt --encoding gb18030

Se il file contiene già caratteri �, il danno è avvenuto prima che lo ricevessi. Convertire di nuovo non ripristinerà i caratteri mancanti. Cerca una copia migliore della fonte.

Passo 2: Rendi i capitoli facili da trovare

I capitoli contano per tre motivi. Un file lungo viene tradotto a pezzi, e le interruzioni di capitolo sono i punti più puliti in cui tagliare. Vorrai controllare ogni capitolo dopo la traduzione. E se in seguito converti il testo in un ebook, i titoli dei capitoli diventano l'indice.

Metti ogni titolo su una riga separata, con una riga vuota prima e dopo, e usa lo stesso schema in tutto il libro. Questi sono gli schemi che il nostro checker conta:

  • Chapter 1, Chapter One: The Last Ferry, Part Two, Prologue, Epilogue
  • 第一章, 第12回, 第三話, 第二卷
  • un numero o un numero romano da solo su una riga, come 12 o XII.

Esegui inspect e leggi l'elenco dei titoli trovati. Se il libro ha 40 capitoli e il checker ne trova 37, tre titoli si nascondono: uno si fonde con la prima frase, uno usa una parola diversa come "Cap. 7", o uno ha del testo sulla stessa riga. Correggi quei tre a mano. Ci vuole meno tempo che trovare il problema in un file tradotto.

Passo 3: Rimuovi con attenzione gli a capo forzati

Alcuni file TXT vanno a capo a larghezza fissa, così che il testo stia in un terminale semplice o in una finestra stretta. Il testo copiato da PDF e l'output OCR fanno lo stesso alla larghezza della pagina stampata. In questi file un a capo significa "la riga era piena", non "la frase o il paragrafo è finito".

L'a capo forzato è facile da individuare. Nel nostro esempio con a capo forzati, il checker ha riportato:

non-empty lines: 43; longest line: 66 chars; 25 lines within 12 chars of the longest
line breaks inside paragraphs that do not end a sentence: 23
looks hard-wrapped: consider convert --unwrap

La soluzione è unire le righe all'interno di ogni paragrafo e mantenere le righe vuote tra i paragrafi. La trappola è il testo i cui a capo sono reali: versi, testi di canzoni, lettere, indirizzi, ricette ed elenchi. Il nostro esempio include una lettera di cinque righe:

My dear Mara,
The key is under the blue pot.
Do not let your uncle sell the boat.
With love, always,
Nonna

Un brusco "sostituisci ogni singolo a capo con uno spazio" la trasforma in un'unica riga continua. L'opzione --unwrap del checker unisce un paragrafo solo quando la maggior parte delle sue righe è vicina alla larghezza massima, quindi blocchi di righe corte come questa lettera vengono lasciati intatti. Sul nostro esempio ha ricostruito esattamente il file originale non impaginato, byte per byte, lettera inclusa. Sul tuo file, controlla alcuni paragrafi uniti e ogni blocco di versi prima di fidarti.

Altri due dettagli. Quando unisci righe di testo cinese o giapponese, non aggiungere uno spazio tra loro; il checker unisce le righe CJK, comprese quelle che terminano con punteggiatura CJK, senza spazio. E se il tuo testo proviene da OCR, le parole potrebbero anche essere spezzate con trattini alla fine delle righe, il che richiede decisioni a parte. La nostra guida per correggere gli a capo e la sillabazione da OCR tratta questo argomento.

Cosa abbiamo testato: testo con a capo forzati, intero vs. suddiviso

Volevamo sapere se l'hard wrapping danneggia davvero la traduzione o se si limita a renderla disordinata. Per il test abbiamo scritto un racconto di 396 parole: tre capitoli, quindici paragrafi, dialoghi, la lettera qui sopra e una separazione di scena * * *. L'abbiamo salvato due volte con le stesse parole: senza wrapping, con un paragrafo per riga, e con hard wrapping a 66 caratteri, che ha 43 righe non vuote invece di 19.

Poi abbiamo chiesto a un modello locale di tradurlo in cinese semplificato in tre modi, con tre esecuzioni ciascuno:

  1. Con wrapping, file intero. Il file con hard wrapping in un'unica richiesta.
  2. Senza wrapping, file intero. Il file senza wrapping in un'unica richiesta.
  3. Con wrapping, tagliato ogni 12 righe. Il file con hard wrapping suddiviso ogni 12 righe, una richiesta per pezzo, con le risposte ricongiunte. È quello che succede quando uno script o uno strumento divide un file lungo in base al numero di righe invece che ai paragrafi.

Il modello era Qwen 3.6 27B (Q4_K_M) in LM Studio, con il thinking disattivato e temperatura 0.3, su un Apple M4 Max con 64 GB di memoria. Ogni richiesta usava lo stesso prompt di una frase. L'abbiamo eseguito il 28 ottobre 2026. Lo script è run_llm_txt_test.py, tutti e nove gli output sono pubblicati senza modifiche e results.csv contiene una riga per esecuzione.

Con wrapping, file interoSenza wrapping, file interoCon wrapping, tagliato ogni 12 righe
Paragrafi mantenuti (15)3 su 3 esecuzioni3 su 3 esecuzioni0 su 3 (14 ogni volta)
Titoli dei capitoli mantenuti (3)3 su 33 su 33 su 3
Lettera mantenuta come cinque righe3 su 33 su 33 su 3
Frasi tagliate in un punto di divisione003 in ogni esecuzione
Azione attribuita al personaggio sbagliato003 esecuzioni su 3

La prima scoperta ci ha sorpresi. Quando il modello ha visto l'intero file con interruzioni rigide, ha unito le righe da solo. Tutti e tre gli output avevano un paragrafo per riga, le stesse 19 righe delle esecuzioni senza interruzioni, e si leggevano altrettanto bene. Quindi le interruzioni rigide da sole non hanno danneggiato questo modello su questo file breve.

Tagliare il file per numero di righe ha invece causato danni, sempre negli stessi punti. Tre dei pezzi da 12 righe finivano a metà frase. Il primo termina con "He pointed with his" e il pezzo successivo inizia con "pen at a three-storey building on the corner." Tradotta separatamente, la seconda metà ha perso il soggetto. In due esecuzioni è tornata come 她瞥了一眼街角那栋三层楼的建筑, "lei diede un'occhiata all'edificio di tre piani all'angolo." Nella terza, terminava con 随后她重新回到填字游戏上, "poi tornò al cruciverba." Nella storia, l'uomo nella biglietteria indica e torna al suo cruciverba. In tutte e tre le esecuzioni, un lettore del cinese penserebbe che sia stata Mara a farlo.

Il secondo taglio, tra "the careful, slightly old-fashioned hand she had learned at a" e "convent school," ha lasciato la frase cinese sospesa a 那是她在, "quello era dove lei," in tutte e tre le esecuzioni (una esecuzione ha aggiunto un 一 di troppo), e la parola "learned" è scomparsa. Il terzo taglio ha diviso la frase sulle imposte su due righe, e la seconda metà ha trasformato "painted, not well, but not long ago" in vernice scrostata: 油漆虽已斑驳 in due esecuzioni e 油漆剥落 nella terza. E poiché i pezzi sono stati uniti con un singolo a capo, la riga vuota prima della separazione di scena è svanita, ed è per questo che ogni esecuzione aveva 14 paragrafi invece di 15. Il nostro controllo ha rilevato il numero di paragrafi. Non ha potuto rilevare il carattere sbagliato; lo abbiamo scoperto leggendo.

Cosa significa questo per il tuo file:

  • Rimuovere le interruzioni rigide ti protegge da splitter che non controlli. Ogni file lungo viene diviso da qualche parte, che sia dal tuo script, dal limite di una finestra di chat o dallo strumento su cui carichi. Se i paragrafi sono righe singole separate da righe vuote, qualsiasi splitter ragionevole può tagliare tra i paragrafi invece che dentro una frase.
  • Gli errori peggiori erano fluenti. "She glanced at the building" è un buon cinese. Un lettore noterebbe gli strani a capo a ogni taglio e il 那是她在 sospeso, ma nulla segnala il carattere sbagliato o la vernice scrostata come errori. Gli errori nei punti di divisione sono prima errori di significato, poi di formattazione.
  • Questo era un modello e un racconto breve. Un file così breve sta in una singola richiesta, quindi le esecuzioni sull'intero file non hanno mai dovuto dividere nulla. Un romanzo completo deve invece essere diviso, ed è esattamente allora che la preparazione dei Passi da 1 a 3 dà i suoi frutti. Questi file testano la preparazione e la divisione, non la pipeline di BookTranslator.

Un'osservazione minore: nelle sei esecuzioni sull'intero file, il modello ha scritto il nome di Mara come 玛拉 in cinque e 马拉 in una. Ogni output era coerente con se stesso, ma richieste separate non concordavano tra loro. Per un libro lungo tradotto in molti pezzi, un elenco di nomi e delle loro grafie concordate mantiene ogni capitolo in linea. La nostra guida al glossario mostra come crearne uno.

Passo 4: Traduci, poi controlla i conteggi

Quando il file è pulito, tradurlo è la parte facile. Puoi caricarlo sul traduttore TXT di BookTranslator, che accetta file .txt, .md e .mdx, dichiara di gestire file TXT fino a 300 MB e mostra il prezzo prima del pagamento. Non esiste una traduzione completa gratuita, ma il caricamento stesso ti dice il costo. Se preferisci lavorare con un modello di chat o un LLM locale, dividi il file ai confini di capitolo o paragrafo e tieni un glossario per i nomi. Se il tuo testo è Markdown invece che prosa semplice, consulta la nostra guida alla traduzione Markdown, perché la sintassi Markdown richiede regole proprie.

Dopo la traduzione, confronta i due file:

python3 check_txt.py compare book-utf8.txt book-translated.txt

Se uno dei due file non è UTF-8, aggiungi --source-encoding o --translated-encoding. Il controllo dei capitoli riconosce i pattern di intestazione inglesi e cinesi/giapponesi; per altre lingue di destinazione, aggiungi la parola locale per "capitolo" al pattern all'inizio dello script.

Questo è il report per una delle nostre esecuzioni con tagli:

                            source  translated
paragraphs                      15          14  <- differs
chapter headings                 3           3
non-empty lines                 43          24  <- differs
scene breaks (* * *)             1           1
replacement chars                0           0
source script LATIN characters left in translation: 0

Leggilo così:

  • Paragrafi e intestazioni di capitolo dovrebbero corrispondere. Un paragrafo mancante spesso significa che due sono stati uniti o uno è stato eliminato.
  • Le righe non vuote possono differire per un buon motivo. Le nostre esecuzioni con interruzioni rigide sull'intero file sono passate da 43 righe a 19 perché il modello ha unito le righe con interruzioni rigide, il che è stato un miglioramento. Confronta le righe solo quando l'originale era già senza interruzioni.
  • Caratteri della scrittura di origine rimasti indicano passaggi non tradotti affatto. Alcuni sono normali per nomi, termini di prodotto o citazioni; una serie di essi è una sezione saltata.
  • Caratteri di sostituzione nella traduzione indicano un problema di codifica in uscita.

I conteggi non possono dirti se la traduzione è corretta. Leggi il primo e l'ultimo paragrafo di ogni capitolo, e i paragrafi su entrambi i lati di ogni punto in cui il file è stato diviso. È lì che il nostro test ha trovato ogni errore grave.

Domande frequenti

Perché il mio file TXT sembra a posto in un programma e illeggibile in un altro?

I due programmi hanno indovinato codifiche diverse. Uno ha indovinato giusto. Trova la codifica che mostra il testo correttamente, poi salva il file come UTF-8 in modo che ogni programma lo legga allo stesso modo.

Dovrei convertire un file TXT in EPUB o DOCX prima di tradurlo?

Solo se vuoi ciò che quei formati aggiungono. Un file TXT pulito con capitoli chiari si traduce bene così com'è. Se desideri un indice, la navigazione tra i capitoli e un ebook leggibile su un dispositivo, la nostra guida per trasformare una web novel in un EPUB pronto per la traduzione ti spiega come fare.

Posso tradurre un file TXT con più lingue?

Sì, ma indica al traduttore cosa lasciare invariato. Citazioni o termini in una terza lingua, e nomi che devono restare nella loro grafia originale, sono più facili da proteggere con un glossario o una breve istruzione che da correggere in seguito.

E un file TXT scaricato da un sito web?

Verifica di avere il diritto di usarlo. Per i libri di pubblico dominio o i file che hai scritto tu, valgono i passaggi precedenti. La codifica o il formato di un file non ti dicono nulla sul suo copyright.

Post Correlati