diff --git a/src/message.c b/src/message.c
index 18f3013..985161d 100644
--- a/src/message.c
+++ b/src/message.c
@@ -592,12 +592,12 @@
 }
 
     static int
-ignore_error(char_u *msg)
+ignore_error(const char *msg)
 {
     int i;
 
     for (i = 0; i < ignore_error_list.ga_len; ++i)
-	if (strstr((char *)msg,
+	if (strstr(msg,
 		  (char *)((char_u **)(ignore_error_list.ga_data))[i]) != NULL)
 	    return TRUE;
     return FALSE;
@@ -629,7 +629,7 @@
  * Note: caller must check 'emsg_not_now()' before calling this.
  */
     static int
-emsg_core(char_u *s)
+emsg_core(const char *s)
 {
     int		attr;
     char_u	*p;
@@ -665,7 +665,7 @@
 	 * when the message should be ignored completely (used for the
 	 * interrupt message).
 	 */
-	if (cause_errthrow(s, severe, &ignore) == TRUE)
+	if (cause_errthrow((char_u *)s, severe, &ignore) == TRUE)
 	{
 	    if (!ignore)
 		++did_emsg;
@@ -674,7 +674,7 @@
 
 	if (in_assert_fails && emsg_assert_fails_msg == NULL)
 	{
-	    emsg_assert_fails_msg = vim_strsave(s);
+	    emsg_assert_fails_msg = vim_strsave((char_u *)s);
 	    emsg_assert_fails_lnum = SOURCING_LNUM;
 	    vim_free(emsg_assert_fails_context);
 	    emsg_assert_fails_context = vim_strsave(
@@ -682,7 +682,7 @@
 	}
 
 	// set "v:errmsg", also when using ":silent! cmd"
-	set_vim_var_string(VV_ERRMSG, s, -1);
+	set_vim_var_string(VV_ERRMSG, (char_u *)s, -1);
 #endif
 
 	/*
@@ -711,7 +711,7 @@
 		    redir_write(p, -1);
 		    vim_free(p);
 		}
-		redir_write(s, -1);
+		redir_write((char_u *)s, -1);
 	    }
 #ifdef FEAT_EVAL
 	    // Only increment did_emsg_def when :silent! wasn't used inside the
@@ -720,7 +720,7 @@
 		++did_emsg_def;
 #endif
 #ifdef FEAT_EVAL
-	    ch_log(NULL, "ERROR silent: %s", (char *)s);
+	    ch_log(NULL, "ERROR silent: %s", s);
 #endif
 	    return TRUE;
 	}
@@ -778,45 +778,44 @@
 }
 
 /*
- * Print an error message.
+ * Print error message "s".  Should already be translated.
+ * Return TRUE if wait_return() not called.
  */
     int
 emsg(char *s)
 {
     // Skip this if not giving error messages at the moment.
-    if (!emsg_not_now())
-	return emsg_core((char_u *)s);
-    return TRUE;		// no error messages at the moment
+    if (emsg_not_now())
+	return TRUE;
+
+    return emsg_core(s);
 }
 
 #ifndef PROTO  // manual proto with __attribute__
 /*
- * Print an error message with format string and variable arguments.
- * Note: caller must not pass 'IObuff' as 1st argument.
+ * Print error message "s" with format string and variable arguments.
+ * "s" should already be translated.
+ * Note: caller must not use "IObuff" for "s"!
+ * Return TRUE if wait_return() not called.
  */
     int
 semsg(const char *s, ...)
 {
     // Skip this if not giving error messages at the moment.
-    if (!emsg_not_now())
-    {
-	if (IObuff == NULL)
-	{
-	    // Very early in initialisation and already something wrong, just
-	    // give the raw message so the user at least gets a hint.
-	    return emsg_core((char_u *)s);
-	}
-	else
-	{
-	    va_list ap;
+    if (emsg_not_now())
+	return TRUE;
 
-	    va_start(ap, s);
-	    vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
-	    va_end(ap);
-	    return emsg_core(IObuff);
-	}
-    }
-    return TRUE;		// no error messages at the moment
+    if (IObuff == NULL)
+	// Very early in initialisation and already something wrong, just
+	// give the raw message so the user at least gets a hint.
+	return emsg_core(s);
+
+    va_list ap;
+
+    va_start(ap, s);
+    vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
+    va_end(ap);
+    return emsg_core((char *)IObuff);
 }
 #endif
 
@@ -831,7 +830,11 @@
     if (emsg_not_now())
 	return;
 
-    emsg_core((char_u *)s);
+    // Give a generic error which is translated.  The error itself may not be
+    // translated, it almost never shows.
+    emsg_core(_(e_internal_error_please_report_a_bug));
+
+    emsg_core(s);
 #if defined(ABORT_ON_INTERNAL_ERROR) && defined(FEAT_EVAL)
     set_vim_var_string(VV_ERRMSG, (char_u *)s, -1);
     msg_putchar('\n');  // avoid overwriting the error message
@@ -853,11 +856,15 @@
     if (emsg_not_now())
 	return;
 
+    // Give a generic error which is translated.  The error itself may not be
+    // translated, it almost never shows.
+    emsg_core(_(e_internal_error_please_report_a_bug));
+
     if (IObuff == NULL)
     {
 	// Very early in initialisation and already something wrong, just
 	// give the raw message so the user at least gets a hint.
-	emsg_core((char_u *)s);
+	emsg_core(s);
     }
     else
     {
@@ -866,7 +873,7 @@
 	va_start(ap, s);
 	vim_vsnprintf((char *)IObuff, IOSIZE, s, ap);
 	va_end(ap);
-	emsg_core(IObuff);
+	emsg_core((char *)IObuff);
     }
 # ifdef ABORT_ON_INTERNAL_ERROR
     msg_putchar('\n');  // avoid overwriting the error message
@@ -882,6 +889,10 @@
     void
 internal_error(char *where)
 {
+    // Give a generic error which is translated.  The error itself may not be
+    // translated, it almost never shows.
+    emsg_core(_(e_internal_error_please_report_a_bug));
+
     siemsg(_(e_internal_error_str), where);
 }
 
@@ -893,7 +904,11 @@
     void
 internal_error_no_abort(char *where)
 {
-     semsg(_(e_internal_error_str), where);
+    // Give a generic error which is translated.  The error itself may not be
+    // translated, it almost never shows.
+    emsg_core(_(e_internal_error_please_report_a_bug));
+
+    semsg(_(e_internal_error_str), where);
 }
 #endif
 
