Я еще не пользовался Microsoft Translate, так что вы впереди меня в этом вопросе — хотя, полагаю, что в теории методы должны быть одинаковыми.
Мне нравится ваша идея с разбивкой по абзацам, но я не уверен, что стоит полагать, будто каждый документ использует окончания строк CR/LF. В Unix используется только символ LF, в старых версиях Mac — только CR, в Windows — оба. В других документах в качестве символа конца строки может использоваться нулевой байт.
Unicode тоже создаёт свои проблемы, поскольку каждый символ занимает два байта.
Возможное решение: проанализировать окончание строки в первых одном-двух предложениях, сохранить его как значение, а затем перед парсингом документа заменить все окончания строк на просто “\n”. После завершения обработки документа можно автоматически вернуть правильные окончания строк.
Один из методов — сканировать документ вперёд, пока не будет достигнут объём в 10 000 слов, а затем сканировать назад в поисках разрыва абзаца. Установить указатель начала (head-pointer) в начало текущего блока, сканировать вперёд и, найдя последний разрыв абзаца до отметки в 10 000 слов, установить указатель конца (tail-pointer). Вырезать этот блок, перевести его, переместить в итоговый документ, сдвинуть указатель начала на позицию указателя конца и продолжить.
==============================
Кстати, программное обеспечение для перевода часто оказывается ужасным, потому что перевод во многих случаях сильно зависит от контекста, содержит сленг или жаргон. То же самое касается технических терминов или слов, специфичных для определённой профессии или навыка, которые во многих случаях не должны переводиться, но при этом часто искажаются до неузнаваемости. Классическими примерами являются юридические, медицинские и инженерно-технические документы.
Я отправил сложный медицинский документ (операционный отчёт о операции на мозге) через два разных переводчика — Google и Яндекс — пытаясь перевести его на русский язык. Результат обоих переводов был больше похож на плохую лазанью, чем на читаемый документ!