VBA DetectLanguage для разделения разных языков различным цветом шрифта

Автор Посетитель, 02 сентября 2023, 23:33

Посетитель

Добрый день, гуру VBA макросов!

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

Спойлер
4.2.1.15   当汽机负荷从 100%甩至零时,汽轮机甩全负荷的最高飞升转速不超过危急保安器的动作转速,汽轮发电机组能自动降至同步转速,并自动控制汽轮机的转速,以防机组脱扣。
4.2.1.15   When the steam turbine load is switched from 100% to zero, the maximum speed of the steam turbine for full load rejection shall not exceed the operating speed of the emergency governor. The steam turbine generator unit can automatically reduce to the synchronous speed and automatically control the speed of the steam turbine to prevent the unit from tripping.
4.2.1.16   调节装置的性能满足如下要求:调节装置总的速度不等率应为 3~5%;局部速度不等率在 0 至 0.9,最大连续功率范围内为 3~8%,在 0.9 最大连续功率以上范围应不大于 12%;在 0.9 最大连续功率以上范围的平均局部速度不等率应不大于 10%;额定转速下调节器的死区应小于 0.06%。调节汽轮机,在 90~100%MCR 负荷范围内由任意调节门控制时,其平均不等率应不大于总不等率的 3 倍。
4.2.1.16   The performance of the regulating device shall meet the following requirements: the overall speed inequality rate of the regulating device shall be 3~5%;The local speed inequality rate is 0 to 0.9, the maximum continuous power range is 3 to 8%, and the range above 0.9 maximum continuous power should not be more than 12%;The average local speed difference rate above 0.9 maximum continuous power shall not be greater than 10%;The dead band of the regulator at rated speed shall be less than 0.06%.When nozzle regulating steam turbine is controlled by any regulating valve within 90~100% MCR load range, its average inequality rate shall not be more than 3 times of the total inequality rate.
4.2.1.17   在可能的不正常环境条件下或排汽装置、空冷岛发生故障,机组应能在高背压下、其最低负荷应不小于 (详见背压保护曲线) MW 下安全运行。卖方应说明在最高背压、最小容积流量的限制范围和负荷及时间上的限制。卖方还应提供机组在额定负荷下运行时允许的最大背压值 65 kPa(a)。
4.2.1.17   In case of possible abnormal environmental conditions or failure of steam exhaust device and air cooling island, the unit shall be able to operate safely under high back pressure and its minimum load shall not be less than ( refer to back
 

pressure protection curve for details)MW.The vendor shall describe the limit range of maximum back pressure and minimum volume flow, as well as the limit of load and time.The vendor shall also provide the maximum allowable back pressure value 65kPa (a) when the unit operates under rated load.

[свернуть]


Я пытаюсь решить эту задачу с помощью выражения

[⺀-■]{1;}

с добавлением прочих символов китайской пунктуации, и поиском от знака абзаца до следующего знака абзаца, типа:

(^13)[⺀-■ 、。〃々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〝〞〡〢〣〤〥〦〧〨〩〾0-9^t%℃℉№::;~〟()「」『』., -\″′°%~×]{1;}(^13)

Заменяя найденному значение цвета шрифта на любой другой.

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

Поэтому решил что метод достаточно сложный и не однозначный.

Наткнулся на функцию в VBA -  "DetectLanguage" которая использует "CLD2DetectLanguage"

https://poe.com/s/bkKSYVZnUb410De2mHy5

Но никак не получается запустить "AnalyzeSentences" subroutine, не пойму что и как делать с CLD2.dll, где его брать ...


Моя задача примерно такова:
Код должен помочь мне анализировать предложения в тексте и проверять, на каком языке они в основном состоят, а затем менять цвет текста на указанный, в то время как предложения, состоящие из символов другого языка, должны быть выделены другим цветом шрифта.

В правильном ли вообще направлении я копаю используя DetectLanguage ?

Заранее спасибо

Администратор

