1 /* top_nls.c - provide the basis for future nls translations */
3 * Copyright (c) 2011-2022, by: Jim Warner <james.warner@comcast.net
5 * This file may be used subject to the terms and conditions of the
6 * GNU Library General Public License Version 2, or any later version
7 * at your option, as published by the Free Software Foundation.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU Library General Public License for more details.
13 /* For contributions to this program, the author wishes to thank:
14 * Craig Small, <csmall@dropbear.xyz>
15 * Sami Kerola, <kerolasa@iki.fi>
33 * The provision excluding some strings is intended to be
34 * used very sparingly. It exists in case we collide with
35 * some translation project person in a position to delay
36 * a future release over his or her personal preferences.
38 * If it's ever enabled, it will produce a fatal compiler
39 * error as our only option since those gettext tools are
40 * far too primitive to be influenced with a conditional.
41 * They always ignore a '_X()' macro no matter its state. */
44 # define _X(str) (str)
47 # error instead of this #define, restore the true gettext macro(s)
50 // Programmer Note(s):
51 // Preparation ---------------------------------------------
52 // Unless you have *something* following the gettext macro,
53 // xgettext will refuse to see any TRANSLATORS comments.
54 // Thus empty strings have been added for potential future
57 // Also, by omitting the argument for the --add-comments
58 // XGETTEXT_OPTION in po/Makevars, *any* preceding c style
59 // comment will be propagated to the .pot file, providing
60 // that the gettext macro isn't empty as discussed above.
61 // However, this is far too aggressive so we have chosen
62 // the word 'Translation' to denote xgettext comments.
64 // /* Need Not Say 'TRANSLATORS': ...
65 // snprintf(buf, sizeof(buf), "%s", _( // unseen comment
67 // /* Translation Hint: ...
68 // snprintf(buf, sizeof(buf), "%s", _("" // now it's seen!
70 // Translation, from po/ directory after make --------------
71 // ( this is the procedure used before any translations were )
72 // ( available in the po/ directory, which contained only the )
73 // ( procps-ng.pot, this domain's template file. )
75 // ( below: ll_CC = language/country as in 'zh_CN' or 'en_AU' )
77 // msginit --locale=ll_CC --no-wrap
78 // . creates a ll_CC.po file from the template procps-ng.pot
79 // . may also duplicate msgid as msgstr if languages similar
80 // msgen --no-wrap ll_CC.po --output-file=ll_CC.po
81 // . duplicates every msgid literal as msgstr value
82 // . this is the file that's edited
83 // . replace "Content-Type: ... charset=ASCII\n"
84 // with "... charset=UTF-8\n"
85 // . translate msgstr values, leaving msgid unchanged
86 // msgfmt ll_CC.po --strict --output-file=procps-ng.mo
87 // . after which ensure, chmod 644
89 // to /usr/share/locale-langpack/ll_CC/LC_MESSAGES/
90 // or /usr/share/locale/ll_CC/LC_MESSAGES/
91 // Testing -------------------------------------------------
92 // export LC_ALL= && export LANGUAGE=ll_CC
93 // run some capable program like top
97 * These are our string tables with the following contents:
98 * Head : column headings with varying size limits
99 * Desc : fields descriptions not to exceed 20 screen positions
100 * Norm : regular text possibly also containing c-format specifiers
101 * Uniq : show_special specially formatted strings
103 * The latter table presents the greatest translation challenge !
105 * We go to the trouble of creating the nls string tables to achieve
107 * + the overhead of repeated runtime calls to gettext()
109 * + the order of the strings in the template (.pot) file
110 * can be completely controlled
111 * + none of the important translator only comments will
112 * clutter and obscure the main program
114 const char *Head_nlstab[EU_MAXPFLGS];
115 const char *Desc_nlstab[EU_MAXPFLGS];
116 const char *Norm_nlstab[norm_MAX];
117 const char *Uniq_nlstab[uniq_MAX];
121 * This routine builds the nls table containing plain text only
122 * used as the field descriptions. Each translated line MUST be
123 * kept to a maximum of 20 characters or less! */
124 static void build_two_nlstabs (void) {
126 /* Translation Notes ------------------------------------------------
127 . It is strongly recommend that the --no-wrap command line option
128 . be used with all supporting translation tools, when available.
130 . The following line pairs contain only plain text and consist of:
131 . 1) a field name/column header - mostly upper case
132 . 2) the related description - both upper and lower case
134 . To avoid truncation on the main top display, each column header
135 . is noted with its maximum size, while a few are 'variable' width.
136 . Names for the latter should probably be 10 or fewer characters.
138 . Those fields shown with a '+' are also eligible for user resizing
139 . using the 'X' command. That means the default width might produce
140 . truncation but need not if widened (see the man page 'X' command).
142 . All headers are subject to a maximum of 8 on the Fields Management
143 . screen where truncation is entirely acceptable.
145 . The associated descriptions are always limited to 20 characters,
146 . and are used only on the Fields Management screen.
148 . In all cases, fewer characters are just fine.
151 /* Translation Hint: maximum 'PID' = 5 */
152 Head_nlstab[EU_PID] = _("PID");
153 Desc_nlstab[EU_PID] = _("Process Id");
154 /* Translation Hint: maximum 'PPID' = 5 */
155 Head_nlstab[EU_PPD] = _("PPID");
156 Desc_nlstab[EU_PPD] = _("Parent Process pid");
157 /* Translation Hint: maximum 'UID' = 5 + */
158 Head_nlstab[EU_UED] = _("UID");
159 Desc_nlstab[EU_UED] = _("Effective User Id");
160 /* Translation Hint: maximum 'USER' = 8 + */
161 Head_nlstab[EU_UEN] = _("USER");
162 Desc_nlstab[EU_UEN] = _("Effective User Name");
163 /* Translation Hint: maximum 'RUID' = 5 + */
164 Head_nlstab[EU_URD] = _("RUID");
165 Desc_nlstab[EU_URD] = _("Real User Id");
166 /* Translation Hint: maximum 'RUSER' = 8 + */
167 Head_nlstab[EU_URN] = _("RUSER");
168 Desc_nlstab[EU_URN] = _("Real User Name");
169 /* Translation Hint: maximum 'SUID' = 5 + */
170 Head_nlstab[EU_USD] = _("SUID");
171 Desc_nlstab[EU_USD] = _("Saved User Id");
172 /* Translation Hint: maximum 'SUSER' = 8 + */
173 Head_nlstab[EU_USN] = _("SUSER");
174 Desc_nlstab[EU_USN] = _("Saved User Name");
175 /* Translation Hint: maximum 'GID' = 5 + */
176 Head_nlstab[EU_GID] = _("GID");
177 Desc_nlstab[EU_GID] = _("Group Id");
178 /* Translation Hint: maximum 'GROUP' = 8 + */
179 Head_nlstab[EU_GRP] = _("GROUP");
180 Desc_nlstab[EU_GRP] = _("Group Name");
181 /* Translation Hint: maximum 'PGRP' = 5 */
182 Head_nlstab[EU_PGD] = _("PGRP");
183 Desc_nlstab[EU_PGD] = _("Process Group Id");
184 /* Translation Hint: maximum 'TTY' = 8 + */
185 Head_nlstab[EU_TTY] = _("TTY");
186 Desc_nlstab[EU_TTY] = _("Controlling Tty");
187 /* Translation Hint: maximum 'TPGID' = 5 */
188 Head_nlstab[EU_TPG] = _("TPGID");
189 Desc_nlstab[EU_TPG] = _("Tty Process Grp Id");
190 /* Translation Hint: maximum 'SID' = 5 */
191 Head_nlstab[EU_SID] = _("SID");
192 Desc_nlstab[EU_SID] = _("Session Id");
193 /* Translation Hint: maximum 'PR' = 3 */
194 Head_nlstab[EU_PRI] = _("PR");
195 Desc_nlstab[EU_PRI] = _("Priority");
196 /* Translation Hint: maximum 'NI' = 3 */
197 Head_nlstab[EU_NCE] = _("NI");
198 Desc_nlstab[EU_NCE] = _("Nice Value");
199 /* Translation Hint: maximum 'nTH' = 3 */
200 Head_nlstab[EU_THD] = _("nTH");
201 Desc_nlstab[EU_THD] = _("Number of Threads");
202 /* Translation Hint: maximum 'P' = 1 */
203 Head_nlstab[EU_CPN] = _("P");
204 Desc_nlstab[EU_CPN] = _("Last Used Cpu (SMP)");
205 /* Translation Hint: maximum '%CPU' = 4 */
206 Head_nlstab[EU_CPU] = _("%CPU");
207 Desc_nlstab[EU_CPU] = _("CPU Usage");
208 /* Translation Hint: maximum '' = 6 */
209 Head_nlstab[EU_TME] = _("TIME");
210 Desc_nlstab[EU_TME] = _("CPU Time");
211 /* Translation Hint: maximum 'TIME+' = 9 */
212 Head_nlstab[EU_TM2] = _("TIME+");
213 Desc_nlstab[EU_TM2] = _("CPU Time, hundredths");
214 /* Translation Hint: maximum '%MEM' = 4 */
215 Head_nlstab[EU_MEM] = _("%MEM");
216 Desc_nlstab[EU_MEM] = _("Memory Usage (RES)");
217 /* Translation Hint: maximum 'VIRT' = 7 */
218 Head_nlstab[EU_VRT] = _("VIRT");
219 Desc_nlstab[EU_VRT] = _("Virtual Image (KiB)");
220 /* Translation Hint: maximum 'SWAP' = 6 */
221 Head_nlstab[EU_SWP] = _("SWAP");
222 Desc_nlstab[EU_SWP] = _("Swapped Size (KiB)");
223 /* Translation Hint: maximum 'RES' = 6 */
224 Head_nlstab[EU_RES] = _("RES");
225 Desc_nlstab[EU_RES] = _("Resident Size (KiB)");
226 /* Translation Hint: maximum 'CODE' = 4 */
227 Head_nlstab[EU_COD] = _("CODE");
228 Desc_nlstab[EU_COD] = _("Code Size (KiB)");
229 /* Translation Hint: maximum 'DATA' = 7 */
230 Head_nlstab[EU_DAT] = _("DATA");
231 Desc_nlstab[EU_DAT] = _("Data+Stack (KiB)");
232 /* Translation Hint: maximum 'SHR' = 6 */
233 Head_nlstab[EU_SHR] = _("SHR");
234 Desc_nlstab[EU_SHR] = _("Shared Memory (KiB)");
235 /* Translation Hint: maximum 'nMaj' = 4 */
236 Head_nlstab[EU_FL1] = _("nMaj");
237 Desc_nlstab[EU_FL1] = _("Major Page Faults");
238 /* Translation Hint: maximum 'nMin' = 4 */
239 Head_nlstab[EU_FL2] = _("nMin");
240 Desc_nlstab[EU_FL2] = _("Minor Page Faults");
241 /* Translation Hint: maximum 'nDRT' = 4 */
242 Head_nlstab[EU_DRT] = _("nDRT");
243 Desc_nlstab[EU_DRT] = _("Dirty Pages Count");
244 /* Translation Hint: maximum 'S' = 1 */
245 Head_nlstab[EU_STA] = _("S");
246 Desc_nlstab[EU_STA] = _("Process Status");
247 /* Translation Hint: maximum 'COMMAND' = variable */
248 Head_nlstab[EU_CMD] = _("COMMAND");
249 Desc_nlstab[EU_CMD] = _("Command Name/Line");
250 /* Translation Hint: maximum 'WCHAN' = 10 + */
251 Head_nlstab[EU_WCH] = _("WCHAN");
252 Desc_nlstab[EU_WCH] = _("Sleeping in Function");
253 /* Translation Hint: maximum 'Flags' = 8 */
254 Head_nlstab[EU_FLG] = _("Flags");
255 Desc_nlstab[EU_FLG] = _("Task Flags <sched.h>");
256 /* Translation Hint: maximum 'CGROUPS' = variable */
257 Head_nlstab[EU_CGR] = _("CGROUPS");
258 Desc_nlstab[EU_CGR] = _("Control Groups");
259 /* Translation Hint: maximum 'SUPGIDS' = variable */
260 Head_nlstab[EU_SGD] = _("SUPGIDS");
261 Desc_nlstab[EU_SGD] = _("Supp Groups IDs");
262 /* Translation Hint: maximum 'SUPGRPS' = variable */
263 Head_nlstab[EU_SGN] = _("SUPGRPS");
264 Desc_nlstab[EU_SGN] = _("Supp Groups Names");
265 /* Translation Hint: maximum 'TGID' = 5 */
266 Head_nlstab[EU_TGD] = _("TGID");
267 Desc_nlstab[EU_TGD] = _("Thread Group Id");
268 /* Translation Hint: maximum 'OOMa' = 5 */
269 Head_nlstab[EU_OOA] = _("OOMa");
270 Desc_nlstab[EU_OOA] = _("OOMEM Adjustment");
271 /* Translation Hint: maximum 'OOMs' = 4 */
272 Head_nlstab[EU_OOM] = _("OOMs");
273 Desc_nlstab[EU_OOM] = _("OOMEM Score current");
274 /* Translation Hint: maximum 'ENVIRON' = variable */
275 Head_nlstab[EU_ENV] = _("ENVIRON");
276 /* Translation Hint: the abbreviation 'vars' below is shorthand for
278 Desc_nlstab[EU_ENV] = _("Environment vars");
279 /* Translation Hint: maximum 'vMj' = 3 */
280 Head_nlstab[EU_FV1] = _("vMj");
281 Desc_nlstab[EU_FV1] = _("Major Faults delta");
282 /* Translation Hint: maximum 'vMn' = 3 */
283 Head_nlstab[EU_FV2] = _("vMn");
284 Desc_nlstab[EU_FV2] = _("Minor Faults delta");
285 /* Translation Hint: maximum 'USED' = 6 */
286 Head_nlstab[EU_USE] = _("USED");
287 Desc_nlstab[EU_USE] = _("Res+Swap Size (KiB)");
288 /* Translation Hint: maximum 'nsIPC' = 10 + */
289 Head_nlstab[EU_NS1] = _("nsIPC");
290 Desc_nlstab[EU_NS1] = _("IPC namespace Inode");
291 /* Translation Hint: maximum 'nsMNT' = 10 + */
292 Head_nlstab[EU_NS2] = _("nsMNT");
293 Desc_nlstab[EU_NS2] = _("MNT namespace Inode");
294 /* Translation Hint: maximum 'nsNET' = 10 + */
295 Head_nlstab[EU_NS3] = _("nsNET");
296 Desc_nlstab[EU_NS3] = _("NET namespace Inode");
297 /* Translation Hint: maximum 'nsPID' = 10 + */
298 Head_nlstab[EU_NS4] = _("nsPID");
299 Desc_nlstab[EU_NS4] = _("PID namespace Inode");
300 /* Translation Hint: maximum 'nsUSER' = 10 + */
301 Head_nlstab[EU_NS5] = _("nsUSER");
302 Desc_nlstab[EU_NS5] = _("USER namespace Inode");
303 /* Translation Hint: maximum 'nsUTS' = 10 + */
304 Head_nlstab[EU_NS6] = _("nsUTS");
305 Desc_nlstab[EU_NS6] = _("UTS namespace Inode");
306 /* Translation Hint: maximum 'LXC' = 8 + */
307 Head_nlstab[EU_LXC] = _("LXC");
308 Desc_nlstab[EU_LXC] = _("LXC container name");
309 /* Translation Hint: maximum 'RSan' = 6 */
310 Head_nlstab[EU_RZA] = _("RSan");
311 Desc_nlstab[EU_RZA] = _("RES Anonymous (KiB)");
312 /* Translation Hint: maximum 'RSfd' = 6 */
313 Head_nlstab[EU_RZF] = _("RSfd");
314 Desc_nlstab[EU_RZF] = _("RES File-based (KiB)");
315 /* Translation Hint: maximum 'RSlk' = 6 */
316 Head_nlstab[EU_RZL] = _("RSlk");
317 Desc_nlstab[EU_RZL] = _("RES Locked (KiB)");
318 /* Translation Hint: maximum 'RSsh' = 6 */
319 Head_nlstab[EU_RZS] = _("RSsh");
320 Desc_nlstab[EU_RZS] = _("RES Shared (KiB)");
321 /* Translation Hint: maximum 'CGNAME' = variable */
322 Head_nlstab[EU_CGN] = _("CGNAME");
323 Desc_nlstab[EU_CGN] = _("Control Group name");
324 /* Translation Hint: maximum 'NU' = 2 */
325 Head_nlstab[EU_NMA] = _("NU");
326 Desc_nlstab[EU_NMA] = _("Last Used NUMA node");
327 /* Translation Hint: maximum 'LOGID' = 5 + */
328 Head_nlstab[EU_LID] = _("LOGID");
329 Desc_nlstab[EU_LID] = _("Login User Id");
330 /* Translation Hint: maximum 'EXE' = variable */
331 Head_nlstab[EU_EXE] = _("EXE");
332 Desc_nlstab[EU_EXE] = _("Executable Path");
333 /* Translation Hint: With the next 5 fields, notice how an extra space
334 has been added ahead of one 'KiB' so that they all
335 align. You need not preserve such alignment. */
336 /* Translation Hint: maximum 'RSS' = 6 */
337 Head_nlstab[EU_RSS] = _("RSS");
338 Desc_nlstab[EU_RSS] = _("Res Mem (smaps), KiB");
339 /* Translation Hint: maximum 'PSS' = 6 */
340 Head_nlstab[EU_PSS] = _("PSS");
341 Desc_nlstab[EU_PSS] = _("Proportion RSS, KiB");
342 /* Translation Hint: maximum 'PSan' = 6 */
343 Head_nlstab[EU_PZA] = _("PSan");
344 Desc_nlstab[EU_PZA] = _("Proportion Anon, KiB");
345 /* Translation Hint: maximum 'PSfd' = 6 */
346 Head_nlstab[EU_PZF] = _("PSfd");
347 Desc_nlstab[EU_PZF] = _("Proportion File, KiB");
348 /* Translation Hint: maximum 'PSsh' = 6 */
349 Head_nlstab[EU_PZS] = _("PSsh");
350 Desc_nlstab[EU_PZS] = _("Proportion Shrd, KiB");
351 /* Translation Hint: maximum 'USS' = 6 */
352 Head_nlstab[EU_USS] = _("USS");
353 Desc_nlstab[EU_USS] = _("Unique RSS, KiB");
354 /* Translation Hint: maximum 'ioR' = 6 */
355 Head_nlstab[EU_IRB] = _("ioR");
356 Desc_nlstab[EU_IRB] = _("I/O Bytes Read");
357 /* Translation Hint: maximum 'ioRop' = 5 */
358 Head_nlstab[EU_IRO] = _("ioRop");
359 Desc_nlstab[EU_IRO] = _("I/O Read Operations");
360 /* Translation Hint: maximum 'ioW' = 6 */
361 Head_nlstab[EU_IWB] = _("ioW");
362 Desc_nlstab[EU_IWB] = _("I/O Bytes Written");
363 /* Translation Hint: maximum 'ioWop' = 5 */
364 Head_nlstab[EU_IWO] = _("ioWop");
365 Desc_nlstab[EU_IWO] = _("I/O Write Operations");
366 /* Translation Hint: maximum 'AGID' = 5 */
367 Head_nlstab[EU_AGI] = _("AGID");
368 Desc_nlstab[EU_AGI] = _("Autogroup Identifier");
369 /* Translation Hint: maximum 'AGNI' = 4 */
370 Head_nlstab[EU_AGN] = _("AGNI");
371 Desc_nlstab[EU_AGN] = _("Autogroup Nice Value");
372 /* Translation Hint: maximum 'STARTED' = 7 */
373 Head_nlstab[EU_TM3] = _("STARTED");
374 Desc_nlstab[EU_TM3] = _("Start Time from boot");
375 /* Translation Hint: maximum 'ELAPSED' = 7 */
376 Head_nlstab[EU_TM4] = _("ELAPSED");
377 Desc_nlstab[EU_TM4] = _("Elapsed Running Time");
378 /* Translation Hint: maximum '%CUU' = 6 */
379 Head_nlstab[EU_CUU] = _("%CUU");
380 Desc_nlstab[EU_CUU] = _("CPU Utilization");
381 /* Translation Hint: maximum '%CUC' = 7 */
382 Head_nlstab[EU_CUC] = _("%CUC");
383 Desc_nlstab[EU_CUC] = _("Utilization + child");
384 /* Translation Hint: maximum 'nsCGROUP' = 10 + */
385 Head_nlstab[EU_NS7] = _("nsCGROUP");
386 Desc_nlstab[EU_NS7] = _("CGRP namespace Inode");
387 /* Translation Hint: maximum 'nsTIME' = 10 + */
388 Head_nlstab[EU_NS8] = _("nsTIME");
389 Desc_nlstab[EU_NS8] = _("TIME namespace Inode");
394 * This routine builds the nls table containing both plain text
395 * and regular c-format strings. */
396 static void build_norm_nlstab (void) {
398 /* Translation Notes ------------------------------------------------
399 . It is strongly recommend that the --no-wrap command line option
400 . be used with all supporting translation tools, when available.
402 . This group of lines contains both plain text and c-format strings.
404 . Some strings reflect switches used to affect the running program
405 . and should not be translated without also making corresponding
406 . c-code logic changes.
409 Norm_nlstab[EXIT_signals_fmt] = _(""
410 "\tsignal %d (%s) was caught by %s, please\n"
411 "\tsend bug reports to <procps@freelists.org>\n");
412 Norm_nlstab[HELP_cmdline_fmt] = _X("\n"
417 " -b, --batch-mode run in non-interactive batch mode\n"
418 " -c, --cmdline-toggle reverse last remembered 'c' state\n"
419 " -d, --delay =SECS [.TENTHS] iterative delay as SECS [.TENTHS]\n"
420 " -E, --scale-summary-mem =SCALE set mem as: k,m,g,t,p,e for SCALE\n"
421 " -e, --scale-task-mem =SCALE set mem with: k,m,g,t,p for SCALE\n"
422 " -H, --threads-show show tasks plus all their threads\n"
423 " -i, --idle-toggle reverse last remembered 'i' state\n"
424 " -n, --iterations =NUMBER exit on maximum iterations NUMBER\n"
425 " -O, --list-fields output all field names, then exit\n"
426 " -o, --sort-override =FIELD force sorting on this named FIELD\n"
427 " -p, --pid =PIDLIST monitor only the tasks in PIDLIST\n"
428 " -S, --accum-time-toggle reverse last remembered 'S' state\n"
429 " -s, --secure-mode run with secure mode restrictions\n"
430 " -U, --filter-any-user =USER show only processes owned by USER\n"
431 " -u, --filter-only-euser =USER show only processes owned by USER\n"
432 " -w, --width [=COLUMNS] change print width [,use COLUMNS]\n"
433 " -1, --single-cpu-toggle reverse last remembered '1' state\n"
435 " -h, --help display this help text, then exit\n"
436 " -V, --version output version information & exit\n"
438 "For more details see top(1).");
439 Norm_nlstab[BAD_delayint_fmt] = _("bad delay interval '%s'");
440 Norm_nlstab[BAD_niterate_fmt] = _("bad iterations argument '%s'");
441 Norm_nlstab[LIMIT_exceed_fmt] = _("pid limit (%d) exceeded");
442 Norm_nlstab[BAD_mon_pids_fmt] = _("bad pid '%s'");
443 Norm_nlstab[MISSING_args_fmt] = _("-%c argument missing");
444 Norm_nlstab[BAD_widtharg_fmt] = _("bad width arg '%s'");
445 Norm_nlstab[UNKNOWN_opts_fmt] = _("unknown option '%s'");
446 Norm_nlstab[DELAY_secure_txt] = _("-d disallowed in \"secure\" mode");
447 Norm_nlstab[DELAY_badarg_txt] = _("-d requires positive argument");
448 Norm_nlstab[ON_word_only_txt] = _("On");
449 Norm_nlstab[OFF_one_word_txt] = _("Off");
450 Norm_nlstab[VERSION_opts_fmt] = _("%s from %s");
451 Norm_nlstab[FOREST_modes_fmt] = _("Forest mode %s");
452 Norm_nlstab[FAIL_tty_get_txt] = _("failed tty get");
453 Norm_nlstab[FAIL_tty_set_fmt] = _("failed tty set: %s");
454 Norm_nlstab[CHOOSE_group_txt] = _("Choose field group (1 - 4)");
455 Norm_nlstab[DISABLED_cmd_txt] = _("Command disabled, 'A' mode required");
456 Norm_nlstab[DISABLED_win_fmt] = _("Command disabled, activate %s with '-' or '_'");
457 Norm_nlstab[COLORS_nomap_txt] = _("No colors to map!");
458 Norm_nlstab[FAIL_rc_open_fmt] = _("Failed '%s' open: %s");
459 Norm_nlstab[WRITE_rcfile_fmt] = _("Wrote configuration to '%s'");
460 Norm_nlstab[DELAY_change_fmt] = _("Change delay from %.1f to");
461 Norm_nlstab[THREADS_show_fmt] = _("Show threads %s");
462 Norm_nlstab[IRIX_curmode_fmt] = _("Irix mode %s");
463 Norm_nlstab[GET_pid2kill_fmt] = _("PID to signal/kill [default pid = %d]");
464 Norm_nlstab[GET_sigs_num_fmt] = _("Send pid %d signal [%d/sigterm]");
465 Norm_nlstab[FAIL_signals_fmt] = _("Failed signal pid '%d' with '%d': %s");
466 Norm_nlstab[BAD_signalid_txt] = _("Invalid signal");
467 Norm_nlstab[GET_pid2nice_fmt] = _("PID to renice [default pid = %d]");
468 Norm_nlstab[GET_nice_num_fmt] = _("Renice PID %d to value");
469 Norm_nlstab[FAIL_re_nice_fmt] = _("Failed renice of PID %d to %d: %s");
470 Norm_nlstab[NAME_windows_fmt] = _("Rename window '%s' to (1-3 chars)");
471 Norm_nlstab[TIME_accumed_fmt] = _("Cumulative time %s");
472 Norm_nlstab[GET_max_task_fmt] = _("Maximum tasks = %d, change to (0 is unlimited)");
473 Norm_nlstab[BAD_max_task_txt] = _("Invalid maximum");
474 Norm_nlstab[GET_user_ids_txt] = _("Which user (blank for all)");
475 Norm_nlstab[UNKNOWN_cmds_txt] = _("Unknown command - try 'h' for help");
476 Norm_nlstab[SCROLL_coord_fmt] = _("scroll coordinates: y = %d/%d (tasks), x = %d/%d (fields)");
477 Norm_nlstab[FAIL_alloc_c_txt] = _("failed memory allocate");
478 Norm_nlstab[FAIL_alloc_r_txt] = _("failed memory re-allocate");
479 Norm_nlstab[BAD_numfloat_txt] = _("Unacceptable floating point");
480 Norm_nlstab[BAD_username_txt] = _("Invalid user");
481 Norm_nlstab[FOREST_views_txt] = _("forest view");
482 Norm_nlstab[FAIL_widepid_txt] = _("failed pid maximum size test");
483 Norm_nlstab[FAIL_widecpu_txt] = _("failed number of cpus test");
484 Norm_nlstab[RC_bad_files_fmt] = _("incompatible rcfile, you should delete '%s'");
485 Norm_nlstab[RC_bad_entry_fmt] = _("window entry #%d corrupt, please delete '%s'");
486 Norm_nlstab[NOT_onsecure_txt] = _("Unavailable in secure mode");
487 Norm_nlstab[NOT_smp_cpus_txt] = _("Only 1 cpu detected");
488 Norm_nlstab[BAD_integers_txt] = _("Unacceptable integer");
489 Norm_nlstab[SELECT_clash_txt] = _("conflicting process selections (U/p/u)");
490 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
491 . kibibytes (1024 bytes) */
492 Norm_nlstab[AMT_kilobyte_txt] = _("KiB");
493 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
494 . mebibytes (1,048,576 bytes) */
495 Norm_nlstab[AMT_megabyte_txt] = _("MiB");
496 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
497 . gibibytes (1,073,741,824 bytes) */
498 Norm_nlstab[AMT_gigabyte_txt] = _("GiB");
499 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
500 . tebibytes (1,099,511,627,776 bytes) */
501 Norm_nlstab[AMT_terabyte_txt] = _("TiB");
502 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
503 . pebibytes (1,024 tebibytes) */
504 Norm_nlstab[AMT_petabyte_txt] = _("PiB");
505 /* Translation Hint: This is an abbreviation (limit 3 characters) for:
506 . exbibytes (1,024 pebibytes) */
507 Norm_nlstab[AMT_exxabyte_txt] = _("EiB");
508 Norm_nlstab[WORD_threads_txt] = _("Threads");
509 Norm_nlstab[WORD_process_txt] = _("Tasks");
510 /* Translation Hint: The following "word" is meant to represent either a single
511 . cpu or all of the processors in a multi-processor computer
512 . (should be exactly 6 characters, excluding leading % & colon) */
513 Norm_nlstab[WORD_allcpus_txt] = _("%Cpu(s):");
514 /* Translation Hint: The following "word" is meant to represent a single processor
515 and 'the Cp' prefix will be combined with a core id: 'p', 'e' or 'u'
516 . (if 'Cp' is translated, it must be exactly 2 characters long) */
517 Norm_nlstab[WORD_eachcpu_fmt] = _("%%Cp%c%-3d:");
518 /* Translation Hint: The following word "another" must have 1 trailing space */
519 Norm_nlstab[WORD_another_txt] = _("another ");
520 Norm_nlstab[FIND_no_next_txt] = _("Locate next inactive, use \"L\"");
521 Norm_nlstab[GET_find_str_txt] = _("Locate string");
522 Norm_nlstab[FIND_no_find_fmt] = _("%s\"%s\" not found");
523 Norm_nlstab[XTRA_fixwide_fmt] = _("width incr is %d, change to (0 default, -1 auto)");
524 Norm_nlstab[XTRA_warncfg_txt] = _("rcfile has inspect/other-filter error(s), save anyway?");
525 Norm_nlstab[XTRA_badflds_fmt] = _("unrecognized field name '%s'");
526 Norm_nlstab[XTRA_winsize_txt] = _("even using field names only, window is now too small");
527 Norm_nlstab[YINSP_demo01_txt] = _("Open Files");
528 Norm_nlstab[YINSP_demo02_txt] = _("NUMA Info");
529 Norm_nlstab[YINSP_demo03_txt] = _("Log");
530 Norm_nlstab[YINSP_deqfmt_txt] = _("the '=' key will eventually show the actual file read or command(s) executed ...");
531 Norm_nlstab[YINSP_deqtyp_txt] = _("demo");
532 Norm_nlstab[YINSP_dstory_txt] = _(""
533 "This is simulated output representing the contents of some file or the output\n"
534 "from some command. Exactly which commands and/or files are solely up to you.\n"
536 "Although this text is for information purposes only, it can still be scrolled\n"
537 "and searched like real output will be. You are encouraged to experiment with\n"
538 "those features as explained in the prologue above.\n"
540 "To enable real Inspect functionality, entries must be added to the end of the\n"
541 "top personal personal configuration file. You could use your favorite editor\n"
542 "to accomplish this, taking care not to disturb existing entries.\n"
544 "Another way to add entries is illustrated below, but it risks overwriting the\n"
545 "rcfile. Redirected echoes must not replace (>) but append (>>) to that file.\n"
547 " /bin/echo -e \"pipe\\tOpen Files\\tlsof -P -p %d 2>&1\" >> ~/.toprc\n"
548 " /bin/echo -e \"file\\tNUMA Info\\t/proc/%d/numa_maps\" >> ~/.toprc\n"
549 " /bin/echo -e \"pipe\\tLog\\ttail -n200 /var/log/syslog | sort -Mr\" >> ~/.toprc\n"
551 "If you don't know the location or name of the top rcfile, use the 'W' command\n"
552 "and note those details. After backing up the current rcfile, try issuing the\n"
553 "above echoes exactly as shown, replacing '.toprc' as appropriate. The safest\n"
554 "approach would be to use copy then paste to avoid any typing mistakes.\n"
556 "Finally, restart top to reveal what actual Inspect entries combined with this\n"
557 "new command can offer. The possibilities are endless, especially considering\n"
558 "that 'pipe' type entries can include shell scripts too!\n"
560 "For additional important information, please consult the top(1) man document.\n"
561 "Then, enhance top with your very own customized 'file' and/or 'pipe' entries.\n"
564 Norm_nlstab[YINSP_noent1_txt] = _("to enable 'Y' press <Enter> then type 'W' and restart top");
565 Norm_nlstab[YINSP_noent2_txt] = _("to enable 'Y' please consult the top man page (press Enter)");
566 Norm_nlstab[YINSP_failed_fmt] = _("Selection failed with: %s\n");
567 Norm_nlstab[YINSP_pidbad_fmt] = _("unable to inspect, pid %d not found");
568 Norm_nlstab[YINSP_pidsee_fmt] = _("inspect at PID [default pid = %d]");
569 Norm_nlstab[YINSP_status_fmt] = _("%s: %*d-%-*d lines, %*d-%*d columns, %lu bytes read");
570 Norm_nlstab[YINSP_waitin_txt] = _("patience please, working ...");
571 Norm_nlstab[YINSP_workin_txt] = _("working, use Ctrl-C to end ...");
572 /* Translation Hint: Below are 2 abbreviations which can be as long as needed:
573 . FLD = FIELD, VAL = VALUE */
574 Norm_nlstab[OSEL_prompts_fmt] = _("add filter #%d (%s) as: [!]FLD?VAL");
575 Norm_nlstab[OSEL_casenot_txt] = _("ignoring case");
576 Norm_nlstab[OSEL_caseyes_txt] = _("case sensitive");
577 Norm_nlstab[OSEL_errdups_txt] = _("duplicate filter was ignored");
578 Norm_nlstab[OSEL_errdelm_fmt] = _("'%s' filter delimiter is missing");
579 Norm_nlstab[OSEL_errvalu_fmt] = _("'%s' filter value is missing");
580 Norm_nlstab[WORD_include_txt] = _("include");
581 Norm_nlstab[WORD_exclude_txt] = _("exclude");
582 Norm_nlstab[OSEL_statlin_fmt] = _("<Enter> to resume, filters: %s");
583 Norm_nlstab[WORD_noneone_txt] = _("none");
584 /* Translation Hint: The following word 'Node' should be exactly
585 4 characters, excluding leading %%, fmt chars & colon) */
586 Norm_nlstab[NUMA_nodenam_fmt] = _("%%Node%-2d:");
587 Norm_nlstab[NUMA_nodeget_fmt] = _("expand which numa node (0-%d)");
588 Norm_nlstab[NUMA_nodebad_txt] = _("invalid numa node");
589 Norm_nlstab[NUMA_nodenot_txt] = _("sorry, NUMA extensions unavailable");
590 /* Translation Hint: 'Mem ' is an abbreviation for physical memory/ram
591 . 'Swap' represents the linux swap file --
592 . please make both translations exactly 4 characters,
593 . padding with extra spaces as necessary */
594 Norm_nlstab[WORD_abv_mem_txt] = _("Mem ");
595 Norm_nlstab[WORD_abv_swp_txt] = _("Swap");
596 Norm_nlstab[LIB_errormem_fmt] = _("library failed memory statistics, at %d: %s");
597 Norm_nlstab[LIB_errorcpu_fmt] = _("library failed cpu statistics, at %d: %s");
598 Norm_nlstab[LIB_errorpid_fmt] = _("library failed pids statistics, at %d: %s");
599 Norm_nlstab[BAD_memscale_fmt] = _("bad memory scaling arg '%s'");
600 Norm_nlstab[XTRA_vforest_fmt] = _("PID to collapse/expand [default pid = %d]");
601 Norm_nlstab[XTRA_modebad_txt] = _("wrong mode, command inactive");
602 Norm_nlstab[XTRA_warnold_txt] = _("saving prevents older top from reading, save anyway?");
603 Norm_nlstab[X_SEMAPHORES_fmt] = _("failed sem_init() at %d: %s");
604 Norm_nlstab[X_THREADINGS_fmt] = _("failed pthread_create() at %d: %s");
605 Norm_nlstab[X_RESTRICTED_txt] = _("sorry, restricted namespace with reduced functionality");
606 Norm_nlstab[AGNI_valueof_fmt] = _("set pid %d AGNI value to");
607 Norm_nlstab[AGNI_invalid_txt] = _("valid AGNI range is -20 to +19");
608 Norm_nlstab[AGNI_notopen_fmt] = _("autogroup open failed, %s");
609 Norm_nlstab[AGNI_nowrite_fmt] = _("autogroup write failed, %s");
610 Norm_nlstab[X_BOT_cmdlin_fmt] = _("command line for pid %d, %s");
611 Norm_nlstab[X_BOT_ctlgrp_fmt] = _("control groups for pid %d, %s");
612 Norm_nlstab[X_BOT_envirn_fmt] = _("environment for pid %d, %s");
613 Norm_nlstab[X_BOT_namesp_fmt] = _("namespaces for pid %d, %s");
614 Norm_nlstab[X_BOT_nodata_txt] = _("n/a");
615 Norm_nlstab[X_BOT_supgrp_fmt] = _("supplementary groups for pid %d, %s");
616 Norm_nlstab[X_BOT_msglog_txt] = _("message log, last 10 messages:");
621 * This routine builds the nls table containing specially
622 * formatted strings designed to fit within an 80x24 terminal. */
623 static void build_uniq_nlstab (void) {
625 /* Translation Notes ------------------------------------------------
626 . It is strongly recommend that the --no-wrap command line option
627 . be used with all supporting translation tools, when available.
629 . The next several text groups contain special escape sequences
630 . representing values used to index a table at run-time.
632 . Each such sequence consists of a tilde (~) followed by an ascii
633 . number in the range of '1' - '8'. Examples are '~2', '~8', etc.
634 . These escape sequences must never themselves be translated but
637 . If you remove these escape sequences (both tilde and number) it
638 . would make translation easier. However, the ability to display
639 . colors and bold text at run-time will have been lost.
641 . Additionally, each of these text groups was designed to display
642 . in a 80x24 terminal window. Hopefully, any translations will
643 . adhere to that goal lest the translated text be truncated.
645 . If you would like additional information regarding these strings,
646 . please see the prologue to the show_special function in the top.c
650 . The next three items represent pages for interacting with a user.
651 . In all cases, the last lines of text must be treated with care.
653 . They must not end with a newline character so that at runtime the
654 . cursor will remain on that final text line.
656 . Also, the special sequences (tilde+number) must not appear on the
657 . last line (the one without the newline). So please avoid any line
658 . wraps that could place them there.
661 Uniq_nlstab[KEYS_helpbas_fmt] = _(""
662 "Help for Interactive Commands~2 - %s\n"
663 "Window ~1%s~6: ~1Cumulative mode ~3%s~2. ~1System~6: ~1Delay ~3%.1f secs~2; ~1Secure mode ~3%s~2.\n"
665 " Z~5,~1B~5,E,e Global: '~1Z~2' colors; '~1B~2' bold; '~1E~2'/'~1e~2' summary/task memory scale\n"
666 " l,t,m,I Toggle: '~1l~2' load avg; '~1t~2' task/cpu; '~1m~2' memory; '~1I~2' Irix mode\n"
667 " 0,1,2,3,4 Toggle: '~10~2' zeros; '~11~2/~12~2/~13~2' cpu/numa views; '~14~2' cpus two abreast\n"
668 " f,X Fields: '~1f~2' add/remove/order/sort; '~1X~2' increase fixed-width fields\n"
670 " L,&,<,> . Locate: '~1L~2'/'~1&~2' find/again; Move sort column: '~1<~2'/'~1>~2' left/right\n"
671 " R,H,J,C . Toggle: '~1R~2' Sort; '~1H~2' Threads; '~1J~2' Num justify; '~1C~2' Coordinates\n"
672 " c,i,S,j . Toggle: '~1c~2' Cmd name/line; '~1i~2' Idle; '~1S~2' Time; '~1j~2' Str justify\n"
673 " x~5,~1y~5 . Toggle highlights: '~1x~2' sort field; '~1y~2' running tasks\n"
674 " z~5,~1b~5 . Toggle: '~1z~2' color/mono; '~1b~2' bold/reverse (only if 'x' or 'y')\n"
675 " u,U,o,O . Filter by: '~1u~2'/'~1U~2' effective/any user; '~1o~2'/'~1O~2' other criteria\n"
676 " n,#,^O . Set: '~1n~2'/'~1#~2' max tasks displayed; Show: ~1Ctrl~2+'~1O~2' other filter(s)\n"
677 " V,v,F . Toggle: '~1V~2' forest view; '~1v~2' hide/show children; '~1F~2' keep focused\n"
680 " ^G,K,N,U View: ctl groups ~1^G~2; cmdline ~1^K~2; environment ~1^N~2; supp groups ~1^U~2\n"
681 " W,Y,!,^E Write cfg '~1W~2'; Inspect '~1Y~2'; Combine Cpus '~1!~2'; Scale time ~1^E~2'\n"
683 " ( commands shown with '.' require a ~1visible~2 task display ~1window~2 ) \n"
684 "Press '~1h~2' or '~1?~2' for help with ~1Windows~2,\n"
685 "Type 'q' or <Esc> to continue ");
687 Uniq_nlstab[WINDOWS_help_fmt] = _(""
688 "Help for Windows / Field Groups~2 - \"Current Window\" = ~1 %s ~6\n"
690 ". Use multiple ~1windows~2, each with separate config opts (color,fields,sort,etc)\n"
691 ". The 'current' window controls the ~1Summary Area~2 and responds to your ~1Commands~2\n"
692 " . that window's ~1task display~2 can be turned ~1Off~2 & ~1On~2, growing/shrinking others\n"
693 " . with ~1NO~2 task display, some commands will be ~1disabled~2 ('i','R','n','c', etc)\n"
694 " until a ~1different window~2 has been activated, making it the 'current' window\n"
695 ". You ~1change~2 the 'current' window by: ~1 1~2) cycling forward/backward;~1 2~2) choosing\n"
696 " a specific field group; or~1 3~2) exiting the color mapping or fields screens\n"
697 ". Commands ~1available anytime -------------~2\n"
698 " A . Alternate display mode toggle, show ~1Single~2 / ~1Multiple~2 windows\n"
699 " g . Choose another field group and make it 'current', or change now\n"
700 " by selecting a number from: ~1 1~2 =%s;~1 2~2 =%s;~1 3~2 =%s; or~1 4~2 =%s\n"
701 ". Commands ~1requiring~2 '~1A~2' mode~1 -------------~2\n"
702 " G . Change the ~1Name~5 of the 'current' window/field group\n"
703 " ~1*~4 a , w . Cycle through all four windows: '~1a~5' Forward; '~1w~5' Backward\n"
704 " ~1*~4 - , _ . Show/Hide: '~1-~5' ~1Current~2 window; '~1_~5' all ~1Visible~2/~1Invisible~2\n"
705 " The screen will be divided evenly between task displays. But you can make\n"
706 " some ~1larger~2 or ~1smaller~2, using '~1n~2' and '~1i~2' commands. Then later you could:\n"
707 " ~1*~4 = , + . Rebalance tasks: '~1=~5' ~1Current~2 window; '~1+~5' ~1Every~2 window\n"
708 " (this also forces the ~1current~2 or ~1every~2 window to become visible)\n"
710 "In '~1A~2' mode, '~1*~4' keys are your ~1essential~2 commands. Please try the '~1a~2' and '~1w~2'\n"
711 "commands plus the 'g' sub-commands NOW. Press <Enter> to make 'Current' ");
713 /* Translation Notes ------------------------------------------------
714 . The following 'Help for color mapping' simulated screen should
715 . probably NOT be translated. It is terribly hard to follow in
716 . this form and any translation could produce unpleasing results
717 . that are unlikely to parallel the running top program.
719 . If you decide to proceed with translation, please take care
720 . to not disturb the spaces and the tilde + number delimiters.
722 Uniq_nlstab[COLOR_custom_fmt] = _(""
723 "Help for color mapping~2 - \"Current Window\" = ~1 %s ~6\n"
725 " color - 04:25:44 up 8 days, 50 min, 7 users, load average:\n"
726 " Tasks:~3 64 ~2total,~3 2 ~3running,~3 62 ~2sleeping,~3 0 ~2stopped,~3\n"
727 " %%Cpu(s):~3 76.5 ~2user,~3 11.2 ~2system,~3 0.0 ~2nice,~3 12.3 ~2idle~3\n"
728 " ~1 Nasty Message! ~4 -or- ~1Input Prompt~5\n"
729 " ~1 PID TTY PR NI %%CPU TIME+ VIRT SWAP S COMMAND ~6\n"
730 " 17284 ~8pts/2 ~7 8 0 0.0 0:00.75 1380 0 S /bin/bash ~8\n"
731 " ~1 8601 pts/1 7 -10 0.4 0:00.03 916 0 R color -b -z~7\n"
732 " 11005 ~8? ~7 9 0 0.0 0:02.50 2852 1008 S amor -sessi~8\n"
733 " available toggles: ~1B~2 =disable bold globally (~1%s~2),\n"
734 " ~1z~2 =color/mono (~1%s~2), ~1b~2 =tasks \"bold\"/reverse (~1%s~2)\n"
736 "1) Select a ~1target~2 as an upper case letter, ~1current target~2 is ~1 %c ~4:\n"
737 " S~2 = Summary Data,~1 M~2 = Messages/Prompts,\n"
738 " H~2 = Column Heads,~1 T~2 = Task Information\n"
739 "2) Select a ~1color~2 as a number or use the up/down arrow keys\n"
740 " to raise/lower the %d colors value, ~1current color~2 is ~1 %d ~4:\n"
741 " 0~2 = black,~1 1~2 = red, ~1 2~2 = green,~1 3~2 = yellow,\n"
742 " 4~2 = blue, ~1 5~2 = magenta,~1 6~2 = cyan, ~1 7~2 = white\n"
744 "3) Then use these keys when finished:\n"
745 " 'q' or <Esc> to abort changes to window '~1%s~2'\n"
746 " 'a' or 'w' to commit & change another, <Enter> to commit and end ");
748 /* Translation Hint: As is true for the text above, the "keys" shown to the left and
749 . also imbedded in the translatable text (along with escape seqs)
750 . should never themselves be translated. */
751 Uniq_nlstab[KEYS_helpext_fmt] = _(""
752 " d,k,r,^R '~1d~2' set delay; '~1k~2' kill; '~1r~2' renice; ~1Ctrl~2+'~1R~2' renice autogroup\n");
755 . This Fields Management header should be 3 lines long so as
756 . to allow 1 blank line before the fields & descriptions.
757 . If absoultely necessary, 4 lines could be used (but never more).
759 Uniq_nlstab[FIELD_header_fmt] = _(""
760 "Fields Management~2 for window ~1%s~6, whose current sort field is ~1%s~2\n"
761 " Navigate with Up/Dn, Right selects for move then <Enter> or Left commits,\n"
762 " 'd' or <Space> toggles display, 's' sets sort. Use 'q' or <Esc> to end!\n");
765 . The next 5 items must each be translated as a single line.
767 Uniq_nlstab[STATE_line_1_fmt] = _("%s:~3"
768 " %3u ~2total,~3 %3u ~2running,~3 %3u ~2sleeping,~3 %3u ~2stopped,~3 %3u ~2zombie~3\n");
770 /* Translation Hint: Only the following abbreviations need be translated
771 . us = user, sy = system, ni = nice, id = idle, wa = wait,
772 . hi hardware interrupt, si = software interrupt */
773 Uniq_nlstab[STATE_lin2x6_fmt] = _("%s~3"
774 " %#5.1f ~2us,~3 %#5.1f ~2sy,~3 %#5.1f ~2ni,~3 %#5.1f ~2id,~3 %#5.1f ~2wa,~3 %#5.1f ~2hi,~3 %#5.1f ~2si~3 ~1");
776 /* Translation Hint: Only the following abbreviations need be translated
777 . us = user, sy = system, ni = nice, id = idle, wa = wait,
778 . hi hardware interrupt, si = software interrupt, st = steal time */
779 Uniq_nlstab[STATE_lin2x7_fmt] = _("%s~3"
780 "%#5.1f ~2us,~3%#5.1f ~2sy,~3%#5.1f ~2ni,~3%#5.1f ~2id,~3%#5.1f ~2wa,~3%#5.1f ~2hi,~3%#5.1f ~2si,~3%#5.1f ~2st~3 ~1");
782 /* Translation Hint: next 2 must be treated together, with WORDS above & below aligned */
783 Uniq_nlstab[MEMORY_line1_fmt] = _(""
784 "%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used,~3 %9.9s~2buff/cache~3 ~1 ");
785 Uniq_nlstab[MEMORY_line2_fmt] = _(""
786 "%s %s:~3 %9.9s~2total,~3 %9.9s~2free,~3 %9.9s~2used.~3 %9.9s~2avail %s~3");
789 . The next 2 headers for 'Inspection' must each be 3 lines or less
791 Uniq_nlstab[YINSP_hdsels_fmt] = _(""
792 "Inspection~2 Pause at: pid ~1%d~6, running ~1%s~6\n"
793 "Use~2: left/right then <Enter> to ~1select~5 an option; 'q' or <Esc> to ~1end~5 !\n"
794 "Options~2: ~1%s\n");
796 Uniq_nlstab[YINSP_hdview_fmt] = _(""
797 "Inspection~2 View at pid: ~1%s~3, running ~1%s~3. Locating: ~1%s~6\n"
798 "Use~2: left/right/up/down/etc to ~1navigate~5 the output; 'L'/'&' to ~1locate~5/~1next~5.\n"
799 "Or~2: <Enter> to ~1select another~5; 'q' or <Esc> to ~1end~5 !\n");
804 * This function must be called very early at startup, before
805 * any other function call, and especially before any changes
806 * have been made to the terminal if NLS_VALIDATE is defined!
808 * The gettext documentation suggests that alone among locale
809 * variables LANGUAGE=ll_CC may be abbreviated as LANGUAGE=ll
810 * to denote the language's main dialect. Unfortunately this
811 * does not appear to be true. One must specify the complete
812 * ll_CC. Optionally, a '.UTF-8' or '.uft8' suffix, as shown
813 * in the following examples, may also be included:
814 * export LANGUAGE=ll_CC # minimal requirement
815 * export LANGUAGE=ll_CC.UTF-8 # optional convention
816 * export LANGUAGE=ll_CC.utf8 # ok, too
818 * Additionally, as suggested in the gettext documentation, a
819 * user will also have to export an empty LC_ALL= to actually
820 * enable any translations.
822 void initialize_nls (void) {
824 static const char *nls_err ="\t%s_nlstab[%d] == NULL\n";
827 setlocale (LC_ALL, "");
828 bindtextdomain(PACKAGE, LOCALEDIR);
831 memset(Head_nlstab, 0, sizeof(Head_nlstab));
832 memset(Desc_nlstab, 0, sizeof(Desc_nlstab));
834 for (i = 0; i < EU_MAXPFLGS; i++) {
835 if (!Head_nlstab[i]) {
836 fprintf(stderr, nls_err, "Head", i);
839 if (!Desc_nlstab[i]) {
840 fprintf(stderr, nls_err, "Desc", i);
844 memset(Norm_nlstab, 0, sizeof(Norm_nlstab));
846 for (i = 0; i < norm_MAX; i++)
847 if (!Norm_nlstab[i]) {
848 fprintf(stderr, nls_err, "Norm", i);
851 memset(Uniq_nlstab, 0, sizeof(Uniq_nlstab));
853 for (i = 0; i < uniq_MAX; i++)
854 if (!Uniq_nlstab[i]) {
855 fprintf(stderr, nls_err, "Uniq", i);
859 setlocale (LC_ALL, "");
860 bindtextdomain(PACKAGE, LOCALEDIR);