Translating the Messages

Each grammar rule in QU_messages.pl defines the generation of a message term from an internal form. For example, in (A) the text that needs to be translated is the quoted text inside the list [] brackets: Type error. The rest of the rule does not need to be changed.

     generate_message(type_error(Goal,ArgNo,TypeName,Culprit)) --> (A)
         ['Type error'-[]],
         head(Goal,ArgNo),
         type(TypeName,Culprit),
         goal(Goal).
     

The general form of text components in a list is (B), where control-string and arg-list are valid for a call such as (C) to the built-in predicate format/2 as exemplified in (D).

     control-string-arg list (B)
     
     | ?- format(control-string, arg-list). (C)
     
     | ?- format('Type error', []). (D)
     Type error
     yes
     

In example (E), when the message is printed, the List will be inserted in place of the ~q. The ~q means that the List will be printed as if by the built-in predicate writeq/1. See the documentation of format/[2,3] for full details of what a control-string can do.

     typename(one_of(List)) --> ['a member of the set ~q'-[List]]. (E)
     

In addition to text components of the form (F), it is also possible to have text components of the form (G), which cause a newline to be output.

     control-string-arg list  (F)
     
     nl   (G)
     

The format option ~n should not be used in control strings: any required newlines should be specified with the nl text components. For example, the list in (H) contains two text components; in general, a number of text components can be collected into a single list like this, or they can appear in separate lists, as in (I):

     advice(invalid_argument,Type,X) -->    (H)
             ['Invalid argument to ~w, ~q was ignored.'-[Type,X],nl].
     
     advice(invalid_argument,Type,X) -->   (I)
         ['Invalid argument to ~w, ~q was ignored.'-[Type,X]], [nl].
     

All (complete) messages must end with an nl.

In addition to translating messages, it is also possible to change the characters that Prolog will accept when it requires input from the user. This is done by modifying the definition of query_abbreviation/2 at the end of QU_messages.pl. For example, (J) means that when the Prolog system wants a yes-or-no answer it expects the first character typed to be a y or a n and the case does not matter. Since "yes" in French is "oui" a French translator might change this to (K).

      query_abbreviation(yes_or_no,[yes-"yY",no-"nN"]).  (J)
     
     query_abbreviation(yes_or_no,[yes-"oO",no-"nN"]).   (K)