]>
git.ipfire.org Git - thirdparty/cups.git/blob - cups/localize.c
2 * "$Id: localize.c 6457 2007-04-17 18:40:55Z mike $"
4 * PPD custom option routines for the Common UNIX Printing System (CUPS).
6 * Copyright 1997-2007 by Easy Software Products, all rights reserved.
8 * These coded instructions, statements, and computer programs are the
9 * property of Easy Software Products and are protected by Federal
10 * copyright law. Distribution and use rights are outlined in the file
11 * "LICENSE.txt" which should have been included with this file. If this
12 * file is missing or damaged please contact Easy Software Products
15 * Attn: CUPS Licensing Information
16 * Easy Software Products
17 * 44141 Airport View Drive, Suite 204
18 * Hollywood, Maryland 20636 USA
20 * Voice: (301) 373-9600
21 * EMail: cups-info@cups.org
22 * WWW: http://www.cups.org
24 * PostScript is a trademark of Adobe Systems, Inc.
26 * This code and any derivative of it may be used and distributed
27 * freely under the terms of the GNU General Public License when
28 * used with GNU Ghostscript or its derivatives. Use of the code
29 * (or any derivative of it) with software other than GNU
30 * GhostScript (or its derivatives) is governed by the CUPS license
33 * This file is subject to the Apple OS-Developed Software exception.
37 * ppdLocalize() - Localize the PPD file to the current locale.
41 * Include necessary headers.
52 static const char *ppd_text(ppd_file_t
*ppd
, const char *keyword
,
53 const char *spec
, const char *ll_CC
,
58 * 'ppdLocalize()' - Localize the PPD file to the current locale.
63 int /* O - 0 on success, -1 on error */
64 ppdLocalize(ppd_file_t
*ppd
) /* I - PPD file */
66 int i
, j
, k
; /* Looping vars */
67 ppd_group_t
*group
; /* Current group */
68 ppd_option_t
*option
; /* Current option */
69 ppd_choice_t
*choice
; /* Current choice */
70 ppd_coption_t
*coption
; /* Current custom option */
71 ppd_cparam_t
*cparam
; /* Current custom parameter */
72 ppd_attr_t
*attr
; /* Current attribute */
73 cups_lang_t
*lang
; /* Current language */
74 char ckeyword
[PPD_MAX_NAME
], /* Custom keyword */
75 ll_CC
[6], /* Language + country locale */
76 ll
[3]; /* Language locale */
77 const char *text
; /* Localized text */
81 * Range check input...
84 DEBUG_printf(("ppdLocalize(ppd=%p)\n", ppd
));
90 * Get the default language...
93 if ((lang
= cupsLangDefault()) == NULL
)
96 strlcpy(ll_CC
, lang
->language
, sizeof(ll_CC
));
97 strlcpy(ll
, lang
->language
, sizeof(ll
));
99 if (strlen(ll_CC
) == 2)
102 * Map "ll" to primary/origin country locales to have the best
103 * chance of finding a match...
106 if (!strcmp(ll_CC
, "cs"))
107 strcpy(ll_CC
, "cs_CZ");
108 else if (!strcmp(ll_CC
, "en"))
109 strcpy(ll_CC
, "en_US");
110 else if (!strcmp(ll_CC
, "ja"))
111 strcpy(ll_CC
, "ja_JP");
112 else if (!strcmp(ll_CC
, "sv"))
113 strcpy(ll_CC
, "sv_SE");
114 else if (!strcmp(ll_CC
, "zh"))
115 strcpy(ll_CC
, "zh_CN"); /* Simplified Chinese */
119 ll_CC
[3] = toupper(ll_CC
[0] & 255);
120 ll_CC
[4] = toupper(ll_CC
[1] & 255);
125 DEBUG_printf((" lang->language=\"%s\", ll=\"%s\", ll_CC=\"%s\"...\n",
126 lang
->language
, ll
, ll_CC
));
129 * Now lookup all of the groups, options, choices, etc.
132 for (i
= ppd
->num_groups
, group
= ppd
->groups
; i
> 0; i
--, group
++)
134 if ((text
= ppd_text(ppd
, "Translation", group
->name
, ll_CC
, ll
)) != NULL
)
135 strlcpy(group
->text
, text
, sizeof(group
->text
));
137 for (j
= group
->num_options
, option
= group
->options
; j
> 0; j
--, option
++)
139 if ((text
= ppd_text(ppd
, "Translation", option
->keyword
, ll_CC
,
141 strlcpy(option
->text
, text
, sizeof(option
->text
));
143 for (k
= option
->num_choices
, choice
= option
->choices
;
147 if (strcmp(choice
->choice
, "Custom"))
148 text
= ppd_text(ppd
, option
->keyword
, choice
->choice
, ll_CC
, ll
);
151 snprintf(ckeyword
, sizeof(ckeyword
), "Custom%s", option
->keyword
);
153 text
= ppd_text(ppd
, ckeyword
, "True", ll_CC
, ll
);
157 strlcpy(choice
->text
, text
, sizeof(choice
->text
));
163 * Translate any custom parameters...
166 for (coption
= (ppd_coption_t
*)cupsArrayFirst(ppd
->coptions
);
168 coption
= (ppd_coption_t
*)cupsArrayNext(ppd
->coptions
))
170 for (cparam
= (ppd_cparam_t
*)cupsArrayFirst(coption
->params
);
172 cparam
= (ppd_cparam_t
*)cupsArrayNext(coption
->params
))
174 snprintf(ckeyword
, sizeof(ckeyword
), "ParamCustom%s", coption
->keyword
);
176 if ((text
= ppd_text(ppd
, ckeyword
, cparam
->name
, ll_CC
, ll
)) != NULL
)
177 strlcpy(cparam
->text
, text
, sizeof(cparam
->text
));
182 * Translate ICC profile names...
185 if ((attr
= ppdFindAttr(ppd
, "APCustomColorMatchingName", NULL
)) != NULL
)
187 if ((text
= ppd_text(ppd
, "APCustomColorMatchingName", attr
->spec
,
189 strlcpy(attr
->text
, text
, sizeof(attr
->text
));
192 for (attr
= ppdFindAttr(ppd
, "cupsICCProfile", NULL
);
194 attr
= ppdFindNextAttr(ppd
, "cupsICCProfile", NULL
))
196 cupsArraySave(ppd
->sorted_attrs
);
198 if ((text
= ppd_text(ppd
, "cupsICCProfile", attr
->spec
, ll_CC
, ll
)) != NULL
)
199 strlcpy(attr
->text
, text
, sizeof(attr
->text
));
201 cupsArrayRestore(ppd
->sorted_attrs
);
209 * 'ppd_text()' - Find the localized text as needed...
212 static const char * /* O - Localized text or NULL */
213 ppd_text(ppd_file_t
*ppd
, /* I - PPD file */
214 const char *keyword
, /* I - Main keyword */
215 const char *spec
, /* I - Option keyword */
216 const char *ll_CC
, /* I - Language + country locale */
217 const char *ll
) /* I - Language locale */
219 char lkeyword
[PPD_MAX_NAME
]; /* Localization keyword */
220 ppd_attr_t
*attr
; /* Current attribute */
223 DEBUG_printf(("ppd_text(ppd=%p, keyword=\"%s\", spec=\"%s\", "
224 "ll_CC=\"%s\", ll=\"%s\")\n",
225 ppd
, keyword
, spec
, ll_CC
, ll
));
228 * Look for Keyword.ll_CC, then Keyword.ll...
231 snprintf(lkeyword
, sizeof(lkeyword
), "%s.%s", ll_CC
, keyword
);
232 if ((attr
= ppdFindAttr(ppd
, lkeyword
, spec
)) == NULL
)
234 snprintf(lkeyword
, sizeof(lkeyword
), "%s.%s", ll
, keyword
);
235 attr
= ppdFindAttr(ppd
, lkeyword
, spec
);
237 if (!attr
&& !strcmp(ll
, "ja"))
240 * Due to a bug in the CUPS DDK 1.1.0 ppdmerge program, Japanese
241 * PPD files were incorrectly assigned "jp" as the locale name
242 * instead of "ja". Support both the old (incorrect) and new
243 * locale names for Japanese...
246 snprintf(lkeyword
, sizeof(lkeyword
), "jp.%s", keyword
);
247 attr
= ppdFindAttr(ppd
, lkeyword
, spec
);
253 printf(" *%s %s/%s: \"%s\"\n", attr
->name
, attr
->spec
, attr
->text
,
254 attr
->value
? attr
->value
: "");
260 * Return text if we find it...
263 return (attr
? attr
->text
: NULL
);
268 * End of "$Id: localize.c 6457 2007-04-17 18:40:55Z mike $".