anchor.diff:    * * text - The text content of the overlay
     * * target - The target atom to display the overlay at
     * * owner - The mob that owns this overlay, only this mob will be able to view it
  +  * * language - The language this message was spoken in
     * * extra_classes - Extra classes to apply to the span that holds the text
     * * lifespan - The lifespan of the message in deciseconds
     */
  -/datum/chatmessage/New(text, atom/target, mob/owner, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN)
  +/datum/chatmessage/New(text, atom/target, mob/owner, datum/language/language, list/extra_classes = list(), lifespan = CHAT_MESSAGE_LIFESPAN)
   	. = ..()
   	if (!istype(target))
   		CRASH("Invalid target given for chatmessage")
  
positive.code:   * * text - The text content of the overlay
    * * target - The target atom to display the overlay at
    * * owner - The mob that owns this overlay, only this mob will be able to view it
    * * extra_classes - Extra classes to apply to the span that holds the text
    * * lifespan - The lifespan of the message in deciseconds
    */
  /datum/chatmessage/proc/generate_image(text, atom/target, mob/owner, list/extra_classes, lifespan)
  	// Register client who owns this message
  	owned_by = owner.client
  	RegisterSignal(owned_by, COMSIG_PARENT_QDELETING, .proc/on_parent_qdel)
  
negative.code: 		stack_trace("/datum/chatmessage created with [isnull(owner) ? "null" : "invalid"] mob owner")
  		qdel(src)
  		return
  	INVOKE_ASYNC(src, .proc/generate_image, text, target, owner, language, extra_classes, lifespan)
  
  /datum/chatmessage/Destroy()
  	if (owned_by)
  