lang-lab.mkxl /size: 14 Kb    last modification: 2024-01-16 09:02
1%D \module
2%D   [       file=lang-lab,
3%D        version=1997.08.27,
4%D          title=\CONTEXT\ Language Macros,
5%D       subtitle=Labels,
6%D         author=Hans Hagen / Tobias Burnus,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% TODO: only preload English and delay loading of other languages
15% till some related command is used.
16
17\writestatus{loading}{ConTeXt Language Macros / Labels}
18
19\registerctxluafile{lang-lab}{autosuffix}
20\registerctxluafile{lang-txt}{}
21
22\unprotect
23
24%D Left-overs:
25
26\ifdefined\sixperemspace \else
27    \permanent\edef\sixperemspace{\tocharacter"2006}
28\fi
29
30%D In this module we deal with language dependant labels and prefixes, like in {\em
31%D Figure~12} and {\em Chapter 1}. In this file we set the default values. Users can
32%D easily overrule these.
33%D
34%D This module is dedicated to the grandfather of Tobias Burnus, who's extensive
35%D languages oriented library helped us a lot in finding the right translations. All
36%D those labels are collected in files that reflect their common ancestor.
37%D
38%D Not all languages can be satisfied with the labeling mechanism as provided here.
39%D Chinese for instance put a label in front as well as after a part number. This is
40%D why the current implementation of labels supports two labels too.
41
42%D \macros
43%D   {setupheadtext, setuplabeltext}
44%D
45%D First we present some macros that deal with what we will call head and label
46%D texts. Such texts are defines by:
47%D
48%D \showsetup{setupheadtext}
49%D \showsetup{setuplabeltext}
50%D
51%D A regular \CONTEXT\ stores some 1500 labels at most.
52%D
53%D These commands accept all kind of inputs:
54%D
55%D \starttyping
56%D \setuplabeltext [language] [label1=text]
57%D \setuplabeltext [language] [label1=text,label2=text,...]
58%D \setuplabeltext            [label1=text]
59%D \setuplabeltext            [label1=text,label2=text,...]
60%D \stoptyping
61%D
62%D The last two cases concern the current language.
63
64\installcorenamespace{label}
65
66% \lettonothing\currentlabelcategory
67
68\permanent\tolerant\protected\def\definelabelclass[#1]#*[#2]%
69  {\normalexpanded
70     {\lang_labels_define_class_indeed
71        {#1}%
72        {\ifchknumber#2\or#2\else\zerocount\fi}% not \lastchknumber as we need expansion
73        \expandafter\noexpand\csname lang_labels_#1_text_1\endcsname
74        \expandafter\noexpand\csname            #1language\endcsname
75        \expandafter\noexpand\csname lang_labels_#1_text_2\endcsname
76        \expandafter\noexpand\csname            left#1text\endcsname
77        \expandafter\noexpand\csname           right#1text\endcsname
78        \expandafter\noexpand\csname               #1texts\endcsname
79        \expandafter\noexpand\csname                #1text\endcsname}}
80
81% hm, not interfaced
82
83\mutable\lettonothing\thetextprefix
84
85\mutable\let\currenttextprefixclass\s!unknown
86\mutable\let\currenttextprefixtag  \s!unknown
87
88\mutable\lettonothing\currenttextprefixname
89
90\protected\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9%
91  {\permanent\instance\protected\defcsname  setup#1text\endcsname{\protecttextprefixes      #2\def\currenttextprefixclass{#1}\lang_labels_text_prefix_setup}%
92   \permanent\instance\protected\defcsname preset#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_setup}%
93   \permanent\instance\protected\defcsname   copy#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_copy }%
94   \permanent\instance\protected\defcsname  start#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_start[#1]}%
95   \permanent\instance          \letcsname   stop#1text\endcsname \relax
96   \permanent\instance\def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}%
97   \ifnum#2=\plustwo % used for math and tags
98     \instance\def#3{#5#4}%
99%      \instance\def#5##1##2% ##1=language
100%        {\ifcsname\??label\currentlabelcategory#1:##1:##2\endcsname
101%           \lastnamedcs
102%         \orelse\ifcsname\??label#1:##1:##2\endcsname
103%           \lastnamedcs
104%         \orelse\ifcsname\??language##1\s!default\endcsname
105%           \expandafter#5\lastnamedcs{##2}%
106%         \orelse\ifcsname\??label\currentlabelcategory#1:##2\endcsname
107%           \lastnamedcs
108%         \orelse\ifcsname\??label#1:##2\endcsname
109%           \lastnamedcs
110%         \orelse\ifcsname\??label\currentlabelcategory#1:\s!en:##2\endcsname
111%           \lastnamedcs
112%         \orelse\ifcsname\??label#1:\s!en:##2\endcsname
113%           \lastnamedcs
114%         \else
115%           ##2%
116%         \fi}%
117     \instance\def#5##1##2% ##1=language
118       {\ifcsname\??label#1:##1:##2\endcsname
119          \lastnamedcs
120        \orelse\ifcsname\??language##1\s!default\endcsname
121          \expandafter#5\lastnamedcs{##2}%
122        \orelse\ifcsname\??label#1:##2\endcsname
123          \lastnamedcs
124        \orelse\ifcsname\??label#1:\s!en:##2\endcsname
125          \lastnamedcs
126        \else
127          ##2%
128        \fi}%
129     \permanent\instance\let#6\gobbleoneargument
130     \permanent\instance\let#7\gobbleoneargument
131     \permanent\instance\let#8\gobbletwoarguments
132     \permanent\instance\let#9#3%
133   \else
134     \instance\protected\def#3{#5#4}%
135     \instance\protected\def#5##1##2%
136       {\ifcsname\??label#1:##1:##2\endcsname
137          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
138        \orelse\ifcsname\??language#4\s!default\endcsname
139          \expandafter#5\lastnamedcs{##2}%
140        \orelse\ifcsname\??label#1:##2\endcsname
141          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
142        \orelse\ifcsname\??label#1:\s!en:##2\endcsname
143          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
144        \else
145          \enforced\let\thetextprefix\dummytextprefix
146        \fi}%
147     \permanent\instance\protected\def#6##1{#3{##1}\expandafter\firstoftwoarguments   \thetextprefix}% \flushleftlabelclass
148     \permanent\instance\protected\def#7##1{#3{##1}\expandafter\secondoftwoarguments  \thetextprefix}% \flushrightlabelclass
149     \permanent\instance\protected\def#8##1{#3{##1}\expandafter\lang_labels_flush_both\thetextprefix}% \flushbothlabelclass #2
150     \permanent\instance\protected\def#9##1{#3{##1}\expandafter\firstoftwoarguments   \thetextprefix}% \flushleftlabelclass
151   \fi
152   \appendtoks
153     \enforced\permanent\instance\let#6\firstofoneargument % to be checked
154     \enforced\permanent\instance\let#7\firstofoneargument % to be checked
155     \enforced\permanent\instance\let#8\firstofoneargument % to be checked
156     \enforced\permanent\instance\let#9\firstofoneargument % to be checked
157   \to \everysimplifycommands}
158
159% why not lang_* ?
160
161% \let\flushleftlabelclass \firstoftwoarguments
162% \let\flushrightlabelclass\secondoftwoarguments
163
164\permanent\def\lang_labels_flush_both#1#2#3{#1#3#2}
165
166\permanent\def\dummytextprefix{\empty\empty}
167
168%D \macros
169%D   {headtext, labeltext, leftlabeltext, rightlabeltext, labeltexts}
170%D
171%D Once defined, head and label texts can be called upon using:
172%D
173%D \showsetup{headtext}
174%D \showsetup{labeltext}
175%D
176%D \macros
177%D   {presetheadtext,presetlabeltext}
178%D
179%D These macros enable us to automatically define head and label texts without
180%D replacing predefined ones. They are internal macros.
181
182\appendtoks \enforced\let\labellanguage\currentlanguage \to \everycurrentdate
183
184\newconstant\protecttextprefixes
185
186\tolerant\def\lang_labels_text_prefix_start[#1]#*[#2]#*[#3]% class language name
187  {\ifarguments\or\or
188     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
189     \cdef\currenttextprefixname{#2}%
190   \else
191     \cdef\currenttextprefixtag{\reallanguagetag{#2}}%
192     \cdef\currenttextprefixname{#3}%
193   \fi
194   \grabuntil{stop#1text}\lang_labels_text_prefix_start_indeed}
195
196\def\lang_labels_text_prefix_start_indeed#1% text (not special checking done here yet, only for long texts anyway)
197  {\edefcsname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname{{\clf_strip{#1}}\empty}}
198
199\tolerant\def\lang_labels_text_prefix_setup[#1]#*[#2]%
200  {\ifarguments\or
201     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
202     \processcommalist[#1]\lang_labels_text_prefix_setup_indeed
203   \else
204     \cdef\currenttextprefixtag{\reallanguagetag{#1}}%
205     \processcommalist[#2]\lang_labels_text_prefix_setup_indeed
206   \fi}
207
208\def\lang_labels_text_prefix_setup_indeed#1%
209  {\lang_labels_text_prefix_assign[#1]}
210
211\def\lang_labels_text_prefix_assign[#1=#2]%
212  {\lang_labels_text_prefix_assign_indeed{#1}[#2,,]}
213
214\def\lang_labels_text_prefix_assign_indeed#1%
215  {\ifcase\protecttextprefixes
216     % no checking
217     \expandafter\lang_labels_text_prefix_assign_yes
218   \or
219     % checking
220     \ifcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname
221       \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_nop
222     \else
223       \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_yes
224     \fi
225   \or
226     % simple assignment (a bit overkill but it fits in the whole)
227     \expandafter\lang_labels_text_prefix_assign_dumb
228   \fi{#1}}
229
230\lettonothing\m_lang_labels_left
231\lettonothing\m_lang_labels_right
232
233\def\lang_labels_text_prefix_assign_yes#1[#2,#3,#4]%
234  {\def\m_lang_labels_left {#2}% no longer an edef ... else \Word undefined expansion issues
235   \def\m_lang_labels_right{#3}% no longer an edef ... else \Word undefined expansion issues
236   \defcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1%
237     \ifempty\m_lang_labels_right
238       \ifempty\m_lang_labels_left
239         \endcsname{\empty\empty}%
240       \else
241         \endcsname{{#2}\empty}%
242       \fi
243     \else
244       \endcsname{{#2}{#3}}%
245     \fi}
246
247\def\lang_labels_text_prefix_assign_nop#1[#2]%
248  {}
249
250\def\lang_labels_text_prefix_assign_dumb#1[#2,#3]%
251  {\defcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}}
252
253\permanent\protected\def\setlabeltextpair#1#2#3#4#5% a fast one for usage at the Lua end
254  {%\writestatus{!!!!}{#1:\reallanguagetag{#2}:#3}%
255   \defcsname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right
256
257\tolerant\def\lang_labels_text_prefix_copy[#1]#*[#2]%
258  {\ifarguments\or
259     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
260     \processcommalist[#1]\lang_labels_text_prefix_copy_indeed
261   \else
262     \cdef\currenttextprefixtag{\reallanguagetag{#1}}%
263     \processcommalist[#2]\lang_labels_text_prefix_copy_indeed
264   \fi}
265
266\def\lang_labels_text_prefix_copy_indeed#1%
267  {\lang_labels_text_prefix_copy_pair[#1]}
268
269\def\lang_labels_text_prefix_copy_pair[#1=#2]%
270  {\lang_labels_text_prefix_copy_pair_indeed{#1}[#2,,]}
271
272% \def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
273%   {\expandafter\let
274%      \csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\expandafter\endcsname
275%      \csname\??label\currenttextprefixclass:\currenttextprefixtag:#2\endcsname}
276%
277% this delays the aliasing so that we can switch mainlanguage in between
278
279\def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
280  {\edefcsname\??label\currenttextprefixclass:#1\endcsname
281     {{\noexpand\csname\??label\currenttextprefixclass:\noexpand\reallanguagetag\noexpand\currentmainlanguage:#2\endcsname}{}}}
282
283\definelabelclass [head]      [0] % titles
284\definelabelclass [label]     [0] % texts
285\definelabelclass [mathlabel] [2] % functions
286\definelabelclass [taglabel]  [2] % tags
287
288\clf_definelabels{head}{titles}\s!true\relax
289\clf_definelabels{label}{texts}\s!true\relax
290\clf_definelabels{mathlabel}{functions}\s!false\relax
291\clf_definelabels{taglabel}{tags}\s!false\relax
292
293%D \macros
294%D   {translate}
295%D
296%D Sometimes macros contain language specific words that are to be typeset. Such
297%D macros can be made (more) language independant by using:
298%D
299%D \showsetup{translate}
300%D
301%D like for instance:
302%D
303%D \starttyping
304%D \translate[en=something,nl=iets]
305%D \stoptyping
306%D
307%D which expands to {\em something} or {\em iets}, depending on de current language.
308
309\installcorenamespace{translation}
310
311\permanent\tolerant\protected\def\translate[#1]%
312  {\getparameters[\??translation][#1]%
313   \ifcsname\??translation\currentlanguage\endcsname
314     \lastnamedcs
315   \orelse\ifcsname\??translation\s!en\endcsname
316     \lastnamedcs
317   \else
318     [translation #1]%
319   \fi}
320
321%D When used without argument, the last defined values are used. This enables
322%D repetitive use like
323%D
324%D \starttyping
325%D \en \translate\ means \nl \translate
326%D \stoptyping
327
328%D \macros
329%D   {assigntranslation}
330%D
331%D This macro is a system macro, and can be used to assign a translation to a macro.
332%D Its form is:
333%D
334%D \starttyping
335%D \assigntranslation[en=something,nl=iets]\to\command
336%D \stoptyping
337
338% nicer is \edef\command{\translated[...]} ... todo
339
340\permanent\protected\def\assigntranslation[#1]\to#2% bad, this \to
341  {\getparameters[\??translation][#1]%
342   \edef#2{\begincsname\??translation\currentlanguage\endcsname}}
343
344%D \macros
345%D   {commalistsentence}
346%D
347%D Redone in \LUA:
348%D
349%D \startbuffer
350%D \commalistsentence[aap,noot,mies]
351%D \commalistsentence[aap,noot]
352%D \commalistsentence[aap]
353%D \commalistsentence[a,b,c]
354%D \commalistsentence[a,b,c][{ \& },{ and }]
355%D \commalistsentence[a,b,c][+,-]
356%D \stopbuffer
357%D
358%D \typebuffer
359%D
360%D \startlines
361%D \getbuffer
362%D \stoplines
363
364\permanent\tolerant\protected\def\commalistsentence[#1]#*[#2]%
365  {\clf_concatcommalist
366     text       {#1}%
367     separators {#2}%
368     separator  {\detokenize\expandafter{\normalexpanded{\labeltext{and-1}}}}%
369     last       {\detokenize\expandafter{\normalexpanded{\labeltext{and-2}}}}%
370   \relax}
371
372\setuplabeltext [\s!nl] [and-1={{, }},and-2={{ en }}]   % 1, 2 en 3
373\setuplabeltext [\s!en] [and-1={{, }},and-2={{, }}]     % 1, 2, 3
374\setuplabeltext [\s!de] [and-1={{, }},and-2={{ und }}]  % 1, 2 und 3
375\setuplabeltext [\s!hr] [and-1={{, }},and-2={{ i }}]    % 1, 2 i 3
376
377%D Goodie (handy at \LUA\ end):
378
379\permanent\protected\def\LABELTEXT#1{\WORD{\labeltext{#1}}} % only for simple cases!
380
381%D For publications we have gender specific ones (one could use the main one for a
382%D gender neutral one).
383%D
384%D \startbuffer
385%D \startlines
386%D     (\labeltext     {demo-texts})
387%D     (\labeltexts    {demo-texts}{ TEST })
388%D     (\leftlabeltext {demo-texts})
389%D     (\rightlabeltext{demo-texts})
390%D \stoplines
391%D
392%D \startlines \mainlanguage[cs]
393%D     test \btxlabeltext{editor}   \par
394%D     test \btxlabeltext{editor:f} \par
395%D     test \btxlabeltext{editor:m} \par
396%D     test \btxlabeltext{editors}   \par
397%D     test \btxlabeltext{editors:f} \par
398%D     test \btxlabeltext{editors:m} \par
399%D \stoplines
400%D \stopbuffer
401%D
402%D \typebuffer \getbuffer
403
404\protect \endinput
405