Цитата:
как-то разграничивать текст в двуязычных файлах

Что вы понимаете под "разграничивать текст"? Покажите два файла. Один файл до запуска макроса, второй макрос после запуска макроса.

Посетитель

Под разграничением текста в двуязычных файлах я понимаю, например, его цветовую дифференциацию, а в некоторых случаях и полное удаление китайских предложений, оставив только английский, для дальнейшего импорта и перевода в программах CAT.

Вот пример того как, должен был бы выглядеть текст после работы макроса:

Спойлер
4.2.1.15   当汽机负荷从 100%甩至零时,汽轮机甩全负荷的最高飞升转速不超过危急保安器的动作转速,汽轮发电机组能自动降至同步转速,并自动控制汽轮机的转速,以防机组脱扣。
4.2.1.15   When the steam turbine load is switched from 100% to zero, the maximum speed of the steam turbine for full load rejection shall not exceed the operating speed of the emergency governor. The steam turbine generator unit can automatically reduce to the synchronous speed and automatically control the speed of the steam turbine to prevent the unit from tripping.
4.2.1.16   调节装置的性能满足如下要求:调节装置总的速度不等率应为 3~5%;局部速度不等率在 0 至 0.9,最大连续功率范围内为 3~8%,在 0.9 最大连续功率以上范围应不大于 12%;在 0.9 最大连续功率以上范围的平均局部速度不等率应不大于 10%;额定转速下调节器的死区应小于 0.06%。调节汽轮机,在 90~100%MCR 负荷范围内由任意调节门控制时,其平均不等率应不大于总不等率的 3 倍。
4.2.1.16   The performance of the regulating device shall meet the following requirements: the overall speed inequality rate of the regulating device shall be 3~5%;The local speed inequality rate is 0 to 0.9, the maximum continuous power range is 3 to 8%, and the range above 0.9 maximum continuous power should not be more than 12%;The average local speed difference rate above 0.9 maximum continuous power shall not be greater than 10%;The dead band of the regulator at rated speed shall be less than 0.06%.When nozzle regulating steam turbine is controlled by any regulating valve within 90~100% MCR load range, its average inequality rate shall not be more than 3 times of the total inequality rate.
4.2.1.17   在可能的不正常环境条件下或排汽装置、空冷岛发生故障,机组应能在高背压下、其最低负荷应不小于 (详见背压保护曲线) MW 下安全运行。卖方应说明在最高背压、最小容积流量的限制范围和负荷及时间上的限制。卖方还应提供机组在额定负荷下运行时允许的最大背压值 65 kPa(a)。
4.2.1.17   In case of possible abnormal environmental conditions or failure of steam exhaust device and air cooling island, the unit shall be able to operate safely under high back pressure and its minimum load shall not be less than ( refer to back pressure protection curve for details)MW.The vendor shall describe the limit range of maximum back pressure and minimum volume flow, as well as the limit of load and time.The vendor shall also provide the maximum allowable back pressure value 65kPa (a) when the unit operates under rated load.
[свернуть]

То есть предложения (целиком, и не зависимо от присутствия в них небольшого числа символов другого языка) отмечаются отличным друг от друга цветом шрифта. Это я и понимаю под разграничением.
Дальнейшем в программах CAT (для переводчиков) есть возможность отсортировать предложения по цвету и работать / переводить только, скажем, английские предложения.

При желании, до импорта в CAT, можно будет легко удалять текст по назначенному ему цвету простым найти и заменить.

См. скриншоты в приложении.





Администратор

В Ворде есть такое понятие "абзац".
Как увидеть абзац. Отобразите непечатаемые символы: вкладка "Главная" - группа "Абзац" - кнопка "Отобразить все знаки".
На конце каждого абзаца есть знак абзаца (буква "Р", смотрящая в обратную сторону).
Может быть вам надо работать не с предложениями, а с абзацами?
Проблема в том, что в Ворде тяжело определить начало и конец предложения, но легко определить начало и конец абзаца.

