After parsing, mstring compares the messages' languages and parameters.
A missing language
$LANGUAGE en
$MESSAGE A
"a"
[tr]
"a (tr)"
$MESSAGE B
"b"
app.msg:6:10: warning: message 'B' has no [tr] text; its default text is used
A language counts as "the module's" as soon as one message has a text in it. The generated code falls back to the default text, so the program works — in the wrong language.
A parameter one language does not use
$MESSAGE Items
@ n int
"{$n} items"
[tr]
"öğeler"
app.msg:1:10: warning: parameter 'n' of message 'Items' is used in the [C] text but not in the [tr] text
That is almost always a translation mistake. A parameter that no language uses is not reported — an exception may carry data for its getters without printing it.
A message without text
app.msg:1:10: warning: message 'Empty' has no text
Silencing
Warnings never fail a build. mstring -w — or mstring_generate( … OPTIONS -w ) — hides them, for a module whose translations are incomplete on purpose.

