KTRANS(1) KTRANS(1)
NAME
ktrans - language transliterator
SYNOPSIS
ktrans [ -G ] [ -l lang ] [ kbdtap ]
DESCRIPTION
Ktrans transliterates a stream of keyboard events. Without
any arguments, ktrans reads events from standard input and
writes out converted events to stdout. If a kbdtap file is
given, it is used for both input and output instead. By
default ktrans starts in passthrough mode, echoing out the
input with no conversions. The initial language is set with
the -l flag. After operation has begun, the language may be
changed by either typing a control sequence and/or through
the plumber. The following table provides the control
sequence and lang strings accepted for each supported lan-
guage respectfully.
English (Passthrough).
ctl-t and en
Japanese Hiragana.
ctl-n and jp
Japanese Katakana.
ctl-k and jpk
Chinese.
ctl-c and zh
Korean.
ctl-s and ko
Vietnamese.
ctl-v and vn
Ktrans listens on the lang plumber port for switching lan-
guages. The data accepted on this port is the same as the -l
flag's lang argument.
CONVERSION
Conversion is done in two layers, an implicit layer for
unambiguous mappings, and an explicit layer for selecting
one match out of a list of ambiguous matches. The following
control characters are used for conversion instructions.
ctl-\
Explicitly match the current input, consecutive inputs
of ctl-\ will cycle through all the possible options.
Page 1 Plan 9 (printed 12/16/25)
KTRANS(1) KTRANS(1)
ctl-l
Reset the current input buffer.
The implicit layer happens automatically as characters are
input, transforming a consecutive set of key strokes in to
their rune counterpart. A series of runes may then be
explicitly matched by cycling through a list of options.
Ktrans automatically maintains a buffer of the current
series of key strokes being considered for an explicit
match, and resets that buffer on logical "word" breaks
depending on the language. However in some cases the auto-
matic hinting will be insufficient.
Input is always passed along, when a match is found Ktrans
will emit backspaces to clear the input sequence and replace
it with the matched sequence. Once ctl-\ has been used to
start the selection of an explicit match, the up and down
arrow keys may be used to thumb around the options.
DISPLAY
Ktrans will provide a graphical display of current explicit
conversion candidates as implicit conversion is done. Candi-
dates are highlighted as a user cycles through them. At the
bottom of the list is an exit button for quitting the pro-
gram. Keyboard input typed in to the window is transliter-
ated but discarded, providing a scratch input space. The
mouse may be used to scroll through and select candidates,
but it requires that ktrans is started using rio(1)'s -k
flag.
The -G flag disables the graphical display entirely.
KEY MAPPING
For convenience, the control characters used by ktrans can
be mapped directly to physical keys through modifications of
the kbmap (see kbdfs(8)). The /sys/lib/kbmap/jp mapping will
turn language input keys present on Japanese A01/106/109(A)
in to control sequences matching their label:
Henkan
Convert to Kanji (ctl-\)
Muhenkan
Clear Kanji buffer (ctl-l)
Hiragana / Katakana
Switch to Hiragana (ctl-n)
Shift + Hiragana / Katakana
Switch to Katakana (ctl-k)
Hankaku / Zenkaku
Page 2 Plan 9 (printed 12/16/25)
KTRANS(1) KTRANS(1)
Switch to Hiragana (ctl-n)
Shift + Hankaku / Zenkaku
Switch to passthrough (ctl-t)
Shift + Space
Convert to Kanji (ctl-\). This is a fallback for key-
boards without a physical Henkan key.
DICTIONARIES
All implicit and explicit matching dictionaries are provided
as plain text files within /lib/ktrans. The formats of
which are specified within ktrans(6). Additionally, dictio-
naries located in $home/lib/ktrans/ will be merged on top of
the system dictionaries. Merging is done at a list level
only; Keys that appear replace all values of the previous
definition.
For backwards compatibility the jisho and zidian environment
variables may also be set to pick alternate system dictio-
naries for Japanese and Chinese respectfully.
LANGUAGES
JAPANESE
The Hiragana and Katakana modes implicitly turn Hepburn rep-
resentations in to their Kana counterparts. Explicit conver-
sions combine sequences of Hiragana in to Kanji.
Capital Latin input is used for hinting. For adjectives and
verbs, a single capital is used as an Okurigana hint. For
example, 動かす is typed as 'ugoKasu[^\]'. The hint serves two
purposes, it is provided as part of the explicit sequence
for Kanji lookup and denotes that the following runes are
Okurigana.
For particles, the entire Kana may be input in upper case.
This similarly denotes the end of the Kanji portion of the
sequence, but is not used as part of the lookup sequence
itself. So to write 私の猫 the user types
"watashiNO[^\]neko[^\]". Note that in both cases we have
successfully communicated to ktrans when to reset the
explicit match buffer without needing to explicitly give a
ctl-l character.
CHINESE
Implicit conversion converts punctuation. Explicit matches
use a dictionary to convert a series of Latin characters
into Hanzi. By default a Wubizixing input dictionary is
used. Additionally a Pinyin input dictionary is provided.
VIETNAMESE
Implicit conversion is modeled after Telex, supporting
Page 3 Plan 9 (printed 12/16/25)
KTRANS(1) KTRANS(1)
standard diacritic suffixes.
KOREAN
Mapping is done by emulating a Dubeolsik layout, with each
Latin character mapping to a single Jamo. Sequences of Jamo
are automatically converted to Hangul syllables.
EXAMPLES
To type the following Japanese text:
私は毎日35分以上歩いて、 更に10分電車に乗って学校に通います。
健康の維持にも役だっていますが、 なかなかたのしいものです。
your keyboard typing stream should be:
watashiHA[^\]mainichi[^\]35[^l]fun[^\]ijou[^\]aruIte,[^\]
saraNI[^\]10[^l]fun[^\]denshaNI[^\]noTte[^\]gakkouNI[^\]
kayoImasu.[\n]kenkouNO[^\]ijiNImo[^\]yakuDAtteimasuga,[^\]
nakanakatanoshiImonodesu.[\n]
where [^\] and [^l] indicate 'ctl-\' and 'ctl-l', respec-
tively.
SOURCE
/sys/src/cmd/ktrans
SEE ALSO
ktrans(6), rio(4), kbdfs(8)
BUGS
There is no hint from rio when the user moves the cursor, as
such moving it is unlikely to result in what the user
expects.
Plan 9 lacks support for rendering combinational Unicode
sequences, limiting the use of some code ranges.
HISTORY
Ktrans was originally written by Kenji Okamoto in August of
2000 for the 2nd edition of Plan 9. It was imported in to
9front in July of 2022, with patches by several contribu-
tors. It was towed inside the environment during the 2022
9front hackathon.
Page 4 Plan 9 (printed 12/16/25)