# 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.01

# DESCRIPTION

**Greple** **xlate** модуль находит нужные текстовые блоки и заменяет их переведённым текстом. Основным движком является GPT-5.5 (`llm/gpt5.pm`), который вызывает команду [llm](https://llm.datasette.io/); также включены DeepL (`deepl.pm`) и устаревшие движки на основе **gpty**.

Переводы кэшируются по файлам, поэтому повторный запуск команды не требует затрат для неизменённого текста. При редактировании документа в API повторно отправляются только изменившиеся абзацы; контекстно-зависимый движок также получает окружающие переводы, исходный текст вокруг изменения и предыдущую версию отредактированного абзаца, благодаря чему новый перевод сохраняет устоявшуюся формулировку (см. **--xlate-context-window**). Конфиденциальные строки можно скрыть перед передачей (см. ["ANONYMIZATION AND TEMPLATES"](#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** используется для перевода всего текста.

<div>
    <p>
    <img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/select-area.png">
    </p>
</div>

Затем добавьте опцию `--xlate` для перевода выделенного фрагмента. После этого система найдёт нужные фрагменты и заменит их результатом работы механизма перевода.

По умолчанию оригинальный и транслированный текст печатается в формате "маркер конфликта", совместимом с [git(1)](http://man.he.net/man1/git). Используя формат `ifdef`, можно легко получить нужную часть командой [unifdef(1)](http://man.he.net/man1/unifdef). Выходной формат может быть задан опцией **--xlate-format**.

<div>
    <p>
    <img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/format-conflict.png">
    </p>
</div>

Если требуется перевести весь текст, используйте опцию **--match-all**. Это сокращение для указания шаблона `(?s).+`, который соответствует всему тексту.

Данные в формате конфликтных маркеров можно просматривать в стиле "бок о бок" с помощью команды [sdif](https://metacpan.org/pod/App%3A%3Asdif) с опцией `-V`. Поскольку сравнивать по каждой строке не имеет смысла, рекомендуется использовать опцию `--no-cdif`. Если вам не нужно окрашивать текст, укажите `--no-textcolor` (или `--no-tc`).

    sdif -V --no-filename --no-tc --no-cdif data_shishin.deepl-EN-US.cm

<div>
    <p>
    <img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/sdif-cm-view.png">
    </p>
</div>

# 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); оба метода можно использовать вместе.

Этот интерфейс является экспериментальным и может быть изменен в будущем.

# 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](https://metacpan.org/pod/App%3A%3AGreple%3A%3Aupdate).

    Опция **--xlate** вызывает опцию **--xlate-color** с опцией **--color=never**.

    С опцией **--xlate-fold** преобразованный текст сворачивается на указанную ширину. Ширина по умолчанию равна 70 и может быть задана опцией **--xlate-fold-width**. Для обкатки зарезервировано четыре колонки, поэтому в каждой строке может содержаться не более 74 символов.

- **--xlate-engine**=_engine_

    Указывает движок перевода, который будет использоваться.

    На данный момент доступны следующие движки

    - **gpt5**: gpt-5.5 (via the `llm` command)
    - **deepl**: DeepL API (via the `deepl` command)
    - **gpt3**: gpt-3.5-turbo (legacy, via the `gpty` command)
    - **gpt4o**: gpt-4o-mini (legacy, via the `gpty` command)

    Модули движка сначала ищутся в пространствах имён бэкенда (`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)](http://man.he.net/man1/git) маркеров конфликтов.

            <<<<<<< ORIGINAL
            original text
            =======
            translated Japanese text
            >>>>>>> JA

        Вы можете восстановить исходный файл следующей командой [sed(1)](http://man.he.net/man1/sed).

            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)](http://man.he.net/man1/cpp) `#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. `gpt5` on 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](https://metacpan.org/pod/App%3A%3AGreple%3A%3Astripe), чтобы показать совпадающие части в виде полосок зебры. Это удобно, когда совпадающие части соединены встык.

    Цветовая палитра переключается в соответствии с цветом фона терминала. Если вы хотите указать его явно, можно использовать **--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](https://metacpan.org/pod/App%3A%3Adozo), которая также может использоваться как отдельная команда. Команда `dozo` поддерживает конфигурационный файл `.dozorc` для постоянных настроек контейнера.

Кроме того, поскольку в комплекте поставляются make-файлы для различных стилей документов, перевод на другие языки возможен без специальных уточнений. Используйте опцию `-M`.

Вы также можете комбинировать опции Docker и `make`, чтобы запустить `make` в среде Docker.

Выполнение `xlate -C` запустит оболочку с подключенным текущим рабочим git-репозиторием.

Подробности читайте в японской статье в разделе ["SEE ALSO"](#see-also).

# EMACS

Загрузите файл `xlate.el`, включенный в репозиторий, чтобы использовать команду `xlate` из редактора Emacs. Функция `xlate-region` переводит заданный регион. Язык по умолчанию - `EN-US`, и вы можете указать язык, вызывая ее с помощью аргумента prefix.

<div>
    <p>
    <img width="750" src="https://raw.githubusercontent.com/kaz-utashiro/App-Greple-xlate/main/images/emacs.png">
    </p>
</div>

# ENVIRONMENT

- DEEPL\_AUTH\_KEY

    Задайте ключ аутентификации для сервиса DeepL.

- OPENAI\_API\_KEY

    Ключ аутентификации OpenAI, используемый устаревшими движками **gpty**. Движок **gpt5**, основанный на `llm`, также считывает эту переменную, но ключи, хранящиеся с помощью `llm keys set openai`, тоже работают.

- GREPLE\_XLATE\_CACHE

    Установите стратегию кэширования по умолчанию (см. ["CACHE OPTIONS"](#cache-options)).

# INSTALL

## CPANMINUS

    $ cpanm App::Greple::xlate

## TOOLS

Установите инструмент командной строки для используемого вами движка: `llm` для движка **gpt5**, `deepl` для DeepL, `gpty` для устаревших движков GPT.

[https://llm.datasette.io/](https://llm.datasette.io/)

[https://github.com/DeepLcom/deepl-python](https://github.com/DeepLcom/deepl-python)

[https://github.com/tecolicom/App-gpty](https://github.com/tecolicom/App-gpty)

# SEE ALSO

## MODULES

[App::Greple::xlate::llm](https://metacpan.org/pod/App%3A%3AGreple%3A%3Axlate%3A%3Allm), [App::Greple::xlate::deepl](https://metacpan.org/pod/App%3A%3AGreple%3A%3Axlate%3A%3Adeepl)

[App::dozo](https://metacpan.org/pod/App%3A%3Adozo) - общий Docker runner, используемый xlate для операций с контейнерами.

## RELATED MODULES

- [App::Greple](https://metacpan.org/pod/App%3A%3AGreple)

    Подробную информацию о шаблоне целевого текста см. в руководстве **greple**. Используйте опции **--inside**, **--outside**, **--include**, **--exclude** для ограничения области совпадения.

- [App::Greple::update](https://metacpan.org/pod/App%3A%3AGreple%3A%3Aupdate)

    Вы можете использовать модуль `-Mupdate` для модификации файлов по результатам команды **greple**.

- [App::sdif](https://metacpan.org/pod/App%3A%3Asdif)

    Используйте **sdif**, чтобы показать формат маркера конфликта бок о бок с опцией **-V**.

- [App::Greple::stripe](https://metacpan.org/pod/App%3A%3AGreple%3A%3Astripe)

    Использование модуля Greple **stripe** с помощью опции **--xlate-stripe**.

## RESOURCES

- [https://hub.docker.com/r/tecolicom/xlate](https://hub.docker.com/r/tecolicom/xlate)

    Образ контейнера Docker.

- [https://github.com/tecolicom/getoptlong](https://github.com/tecolicom/getoptlong)

    Библиотека `getoptlong.sh` используется для разбора опций в скрипте `xlate` и [App::dozo](https://metacpan.org/pod/App%3A%3Adozo).

- [https://llm.datasette.io/](https://llm.datasette.io/)

    Команда `llm`, используемая движком **gpt5** для доступа к моделям LLM.

- [https://github.com/DeepLcom/deepl-python](https://github.com/DeepLcom/deepl-python)

    DeepL Библиотека Python и команда CLI.

- [https://github.com/openai/openai-python](https://github.com/openai/openai-python)

    Библиотека OpenAI Python

- [https://github.com/tecolicom/App-gpty](https://github.com/tecolicom/App-gpty)

    Интерфейс командной строки OpenAI

## ARTICLES

- [https://qiita.com/kaz-utashiro/items/1c1a51a4591922e18250](https://qiita.com/kaz-utashiro/items/1c1a51a4591922e18250)

    Модуль Greple для перевода и замены только необходимых частей с помощью DeepL API (на японском языке)

- [https://qiita.com/kaz-utashiro/items/a5e19736416ca183ecf6](https://qiita.com/kaz-utashiro/items/a5e19736416ca183ecf6)

    Генерация документов на 15 языках с помощью модуля DeepL API (на японском языке)

- [https://qiita.com/kaz-utashiro/items/1b9e155d6ae0620ab4dd](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.
