94 lines
5.8 KiB
Markdown
94 lines
5.8 KiB
Markdown
# Translating the Books
|
|
|
|
The three Singe books are kept in English and in French, Italian, German, and Spanish. The English
|
|
is the source: docs/Manual.adoc, docs/Reference.adoc, and docs/Learn.adoc with the lessons in
|
|
docs/lessons/. Each language has the same files under docs/fr, docs/it, docs/de, and docs/es, plus
|
|
locale.adoc (the captions Asciidoctor prints: Chapter, Table of Contents, Note, and the like) and
|
|
glossary.md (the words that language's books use for Singe's terms).
|
|
|
|
The English stays ASCII. The translations are UTF-8, with the language's own letters and marks.
|
|
|
|
## Keeping Them Current
|
|
|
|
Every change to an English book goes into all four translations in the same change. Then:
|
|
|
|
ruby util/checkTranslations.rb compares every translation with the English, block by block
|
|
./build-docs.sh builds all five languages
|
|
|
|
The check finds a section, paragraph, list item, table row, picture, note, or listing the
|
|
translation lacks or has extra; Lua code that differs once comments are taken out; references
|
|
that differ; and inline code and web addresses that differ (warnings). It cannot tell a stale
|
|
sentence from a current one: a changed English sentence has to be found and changed in each
|
|
translation by hand.
|
|
|
|
A new section whose id Asciidoctor makes from its title needs that English id written above the
|
|
translated heading, or the translated title changes the id and links to it break. The check names
|
|
the id a section should have.
|
|
|
|
## Rules for Translators
|
|
|
|
**Translate:** prose (paragraphs, headings, list items, table cells, notes, block titles such as
|
|
.Example), the text of links (`<<id,text>>` and `xref:Book.adoc#id[text]`), a picture's alternative
|
|
text (`image::learn/01-hello.png[The finished lesson, 480]`: the words, not the file or the size),
|
|
the labels of the Reference's entries (*Parameters:*, *Returns:*, *Since:*, *See also:*, *Notes:*),
|
|
and comments in code listings. A link whose English text is its target's title gets the
|
|
translated title as that language's book has it.
|
|
|
|
**Never change:**
|
|
|
|
* anything in backticks, and every listing except its comments; string literals in code stay as
|
|
they are, because they match the pictures and the shipped lesson scripts;
|
|
* ids and anchors (`[#id]`, `[[id]]`), the targets of links, includes, and pictures;
|
|
* attribute lines (`:name: value`), block attribute lines (`[source,lua]`, `[cols=...]`), table cell
|
|
specifiers (`a|`, `2+|`), and the admonition keywords (`NOTE:`, `TIP:`, `IMPORTANT:`, `WARNING:`,
|
|
`CAUTION:`), which are syntax: locale.adoc translates the captions they print;
|
|
* `kbd:[...]` and `menu:...[...]` macros and web addresses;
|
|
* file names, paths, command line options, settings, function and constant names, and anything
|
|
Singe prints or shows: its menus and messages are in English, so the books quote them in English.
|
|
|
|
**Keep the shape:** the same paragraphs (never merge or split one), the same list items, table
|
|
rows, and columns, the same notes, and the same number of lines in every listing. In a listing
|
|
that is not Lua (a folder layout, a settings file, a trace), translate only the descriptions and
|
|
comments, line for line. Wrapping inside a paragraph is free.
|
|
|
|
**Voice:** the Manual and the lessons are in the author's voice: short plain sentences, "you",
|
|
direct, a little dry humor. Keep it plain; do not make it formal or add words. The Reference is
|
|
dense and exact; keep it dense and exact. The lessons are for someone who has never programmed:
|
|
keep them friendly and simple.
|
|
|
|
**Addressing the reader:** French *vous*; Italian *tu*; German *du* (lower case); Spanish the
|
|
familiar singular (never *vosotros*, never *usted*).
|
|
|
|
**Varieties:** French of France, Italian of Italy, German of Germany (with the sharp s), Spanish of
|
|
Spain (*ordenador*, not *computadora*).
|
|
|
|
**Headings:** sentence case in French, Italian, and Spanish (a capital on the first word and on
|
|
names only); German capitalises its nouns as usual. A heading that is a name from the code
|
|
(`==== spriteLoad`, `=== controls.cfg`) stays exactly as it is.
|
|
|
|
**Typography:**
|
|
|
|
* French: guillemets with no-break spaces inside; a no-break space (U+00A0) before ; : ! ? in
|
|
prose, never inside AsciiDoc syntax (`term::`, `NOTE:`, attributes, macros, inline code). Type
|
|
ordinary spaces and run `python3 util/frenchSpaces.py`, which makes them no-break.
|
|
* German: low-high quotation marks.
|
|
* Italian and Spanish: guillemets with no spaces inside; Spanish opens questions and exclamations
|
|
with their inverted marks.
|
|
* The English's "`curved quotes`" become the language's own marks.
|
|
* An apostrophe straight before or after inline code (l'`id`, `id`'s) is AsciiDoc quote syntax and
|
|
stops the code rendering: write the typographic apostrophe there (U+2019) or reword. The check counts
|
|
inline code the way Asciidoctor renders it, so a span lost this way shows up as a warning.
|
|
* ` -- ` stays as it is (it prints a dash in every language), but only with a space on both sides:
|
|
`--,` or `--.` prints the two hyphens. Where the language wants a comma after the dash, recast
|
|
the sentence.
|
|
* A decimal in running prose takes the language's comma (1,5 seconds); a number the reader types,
|
|
or one in code or inline code, never does.
|
|
|
|
**Names:** Singe, its expansion "SINGE Is Not a Game Emulator" (which may be glossed in
|
|
parentheses), Hypseus, Daphne, Lua, SDL, and every other product name stay as they are. The books
|
|
name no games except where the English does, for Singe's own name; a translation adds none.
|
|
Other programs and keys go by the names the reader's own system shows (Notepad is Bloc-notes on a
|
|
French Windows, Ctrl is Strg on a German keyboard): the glossary lists them.
|
|
|
|
**Terms:** use the language's glossary.md. A term the glossary lacks that comes up more than once
|
|
gets one rendering, added to the glossary.
|