Actions Status

NAME

App::Greple::xlate - translation support module for 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 module find desired text blocks and replace them by the translated text. The primary engine is GPT-5.5 (llm/gpt5.pm), which calls the llm command; DeepL (deepl.pm) and legacy gpty-based engines are also included.

Translations are cached per file, so re-running a command costs nothing for unchanged text. When a document is edited, only the changed paragraphs are sent to the API again; a context-aware engine also receives the surrounding translations, the raw source text around the change, and the previous version of the edited paragraph, so the new translation keeps the established wording (see --xlate-context-window). Sensitive strings can be concealed before transmission (see "ANONYMIZATION AND TEMPLATES").

If you want to translate normal text blocks in a document written in the Perl's pod style, use greple command with --xlate-engine gpt5 and perl module like this:

greple -Mxlate --xlate-engine gpt5 -Mperl --pod --re '^([\w\pP].*\n)+' --all foo.pm

In this command, pattern string ^([\w\pP].*\n)+ means consecutive lines starting with alpha-numeric and punctuation letter. This command show the area to be translated highlighted. Option --all is used to produce entire text.

Then add --xlate option to translate the selected area. Then, it will find the desired sections and replace them by the translation engine's output.

By default, original and translated text is printed in the "conflict marker" format compatible with git(1). Using ifdef format, you can get desired part by unifdef(1) command easily. Output format can be specified by --xlate-format option.

If you want to translate entire text, use --match-all option. This is a short-cut to specify the pattern (?s).+ which matches entire text.

Conflict marker format data can be viewed in side-by-side style by sdif command with -V option. Since it makes no sense to compare on a per-string basis, the --no-cdif option is recommended. If you do not need to color the text, specify --no-textcolor (or --no-tc).

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

NORMALIZATION

Processing is done in specified units, but in the case of a sequence of multiple lines of non-empty text, they are converted together into a single line. This operation is performed as follows:

Cache data is managed based on the normalized text, so even if modifications are made that do not affect the normalization results, the cached translation data will still be effective.

This normalization process is performed only for the first (0th) and even-numbered pattern. Thus, if two patterns are specified as follows, the text matching the first pattern will be processed after normalization, and no normalization process will be performed on the text matching the second pattern.

greple -Mxlate -E normalized -E not-normalized

Therefore, use the first pattern for text that is to be processed by combining multiple lines into a single line, and use the second pattern for pre-formatted text. If there is no text to match in the first pattern, use a pattern that does not match anything, such as (?!).

MASKING

Occasionally, there are parts of text that you do not want translated. For example, tags in markdown files. DeepL suggests that in such cases, the part of the text to be excluded be converted to XML tags, translated, and then restored after the translation is complete. To support this, it is possible to specify the parts to be masked from translation.

--xlate-setopt maskfile=MASKPATTERN

This will interpret each line of the file MASKPATTERN as a regular expression, translate strings matching it, and revert after processing. Lines beginning with # are ignored.

Complex pattern can be written on multiple lines with backslash escaped newline.

How the text is transformed by masking can be seen by --xlate-mask option.

Masking protects markup from being translated. To conceal sensitive strings from the translation service itself, see "ANONYMIZATION AND TEMPLATES"; both can be used together.

This interface is experimental and subject to change in the future.

ANONYMIZATION AND TEMPLATES

Sensitive strings can be concealed before they are sent to the translation API and restored in the output. Three sources of anonymization rules are available: a dictionary file (--xlate-anonymize), inline marks in the document itself (--xlate-anonymize-mark), and YAML front matter values (--xlate-frontmatter). Each string is replaced by a category tag such as <person id=1 /> during transmission. The concealment target is API transmission only: local cache files store restored plain text. Use --xlate-dryrun to inspect exactly what would be transmitted.

For form documents (quarterly reports and the like), define the actors up front and reference them in the body:

---
報告者: 山田太郎
発注会社: アクメ株式会社
---
本件について {{ 報告者 }} が調査を行った。

Translate the template once per language with --xlate-template (and --xlate-frontmatter when the values are kept in the file), then render each case with pandoc-embedz standalone mode -- values under global: in an external config never reach the translation API at all:

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

For inline marks, providing a macro definition config makes the same translated template render either the real names or a redacted version:

# macros.yaml           # macros-redacted.yaml
preamble: |             preamble: |
  {% macro person(name) %}{{ name }}{% endmacro %}
                          {% macro person(name) %}(関係者){% endmacro %}

Exclude embedz blocks from translation when a document contains them:

--exclude '^```embedz\n(?s:.*?)^```\n'

OPTIONS

CACHE OPTIONS

xlate module can store cached text of translation for each file and read it before execution to eliminate the overhead of asking to server. With the default cache strategy auto, it maintains cache data only when the cache file exists for target file.

Use --xlate-cache=clear to initiate cache management or to clean up all existing cache data. Once executed with this option, a new cache file will be created if one does not exist and then automatically maintained afterward.

COMMAND LINE INTERFACE

You can easily use this module from the command line by using the xlate command included in the distribution. See the xlate man page for usage.

The xlate command supports GNU-style long options such as --to-lang, --from-lang, --engine, and --file. Use xlate -h to see all available options.

The xlate command works in concert with the Docker environment, so even if you do not have anything installed on hand, you can use it as long as Docker is available. Use -D or -C option.

Docker operations are handled by App::dozo, which can also be used as a standalone command. The dozo command supports the .dozorc configuration file for persistent container settings.

Also, since makefiles for various document styles are provided, translation into other languages is possible without special specification. Use -M option.

You can also combine the Docker and make options so that you can run make in a Docker environment.

Running like xlate -C will launch a shell with the current working git repository mounted.

Read Japanese article in "SEE ALSO" section for detail.

EMACS

Load the xlate.el file included in the repository to use xlate command from Emacs editor. xlate-region function translate the given region. Default language is EN-US and you can specify language invoking it with prefix argument.

ENVIRONMENT

INSTALL

CPANMINUS

$ cpanm App::Greple::xlate

TOOLS

Install the command line tool for the engine you use: llm for the gpt5 engine, deepl for DeepL, gpty for the legacy GPT engines.

https://llm.datasette.io/

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 - Generic Docker runner used by xlate for container operations

RESOURCES

ARTICLES

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.