lang-lab.mkxl /size: 14 Kb    last modification: 2025-02-21 11:03
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
69\permanent\tolerant\protected\def\definelabelclass[#1]#*[#2]%
70  {\normalexpanded
71     {\lang_labels_define_class_indeed
72        {#1}%
73        {\ifchknumber#2\or#2\else\zerocount\fi}% not \lastchknumber as we need expansion
74        \expandafter\noexpand\csname lang_labels_#1_text_1\endcsname
75        \expandafter\noexpand\csname            #1language\endcsname
76        \expandafter\noexpand\csname lang_labels_#1_text_2\endcsname
77        \expandafter\noexpand\csname            left#1text\endcsname
78        \expandafter\noexpand\csname           right#1text\endcsname
79        \expandafter\noexpand\csname               #1texts\endcsname
80        \expandafter\noexpand\csname                #1text\endcsname}}
81
82% hm, not interfaced
83
84\mutable\lettonothing\thetextprefix
85
86\mutable\let\currenttextprefixclass\s!unknown
87\mutable\let\currenttextprefixtag  \s!unknown
88
89\mutable\lettonothing\currenttextprefixname
90
91\protected\def\lang_labels_define_class_indeed#1#2#3#4#5#6#7#8#9%
92  {\permanent\instance\protected\defcsname  setup#1text\endcsname{\protecttextprefixes      #2\def\currenttextprefixclass{#1}\lang_labels_text_prefix_setup}%
93   \permanent\instance\protected\defcsname preset#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_setup}%
94   \permanent\instance\protected\defcsname   copy#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_copy }%
95   \permanent\instance\protected\defcsname  start#1text\endcsname{\protecttextprefixes\plusone\def\currenttextprefixclass{#1}\lang_labels_text_prefix_start[#1]}%
96   \permanent\instance          \letcsname   stop#1text\endcsname \relax
97   \permanent\instance\def#4{\reallanguagetag{\defaultlanguage\currentmainlanguage}}%
98   \ifnum#2=\plustwo % used for math and tags
99     \instance\def#3{#5#4}%
100%      \instance\def#5##1##2% ##1=language
101%        {\ifcsname\??label\currentlabelcategory#1:##1:##2\endcsname
102%           \lastnamedcs
103%         \orelse\ifcsname\??label#1:##1:##2\endcsname
104%           \lastnamedcs
105%         \orelse\ifcsname\??language##1\s!default\endcsname
106%           \expandafter#5\lastnamedcs{##2}%
107%         \orelse\ifcsname\??label\currentlabelcategory#1:##2\endcsname
108%           \lastnamedcs
109%         \orelse\ifcsname\??label#1:##2\endcsname
110%           \lastnamedcs
111%         \orelse\ifcsname\??label\currentlabelcategory#1:\s!en:##2\endcsname
112%           \lastnamedcs
113%         \orelse\ifcsname\??label#1:\s!en:##2\endcsname
114%           \lastnamedcs
115%         \else
116%           ##2%
117%         \fi}%
118     \instance\def#5##1##2% ##1=language
119       {\ifcsname\??label#1:##1:##2\endcsname
120          \lastnamedcs
121        \orelse\ifcsname\??language##1\s!default\endcsname
122          \expandafter#5\lastnamedcs{##2}%
123        \orelse\ifcsname\??label#1:##2\endcsname
124          \lastnamedcs
125        \orelse\ifcsname\??label#1:\s!en:##2\endcsname
126          \lastnamedcs
127        \else
128          ##2%
129        \fi}%
130     \permanent\instance\let#6\gobbleoneargument
131     \permanent\instance\let#7\gobbleoneargument
132     \permanent\instance\let#8\gobbletwoarguments
133     \permanent\instance\let#9#3%
134   \else
135     \instance\protected\def#3{#5#4}%
136     \instance\protected\def#5##1##2%
137       {\ifcsname\??label#1:##1:##2\endcsname
138          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
139        \orelse\ifcsname\??language#4\s!default\endcsname
140          \expandafter#5\lastnamedcs{##2}%
141        \orelse\ifcsname\??label#1:##2\endcsname
142          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
143        \orelse\ifcsname\??label#1:\s!en:##2\endcsname
144          \enforced\expandafter\let\expandafter\thetextprefix\lastnamedcs
145        \else
146          \enforced\let\thetextprefix\dummytextprefix
147        \fi}%
148     \permanent\instance\protected\def#6##1{#3{##1}\expandafter\firstoftwoarguments   \thetextprefix}% \flushleftlabelclass
149     \permanent\instance\protected\def#7##1{#3{##1}\expandafter\secondoftwoarguments  \thetextprefix}% \flushrightlabelclass
150     \permanent\instance\protected\def#8##1{#3{##1}\expandafter\lang_labels_flush_both\thetextprefix}% \flushbothlabelclass #2
151     \permanent\instance\protected\def#9##1{#3{##1}\expandafter\firstoftwoarguments   \thetextprefix}% \flushleftlabelclass
152   \fi
153   \appendtoks
154     \enforced\permanent\instance\let#6\firstofoneargument % to be checked
155     \enforced\permanent\instance\let#7\firstofoneargument % to be checked
156     \enforced\permanent\instance\let#8\firstofoneargument % to be checked
157     \enforced\permanent\instance\let#9\firstofoneargument % to be checked
158   \to \everysimplifycommands}
159
160% why not lang_* ?
161
162% \let\flushleftlabelclass \firstoftwoarguments
163% \let\flushrightlabelclass\secondoftwoarguments
164
165\permanent\def\lang_labels_flush_both#1#2#3{#1#3#2}
166
167\permanent\def\dummytextprefix{\empty\empty}
168
169%D \macros
170%D   {headtext, labeltext, leftlabeltext, rightlabeltext, labeltexts}
171%D
172%D Once defined, head and label texts can be called upon using:
173%D
174%D \showsetup{headtext}
175%D \showsetup{labeltext}
176%D
177%D \macros
178%D   {presetheadtext,presetlabeltext}
179%D
180%D These macros enable us to automatically define head and label texts without
181%D replacing predefined ones. They are internal macros.
182
183\appendtoks \enforced\let\labellanguage\currentlanguage \to \everycurrentdate
184
185\newconstant\protecttextprefixes
186
187\tolerant\def\lang_labels_text_prefix_start[#1]#*[#2]#*[#3]% class language name
188  {\ifarguments\or\or
189     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
190     \cdef\currenttextprefixname{#2}%
191   \else
192     \cdef\currenttextprefixtag{\reallanguagetag{#2}}%
193     \cdef\currenttextprefixname{#3}%
194   \fi
195   \grabuntil{stop#1text}\lang_labels_text_prefix_start_indeed}
196
197\def\lang_labels_text_prefix_start_indeed#1% text (not special checking done here yet, only for long texts anyway)
198  {\edefcsname\??label\currenttextprefixclass:\currenttextprefixtag:\currenttextprefixname\endcsname{{\clf_strip{#1}}\empty}}
199
200\tolerant\def\lang_labels_text_prefix_setup[#1]#*[#2]%
201  {\ifarguments\or
202     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
203     \processcommalist[#1]\lang_labels_text_prefix_setup_indeed
204   \else
205     \cdef\currenttextprefixtag{\reallanguagetag{#1}}%
206     \processcommalist[#2]\lang_labels_text_prefix_setup_indeed
207   \fi}
208
209\def\lang_labels_text_prefix_setup_indeed#1%
210  {\lang_labels_text_prefix_assign[#1]}
211
212\def\lang_labels_text_prefix_assign[#1=#2]%
213  {\lang_labels_text_prefix_assign_indeed{#1}[#2,,]}
214
215\def\lang_labels_text_prefix_assign_indeed#1%
216  {\ifcase\protecttextprefixes
217     % no checking
218     \expandafter\lang_labels_text_prefix_assign_yes
219   \or
220     % checking
221     \ifcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname
222       \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_nop
223     \else
224       \expandafter\expandafter\expandafter\lang_labels_text_prefix_assign_yes
225     \fi
226   \or
227     % simple assignment (a bit overkill but it fits in the whole)
228     \expandafter\lang_labels_text_prefix_assign_dumb
229   \fi{#1}}
230
231\lettonothing\m_lang_labels_left
232\lettonothing\m_lang_labels_right
233
234\def\lang_labels_text_prefix_assign_yes#1[#2,#3,#4]%
235  {\def\m_lang_labels_left {#2}% no longer an edef ... else \Word undefined expansion issues
236   \def\m_lang_labels_right{#3}% no longer an edef ... else \Word undefined expansion issues
237   \defcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1%
238     \ifempty\m_lang_labels_right
239       \ifempty\m_lang_labels_left
240         \endcsname{\empty\empty}%
241       \else
242         \endcsname{{#2}\empty}%
243       \fi
244     \else
245       \endcsname{{#2}{#3}}%
246     \fi}
247
248\def\lang_labels_text_prefix_assign_nop#1[#2]%
249  {}
250
251\def\lang_labels_text_prefix_assign_dumb#1[#2,#3]%
252  {\defcsname\??label\currenttextprefixclass:\currenttextprefixtag:#1\endcsname{#2}}
253
254\permanent\protected\def\setlabeltextpair#1#2#3#4#5% a fast one for usage at the Lua end
255  {%\writestatus{!!!!}{#1:\reallanguagetag{#2}:#3}%
256   \defcsname\??label#1:\reallanguagetag{#2}:#3\endcsname{{#4}{#5}}} % class tag key left right
257
258\tolerant\def\lang_labels_text_prefix_copy[#1]#*[#2]%
259  {\ifarguments\or
260     \cdef\currenttextprefixtag{\reallanguagetag\currentmainlanguage}%
261     \processcommalist[#1]\lang_labels_text_prefix_copy_indeed
262   \else
263     \cdef\currenttextprefixtag{\reallanguagetag{#1}}%
264     \processcommalist[#2]\lang_labels_text_prefix_copy_indeed
265   \fi}
266
267\def\lang_labels_text_prefix_copy_indeed#1%
268  {\lang_labels_text_prefix_copy_pair[#1]}
269
270\def\lang_labels_text_prefix_copy_pair[#1=#2]%
271  {\lang_labels_text_prefix_copy_pair_indeed{#1}[#2,,]}
272
273% \def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
274%   {\expandafter\let
275%      \csname\??label\currenttextprefixclass:\currenttextprefixtag:#1\expandafter\endcsname
276%      \csname\??label\currenttextprefixclass:\currenttextprefixtag:#2\endcsname}
277%
278% this delays the aliasing so that we can switch mainlanguage in between
279
280\def\lang_labels_text_prefix_copy_pair_indeed#1[#2,#3]%
281  {\edefcsname\??label\currenttextprefixclass:#1\endcsname
282     {{\noexpand\csname\??label\currenttextprefixclass:\noexpand\reallanguagetag\noexpand\currentmainlanguage:#2\endcsname}{}}}
283
284\definelabelclass [head]      [0] % titles
285\definelabelclass [label]     [0] % texts
286\definelabelclass [mathlabel] [2] % functions
287\definelabelclass [taglabel]  [2] % tags
288
289\clf_definelabels{head}{titles}\s!true\relax
290\clf_definelabels{label}{texts}\s!true\relax
291\clf_definelabels{mathlabel}{functions}\s!false\relax
292\clf_definelabels{taglabel}{tags}\s!false\relax
293
294%D \macros
295%D   {translate}
296%D
297%D Sometimes macros contain language specific words that are to be typeset. Such
298%D macros can be made (more) language independant by using:
299%D
300%D \showsetup{translate}
301%D
302%D like for instance:
303%D
304%D \starttyping
305%D \translate[en=something,nl=iets]
306%D \stoptyping
307%D
308%D which expands to {\em something} or {\em iets}, depending on de current language.
309
310\installcorenamespace{translation}
311
312\permanent\tolerant\protected\def\translate[#1]%
313  {\getparameters[\??translation][#1]%
314   \ifcsname\??translation\currentlanguage\endcsname
315     \lastnamedcs
316   \orelse\ifcsname\??translation\s!en\endcsname
317     \lastnamedcs
318   \else
319     [translation #1]%
320   \fi}
321
322%D When used without argument, the last defined values are used. This enables
323%D repetitive use like
324%D
325%D \starttyping
326%D \en \translate\ means \nl \translate
327%D \stoptyping
328
329%D \macros
330%D   {assigntranslation}
331%D
332%D This macro is a system macro, and can be used to assign a translation to a macro.
333%D Its form is:
334%D
335%D \starttyping
336%D \assigntranslation[en=something,nl=iets]\to\command
337%D \stoptyping
338
339% nicer is \edef\command{\translated[...]} ... todo
340
341\permanent\protected\def\assigntranslation[#1]\to#2% bad, this \to
342  {\getparameters[\??translation][#1]%
343   \edef#2{\begincsname\??translation\currentlanguage\endcsname}}
344
345%D \macros
346%D   {commalistsentence}
347%D
348%D Redone in \LUA:
349%D
350%D \startbuffer
351%D \commalistsentence[aap,noot,mies]
352%D \commalistsentence[aap,noot]
353%D \commalistsentence[aap]
354%D \commalistsentence[a,b,c]
355%D \commalistsentence[a,b,c][{ \& },{ and }]
356%D \commalistsentence[a,b,c][+,-]
357%D \stopbuffer
358%D
359%D \typebuffer
360%D
361%D \startlines
362%D \getbuffer
363%D \stoplines
364
365\permanent\tolerant\protected\def\commalistsentence[#1]#*[#2]%
366  {\clf_concatcommalist
367     text       {#1}%
368     separators {#2}%
369     separator  {\detokenize\expandafter{\normalexpanded{\labeltext{and-1}}}}%
370     last       {\detokenize\expandafter{\normalexpanded{\labeltext{and-2}}}}%
371   \relax}
372
373\setuplabeltext [\s!nl] [and-1={{, }},and-2={{ en }}]   % 1, 2 en 3
374\setuplabeltext [\s!en] [and-1={{, }},and-2={{, }}]     % 1, 2, 3
375\setuplabeltext [\s!de] [and-1={{, }},and-2={{ und }}]  % 1, 2 und 3
376\setuplabeltext [\s!hr] [and-1={{, }},and-2={{ i }}]    % 1, 2 i 3
377
378%D Goodie (handy at \LUA\ end):
379
380\permanent\protected\def\LABELTEXT#1{\WORD{\labeltext{#1}}} % only for simple cases!
381
382%D For publications we have gender specific ones (one could use the main one for a
383%D gender neutral one).
384%D
385%D \startbuffer
386%D \startlines
387%D     (\labeltext     {demo-texts})
388%D     (\labeltexts    {demo-texts}{ TEST })
389%D     (\leftlabeltext {demo-texts})
390%D     (\rightlabeltext{demo-texts})
391%D \stoplines
392%D
393%D \startlines \mainlanguage[cs]
394%D     test \btxlabeltext{editor}   \par
395%D     test \btxlabeltext{editor:f} \par
396%D     test \btxlabeltext{editor:m} \par
397%D     test \btxlabeltext{editors}   \par
398%D     test \btxlabeltext{editors:f} \par
399%D     test \btxlabeltext{editors:m} \par
400%D \stoplines
401%D \stopbuffer
402%D
403%D \typebuffer \getbuffer
404
405\protect \endinput
406