The sumer package provides tools for working with
Sumerian cuneiform texts. It supports conversion between different
representations, dictionary lookup, and the creation of translation
templates.
Sumerian texts today are typically available in
transliterated form. Transliteration renders the
pronunciation of the signs in Latin characters β for example, the
Sumerian word for king is transliterated as lugal. However,
transliteration is actually irrelevant for translation, because the
meaning of a sign depends on the sign itself. The only exception is when
there is reason to believe that words with similar pronunciations also
have similar meanings. But even then, it is possible to base
dictionaries solely on the cuneiform characters.
Each cuneiform sign has three representations:
| Representation | Example | Description |
|---|---|---|
| Transliteration | lugal |
Phonetic transcription in lowercase letters |
| Sign name | LUGAL |
Canonical name in uppercase letters |
| Cuneiform | π | Unicode character (U+12000 to U+12500) |
The package works internally primarily with cuneiform characters and sign names. Transliteration serves as a convenient input method from which the other forms are recovered. Many signs have multiple readings (transliterations) but only one sign name and one cuneiform character.
The function info() displays all available information
about a sign or sign sequence: reading, sign name, cuneiform character,
and alternative readings.
info("lugal")
#> π LUGAL lugal, lillan, rab3, Ε‘arrum
#>
#> syllables : lugal
#> sign names : LUGAL
#> cuneiform text : πThe output contains a table with one row per sign as well as the three representations of the text: syllables (transliteration), sign names, and cuneiform.
For compound expressions, all contained signs are analyzed:
info("d-en-lil2")
#> π AN an, d, diΔir, il3, am6, naggax
#> π EN en, in4, ru12, uru16
#> π€ KID ke4, kid, lil2, ge2, gi2
#>
#> syllables : d-en-lil2
#> sign names : AN.EN.KID
#> cuneiform text : πππ€Here, each individual sign (d, en, lil2) is shown with its sign name
(AN, EN, KID) and its cuneiform character. The alternatives
column lists all possible readings β for instance, the sign EN can also
be read as ru12 or uru16.
Two functions are available for converting entire texts:
# Transliteration -> Cuneiform
as.cuneiform("lugal-e")
#> ππ
as.cuneiform(c("d-en-lil2", "an-ki"))
#> πππ€
#> ππ
# Transliteration -> Sign names
as.sign_name("lugal-e")
#> LUGAL.E
as.sign_name(c("d-en-lil2", "an-ki"))
#> AN.EN.KID
#> AN.KIBoth functions accept character vectors and process each element
individually. Within a word, hyphens (-) separate
syllables; dots (.) separate sign names; spaces separate
words.
Note on display: For cuneiform characters to display correctly, a font supporting the Unicode βCuneiformβ block (U+12000βU+12500) must be installed. In RStudio, the AGG graphics backend should also be enabled (Tools > Global Options > General > Graphics > Backend > AGG).
The package includes a built-in dictionary that is loaded with
read_dictionary():
dic <- read_dictionary()
#> ###---------------------------------------------------------------
#> ### Sumerian Dictionary
#> ###
#> ### Author: Robin Wellmann
#> ### Year: 2026
#> ### Version: 0.5
#> ### Watch for Updates: https://founder-hypothesis.com/en/sumerian-mythology/downloads/
#> ###---------------------------------------------------------------When loading, the metadata is displayed (author, version, URL for updates). The dictionary is a data frame with entries for cuneiform characters, readings, and translations.
A Sumerian expression can be looked up with
look_up():
look_up("lugal", dic)
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#> Search: lugal
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#>
#> Cuneiform: π
#> Sign Names: LUGAL
#>
#> βΆ Translations:
#> [16] S great one with human body {king}
#> [ 3] S kingship
#> [ 1] S great one with human body
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββThe output shows:
For compound expressions, all partial combinations are also looked up:
look_up("d-suen", dic)
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#> Search: d-suen
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#>
#> Cuneiform: πππͺ
#> Sign Names: AN.EN.ZU
#>
#> βΆ Translations:
#> [ 8] S god of heaven who is a cultural leader with knowledge {god Suen}
#> [ 1] S divine cultural leader with knowledge
#>
#> βΆ Individual Signs / Substrings:
#>
#> AN π
#> [29] S god of heaven
#> [18] βSβS divine S
#> [5] S sky/heaven
#> [1] AββA A by divine intervention
#> [1] S divine one
#>
#> EN π
#> [17] S cultural leader
#> [4] SββA who acts as S
#> [1] S cultural leadership
#>
#> ZU πͺ
#> [1] S knowledge
#> [1] βSβA with knowledge about S
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββHere, translations are shown not only for the complete expression AN.EN.ZU but also for the substrings AN, EN, ZU, AN.EN, EN.ZU, etc. This gives an overview of the meanings of the individual components at a glance.
If you know the English term and are looking for the Sumerian sign,
use the parameter lang = "en":
look_up("Enki", dic, "en")
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#> Search: Enki
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#>
#> βΆ Matches for 'Enki':
#>
#> AN.EN.KI πππ
#> [1] S god of heaven who is the cultural leader of the earth {god Enki}
#>
#> AN.ZA.GUDΓKUR.BI.I.A πππ ππΏπ
#> [1] S divine radiance of the strong invincible one, the raw material of the
#> god Enki, the god of heaven who is the cultural leader of the earth
#> {Zambija}
#>
#> I.A πΏπ
#> [1] S life force with transformative power {god Enki}
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββThe reverse lookup searches all translations in the dictionary and displays matching entries with their sign names and cuneiform characters.
Each dictionary entry has a grammatical type in addition to its translation. These types describe what function the sign can have in a sentence. Since the same sign can serve different functions depending on the context, it can have multiple entries with different types in the dictionary.
There are three basic types:
| Type | Name | Description |
|---|---|---|
| S | Noun | Noun phrases and substantives |
| V | Verb | Verbs and verbal expressions |
| A | Attribute | Modifying subordinate clauses |
For example, the sign LUGAL is a noun (S) with the meaning βkingβ, while the sign SI can appear in the dictionary both as a noun (S: βalignment of the orderβ) and with the operator type Sx->V (βto put into order Sβ).
In addition to the basic types, there are operators. An operator takes an expression of a certain basic type as its argument and produces an expression of a (possibly different) basic type. The notation describes where the argument is located and which type is produced:
| Notation | Meaning |
|---|---|
Sx->V |
Takes an S to the left as argument, produces a V |
xS->S |
Takes an S to the right as argument, produces an S |
Sx->A |
Takes an S to the left as argument, produces an A |
Vx->V |
Takes a V to the left as argument, produces a V |
Vx->A |
Takes a V to the left as argument, produces an A |
SSx->V |
Takes two S to the left as arguments, produces a V |
The x marks the position of the operator itself:
Sx means the argument S is to the left of the operator;
xS means it is to the right.
An example: The sign AN can have the meaning βheavenβ as a noun (type
S). But it can also appear as an operator xS->S with the
meaning βdivine Sβ β in this case, a noun stands to the right of AN and
the result is again a noun. In the expression d-en-lil2
(AN.EN.KID), AN functions as such an operator and produces βthe divine
EN.KIDβ.
In translations, the placeholder S or V
stands for the argument of the operator. For operators with two
arguments (e.g., SSx->V), S1 and
S2 stand for the two arguments.
You can view the different types of a sign with
look_up():
look_up("an", dic)
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#> Search: an
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
#>
#> Cuneiform: π
#> Sign Names: AN
#>
#> βΆ Translations:
#> [29] S god of heaven
#> [18] βSβS divine S
#> [ 5] S sky/heaven
#> [ 1] AββA A by divine intervention
#> [ 1] S divine one
#>
#> ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββWhen you want to translate an entire sentence, the function
skeleton() helps. It generates a hierarchical template in
which each word is broken down into its components. Consider the
following input as an example:
x <- "<d-en-ki> (ki a). jal2 ((e2-kur) ra)."
skeleton(x)
#> |an-en-ki-ki-a-ig-e2-kur-ra::
#> |an-en-ki=AN.EN.KI=πππ ::
#> |ki-a=KI.A=π π::
#> | ki=KI=π ::
#> | a=A=π::
#> |ig=IG=π
::
#> |e2-kur-ra=E2.KUR.RA=ππ³π::
#> | e2-kur=E2.KUR=ππ³::
#> | e2=E2=π::
#> | kur=KUR=π³::
#> | ra=RA=π::The input contains two sentences (separated by .), and
the brackets control how the template is constructed (more on this
below). Each line of the generated template follows the pattern
|reading=SIGN_NAME=cuneiform:type:translation. Indentation
indicates the nesting depth: the overall expression is at the top level,
followed by words and word groups, and below them the individual
signs.
The first line is the header β it contains the reading of the entire
input text. Below it are the entries for the individual components. Note
that the transliteration jal2=ig has been adjusted in order
to establish an unambiguous 1:1 mapping between transliteration and
cuneiform signs.
The two fields after the colons are initially empty β this is where you enter the grammatical type and translation.
The input can contain three types of brackets that control how the template is constructed:
Angle brackets < >: The
enclosed expression is treated as a fixed term. No individual entries
are generated for the signs inside. This is useful for proper names: in
our example, <d-en-ki> generates only a single entry
for AN.EN.KI, without breaking down the three individual signs.
Round brackets ( ): The enclosed
expression receives its own entry in the template, in addition to
entries for its individual signs. This is useful when a subsequence of
signs forms a compound word. Brackets can be nested: in
((e2-kur) ra), both e2-kur and
e2-kur-ra receive their own entry.
Curly braces { }: Ignored during
skeleton generation. They can be used in the input text to mark
arguments of operators.
The function guess_substr_info() looks up the most
frequent translation for each substring from the dictionary. The result
can be passed to skeleton():
fill <- guess_substr_info(x, dic)
skeleton(x, fill = fill)
#> |an-en-ki-ki-a-ig-e2-kur-ra::
#> |an-en-ki=AN.EN.KI=πππ :S:god of heaven who is the cultural leader of the earth {god Enki}
#> |ki-a=KI.A=π π::
#> | ki=KI=π :S:place {city}
#> | a=A=π:S:transformative power
#> |ig=IG=π
:V:to appear
#> |e2-kur-ra=E2.KUR.RA=ππ³π::
#> | e2-kur=E2.KUR=ππ³::
#> | e2=E2=π:S:temple
#> | kur=KUR=π³:S:country
#> | ra=RA=π:SββS:(that which/the one who) is utilized by SThe template is then pre-filled with the most likely translations and types. Since the automatic assignment is often not correct, the entries must be reviewed and adjusted as needed. The filled template could look like this:
|an-en-ki-ki-a-ig-e2-kur-ra: SEN: The god Enki transforms the Earth. The one who establishes sustenance of human existence utilizes a supplier of energy from a distant place (the E-Kur temple).
|an-en-ki=AN.EN.KI=πππ : S: god Enki
|ki-a=KI.A=π π: V: to transform the Earth
| ki=KI=π : S: Earth
| a=A=π:Sβ->V: to transform S
|ig=IG=π
: S: one who establishes the sustenance of human existence.
|e2-kur-ra=E2.KUR.RA=ππ³π: V: to utilize a supplier of energy from a distant place
| e2-kur=E2.KUR=ππ³: S: supplier of energy from a distant place
| e2=E2=π: βS->S: supplier of energy from S
| kur=KUR=π³: S: distant place
| ra=RA=π: Sβ->V: to utilize S
This example shows very well the typical structure of Old Sumerian sentences with each sentence consisting of a subject, an object and a verb (in this order).
For interactive translation of individual lines, the package provides
the function translate(), which opens a Shiny gadget:
The gadget displays four sections on a scrollable page:
N-gram patterns: Frequent sign combinations in the text that appear in the current line. Such recurring patterns point to fixed terms or compound words.
Context: The neighbouring lines (if a full text was provided). Frequent n-grams are marked with curly braces.
Grammar probabilities: A bar chart showing the probability of the different grammatical types for each sign. Tall bars indicate a likely grammatical function.
Translation: The interactive core section. Here you see the skeleton template with input fields for type and translation. Clicking the green arrow next to an entry displays the corresponding dictionary entries. Clicking a dictionary entry adopts its type and translation. In the input field at the top, you can adjust the bracket structure and click βUpdate Skeletonβ to regenerate the template without losing existing translations.
When you click βDoneβ, the function returns a skeleton
object containing the completed translation:
The second vignette (βTranslating Sumerian Textsβ) shows how to use
translate() together with a full text and how to generate a
custom dictionary from the results.