Посетитель

Собственно да, я и пытался работать именно с абзацами:

(^13)[⺀-■ 、。〃々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〝〞〡〢〣〤〥〦〧〨〩〾0-9^t%℃℉№::;~〟()「」『』., -\″′°%~×]{1;}(^13)

то есть поиск китайского текста и вспомогательных символов между двумя знаками абзаца (^13).

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

- либо абзац просто НЕ начинается со знака абзаца (текст в таблице, текст сразу после разрыва страницы или раздела),
- либо началом абзаца является автонумерованный список, не китайский символ (и в таком случае мы захватываем предыдущее английское предложение...),
- либо внутри китайского предложения используются латинские символы,
- либо еще куча не понятных пока для меня причин почему мое выражение не срабатывает при поиске

Поэтому подумал что функция DetectLanguage будет наиболее удобна и возвращать больше нахождений, как я понял она может работать именно выводя процент совпадения с языком.
Скажем если в предложении 95% китайских символов, значит функция вернет значение что это китайское предложение и я смогу с большей вероятностью переназначать этому предложению нужный мне цвет.

Есть у кого опыт работы с DetectLanguage ? что посоветуете?

Администратор

Вам нужно найти абзац, в котором есть хотя бы один китайский символ?
Если в абзаце есть хотя бы один китайский символ, то закрасить такой абзац?
Или в абзаце должно быть больше китайских символов?

Посетитель

1. Если абзац преимущественно состоит из китайских символов - сменить цвет ВСЕГО абзаца на ЗЕЛЕНЫЙ

2. Если абзац преимущественно состоит из английских символов - сменить цвет ВСЕГО абзаца на СИНИЙ

===============


Под "цветом ВСЕГО абзаца" я понимаю цвет КАЖДОГО символа в данном предложении, независимо от того китайский он или английский:


4.2.1.15   当汽机负荷从 100%甩至零时,汽轮机甩全负荷的最高飞升转速不超过危急保安器的动作转速,汽轮发电机组能自动降至同步转速,并自动控制汽轮机的转速,以防机组脱扣。
4.2.1.15   When the steam turbine load is switched from 100% to zero, the maximum speed of the steam turbine for full load rejection shall not exceed the operating speed of the emergency governor. The steam turbine generator unit can automatically reduce to the synchronous speed and automatically control the speed of the steam turbine to prevent the unit from tripping.
4.2.1.16   调节装置的性能满足如下要求:调节装置总的速度不等率应为 3~5%;局部速度不等率在 0 至 0.9,最大连续功率范围内为 3~8%,在 0.9 最大连续功率以上范围应不大于 12%;在 0.9 最大连续功率以上范围的平均局部速度不等率应不大于 10%;额定转速下调节器的死区应小于 0.06%。调节汽轮机,在 90~100%MCR 负荷范围内由任意调节门控制时,其平均不等率应不大于总不等率的 3 倍。
4.2.1.16   The performance of the regulating device shall meet the following requirements: the overall speed inequality rate of the regulating device shall be 3~5%;The local speed inequality rate is 0 to 0.9, the maximum continuous power range is 3 to 8%, and the range above 0.9 maximum continuous power should not be more than 12%;The average local speed difference rate above 0.9 maximum continuous power shall not be greater than 10%;The dead band of the regulator at rated speed shall be less than 0.06%.When nozzle regulating steam turbine is controlled by any regulating valve within 90~100% MCR load range, its average inequality rate shall not be more than 3 times of the total inequality rate.
4.2.1.17   在可能的不正常环境条件下或排汽装置、空冷岛发生故障,机组应能在高背压下、其最低负荷应不小于 (详见背压保护曲线) MW 下安全运行。卖方应说明在最高背压、最小容积流量的限制范围和负荷及时间上的限制。卖方还应提供机组在额定负荷下运行时允许的最大背压值 65 kPa(a)。
4.2.1.17   In case of possible abnormal environmental conditions or failure of steam exhaust device and air cooling island, the unit shall be able to operate safely under high back pressure and its minimum load shall not be less than ( refer to back pressure protection curve for details)MW.The vendor shall describe the limit range of maximum back pressure and minimum volume flow, as well as the limit of load and time.The vendor shall also provide the maximum allowable back pressure value 65kPa (a) when the unit operates under rated load.

