View source with raw comments or as raw
    1:- module(scasp_messages,
    2          [ scasp_lang/1,			 % -Lang
    3            scasp_justification_message//1       % +Term
    4          ]).    5:- use_module(lang/en, []).    6:- use_module(lang/nl, []).                      % Dynamic?
    7:- use_module(library(solution_sequences)).    8
    9:- create_prolog_flag(scasp_lang, default, [keep(true)]).   10
   11:- multifile
   12    scasp_lang_module/2.   13
   14:- thread_local lang_module_cache/1 as volatile.
 lang_module(-M) is multi
True when M is a module holding rules for scasp_message//1.
   20lang_module(M) :-
   21    (   lang_module_cache(M)
   22    *-> true
   23    ;   forall(distinct(gen_lang_module(M)),
   24               assertz(lang_module_cache(M))),
   25        lang_module_cache(M)
   26    ).
   27
   28gen_lang_module(Module) :-
   29    scasp_lang(Lang),
   30    clean_encoding(Lang, Clean),
   31    longest_id(Clean, LangID),
   32    scasp_lang_module(LangID, Module).
   33gen_lang_module(Module) :-
   34    scasp_lang_module(en, Module).
   35
   36clean_encoding(Lang0, Lang) :-
   37    (   sub_atom(Lang0, A, _, _, '.')
   38    ->  sub_atom(Lang0, 0, A, _, Lang)
   39    ;   Lang = Lang0
   40    ).
 scasp_lang(-Lang) is det
True when Lang is the language used for messages and justifications.
   46scasp_lang(Lang),
   47    current_prolog_flag(scasp_lang, Lang0),
   48    Lang0 \== default =>
   49    Lang = Lang0.
   50:- if(current_prolog_flag(windows, true)).   51scasp_lang(Lang),
   52    win_get_user_preferred_ui_languages(name, [Lang0|_]) =>
   53    Lang = Lang0.
   54:- else.   55scasp_lang(Lang),
   56    catch(setlocale(messages, _, ''), _, fail) =>
   57    setlocale(messages, Lang0, Lang0),
   58    Lang = Lang0.
   59:- endif.   60scasp_lang(Lang),
   61    getenv('LANG', Lang0) =>
   62    Lang = Lang0.
   63scasp_lang(Lang) =>
   64    Lang = en.
   65
   66longest_id(Lang, Id) :-
   67    split_string(Lang, "_-", "", Components),
   68    longest_prefix(Components, Taken),
   69    atomic_list_concat(Taken, '_', Id).
   70
   71longest_prefix([H|T0], [H|T]) :-
   72    longest_prefix(T0, T).
   73longest_prefix(_, []).
   74
   75:- multifile
   76    prolog:message//1.   77
   78prolog:message(scasp(Term)) -->
   79    [ 's(CASP): '-[] ],
   80    { lang_module(Module)
   81    },
   82    Module:scasp_message(Term).
   83
   84scasp_justification_message(Term) -->
   85    { lang_module(Module)
   86    },
   87    Module:scasp_message(Term),
   88    !