NAME
App::Greple::xlate - модуль поддержки перевода для greple
SYNOPSIS
greple -Mxlate --xlate-engine gpt5 --xlate pattern target-file
greple -Mxlate --xlate-engine deepl --xlate pattern target-file
VERSION
Version 2.00
DESCRIPTION
Greple xlate модуль находит нужные текстовые блоки и заменяет их переведённым текстом. Основным движком является GPT-5.5 (llm/gpt5.pm), который вызывает команду llm; также включены DeepL (deepl.pm) и устаревшие движки на основе gpty.
Переводы кэшируются по файлам, поэтому повторный запуск команды не требует затрат для неизменённого текста. При редактировании документа в API повторно отправляются только изменившиеся абзацы; контекстно-зависимый движок также получает окружающие переводы, исходный текст вокруг изменения и предыдущую версию отредактированного абзаца, благодаря чему новый перевод сохраняет устоявшуюся формулировку (см. --xlate-context-window). Конфиденциальные строки можно скрыть перед передачей (см. "ANONYMIZATION AND TEMPLATES").
Если вы хотите перевести обычные блоки текста в документе, написанном в стиле pod языка Perl, используйте команду greple с модулями --xlate-engine gpt5 и perl следующим образом:
greple -Mxlate --xlate-engine gpt5 -Mperl --pod --re '^([\w\pP].*\n)+' --all foo.pm
В этой команде шаблонная строка ^([\w\pP].*\n)+ означает последовательные строки, начинающиеся с букв алфавитно-цифрового ряда и знаков препинания. Эта команда показывает область, которую нужно перевести, выделенной. Опция --all используется для перевода всего текста.
Затем добавьте опцию --xlate для перевода выделенного фрагмента. После этого система найдёт нужные фрагменты и заменит их результатом работы механизма перевода.
По умолчанию оригинальный и транслированный текст печатается в формате "маркер конфликта", совместимом с git(1). Используя формат ifdef, можно легко получить нужную часть командой unifdef(1). Выходной формат может быть задан опцией --xlate-format.
Если требуется перевести весь текст, используйте опцию --match-all. Это сокращение для указания шаблона (?s).+, который соответствует всему тексту.
Данные в формате конфликтных маркеров можно просматривать в стиле "бок о бок" с помощью команды sdif с опцией -V. Поскольку сравнивать по каждой строке не имеет смысла, рекомендуется использовать опцию --no-cdif. Если вам не нужно окрашивать текст, укажите --no-textcolor (или --no-tc).
sdif -V --no-filename --no-tc --no-cdif data_shishin.deepl-EN-US.cm
NORMALIZATION
Обработка выполняется в заданных единицах, но в случае последовательности из нескольких строк непустого текста они преобразуются в одну строку. Эта операция выполняется следующим образом:
Удалите пробелы в начале и конце каждой строки.
Если строка заканчивается полноразмерным символом препинания, объедините ее со следующей строкой.
Если строка заканчивается символом полной ширины и следующая строка начинается символом полной ширины, объедините строки.
Если конец или начало строки не являются символами полной ширины, объедините их, вставив символ пробела.
Кэш-данные управляются на основе нормализованного текста, поэтому даже если будут внесены изменения, не влияющие на результаты нормализации, кэшированные данные перевода будут по-прежнему эффективны.
Этот процесс нормализации выполняется только для первого (0-го) и четного шаблона. Таким образом, если два шаблона указаны следующим образом, то текст, соответствующий первому шаблону, будет обработан после нормализации, а для текста, соответствующего второму шаблону, процесс нормализации не будет выполняться.
greple -Mxlate -E normalized -E not-normalized
Поэтому используйте первый шаблон для текста, который должен быть обработан путем объединения нескольких строк в одну, а второй - для предварительно отформатированного текста. Если в первом шаблоне нет текста для проверки, используйте шаблон, который ничему не соответствует, например (?!).
MASKING
Иногда встречаются части текста, которые не нужно переводить. Например, теги в файлах формата markdown. На сайте DeepL предлагается в таких случаях преобразовывать исключаемые части текста в XML-теги, переводить их, а затем восстанавливать после завершения перевода. Чтобы поддержать эту идею, можно указать части, которые нужно замаскировать от перевода.
--xlate-setopt maskfile=MASKPATTERN
Это будет интерпретировать каждую строку файла MASKPATTERN как регулярное выражение, переводить строку, соответствующую ему, и возвращать после обработки. Строки, начинающиеся с #, игнорируются.
Сложный шаблон можно записать на нескольких строках с использованием обратного слеша для экранирования символа новой строки.
Как текст преобразуется при маскировании, можно увидеть с помощью опции --xlate-mask.
Маскировка защищает разметку от перевода. Чтобы скрыть конфиденциальные строки от самого сервиса перевода, см. "ANONYMIZATION AND TEMPLATES"; оба метода можно использовать вместе.
Этот интерфейс является экспериментальным и может быть изменен в будущем.
ANONYMIZATION AND TEMPLATES
Конфиденциальные строки можно скрыть перед отправкой в API перевода и восстановить в выходных данных. Доступны три источника правил анонимизации: файл словаря (--xlate-anonymize), встроенные метки в самом документе (--xlate-anonymize-mark) и значения в предваряющей части YAML (--xlate-frontmatter). Каждая строка во время передачи заменяется тегом категории, например <person id=1 />. Скрытие распространяется только на передачу через API: в локальных файлах кэша хранится восстановленный обычный текст. Используйте --xlate-dryrun, чтобы проверить, что именно будет передано.
Для документов-шаблонов (квартальных отчётов и т. п.) заранее определите участники и ссылайтесь на них в тексте:
---
報告者: 山田太郎
発注会社: アクメ株式会社
---
本件について {{ 報告者 }} が調査を行った。
Переведите шаблон один раз на каждый язык с помощью --xlate-template (и --xlate-frontmatter, если значения хранятся в файле), затем отобразите каждый случай с помощью pandoc-embedz в автономном режиме — значения под global: во внешней конфигурации вообще не попадают в API перевода:
greple -Mxlate --xlate --xlate-engine=gpt5 --xlate-to=EN-US \
--xlate-template= --xlate-format=xtxt \
--match-paragraph --all --need=0 \
report-template.md > report-template.EN.md
pandoc-embedz --standalone report-template.EN.md \
-c case-123.yaml -o report-123.EN.md < /dev/null
Для встроенных меток предоставление конфигурации определения макроса позволяет одному и тому же переведённому шаблону отображать либо настоящие имена, либо отредактированную версию:
# macros.yaml # macros-redacted.yaml
preamble: | preamble: |
{% macro person(name) %}{{ name }}{% endmacro %}
{% macro person(name) %}(関係者){% endmacro %}
Исключайте блоки embedz из перевода, если документ их содержит:
--exclude '^```embedz\n(?s:.*?)^```\n'
OPTIONS
- --xlate
- --xlate-color
- --xlate-fold
- --xlate-fold-width=n (Default: 70)
-
Запустите процесс перевода для каждой совпавшей области.
Без этой опции greple ведет себя как обычная команда поиска. Таким образом, вы можете проверить, какая часть файла будет подвергнута переводу, прежде чем вызывать фактическую работу.
Результат команды выводится в стандартный аут, поэтому при необходимости перенаправьте его в файл или воспользуйтесь модулем App::Greple::update.
Опция --xlate вызывает опцию --xlate-color с опцией --color=never.
С опцией --xlate-fold преобразованный текст сворачивается на указанную ширину. Ширина по умолчанию равна 70 и может быть задана опцией --xlate-fold-width. Для обкатки зарезервировано четыре колонки, поэтому в каждой строке может содержаться не более 74 символов.
- --xlate-engine=engine
-
Указывает движок перевода, который будет использоваться.
На данный момент доступны следующие движки
gpt5: gpt-5.5 (via the
llmcommand)deepl: DeepL API (via the
deeplcommand)gpt3: gpt-3.5-turbo (legacy, via the
gptycommand)gpt4o: gpt-4o-mini (legacy, via the
gptycommand)
Модули движка сначала ищутся в пространствах имён бэкенда (
llm, затемgpty), а затем непосредственно подApp::Greple::xlate. Таким образом,gpt5загружаетApp::Greple::xlate::llm::gpt5, который вызывает командуllm, в то время какgpt4oпереключается наApp::Greple::xlate::gpty::gpt4o. Используйте--xlate-setopt backend=gpty, чтобы принудительно выбрать конкретный бэкенд. - --xlate-labor
- --xlabor
-
Вместо того чтобы вызывать механизм перевода, вы должны работать на него. После подготовки текста для перевода он копируется в буфер обмена. Вы должны вставить их в форму, скопировать результат в буфер обмена и нажать кнопку return.
- --xlate-to (Default:
EN-US) -
Укажите целевой язык. Движки LLM принимают любое название или код языка, который понимает модель; он интерполируется в запрос на перевод. Вы можете получить список доступных языков с помощью команды
deepl languagesпри использовании движка DeepL. - --xlate-from (Default:
ORIGINAL) -
Метка, используемая для исходного текста в форматах вывода
conflict,colonиifdef. При использовании движка DeepL в качестве языка источника также передаётся значение, отличное от значения по умолчанию. - --xlate-format=format (Default:
conflict) -
Укажите формат вывода оригинального и переведенного текста.
Следующие форматы, кроме
xtxt, предполагают, что переводимая часть представляет собой набор строк. На самом деле можно перевести только часть строки, но указание формата, отличного отxtxt, не даст значимых результатов.- conflict, cm
-
Оригинальный и преобразованный текст печатаются в формате git(1) маркеров конфликтов.
<<<<<<< ORIGINAL original text ======= translated Japanese text >>>>>>> JAВы можете восстановить исходный файл следующей командой sed(1).
sed -e '/^<<<<<<< /d' -e '/^=======$/,/^>>>>>>> /d' - colon, :::::::
-
Оригинальный и переведенный текст выводятся в пользовательском стиле контейнера markdown.
::::::: ORIGINAL original text ::::::: ::::::: JA translated Japanese text :::::::Приведенный выше текст будет переведен в HTML следующим образом.
<div class="ORIGINAL"> original text </div> <div class="JA"> translated Japanese text </div>Количество двоеточий по умолчанию равно 7. Если вы укажете последовательность двоеточий, например
:::::, то она будет использоваться вместо 7 двоеточий. - ifdef
-
Оригинальный и преобразованный текст печатаются в формате cpp(1)
#ifdef.#ifdef ORIGINAL original text #endif #ifdef JA translated Japanese text #endifВы можете восстановить только японский текст командой unifdef:
unifdef -UORIGINAL -DJA foo.ja.pm - space
- space+
-
Оригинальный и преобразованный текст выводятся на печать, разделенные одной пустой строкой. Для
пробел+после преобразованного текста также выводится новая строка. - xtxt
-
Если формат
xtxt(переведенный текст) или неизвестен, печатается только переведенный текст.
- --xlate-maxlen=chars (Default: 0)
-
Укажите максимальную длину текста, отправляемого в API за один раз. Значение по умолчанию 0 означает собственное ограничение движка: для бесплатной учетной записи DeepL оно составляет 128K для API (--xlate) и 5000 для интерфейса буфера обмена (--xlate-labor). Вы можете изменить эти значения, если используете сервис Pro.
- --xlate-maxline=n (Default: 0)
-
Укажите максимальное количество строк текста, которое будет отправлено в API за один раз.
Установите значение 1, если вы хотите переводить по одной строке за раз. Этот параметр имеет приоритет перед параметром
--xlate-maxlen. - --xlate-prompt=text
-
Укажите пользовательский запрос, который будет отправлен в движок перевода. Эта опция доступна для движков LLM (
gpt3,gpt4o,gpt5), но не для DeepL. Вы можете настроить поведение перевода, предоставив конкретные инструкции модели ИИ. Если подсказка содержит%s, она будет заменена названием языка перевода. - --xlate-context=text
-
Укажите дополнительную контекстную информацию, которая будет отправлена механизму перевода. Этот параметр можно использовать несколько раз, чтобы указать несколько контекстных строк. Контекстная информация помогает механизму перевода понять фон и создать более точный перевод.
- --xlate-context-window=n
-
(Context-aware engines only, e.g.
gpt5on the llm backend) Количество окружающих переведённых блоков, передаваемых в качестве контекста при повторном переводе изменённых блоков (по умолчанию 2). Контекст также включает исходный текст вокруг изменённого участка (заголовки, структуру списка, подписи) и, при наличии, предыдущую версию изменённого текста, восстановленную из кэша, чтобы сохранить неизменённые формулировки. Установите значение 0, чтобы полностью отключить контекстный перевод. Обратите внимание, что каждый измененный участок переводится в рамках отдельного вызова API, а контекст может увеличить системную подсказку примерно на 8000 символов, поэтому контекстный перевод требует дополнительных затрат в обмен на обеспечение согласованности. - --xlate-cache-seed=file
-
Инициализировать кэш нового документа на основе файла кэша другого документа. Полезно для периодических отчётов: инициализировать кэш нового выпуска на основе кэша предыдущего выпуска, чтобы неизменённые абзацы не переводились заново, а отредактированные абзацы сохраняли формулировки предыдущего выпуска. Исходные данные используются только в том случае, если целевой кэш пуст; в противном случае они игнорируются с выводом предупреждения. При использовании значения по умолчанию
--xlate-cache=autoуказание исходных данных также подразумевает создание файла кэша нового документа. - --xlate-anonymize=file
-
Анонимизировать конфиденциальные строки перед отправкой в API перевода и восстанавливать их в выходных данных. Файл словаря содержит по одной записи на каждый элемент: в формате JSON (каноническом, генерируемом машиной)
[ { "category": "person", "text": "山田太郎" }, { "category": "company", "regex": "アクメ(株式会社)?" } ]или в простом строчном формате (
category pattern,/.../для регулярных выражений). Каждый элемент заменяется тегом категории, например<person id=1 />; одна и та же строка всегда получает один и тот же тег, чтобы модель могла отслеживать, что к чему. Неизвестные поля JSON игнорируются, поэтому генераторы (например, локальный LLM, извлекающий сущности) могут добавлять свои собственные аннотации. Категорияlitзарезервирована. В локальных файлах кэша по-прежнему хранится восстановленный обычный текст: скрытие касается только передачи через API.Словарь может быть сгенерирован внешним инструментом — например, локальной моделью, извлекающей конфиденциальные сущности:
llm -m <local-model> \ -s 'Extract sensitive entities as a JSON array of objects with "category" and "text" fields.' \ < report.md > report.anon.json greple -Mxlate --xlate-anonymize=report.anon.json ...Наличие BOM в формате UTF-8 в файле допускается. Значения, записанные в формате строки вступительной информации, могут сопровождаться комментарием только в отдельной строке, а не после самого значения.
- --xlate-anonymize-mark[=regex]
-
Соберите записи об анонимизации из встроенных меток в самом документе. Пометьте первое вхождение как
{{ person("山田太郎") }}, и каждое вхождение этой строки во всём документе будет анонимизировано. Сама метка остаётся в исходном тексте и в переводе, поэтому документ также можно обработать с помощью макропроцессора в стиле Jinja2 (определите макросpersonдля вывода или редактирования имени). Пользовательский тег regex должен содержать именованные перехваты(?<category>...)и(?<text>...).Обратите внимание, что при использовании такого параметра с опциональным значением в качестве значения будет принят последующий аргумент файла: при использовании нотации по умолчанию запишите
--xlate-anonymize-mark=(с последующим=).Можно настроить альтернативные нотации, например
--xlate-anonymize-mark='@@(?<category>[a-z][a-z0-9_]*):(?<text>[^\n]+?)@@'для меток в стиле@@person:NAME@@или форму HTML-комментария, которая остаётся невидимой в отображаемом Markdown. Правила маркировки собираются по отдельному документу: строка, помеченная в одном входном файле, не скрывается в другом файле того же прогона (в отличие от значений вступительной части, которые накапливаются по всем файлам). - --xlate-template[=regex]
-
Рассматривайте выражения шаблонов (по умолчанию: Jinja2
{{ ... }},{% ... %},{# ... #}) как непрозрачные заполнители: дайте модели указание копировать их без изменений и проверяйте для каждого блока, что ответ содержит точно такие же выражения, причём каждое — ровно столько же раз. Их порядок может измениться, поскольку при переводе они могут быть переупорядочены в соответствии с порядком слов в языке перевода. Неверное выражение приводит к прерыванию прогона; кэш фиксируется и замораживается, поэтому ничего из того, за что было заплачено, не теряется.Обратите внимание, что при использовании такого параметра с опциональным значением в качестве значения будет принят последующий аргумент файла: запишите
--xlate-template=(с последующим=) при использовании нотации по умолчанию. - --xlate-frontmatter
-
Рассматривайте начальный блок
---...---как вступительную часть YAML: исключить его из перевода и из фрагментов контекста фазы 2, а также добавить его плоские значенияkey: valueв правила анонимизации (категорияvar) в качестве меры предосторожности. При наличии нескольких входных файлов собранные значения суммируются (при этом предпочтение отдаётся более строгой анонимизации).Всегда оставляйте пустую строку после закрывающего тега
---. При использовании шаблона сопоставления в стиле абзаца вступительная часть, непосредственно примыкающая к основному тексту, образует один перекрывающийся блок, который исключение не может подавить (в этом случае выводится предупреждение); значения по-прежнему анонимизируются, но сама вступительная часть будет отправлена на перевод. - --xlate-glossary=glossary
-
Укажите идентификатор глоссария, который будет использоваться при переводе. Этот параметр доступен только при использовании механизма DeepL. Идентификатор глоссария должен быть получен из учетной записи DeepL и обеспечивает последовательный перевод специфических терминов.
- --xlate-dryrun
-
Не вызывайте API перевода; вместо этого отображайте через индикатор прогресса каждый полезный груз точно так, как он будет передан (после анонимизации и маскирования). Это полезно для проверки того, что покидает систему, и для оценки стоимости выполнения задания.
- --[no-]xlate-progress (Default: True)
-
Результат перевода можно увидеть в режиме реального времени в выводе STDERR. Данные
Fromотображаются в том виде, в котором они передаются, после анонимизации и маскирования. - --xlate-stripe
-
Используйте модуль App::Greple::stripe, чтобы показать совпадающие части в виде полосок зебры. Это удобно, когда совпадающие части соединены встык.
Цветовая палитра переключается в соответствии с цветом фона терминала. Если вы хотите указать его явно, можно использовать --xlate-stripe-light или --xlate-stripe-dark.
- --xlate-mask
-
Выполните функцию маскирования и отобразите преобразованный текст как есть, без восстановления.
- --match-all
-
Установите весь текст файла в качестве целевой области.
- --lineify-cm
- --lineify-colon
-
В случае форматов
cmиcolonвывод разбивается и форматируется построчно. Поэтому, если перевести только часть строки, ожидаемый результат не будет получен. Эти фильтры исправляют вывод, испорченный переводом части строки в обычный построчный вывод.В текущей реализации, если переводится несколько частей строки, они выводятся как независимые строки.
CACHE OPTIONS
Модуль xlate может хранить кэшированный текст перевода для каждого файла и считывать его перед выполнением, чтобы исключить накладные расходы на запрос к серверу. При стратегии кэширования по умолчанию auto, он сохраняет данные кэша только тогда, когда файл кэша существует для целевого файла.
Используйте --xlate-cache=clear, чтобы запустить управление кэшем или очистить все существующие данные кэша. После выполнения этой опции будет создан новый файл кэша, если он не существует, а затем он будет автоматически поддерживаться.
- --xlate-cache=strategy
-
auto(Default)-
Сохранять файл кэша, если он существует.
create-
Создать пустой файл кэша и выйти.
always,yes,1-
Сохранять кэш в любом случае, пока целевой файл является обычным файлом.
clear-
Сначала очистите данные кэша.
never,no,0-
Никогда не использовать файл кэша, даже если он существует.
accumulate-
По умолчанию неиспользуемые данные удаляются из файла кэша. Если вы не хотите удалять их и сохранять в файле, используйте
accumulate.
- --xlate-update
-
Эта опция заставляет обновлять файл кэша, даже если в этом нет необходимости.
COMMAND LINE INTERFACE
Вы можете легко использовать этот модуль из командной строки с помощью команды xlate, входящей в дистрибутив. Информацию об использовании см. на странице руководства xlate.
Команда xlate поддерживает длинные опции в стиле GNU, такие как --to-lang, --from-lang, --engine и --file. Используйте xlate -h, чтобы увидеть все доступные опции.
Команда xlate работает совместно со средой Docker, поэтому даже если у вас ничего не установлено, вы можете использовать ее, пока доступен Docker. Используйте опцию -D или -C.
Операции Docker выполняются командой App::dozo, которая также может использоваться как отдельная команда. Команда dozo поддерживает конфигурационный файл .dozorc для постоянных настроек контейнера.
Кроме того, поскольку в комплекте поставляются make-файлы для различных стилей документов, перевод на другие языки возможен без специальных уточнений. Используйте опцию -M.
Вы также можете комбинировать опции Docker и make, чтобы запустить make в среде Docker.
Выполнение xlate -C запустит оболочку с подключенным текущим рабочим git-репозиторием.
Подробности читайте в японской статье в разделе "SEE ALSO".
EMACS
Загрузите файл xlate.el, включенный в репозиторий, чтобы использовать команду xlate из редактора Emacs. Функция xlate-region переводит заданный регион. Язык по умолчанию - EN-US, и вы можете указать язык, вызывая ее с помощью аргумента prefix.
ENVIRONMENT
- DEEPL_AUTH_KEY
-
Задайте ключ аутентификации для сервиса DeepL.
- OPENAI_API_KEY
-
Ключ аутентификации OpenAI, используемый устаревшими движками gpty. Движок gpt5, основанный на
llm, также считывает эту переменную, но ключи, хранящиеся с помощьюllm keys set openai, тоже работают. - GREPLE_XLATE_CACHE
-
Установите стратегию кэширования по умолчанию (см. "CACHE OPTIONS").
INSTALL
CPANMINUS
$ cpanm App::Greple::xlate
TOOLS
Установите инструмент командной строки для используемого вами движка: llm для движка gpt5, deepl для DeepL, gpty для устаревших движков GPT.
https://github.com/DeepLcom/deepl-python
https://github.com/tecolicom/App-gpty
SEE ALSO
MODULES
App::Greple::xlate::llm, App::Greple::xlate::deepl
App::dozo - общий Docker runner, используемый xlate для операций с контейнерами.
RELATED MODULES
-
Подробную информацию о шаблоне целевого текста см. в руководстве greple. Используйте опции --inside, --outside, --include, --exclude для ограничения области совпадения.
-
Вы можете использовать модуль
-Mupdateдля модификации файлов по результатам команды greple. -
Используйте sdif, чтобы показать формат маркера конфликта бок о бок с опцией -V.
-
Использование модуля Greple stripe с помощью опции --xlate-stripe.
RESOURCES
https://hub.docker.com/r/tecolicom/xlate
Образ контейнера Docker.
https://github.com/tecolicom/getoptlong
Библиотека
getoptlong.shиспользуется для разбора опций в скриптеxlateи App::dozo.-
Команда
llm, используемая движком gpt5 для доступа к моделям LLM. https://github.com/DeepLcom/deepl-python
DeepL Библиотека Python и команда CLI.
https://github.com/openai/openai-python
Библиотека OpenAI Python
https://github.com/tecolicom/App-gpty
Интерфейс командной строки OpenAI
ARTICLES
https://qiita.com/kaz-utashiro/items/1c1a51a4591922e18250
Модуль Greple для перевода и замены только необходимых частей с помощью DeepL API (на японском языке)
https://qiita.com/kaz-utashiro/items/a5e19736416ca183ecf6
Генерация документов на 15 языках с помощью модуля DeepL API (на японском языке)
https://qiita.com/kaz-utashiro/items/1b9e155d6ae0620ab4dd
Автоматический перевод Docker-окружения с помощью DeepL API (на японском языке)
AUTHOR
Kazumasa Utashiro
LICENSE
Copyright © 2023-2026 Kazumasa Utashiro.
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.