You are on page 1of 13

<!

DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ToA Translation Pack Guide &lt;&excl;-- omit in toc --&gt;</title>
<style>
/* From extension vscode.markdown-math */
@font-face{font-family:KaTeX_AMS;src:url(fonts/KaTeX_AMS-Regular.woff2)
format("woff2"),url(fonts/KaTeX_AMS-Regular.woff)
format("woff"),url(fonts/KaTeX_AMS-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-
family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Bold.woff2)
format("woff2"),url(fonts/KaTeX_Caligraphic-Bold.woff)
format("woff"),url(fonts/KaTeX_Caligraphic-Bold.ttf) format("truetype");font-
weight:700;font-style:normal}@font-face{font-
family:KaTeX_Caligraphic;src:url(fonts/KaTeX_Caligraphic-Regular.woff2)
format("woff2"),url(fonts/KaTeX_Caligraphic-Regular.woff)
format("woff"),url(fonts/KaTeX_Caligraphic-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/
KaTeX_Fraktur-Bold.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Bold.woff)
format("woff"),url(fonts/KaTeX_Fraktur-Bold.ttf) format("truetype");font-
weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(fonts/
KaTeX_Fraktur-Regular.woff2) format("woff2"),url(fonts/KaTeX_Fraktur-Regular.woff)
format("woff"),url(fonts/KaTeX_Fraktur-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/
KaTeX_Main-Bold.woff2) format("woff2"),url(fonts/KaTeX_Main-Bold.woff)
format("woff"),url(fonts/KaTeX_Main-Bold.ttf) format("truetype");font-
weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(fonts/
KaTeX_Main-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Main-BoldItalic.woff)
format("woff"),url(fonts/KaTeX_Main-BoldItalic.ttf) format("truetype");font-
weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/
KaTeX_Main-Italic.woff2) format("woff2"),url(fonts/KaTeX_Main-Italic.woff)
format("woff"),url(fonts/KaTeX_Main-Italic.ttf) format("truetype");font-
weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(fonts/
KaTeX_Main-Regular.woff2) format("woff2"),url(fonts/KaTeX_Main-Regular.woff)
format("woff"),url(fonts/KaTeX_Main-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(fonts/
KaTeX_Math-BoldItalic.woff2) format("woff2"),url(fonts/KaTeX_Math-BoldItalic.woff)
format("woff"),url(fonts/KaTeX_Math-BoldItalic.ttf) format("truetype");font-
weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(fonts/
KaTeX_Math-Italic.woff2) format("woff2"),url(fonts/KaTeX_Math-Italic.woff)
format("woff"),url(fonts/KaTeX_Math-Italic.ttf) format("truetype");font-
weight:400;font-style:italic}@font-face{font-
family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Bold.woff2)
format("woff2"),url(fonts/KaTeX_SansSerif-Bold.woff)
format("woff"),url(fonts/KaTeX_SansSerif-Bold.ttf) format("truetype");font-
weight:700;font-style:normal}@font-face{font-
family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Italic.woff2)
format("woff2"),url(fonts/KaTeX_SansSerif-Italic.woff)
format("woff"),url(fonts/KaTeX_SansSerif-Italic.ttf) format("truetype");font-
weight:400;font-style:italic}@font-face{font-
family:"KaTeX_SansSerif";src:url(fonts/KaTeX_SansSerif-Regular.woff2)
format("woff2"),url(fonts/KaTeX_SansSerif-Regular.woff)
format("woff"),url(fonts/KaTeX_SansSerif-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(fonts/
KaTeX_Script-Regular.woff2) format("woff2"),url(fonts/KaTeX_Script-Regular.woff)
format("woff"),url(fonts/KaTeX_Script-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(fonts/
KaTeX_Size1-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size1-Regular.woff)
format("woff"),url(fonts/KaTeX_Size1-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(fonts/
KaTeX_Size2-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size2-Regular.woff)
format("woff"),url(fonts/KaTeX_Size2-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(fonts/
KaTeX_Size3-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size3-Regular.woff)
format("woff"),url(fonts/KaTeX_Size3-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(fonts/
KaTeX_Size4-Regular.woff2) format("woff2"),url(fonts/KaTeX_Size4-Regular.woff)
format("woff"),url(fonts/KaTeX_Size4-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}@font-face{font-
family:KaTeX_Typewriter;src:url(fonts/KaTeX_Typewriter-Regular.woff2)
format("woff2"),url(fonts/KaTeX_Typewriter-Regular.woff)
format("woff"),url(fonts/KaTeX_Typewriter-Regular.ttf) format("truetype");font-
weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New
Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto;border-
color:currentColor}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-
version:after{content:"0.13.0"}.katex .katex-
mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;w
idth:1px;overflow:hidden}.katex .katex-
html>.newline{display:block}.katex .base{position:relative;white-
space:nowrap;width:-webkit-min-content;width:-moz-min-content;width:min-
content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-
weight:700}.katex .textit{font-style:italic}.katex .textrm{font-
family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-
family:KaTeX_Typewriter}.katex .mathnormal{font-family:KaTeX_Math;font-
style:italic}.katex .mathit{font-family:KaTeX_Main;font-
style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-
family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-
weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-
family:KaTeX_AMS}.katex .mathcal{font-
family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-
family:KaTeX_Fraktur}.katex .mathtt{font-
family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-
family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-
family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-
family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-
family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-
family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-
layout:fixed;border-collapse:collapse}.katex .vlist-r{display:table-
row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex
.vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{displa
y:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-
t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-
size:1px;width:2px;min-width:2px}.katex .vbox{display:inline-flex;flex-
direction:column;align-
items:baseline}.katex .hbox{width:100%}.katex .hbox,.katex .thinbox{display:inline-
flex;flex-direction:row}.katex .thinbox{width:0;max-width:0}.katex .msupsub{text-
align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-
line{display:inline-block;width:100%;border-bottom-
style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-
line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-
line{min-height:1px}.katex .mspace{display:inline-
block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap
>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix
,.katex .llap>.fix,.katex .rlap>.fix{display:inline-
block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.k
atex .clap>.inner>span{margin-left:-50%;margin-
right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex
.hline,.katex .overline .overline-line,.katex .underline .underline-
line{display:inline-block;width:100%;border-bottom-
style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-
style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-
right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-
size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-
size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-
ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-
size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-
size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-
size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-
ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-
size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-
size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-
size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-
ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex
.fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-
size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-
size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-
size2.size1,.katex .sizing.reset-size2.size1{font-
size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-
size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-
size2.size3,.katex .sizing.reset-size2.size3{font-
size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-
size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-
size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-
ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-
size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-
size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-
size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-
ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-
size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex
.sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-
size2.size11,.katex .sizing.reset-size2.size11{font-
size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-
size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex
.sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-
size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-
ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-
size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-
size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-
size3.size6,.katex .sizing.reset-size3.size6{font-
size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-
size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-
size3.size8,.katex .sizing.reset-size3.size8{font-
size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-
size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-
size3.size10,.katex .sizing.reset-size3.size10{font-
size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-
size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-
size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-
ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-
size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-
size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-
size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-
ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex
.fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-
size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-
size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-
size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-
ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-
size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-
size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-
size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-
ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-
size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-
size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex
.sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-
size5.size4,.katex .sizing.reset-size5.size4{font-
size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-
size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-
size5.size6,.katex .sizing.reset-size5.size6{font-
size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-
size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-
size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-
ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-
size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-
size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-
size5.size11,.katex .sizing.reset-size5.size11{font-
size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-
size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-
size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-
ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-
size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-
size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-
size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-
ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-
size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-
size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-
size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-
ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex
.fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-
size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-
size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-
size7.size1,.katex .sizing.reset-size7.size1{font-
size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-
size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-
size7.size3,.katex .sizing.reset-size7.size3{font-
size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-
size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex
.sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-
size7.size6,.katex .sizing.reset-size7.size6{font-
size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-
size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-
size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-
ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-
size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-
size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-
size7.size11,.katex .sizing.reset-size7.size11{font-
size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-
size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex
.sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-
size8.size3,.katex .sizing.reset-size8.size3{font-
size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-
size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex
.sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-
size8.size6,.katex .sizing.reset-size8.size6{font-
size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-
size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex
.sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-
size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-
ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-
size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-
size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-
size9.size1,.katex .sizing.reset-size9.size1{font-
size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-
size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex
.sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-
size9.size4,.katex .sizing.reset-size9.size4{font-
size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-
size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex
.sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-
size9.size7,.katex .sizing.reset-size9.size7{font-
size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-
size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex
.sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-
size9.size10,.katex .sizing.reset-size9.size10{font-
size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-
size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-
size10.size1,.katex .sizing.reset-size10.size1{font-
size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-
size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-
size10.size3,.katex .sizing.reset-size10.size3{font-
size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-
size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-
size10.size5,.katex .sizing.reset-size10.size5{font-
size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-
size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-
size10.size7,.katex .sizing.reset-size10.size7{font-
size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-
size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-
size10.size9,.katex .sizing.reset-size10.size9{font-
size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-
size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-
size10.size11,.katex .sizing.reset-size10.size11{font-
size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-
size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-
size11.size2,.katex .sizing.reset-size11.size2{font-
size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-
size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-
size11.size4,.katex .sizing.reset-size11.size4{font-
size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-
size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-
size11.size6,.katex .sizing.reset-size11.size6{font-
size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-
size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-
size11.size8,.katex .sizing.reset-size11.size8{font-
size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-
size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-
size11.size10,.katex .sizing.reset-size11.size10{font-
size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-
size11.size11{font-size:1em}.katex .delimsizing.size1{font-
family:KaTeX_Size1}.katex .delimsizing.size2{font-
family:KaTeX_Size2}.katex .delimsizing.size3{font-
family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex
.delimsizing.mult .delim-size1>span{font-
family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-
family:KaTeX_Size4}.katex .nulldelimiter{display:inline-
block;width:.12em}.katex .delimcenter,.katex .op-
symbol{position:relative}.katex .op-symbol.small-op{font-
family:KaTeX_Size1}.katex .op-symbol.large-op{font-
family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-
align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-
body:not(.accent-full)
{width:0}.katex .overlay{display:block}.katex .mtable .vertical-
separator{display:inline-block;min-
width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-
align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-
align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-
align{text-align:left}.katex
svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;str
oke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-
linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-
dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg
path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-
width:none;max-
height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hi
dden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-
tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-
left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-
right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-
left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-
center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-
right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-
pad{padding:0 .5em}.katex .cd-arrow-pad{padding:0 .55556em
0 .27778em}.katex .mover,.katex .munder,.katex .x-arrow{text-
align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-
sizing:border-box;border:.04em solid}.katex .cancel-
pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-
right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex
.angl{box-sizing:border-content;border-top:.049em solid;border-right:.049em
solid;margin-right:.03889em}.katex .anglpad{padding:0 .03889em}.katex .eqn-
num:before{counter-increment:katexEqnNo;content:"(" counter(katexEqnNo)
")"}.katex .mml-eqn-num:before{counter-increment:mmlEqnNo;content:"("
counter(mmlEqnNo) ")"}.katex .mtr-glue{width:50%}.katex .cd-vert-
arrow{display:inline-block;position:relative}.katex .cd-label-left{display:inline-
block;position:absolute;right:calc(50% + .3em);text-align:left}.katex .cd-label-
right{display:inline-block;position:absolute;left:calc(50% + .3em);text-
align:right}.katex-display{display:block;margin:1em 0;text-align:center}.katex-
display>.katex{display:block;text-align:center;white-space:nowrap}.katex-
display>.katex>.katex-html{display:block;position:relative}.katex-
display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-
display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-
display.fleqn>.katex{text-align:left;padding-left:2em}body{counter-reset:katexEqnNo
mmlEqnNo}

/
*----------------------------------------------------------------------------------
-----------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license
information.

*----------------------------------------------------------------------------------
----------*/
.katex-error {
color: var(--vscode-editorError-foreground);
}

</style>

<style>
.task-list-item { list-style-type: none; } .task-list-item-checkbox { margin-left:
-20px; vertical-align: middle; }
</style>

</head>
<body class="vscode-body vscode-light">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-
markdown-css/5.1.0/github-markdown.min.css">
<style>
.markdown-body {
box-sizing: border-box;
min-width: 200px;
max-width: 980px;
margin: 0 auto;
padding: 45px;
}
</style>
<script>
// hackish way to apply the github-markdown stylesheet
document.getElementsByTagName("body")[0].classList.add("markdown-body");
</script>
<h1 id="toa-translation-pack-guide-">ToA Translation Pack Guide <!-- omit in toc --
></h1>
<p>v2022.03.14</p>
<h3 id="table-of-contents">Table of Contents</h3>
<ul>
<li><a href="#file-structure">File structure</a></li>
<li><a href="#manifest">Manifest</a></li>
<li><a href="#assets">Assets</a></li>
<li><a href="#text">Text</a></li>
<li><a href="#encounter-script">Encounter script</a></li>
<li><a href="#the-strings-file">The strings file</a>
<ul>
<li><a href="#fills">Fills</a></li>
<li><a href="#fill-complications">Fill complications</a></li>
<li><a href="#fill-complications---plurals">Fill complications - Plurals</a></li>
<li><a href="#fill-complications---gender-and-character-pronouns">Fill
complications - Gender and character pronouns</a>
<ul>
<li><a href="#notes">Notes</a></li>
</ul>
</li>
<li><a href="#fill-complications---advanced-solving-grammatical-gender-case-and-
additional-requirements-with-extra-keys">Fill complications - (advanced!) Solving
grammatical gender, case, and additional requirements with <em>Extra
Keys</em></a></li>
</ul>
</li>
<li><a href="#fonts">Fonts</a></li>
</ul>
<h1 id="file-structure">File structure</h1>
<p>Translation packs are installed as folders inside the translations/ directory
next to the game. For example, for a translation pack named <code>es</code>:</p>
<pre><code><code><div>translations/
es/
manifest.json
assets/
Tales of Androgyny.exe
</div></code></code></pre>
<h1 id="manifest">Manifest</h1>
<p>The manifest is a JSON file that can have the following data:</p>
<pre><code class="language-jsonc"><div>{
<span class="hljs-attr">&quot;languageName&quot;</span>: <span class="hljs-
string">&quot;Español&quot;</span>,
<span class="hljs-attr">&quot;localeId&quot;</span>: <span class="hljs-
string">&quot;es&quot;</span>
}
</div></code></pre>
<table>
<thead>
<tr>
<th>Field</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>languageName</td>
<td>Name that will appear in the language dropdown in the options menu</td>
</tr>
<tr>
<td>localeId</td>
<td>ICU locale ID for the language (see list: <a
href="https://www.localeplanet.com/icu/">https://www.localeplanet.com/icu/</a>),
used for plural categories and possibly formatting</td>
</tr>
</tbody>
</table>
<h1 id="assets">Assets</h1>
<p>Some assets (mostly images) in the game have text and will need to be replaced
by a translation. To replace an asset, find it inside the game's jar in the
<code>assets/</code> folder, edit it as desired, then place the edited copy inside
the language pack's <code>assets/</code>, with the same name and subfolders as the
original. For example, if replacing
<code>assets/ui/option/Static_Elements.png</code>, using the example language pack
structure above, the edited copy should be placed in
<code>translations/es/assets/ui/option/Static_Elements.png</code>.</p>
<p>To find the base assets from the game, open the Tales of Androgyny.jar file
using any program that can open zip files - 7-Zip, WinRAR, or rename to Tales of
Androgyny.zip and open with Windows Explorer.</p>
<h1 id="text">Text</h1>
<p>There are two main types of text in the game:</p>
<ul>
<li>The Encounters script - contains all the <em>encounters</em> in the game, i.e.,
the parts that are shown in the &quot;VN-style&quot; interface, and includes both
text and display instructions</li>
<li>The strings file - all other text in the game</li>
</ul>
<p>Note: all text files should be saved using the <code>UTF-8</code> encoding.
Please ensure your text editor is configured to save files using that encoding, or
else characters outside the base latin alphabet will cause issues. Do <em>not</em>
use ANSI, UTF-16, &quot;UTF-8 with BOM&quot;, or other encodings.</p>
<h1 id="encounter-script">Encounter script</h1>
<p>The encounter script is a JSON file at
<code>assets/script/encounters.json</code>. The file consists of a number of
encounters defined by name (for example, <code>GOBLIN-REUNION</code>), and each
encounter itself is a list of items.</p>
<p>Each item may have the following properties that should be translated:</p>
<ul>
<li><code>speaker</code> - Indicates who is speaking, appears on the bubble on the
top left on the message box. <strong>NOTE: this should not be changed if the value
is <code>Hiro</code>.</strong> This special value is replace by the player
character's name. Do not change it.</li>
<li><code>text</code> - The text that shows up on the main message box.</li>
<li><code>chatter</code> - The text that shows up on the side message box sometimes
used by e.g. party members.</li>
</ul>
<p>Any other properties in the file are ignored and can be removed.</p>
<p>Each individual encounter in your translation pack will be merged with the base,
english version of the encounter with the same ID when it is loaded. If your pack
does not have the encounter, it will fall back to using the base version. Also,
because changes to encounters may break the flow of the scenes, if your pack's
version of the encounter does not have the same amount of items on the list (for
example, because the encounter was changed to have more added in the base game),
your version of the encounter will be ignored and will have to be updated.</p>
<h1 id="the-strings-file">The strings file</h1>
<p>The strings file is a <em>.properties format</em> file (<a
href="https://en.wikipedia.org/wiki/.properties">https://en.wikipedia.org/
wiki/.properties</a>) at <code>assets/translation/strings.properties</code>. The
file consists of a list of strings used throughout the game in menus,
notifications, etc, generally anything that is not the main text of an
encounter.</p>
<p>The file uses a <strong>key=value</strong> format. When the game needs to
display a string, it will look up the data from this file by the <em>key</em>, and
display the <em>value</em>. For example, if the game needs to display the text for
the <em>Load</em> button on the main menu, it will lookup the key
<code>mainmenu.load</code> and find the definition <code>mainmenu.load=Load</code>
and get the value <code>Load</code>.</p>
<p>If there is no strings file in the translation, or if a specific key is missing
from the translation, the game will use the value from the default language
included with the game.</p>
<p>Some strings are not just fixed text and need to have words or expressions
inserted into them, which we call <strong>Fills</strong>. See below for how to use
fills.</p>
<h2 id="fills">Fills</h2>
<p>Some strings need to have something dynamically inserted in them. For
example:</p>
<ul>
<li><code>item.potion.description.mana=Restores {0} mana.</code> - the amount of
mana needs to be inserted.</li>
<li><code>skillselectionscene.you_have_removed_someperk=You have removed
{0}.</code> - the name of the perk needs to be inserted.</li>
</ul>
<p>In these cases, the game looks up the string by key like normal, but also passes
in either a number or a string respectively to fill in the string. In some cases,
multiple fills might be necessary:</p>
<ul>
<li><code>skillselectionscene.you_have_reduce_someperk_to_rank_x=You have reduced
{0} to Rank {1}.</code> - gets a perk name at 0, and a number at 1.</li>
</ul>
<p>The game specifies the fills in a certain order (starting at 0, not 1!). The
syntax <code>{0}</code> gets fill zero and inserts it in the string. Same for
<code>{1}</code>, <code>{2}</code> and so on.</p>
<p>Some languages need to insert these values in different places, depending on the
sentence. When you are translating a string, determine the proper place to insert a
fill and use that syntax to insert it there.</p>
<p>In general, what the fills mean should be easy to understand from context. Many
string keys have names such as <code>shopscene.you_purchase_the_x</code> that imply
what the fill is. For others, the english sentence should contextualize what the
fills are.</p>
<h2 id="fill-complications">Fill complications</h2>
<p>Depending on your language, some fills are not as simple as inserting the number
or word in a sentence. Most languages have plurals, some have gender, and some have
grammatical case.</p>
<h2 id="fill-complications---plurals">Fill complications - Plurals</h2>
<p>When something in the sentence needs to vary based on a plural, use the plural
syntax. Here's an example:</p>
<pre><code><code><div>mutation.cured_x_bleed_points=Cured {0} bleed {0, plural,
one{point.} other{points.}}
</div></code></code></pre>
<p>The number of bleed points is fill 0. We fill the number in normally where
<code>{0}</code> is, then we use a plural conditional on that fill to determine
whether to use the singular or plural. To break it down (read from bottom
left):</p>
<pre><code><code><div>{0, plural, one{point.} other{points.}}
▲ ▲ ▲ ▲ ▲ ▲
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ │ │ │ │ Use this other text.
│ │ │ │ │
│ │ │ │ │ If it's any other number...
│ │ │ │
│ │ │ │ Use this text.
│ │ │
│ │ │ If the fill is 1...
│ │
│ │ Use the plural syntax.

│ The fill number.
</div></code></code></pre>
<p>The <code>one</code> and <code>other</code> parts are the <em>plural rules</em>.
The plural rules you can use depend on your language. For English, for example, you
can just use <code>one</code> for the singular, and <code>other</code> for every
other case. For Russian, the rules are <code>one</code> for numbers ending in 1,
<code>few</code> for certain numbers ending in 2-4, <code>many</code> for some
others, and <code>other</code> for the rest, due to Russian have more complex ways
of expressing plurals.</p>
<p>To use the proper rules for your language, <strong>make sure you specify the
proper <code>localeId</code> in your manifest.</strong> Then, consult the <a
href="https://unicode-org.github.io/cldr-staging/charts/latest/supplemental/
language_plural_rules.html">ICU Language Plural Rules Table</a>. Find your
language, then look at the <em>cardinal</em> parts (not <em>ordinal</em> or
<em>range</em>). The categories in that table are the rules you can use.</p>
<h2 id="fill-complications---gender-and-character-pronouns">Fill complications -
Gender and character pronouns</h2>
<p>Some strings require knowning the gender of a character. Usually in these cases
one of the fills is a special type called a <em>pronoun set</em>. When you have a
<em>pronoun set</em> as one of the fills, you can use one of the following special
tokens to insert pronouns:</p>
<ul>
<li><code>{nom0}</code> - replaced with
<code>pronouns.&lt;gender&gt;.nominative</code>, for example: he, she</li>
<li><code>{poss0}</code> - replaced with
<code>pronouns.&lt;gender&gt;.possessive</code>, for example: his, her</li>
<li><code>{obj0}</code> - replaced with
<code>pronouns.&lt;gender&gt;.objective</code>, for example: him, her</li>
</ul>
<p>The <code>0</code> above is just an example. If the <em>pronoun set</em> is at a
different index, just use that index instead - <code>{nom1}</code>,
<code>{poss2}</code>, etc.</p>
<p>If you need the words to be capitalized, there are alternate versions that make
the first letter of the pronoun uppercase: <code>{Nom0}</code>,
<code>{Poss0}</code>, <code>{Obj0}</code>.</p>
<p>If this is not sufficient to support pronouns and gender for your language, you
can use the <em>select</em> syntax to create a conditional on a fill, similar to
the <em>plural</em> conditional above. Here are two examples:</p>
<ul>
<li><code>{0, select, m{He leaves the room.} other{She leaves the room.}}</code> -
picks &quot;He leaves the room.&quot; if 0 is &quot;m&quot;, otherwise picks
&quot;She leaves the room.&quot;</li>
<li><code>{1, select, f{She walks up to the counter.} m{She walks up to the
counter.}}</code> - picks &quot;She walks up to the counter.&quot; if 1 is
&quot;f&quot;, and picks &quot;She walks up to the counter.&quot; if 1 is
&quot;m&quot;</li>
</ul>
<p>This works because a <em>pronoun set</em> fill is automatically turned into
<code>m</code> or <code>f</code>.</p>
<p>See the diagram above explaining the <em>plural</em> syntax if this looks
confusing. This works much the same, but the difference is it checks text instead
of numbers.</p>
<h3 id="notes">Notes</h3>
<p>The following sets of strings all have the enemy's <em>pronoun set</em> as fill
0:</p>
<ul>
<li><code>climax.*</code></li>
<li>`battle.knotting_message.*</li>
<li>`battle.facesitting_message.*</li>
<li><code>battle.anal_message.*</code></li>
<li><code>battle.oral_message.*</code></li>
</ul>
<h2 id="fill-complications---advanced-solving-grammatical-gender-case-and-
additional-requirements-with-extra-keys">Fill complications - (advanced!) Solving
grammatical gender, case, and additional requirements with <em>Extra Keys</em></h2>
<p>For advanced requirements for certain languages, we have a system of <em>extra
keys</em>. Extra keys allow you to define additional variants of strings, or
additional attributes that you can then do conditional logic on.</p>
<p>If your language has grammatical case inflection, you might need different
versions of the same word. For example, if you're using the Latin word for
&quot;cook&quot;:</p>
<ul>
<li>as a subject (nominative), you would say &quot;coquus&quot; - &quot;[the]
cook&quot; (e.g. coquus ibī stat – the cook is standing there)</li>
<li>when talking about something that pertains to the cook (genitive), you would
say coquī - &quot;[the] cook's / [of the] cook&quot; (e.g. nōmen coquī Claudius est
– the cook's name is Claudius)</li>
<li>etc for the other cases of Latin.</li>
</ul>
<p>Modern languages that have grammatical case inflection for nouns include the
Slavic languages, German, and Hungarian.</p>
<p>Imagine that we try to turn the examples above into strings:</p>
<pre><code><code><div>cook.name=coquus
x_is_standing_there={0} ibī stat
x_name_is_claudius=nōmen {0} Claudius est
</div></code></code></pre>
<p>In this case, we cannot just use <code>{0}</code> to fill in the word for cook,
because it will incorrectly use the nominative case in both sentences! We can solve
this problem using <em>extra keys</em>. In this case, what you can do is the
following:</p>
<pre><code><code><div>cook.name=coquus
cook.name.genitive=coquī
x_is_standing_there={0} ibī stat
x_name_is_claudius=nōmen {0.genitive} Claudius est
</div></code></code></pre>
<p>We define an extra key <code>cook.name.genitive</code>. Then, in the sentence
that needs the genitive, instead of just using <code>{0}</code> we use
<code>{0.genitive}</code> to get the extra key we created. Thus, both sentences get
the correct case filled in. Note that, naturally, if you ask for
<code>.genitive</code> extra key in a string, you will need to define
<code>.genitive</code> extra keys for all items that could end up in that
string.</p>
<p><em>Extra keys</em> can also be used in conditionals. For example, if you have a
sentence that depends on gender for something that isn't already configured to
support gender (characters), such as grammatical gender in Spanish:</p>
<pre><code><code><div>library=biblioteca
book=libro
where_is_the_x=¿Donde está el {0}?
</div></code></code></pre>
<p>You would run into an issue as the sentence for <code>where_is_the_x</code> has
to be different depending on whether it's about a book or a library. To solve this,
you can add extra information in an extra key, and then use that extra key in a
select conditional much like we did for character gender:</p>
<pre><code><code><div>library=biblioteca
library.gender=f
book=libro
book.gender=m
where_is_the_x=¿Donde está {0.gender, select, m{el {0}} f{la {0}}}?
</div></code></code></pre>
<p><strong>Note: the names of extra keys should start with a letter or underscore
and should only contain letters from the base latin alphabet, numbers, and
underscores.</strong></p>
<h1 id="fonts">Fonts</h1>
<p>The fonts included with the game may not contain all the characters required for
your language. If that is the case, you will need to find fonts that do and replace
two types of font files (using asset replacement):</p>
<ul>
<li><code>.ttf</code> - A TrueType font, similar to the ones you would normally
download to install on your computer.</li>
<li><code>.fnt</code> + <code>.png</code> - A generated bitmap font. You will need
to use the <a href="https://libgdx.com/wiki/tools/hiero">Hiero tool</a> to create
these.</li>
</ul>
</div>
</body>
</html>

You might also like