Администратор

DetectLanguage не даёт информацию о том, какой в указанном фрагменте преимущественный язык.
Эта команда связана с этим: вкладка "Рецензирование" - группа "Язык" - Язык проверки правописания.
Также к этому относится: строка состояния (внизу монитора) - Язык. Здесь отображается, какой язык назначен тексту.
Т.е. для вашей задачи эта команда не подходит - она не определяет, какой преимущественно язык используется в указанном фрагменте.

Администратор

В вашем документе, если выделить один любой китайский символ, то какой язык Ворд показывает в строке состояния?

Администратор

Цитата:
Наткнулся на функцию в VBA -  "DetectLanguage" которая использует "CLD2DetectLanguage"
https://poe.com/s/bkKSYVZnUb410De2mHy5

Я тоже не смог разобраться, как это использовать.

Администратор

Тогда остаётся такой способ. Макрос двигается по всем символам абзаца и подсчитывает: сколько китайских, английских символов. Затем макрос рассчитывает процент китайских и английских символов от общего количества символов и делает вывод - какой это язык.

Латиницу (это английский язык) определить - не проблема.
Китайские символы можно попробовать определять на основе этого веб-сайта: https://old.unicode-table.com/ru/blocks/cjk-unified-ideographs/. Т.е. юникод китайского символа находится в диапазоне от 4E00 до 9FFF (это шестнадцатеричная система исчисления).

Посетитель

Ну судя по обсуждениям на форумах есть предчувствие что такой подход (с вычислением преимущественного языка в абзаце) возможен:
https://stackoverflow.com/questions/35390848/detect-language-of-word-document?answertab=modifieddesc#tab-top
https://learn.microsoft.com/en-us/office/vba/api/word.range.detectlanguage
https://github.com/MicrosoftDocs/VBA-Docs/blob/main/api/Word.Selection.DetectLanguage.md

Администратор

Я посмотрел ваши ссылки в сообщении #11. DetectLanguage и связанные с ним команды (LanguageID и другие) не дают информацию о том, какой язык является преимущественным в абзаце. DetectLanguage и связанные с ним команды (LanguageID и другие) делают другое. Подробности я написал в сообщении #7. Дополню сообщение #7. Если вы в Ворде выделите фрагмент, в котором разные языки, и посмотрите строку состояния, то язык будет указан только для первого символа выделенного фрагмента. То же даст и DetectLanguage и связанные с ним команды. Чтобы узнать, какой язык в абзаце преимущественный, нужно посмотреть каждый символ или каждое слово в абзаце и подсчитать, сколько раз встречается заданный язык, а затем сделать расчёт.

В сообщении #8 есть вопрос, вы на него не ответили.

Посетитель

1. DetectLanguage -- ok, принято. Не годится

2. Вопрос в сообщении #8 -- собственно не важно по причине (1). Язык всему тексту может быть назначен английский. Либо в перемешку английский и китайский.
Так как документ переводился с китайского на английский, то CAT назначает тексту целевой язык.

Поэтому возвращаемся к определению принадлежности символов к диапазону китайских.

3.
Спойлер
Чтобы узнать, какой язык в абзаце преимущественный, нужно посмотреть каждый символ или каждое слово в абзаце и подсчитать, сколько раз встречается заданный язык, а затем сделать расчёт.
[свернуть]

Как может выглядеть vba код для этих целей?


Администратор

Написал вам письмо на почту с заголовком "Письмо с Форума по VBA, Excel и Word". Написал именно на почту, а не на форум.