Vulgar: Language generator

Custom Words, Affixes and Morphology

Adding new words

Use the Add more 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

To specify what the conlang word will actually be, add = conlang word (in IPA), eg:

  queen : n = kalisi

Be aware that this assumes that 'kalisi' is the IPA of the word you want, not the surface spelling.

Derived words

Use the Derived words field whenever you need to pull information from exisitng words, instead of making up entirely new words.

Making 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:

  ethereality : n = ethereal-ADJ.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

The unique tag must be in capitals and can optionally have numbers or a full stop. It must also hyphenate on to the old word.

Custom affixes and morphology

You can define what your new affixes actually is using the following syntax:


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.

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.

Sound changes can be encoded 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 enact 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 + space to distinguish it from commas that have special meaning in RegEx:

  OPPOSITE = a$ > i, -s

This would change ama to amis, because $ means end of a word in RegEx. If the word doesn't end in a, it will just apply -s, eg: aman to amans.

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