34
35:- module(i18n_expansion, []). 36
37:- reexport(library(compound_expand)). 38:- reexport(library(i18n/i18n_op)). 39:- use_module(library(i18n/i18n_support)). 40:- init_expansors. 41
42:- multifile
43 translate_decl_hook/1. 44
45translate_args(Meta, M, Goal1, Goal) :-
46 functor(Meta, F, A),
47 functor(Goal, F, A),
48 translate_arg(1, Meta, M, Goal1, Goal).
49
50translate_arg(N, Meta, M, Goal1, Goal) :-
51 arg(N, Meta, Spec), !,
52 arg(N, Goal1, Term1),
53 arg(N, Goal, Term),
54 translate_non_goal_term(Spec, M, Term1, Term),
55 succ(N, N1),
56 translate_arg(N1, Meta, M, Goal1, Goal).
57translate_arg(_, _, _, _, _).
58
59translate_non_goal_term(S, _, Term, Term) :-
60 '$expand':direct_call_meta_arg(S), !.
61translate_non_goal_term(S, M, Term1, Term) :-
62 translate_term(S, M, Term1, Term).
63
64translate_term(S, M, Term1, Term) :-
65 '$expand':meta_arg(S), !,
66 translate_term_meta(M, Term1, Term).
67translate_term(_, M, Term1, Term) :-
68 translate_term(M, Term1, Term).
69
70translate_term_meta(_, Term1, M:Term) :-
71 nonvar(Term1),
72 Term1 = M:Term2, !,
73 translate_term_meta(M, Term2, Term).
74translate_term_meta(M, Term1, Term) :-
75 translate_term(M, Term1, Term).
76
77gtabling(Elem, Goal) :-
78 ( \+ Elem->
79 ( Goal,
80 compile_aux_clauses(Elem),
81 fail
82 ; true
83 )
84 ; true
85 ).
86
87tabulate_i18n_records(M) :-
88 gtabling(i18n_support:i18n_record(M, L, I, S),
89 current_i18n_record(M, L, I, S)).
90
91translate_term(Term1, Term) :-
92 '$current_source_module'(M),
93 translate_term(M, Term1, Term),
94 Term1 \== Term.
95
96translate_term(M, Term1, Term) :-
97 tabulate_i18n_records(M),
98 expand_i18n_term(i18n_entry_expander, M, Term1, Term).
99
100goal_expansion(V:Goal1, M, V:Goal) :-
101 var(M), !,
102 translate_term(M, Goal1, Goal).
103goal_expansion(M:Goal1, _, M:Goal) :- !,
104 goal_expansion(Goal1, M, Goal).
105goal_expansion(Goal1, M, Goal) :-
106 ( predicate_property(M:Goal1, meta_predicate(Meta))
107 ->translate_args(Meta, M, Goal1, Goal)
108 ; translate_term(M, Goal1, Goal)
109 ), !,
110 Goal1 \== Goal.
111
112goal_expansion(Goal1, Goal) :-
113 callable(Goal1),
114 '$current_source_module'(M),
115 goal_expansion(Goal1, M, Goal).
116
146
147term_expansion((:- i18n_resource(PoAlias)),
148 i18n_support:i18n_resource(M, PoAlias)) :- !,
149 '$current_source_module'(M).
150term_expansion((:- resourceterm(Term)),
151 i18n_support:i18n_resourceterm(M, Term)) :- !,
152 '$current_source_module'(M).
153term_expansion((:- init_i18n),
154 []) :- !,
155 '$current_source_module'(M),
156 tabulate_i18n_records(M).
157term_expansion((:- M:init_i18n), []) :- !, tabulate_i18n_records(M).
158term_expansion((:- init_i18n(M)), []) :- !, tabulate_i18n_records(M).
159term_expansion((:- Decl), _) :-
160 \+ translate_decl_hook(Decl),
161 !,
162 fail. 163term_expansion((Term1 :- Body), (Term :- Body)) :- !,
164 translate_term(Term1, Term).
165term_expansion((Term1 --> Body), (Term --> Body)) :- !,
166 translate_term(Term1, Term).
167term_expansion(Term1, Term) :-
168 translate_term(Term1, Term)