Vulgar: Language generator

Custom Words, Affixes and Morphology

Adding new words

Use the Add and remove words field to add a custom word to your language. Use the format new word (in English) : part-of-speech, eg:

  queen : n
  conlang, constructed language : n

All words must have a part-of-speech (n = noun, v = verb, etc) to be valid. To specify what the conlang word will actually be, add = conlang word (in IPA), eg:

  queen : n = kalisi

This assumes 'kalisi' is the pronunciation of the word, not the surface spelling. If the English word is already in the default vocab, specifying the IPA will overwrite the default word so that there is only ever one translation for "queen". If you wish for your custom entry to be a second translation, write += instead of =, eg:

  queen : n += kalisi

The += method also works for derived words (see below).

Remove default English words with the minus symbol. Adding the part-of-speech is not necessary in this scenario.


Derived words

Derived words are words that are built out of other words, eg: "government" is a noun which is built by combining the verb "govern" with the affix "-ment". Use the Derived words field whenever you need to pull a word from the dictionary and combine it with an affix, or even another word.

Compound words

Use the plus + and ampersand & signs to create compound words. Example: Let's say your word for "war" is kara and your word for "God" is kin, and you want a compound of those words karakin to mean "God of War". Use the following syntax:

  God of War : n = war+god - to create a single compound word
  God of War : n = war&god - to create a compound word but separated by a space

Adding affixes to words

Add affixes to words to create derived words as new word : part-of-speech = existing word-AFFIX.TAG:

  government : n = govern-VERB.TO.NOUN

Vulgar creates nine default affixes, such as Noun to adjective, Adjective to noun, Noun to verb, etc. You can create extra custom affixes by simply typing a unique affix tag, eg:

  unhappy : adj = happy-OPPOSITE
  uncommon : adj = common-OPPOSITE
  sinful : adj = sin-FULL.OF
  colourful : adj = color-FULL.OF

Because Vulgar doesn't automatically create an affix for opposites, typing -OPPOSITE randomly generates one for you, and will be consistent when you use it on multiple entries. This affix tag must be in capitals, to distinguish it from a word, and can optionally have numbers or a full stop. It must also hyphenate onto the word. Affixes can be stacked on each other:

  unhappiness : n = happy-ADJ.TO.NOUN-OPPOSITE

In this scenario, the Adjective-to-Noun affix will be applied first, then the OPPOSITE affix.

What if the word you're trying to pull from the dictionary is a homophone with two different parts of speech, such as "laugh" as a verb and "laugh" as a noun? To select the right one, you can specify the part of speech thusly:

  laughing : v = laugh:v-PROGRESSIVE

Defining affixes

You can define what your custom affixes actually are in the following format:


This will change ama to amas. However, you need to make sure you define it at the top of the code, before using it on vocabulary. Like this:

  unhappy : adj = happy-OPPOSITE
  untall : adj = tall-OPPOSITE
  unhigh : adj = high-OPPOSITE

To create a prefix, attach the - symbol to end of the affix:


This would change ama to sama. Even though this is a prefix, the affix tag can be positioned after the word, eg happy-OPPOSITE, although OPPOSITE-happy is also valid.

Multiple processes can by applied by comma separating the commands. The following two step process attaches a prefix and a suffix, to create a circumfix:

  OPPOSITE = s-, -s

This would change ama to samas. Again, the OPPOSITE tag can be positioned before or after the word, however I suggest putting everything after for consistency.

Sound changes

Sound changes can be encoded into an affix tag using the > symbol

  OPPOSITE = a > i

In this example, ama would change to ami. The left side of the > symbol is RegEx capable, so any RegEx patterns can be used to create advanced sound changes. If you don't know what RegEx is, read up on it here. Be aware that unlike the RegEx in the Spelling Rules, these patterns are not "global", meaning they do not change every match. Instead, > is pre-programmed change the final match in the word, where as < will change the first match in the word. Thus, a > i changes ama to ami, while a < i changes ama to ima.

The sound change step can be combined with affix steps. That is why it's important to comma separate the steps. In fact, it technically has to be a comma with a space after it to distinguish it from commas that have special meaning in RegEx:

  OPPOSITE = a > i, -s

This would change ama to amis.

A choice between random affixes can be created using the bar symbol |. The following rule adds either an -s, -t or -p as the affix:

  OPPOSITE = -s|-t|-p

Similarly, the resulting sound change can be randomised with the | symbol:

  OPPOSITE = a > i|o|e

Conditional IF and ELSE statements

There may be scenarios where you want to create conditional rules. You can do this based on whether a RegEx pattern matches using the following syntax:

  AFFIX.NAME = IF [this regex pattern is in the word] THEN [apply this set of rules] ELSE [apply this set of rules]

For instance, let's say your prefix is s-, but if the root word already starts in an s you want to the prefix to sa- to avoid a double s. In RegEx, the ^ symbol represents beginning of a word. So we can say:


This changes sama to sesama, while ama changes to sama. Note that IF, THEN and ELSE must be capitalised.

The ELSE condition is optional and can be omitted. Multiple IF statements are permitted:

  OPPOSITE = IF ^s THEN sa- IF ^z THEN so- ELSE s-

(A note for the programmers reading, secondary IF statements are technically ELSE IF statements.)

Shorthand uppercase symbols can be used for classes of phonemes, for instance C to mean 'any consonant' and V to mean 'any vowel'.


This means IF the root words stars with a consonant, apply sa-, ELSE if it begins with a vowel apply s-.

IF statements can apply affixes that match the vowel harmony of root word. Let's say you have a vowel harmony system of front vowels (i, e, a) and back vowels (u, o). IF [iea] will simply test for the presence of any of those vowels in the word, from there you can apply an affix that matches the vowel harmony:

  OPPOSITE = IF [iea] THEN -sa ELSE -so

Stem words

Sometimes you may want to create a stem word that doesn't exist as a stand-alone dictionary entry, but that is only found with affixes attached to it. The example in English would be words like "absence" and "absent", where it is somewhat unclear which word is derived from which, and may instead be interpreted as a stem "absen-" attaching to affixes "-ce" and "-t". To create a stem, instead of writing the dictionary word that the affix attaches to, create a new stem tag with the ! symbol. Example:

  absence : n = !newStem-CUSTOM.NOUN.AFFIX

  absent : adj = !newStem-CUSTOM.ADJ.AFFIX

This will randomly generate a stem word for the !newStem tag. Just like creating a unique affix, the stem can be named anything, but does not have to be in upper case. If you want to actually specify what the stem word is in the conlang, you can define it before using it, much the same was you define an affix before using it:

  !newStem = aku