From b9faaae17cfc7cd8dfd6e82cf607c05b2f4def68 Mon Sep 17 00:00:00 2001 From: msweet Date: Wed, 25 Feb 2009 23:37:25 +0000 Subject: [PATCH] Merge changes from CUPS 1.4svn-r8394. git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1253 a1ca3aef-8c08-0410-bb20-df032aa958be --- CHANGES-1.3.txt | 2 + CHANGES.txt | 14 +- backend/serial.c | 1 - backend/testbackend.c | 100 +- cgi-bin/ipp-var.c | 4 +- cgi-bin/var.c | 5 +- conf/cupsd.conf.in | 8 +- config-scripts/cups-common.m4 | 12 +- config.h.in | 4 +- cups/Dependencies | 27 +- cups/adminutil.c | 16 +- cups/cups.h | 2 + cups/file-private.h | 98 + cups/file.c | 68 +- cups/file.h | 1 + cups/localize.c | 3 +- cups/request.c | 14 +- cups/sidechannel.c | 4 +- cups/transcode.c | 1 - cups/util.c | 2 +- doc/Makefile | 2 +- doc/help/spec-ipp.html | 8 + doc/help/spec-ppd.html | 16 +- doc/pl/index.html.in | 107 + locale/cups_ja.po | 6478 +++++++++++++---- locale/cups_ko.po | 544 +- packaging/cups.list.in | 22 +- packaging/cups.spec.in | 6 + scheduler/Dependencies | 32 +- scheduler/cert.c | 22 +- scheduler/client.c | 359 +- scheduler/cups-deviced.c | 19 +- scheduler/cupsd.h | 8 +- scheduler/dirsvc.c | 4 +- scheduler/ipp.c | 159 +- scheduler/job.c | 5006 ++++++------- scheduler/job.h | 51 +- scheduler/main.c | 116 +- scheduler/printers.c | 142 +- scheduler/process.c | 116 +- scheduler/quotas.c | 14 +- scheduler/select.c | 107 +- scheduler/statbuf.c | 2 +- scheduler/subscriptions.c | 4 +- scheduler/util.h | 9 +- templates/pl/add-class.tmpl | 39 + templates/pl/add-printer.tmpl | 42 + templates/pl/add-rss-subscription.tmpl | 43 + templates/pl/admin.tmpl | 109 + templates/pl/choose-device.tmpl | 53 + templates/pl/choose-make.tmpl | 63 + templates/pl/choose-model.tmpl | 59 + templates/pl/choose-serial.tmpl | 51 + templates/pl/choose-uri.tmpl | 43 + templates/pl/class-added.tmpl | 8 + templates/pl/class-confirm.tmpl | 10 + templates/pl/class-deleted.tmpl | 7 + templates/pl/class-jobs-header.tmpl | 3 + templates/pl/class-modified.tmpl | 8 + templates/pl/class.tmpl | 41 + templates/pl/classes-header.tmpl | 1 + templates/pl/classes.tmpl | 11 + templates/pl/command.tmpl | 12 + templates/pl/edit-config.tmpl | 24 + templates/pl/error-op.tmpl | 9 + templates/pl/error.tmpl | 9 + templates/pl/header.tmpl.in | 29 + templates/pl/help-header.tmpl | 51 + templates/pl/help-printable.tmpl | 11 + templates/pl/help-trailer.tmpl | 1 + templates/pl/job-cancel.tmpl | 7 + templates/pl/job-hold.tmpl | 7 + templates/pl/job-move.tmpl | 26 + templates/pl/job-moved.tmpl | 8 + templates/pl/job-release.tmpl | 7 + templates/pl/job-restart.tmpl | 7 + templates/pl/jobs-header.tmpl | 5 + templates/pl/jobs.tmpl | 37 + templates/pl/list-available-printers.tmpl | 11 + templates/pl/modify-class.tmpl | 32 + templates/pl/modify-printer.tmpl | 37 + templates/pl/norestart.tmpl | 8 + templates/pl/option-boolean.tmpl | 6 + templates/pl/option-conflict.tmpl | 7 + templates/pl/option-header.tmpl | 5 + templates/pl/option-pickmany.tmpl | 6 + templates/pl/option-pickone.tmpl | 18 + templates/pl/option-trailer.tmpl | 5 + templates/pl/pager.tmpl | 6 + templates/pl/printer-accept.tmpl | 9 + templates/pl/printer-added.tmpl | 8 + templates/pl/printer-configured.tmpl | 8 + templates/pl/printer-confirm.tmpl | 10 + templates/pl/printer-default.tmpl | 13 + templates/pl/printer-deleted.tmpl | 7 + templates/pl/printer-jobs-header.tmpl | 3 + templates/pl/printer-modified.tmpl | 8 + templates/pl/printer-purge.tmpl | 9 + templates/pl/printer-reject.tmpl | 9 + templates/pl/printer-start.tmpl | 9 + templates/pl/printer-stop.tmpl | 9 + templates/pl/printer.tmpl | 45 + templates/pl/printers-header.tmpl | 1 + templates/pl/printers.tmpl | 11 + templates/pl/restart.tmpl | 8 + templates/pl/samba-export.tmpl | 54 + templates/pl/samba-exported.tmpl | 1 + templates/pl/search.tmpl | 10 + templates/pl/set-printer-options-header.tmpl | 25 + templates/pl/set-printer-options-trailer.tmpl | 16 + templates/pl/subscription-added.tmpl | 5 + templates/pl/subscription-canceled.tmpl | 5 + templates/pl/test-page.tmpl | 8 + templates/pl/trailer.tmpl | 8 + templates/pl/users.tmpl | 29 + test/5.5-lp.sh | 10 +- test/5.6-lpr.sh | 10 +- test/run-stp-tests.sh | 16 +- test/waitjobs.sh | 33 +- 119 files changed, 10330 insertions(+), 4788 deletions(-) create mode 100644 cups/file-private.h create mode 100644 doc/pl/index.html.in create mode 100644 templates/pl/add-class.tmpl create mode 100644 templates/pl/add-printer.tmpl create mode 100644 templates/pl/add-rss-subscription.tmpl create mode 100644 templates/pl/admin.tmpl create mode 100644 templates/pl/choose-device.tmpl create mode 100644 templates/pl/choose-make.tmpl create mode 100644 templates/pl/choose-model.tmpl create mode 100644 templates/pl/choose-serial.tmpl create mode 100644 templates/pl/choose-uri.tmpl create mode 100644 templates/pl/class-added.tmpl create mode 100644 templates/pl/class-confirm.tmpl create mode 100644 templates/pl/class-deleted.tmpl create mode 100644 templates/pl/class-jobs-header.tmpl create mode 100644 templates/pl/class-modified.tmpl create mode 100644 templates/pl/class.tmpl create mode 100644 templates/pl/classes-header.tmpl create mode 100644 templates/pl/classes.tmpl create mode 100644 templates/pl/command.tmpl create mode 100644 templates/pl/edit-config.tmpl create mode 100644 templates/pl/error-op.tmpl create mode 100644 templates/pl/error.tmpl create mode 100644 templates/pl/header.tmpl.in create mode 100644 templates/pl/help-header.tmpl create mode 100644 templates/pl/help-printable.tmpl create mode 100644 templates/pl/help-trailer.tmpl create mode 100644 templates/pl/job-cancel.tmpl create mode 100644 templates/pl/job-hold.tmpl create mode 100644 templates/pl/job-move.tmpl create mode 100644 templates/pl/job-moved.tmpl create mode 100644 templates/pl/job-release.tmpl create mode 100644 templates/pl/job-restart.tmpl create mode 100644 templates/pl/jobs-header.tmpl create mode 100644 templates/pl/jobs.tmpl create mode 100644 templates/pl/list-available-printers.tmpl create mode 100644 templates/pl/modify-class.tmpl create mode 100644 templates/pl/modify-printer.tmpl create mode 100644 templates/pl/norestart.tmpl create mode 100644 templates/pl/option-boolean.tmpl create mode 100644 templates/pl/option-conflict.tmpl create mode 100644 templates/pl/option-header.tmpl create mode 100644 templates/pl/option-pickmany.tmpl create mode 100644 templates/pl/option-pickone.tmpl create mode 100644 templates/pl/option-trailer.tmpl create mode 100644 templates/pl/pager.tmpl create mode 100644 templates/pl/printer-accept.tmpl create mode 100644 templates/pl/printer-added.tmpl create mode 100644 templates/pl/printer-configured.tmpl create mode 100644 templates/pl/printer-confirm.tmpl create mode 100644 templates/pl/printer-default.tmpl create mode 100644 templates/pl/printer-deleted.tmpl create mode 100644 templates/pl/printer-jobs-header.tmpl create mode 100644 templates/pl/printer-modified.tmpl create mode 100644 templates/pl/printer-purge.tmpl create mode 100644 templates/pl/printer-reject.tmpl create mode 100644 templates/pl/printer-start.tmpl create mode 100644 templates/pl/printer-stop.tmpl create mode 100644 templates/pl/printer.tmpl create mode 100644 templates/pl/printers-header.tmpl create mode 100644 templates/pl/printers.tmpl create mode 100644 templates/pl/restart.tmpl create mode 100644 templates/pl/samba-export.tmpl create mode 100644 templates/pl/samba-exported.tmpl create mode 100644 templates/pl/search.tmpl create mode 100644 templates/pl/set-printer-options-header.tmpl create mode 100644 templates/pl/set-printer-options-trailer.tmpl create mode 100644 templates/pl/subscription-added.tmpl create mode 100644 templates/pl/subscription-canceled.tmpl create mode 100644 templates/pl/test-page.tmpl create mode 100644 templates/pl/trailer.tmpl create mode 100644 templates/pl/users.tmpl diff --git a/CHANGES-1.3.txt b/CHANGES-1.3.txt index a61242939..8f4621f57 100644 --- a/CHANGES-1.3.txt +++ b/CHANGES-1.3.txt @@ -5,6 +5,8 @@ CHANGES IN CUPS V1.3.10 - Documentation fixes (STR #2994, STR #2995, STR #3008, STR #3056, STR #3057) + - Fixed a localization problem for option choices (incorrectly) named + "Custom" (STR #3106) - The fallback OpenSSL random number seeding would not work (STR #3079) - The scheduler might miss a child signal, causing high CPU usage. - The scheduler did not enforce quotas after the job history was diff --git a/CHANGES.txt b/CHANGES.txt index e91de63cc..c1cedc32f 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,17 @@ -CHANGES.txt - 2009-02-17 +CHANGES.txt - 2009-02-25 ------------------------ CHANGES IN CUPS V1.4b3 - Documentation fixes (STR #3044, STR #3057) - - Added complete localizations for Japanese and Russian and partial - localizations for Chinese, Danish, German, Finnish, French, Italian, - Korean, Norwegian, Polish, Portuguese, and Swedish (STR #3096, - STR #3098) + - The cups-deviced helper program could miss reporting some backend + devices (STR #3108) + - The cupsSideChannelSNMP* functions did not work. + - The scheduler could consume 100% CPU when jobs were canceled. + - Added complete localizations for Japanese, Polish, and Russian and + partial localizations for Chinese, Danish, German, Finnish, French, + Italian, Korean, Norwegian, Portuguese, and Swedish (STR #3096, + STR #3098, STR #3109, STR #3111) - Clicking on "Select Another Make/Manufacturer" in the web interface incorrectly added the printer (STR #3095) - The scheduler no longer uses programs with insecure file diff --git a/backend/serial.c b/backend/serial.c index c0f8fae50..81d92de8d 100644 --- a/backend/serial.c +++ b/backend/serial.c @@ -944,7 +944,6 @@ list_devices(void) # ifdef B115200 printf("serial serial:%s?baud=115200 \"Unknown\" \"%s\"\n", device, info); - device, i + 1); # else printf("serial serial:%s?baud=38400 \"Unknown\" \"%s\"\n", device, info); # endif /* B115200 */ diff --git a/backend/testbackend.c b/backend/testbackend.c index 363572a76..e0f573ccd 100644 --- a/backend/testbackend.c +++ b/backend/testbackend.c @@ -3,7 +3,7 @@ * * Backend test program for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2005 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -16,8 +16,9 @@ * * Contents: * - * main() - Run the named backend. - * usage() - Show usage information. + * main() - Run the named backend. + * usage() - Show usage information. + * walk_cb() - Show results of cupsSideChannelSNMPWalk... */ /* @@ -40,6 +41,8 @@ */ static void usage(void); +static void walk_cb(const char *oid, const char *data, int datalen, + void *context); /* @@ -57,7 +60,11 @@ main(int argc, /* I - Number of command-line args */ int first_arg, /* First argument for backend */ do_query = 0, /* Do PostScript query? */ do_side_tests = 0, /* Test side-channel ops? */ - do_trickle = 0; /* Trickle data to backend */ + do_trickle = 0, /* Trickle data to backend */ + do_walk = 0, /* Do OID lookup (0) or walking (1) */ + show_log = 0; /* Show log messages from backends? */ + const char *oid = ".1.3.6.1.2.1.43.10.2.1.4.1.1"; + /* OID to lookup or walk */ char scheme[255], /* Scheme in URI == backend */ backend[1024]; /* Backend path */ const char *serverbin; /* CUPS_SERVERBIN environment variable */ @@ -75,12 +82,29 @@ main(int argc, /* I - Number of command-line args */ for (first_arg = 1; argv[first_arg] && argv[first_arg][0] == '-'; first_arg ++) - if (!strcmp(argv[first_arg], "-ps")) + if (!strcmp(argv[first_arg], "-d")) + show_log = 1; + else if (!strcmp(argv[first_arg], "-ps")) do_query = 1; else if (!strcmp(argv[first_arg], "-s")) do_side_tests = 1; else if (!strcmp(argv[first_arg], "-t")) do_trickle = 1; + else if (!strcmp(argv[first_arg], "-get") && (first_arg + 1) < argc) + { + first_arg ++; + + do_side_tests = 1; + oid = argv[first_arg]; + } + else if (!strcmp(argv[first_arg], "-walk") && (first_arg + 1) < argc) + { + first_arg ++; + + do_side_tests = 1; + do_walk = 1; + oid = argv[first_arg]; + } else usage(); @@ -187,6 +211,7 @@ main(int argc, /* I - Number of command-line args */ static const char *ps_query = /* PostScript query file */ "%!\n" "save\n" + "product = flush\n" "currentpagedevice /PageSize get aload pop\n" "2 copy gt {exch} if\n" "(Unknown)\n" @@ -221,7 +246,7 @@ main(int argc, /* I - Number of command-line args */ write(1, ps_query, strlen(ps_query)); write(2, "DEBUG: START\n", 13); - while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 30.0)) > 0) + while ((bytes = cupsBackChannelRead(buffer, sizeof(buffer), 5.0)) > 0) write(2, buffer, bytes); write(2, "\nDEBUG: END\n", 12); } @@ -255,6 +280,12 @@ main(int argc, /* I - Number of command-line args */ close(data_fds[1]); } + if (!show_log) + { + close(2); + open("/dev/null", O_WRONLY); + } + close(3); dup(back_fds[1]); close(back_fds[0]); @@ -343,11 +374,31 @@ main(int argc, /* I - Number of command-line args */ printf("CUPS_SC_CMD_GET_STATE returned %s, %02X\n", statuses[scstatus], buffer[0] & 255); - length = sizeof(buffer); - scstatus = cupsSideChannelSNMPGet(".1.3.6.1.2.1.43.10.2.1.4.1.1", buffer, - &length, 5.0); - printf("CUPS_SC_CMD_SNMP_GET returned %s, %s\n", statuses[scstatus], - buffer); + if (do_walk) + { + /* + * Walk the OID tree... + */ + + scstatus = cupsSideChannelSNMPWalk(oid, 5.0, walk_cb, NULL); + printf("CUPS_SC_CMD_SNMP_WALK returned %s\n", statuses[scstatus]); + } + else + { + /* + * Lookup the same OID twice... + */ + + length = sizeof(buffer); + scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0); + printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid, + statuses[scstatus], buffer); + + length = sizeof(buffer); + scstatus = cupsSideChannelSNMPGet(oid, buffer, &length, 5.0); + printf("CUPS_SC_CMD_SNMP_GET %s returned %s, %s\n", oid, + statuses[scstatus], buffer); + } length = 0; scstatus = cupsSideChannelDoRequest(CUPS_SC_CMD_SOFT_RESET, buffer, @@ -380,12 +431,35 @@ main(int argc, /* I - Number of command-line args */ static void usage(void) { - fputs("Usage: testbackend [-ps] [-s] [-t] device-uri job-id user title copies " - "options [file]\n", stderr); + puts("Usage: testbackend [-d] [-ps] [-s [-oid OID] [-walk OID]] [-t] " + "device-uri job-id user title copies options [file]"); + puts(""); + puts("Options:"); + puts(" -d Show log messages from backend."); + puts(" -oid OID Lookup the specified SNMP OID."); + puts(" -ps Send PostScript query code to backend."); + puts(" -s Do SNMP tests."); + puts(" -t Send spaces slowly to backend ('trickle')."); + puts(" -walk OID Walk the specified SNMP OID."); + exit(1); } +/* + * 'walk_cb()' - Show results of cupsSideChannelSNMPWalk... + */ + +static void +walk_cb(const char *oid, /* I - OID */ + const char *data, /* I - Data */ + int datalen, /* I - Length of data */ + void *context) /* I - Context (unused) */ +{ + printf("CUPS_SC_CMD_SNMP_WALK %s=%s (%d bytes)\n", oid, data, datalen); +} + + /* * End of "$Id$". */ diff --git a/cgi-bin/ipp-var.c b/cgi-bin/ipp-var.c index fd1b5be1b..4048dd605 100644 --- a/cgi-bin/ipp-var.c +++ b/cgi-bin/ipp-var.c @@ -1406,8 +1406,8 @@ cgiShowJobs(http_t *http, /* I - Connection to server */ NULL, url); } else - ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "job-uri", NULL, - "ipp://localhost/jobs"); + ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri", NULL, + "ipp://localhost/"); if ((which_jobs = cgiGetVariable("which_jobs")) != NULL) ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_KEYWORD, "which-jobs", diff --git a/cgi-bin/var.c b/cgi-bin/var.c index 164144a27..6470fcbfd 100644 --- a/cgi-bin/var.c +++ b/cgi-bin/var.c @@ -3,7 +3,7 @@ * * CGI form variable and array functions. * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -148,9 +148,6 @@ cgiGetArray(const char *name, /* I - Name of array variable */ if ((var = cgi_find_variable(name)) == NULL) return (NULL); - if (var->nvalues == 1) - return (var->values[0]); - if (element < 0 || element >= var->nvalues) return (NULL); diff --git a/conf/cupsd.conf.in b/conf/cupsd.conf.in index 63ea89e76..adc0752cf 100644 --- a/conf/cupsd.conf.in +++ b/conf/cupsd.conf.in @@ -62,13 +62,13 @@ DefaultAuthType Basic # All printer operations require a printer operator to authenticate... AuthType Default - Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@ + Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow # Only the owner or an administrator can cancel or authenticate a job... - Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@ + Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow @@ -101,14 +101,14 @@ DefaultAuthType Basic # All printer operations require a printer operator to authenticate... AuthType Default - Require user @CUPS_DEFAULT_PRINTADMIN_AUTH@ + Require user @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow # Only the owner or an administrator can cancel or authenticate a job... AuthType Default - Require user @OWNER @CUPS_DEFAULT_PRINTADMIN_AUTH@ + Require user @OWNER @CUPS_DEFAULT_PRINTOPERATOR_AUTH@ Order deny,allow diff --git a/config-scripts/cups-common.m4 b/config-scripts/cups-common.m4 index ed68d9c3c..bd763894e 100644 --- a/config-scripts/cups-common.m4 +++ b/config-scripts/cups-common.m4 @@ -284,7 +284,7 @@ AC_SUBST(DBUS_NOTIFIER) AC_SUBST(DBUS_NOTIFIERLIBS) dnl Extra platform-specific libraries... -CUPS_DEFAULT_PRINTADMIN_AUTH="@SYSTEM" +CUPS_DEFAULT_PRINTOPERATOR_AUTH="@SYSTEM" CUPS_SYSTEM_AUTHKEY="" FONTS="fonts" LEGACY_BACKENDS="parallel scsi" @@ -334,11 +334,11 @@ case $uname in fi if test "x$default_operkey" != xdefault; then - CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY($default_operkey) @admin @lpadmin" elif grep -q system.print.operator /etc/authorization; then - CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.operator) @admin @lpadmin" else - CUPS_DEFAULT_PRINTADMIN_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin" + CUPS_DEFAULT_PRINTOPERATOR_AUTH="@AUTHKEY(system.print.admin) @admin @lpadmin" fi]) AC_CHECK_HEADER(Security/SecBasePriv.h,AC_DEFINE(HAVE_SECBASEPRIV_H)) @@ -347,8 +347,8 @@ case $uname in ;; esac -AC_SUBST(CUPS_DEFAULT_PRINTADMIN_AUTH) -AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTADMIN_AUTH, "$CUPS_DEFAULT_PRINTADMIN_AUTH") +AC_SUBST(CUPS_DEFAULT_PRINTOPERATOR_AUTH) +AC_DEFINE_UNQUOTED(CUPS_DEFAULT_PRINTOPERATOR_AUTH, "$CUPS_DEFAULT_PRINTOPERATOR_AUTH") AC_SUBST(CUPS_SYSTEM_AUTHKEY) AC_SUBST(FONTS) AC_SUBST(LEGACY_BACKENDS) diff --git a/config.h.in b/config.h.in index b9b4390a1..f577eb285 100644 --- a/config.h.in +++ b/config.h.in @@ -3,7 +3,7 @@ * * Configuration file for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -31,7 +31,7 @@ #define CUPS_DEFAULT_USER "lp" #define CUPS_DEFAULT_GROUP "sys" #define CUPS_DEFAULT_SYSTEM_GROUPS "sys root system" -#define CUPS_DEFAULT_PRINTADMIN_AUTH "@SYSTEM" +#define CUPS_DEFAULT_PRINTOPERATOR_AUTH "@SYSTEM" /* diff --git a/cups/Dependencies b/cups/Dependencies index 8b8c25c8b..ff0ac495c 100644 --- a/cups/Dependencies +++ b/cups/Dependencies @@ -29,9 +29,9 @@ dir.o: dir.h versioning.h string.h ../config.h debug.h emit.o: ppd.h array.h versioning.h file.h string.h ../config.h debug.h encode.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h encode.o: ipp-private.h string.h ../config.h debug.h -file.o: http-private.h ../config.h http.h versioning.h md5.h ipp-private.h -file.o: ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h -file.o: i18n.h transcode.h debug.h +file.o: file-private.h http-private.h ../config.h http.h versioning.h md5.h +file.o: ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h +file.o: language.h i18n.h transcode.h debug.h getdevices.o: globals.h string.h ../config.h http-private.h http.h getdevices.o: versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h getdevices.o: file.h language.h i18n.h transcode.h debug.h @@ -80,7 +80,7 @@ notify.o: md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h language.h notify.o: i18n.h transcode.h options.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h options.o: string.h ../config.h debug.h -page.o: ppd.h array.h versioning.h file.h string.h ../config.h +page.o: ppd.h array.h versioning.h file.h string.h ../config.h debug.h ppd.o: ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h ppd.o: language.h globals.h string.h ../config.h http-private.h md5.h ppd.o: ipp-private.h i18n.h transcode.h debug.h @@ -115,6 +115,7 @@ testarray.o: debug.h testconflicts.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h testconflicts.o: language.h string.h ../config.h testcups.o: cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h +testcups.o: string.h ../config.h testfile.o: string.h ../config.h file.h versioning.h debug.h testhttp.o: http-private.h ../config.h http.h versioning.h md5.h testhttp.o: ipp-private.h ipp.h string.h @@ -160,9 +161,9 @@ dir.32.o: dir.c dir.h versioning.h string.h ../config.h debug.h emit.32.o: emit.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h encode.32.o: encode.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h encode.32.o: encode.c ipp-private.h string.h ../config.h debug.h -file.32.o: file.c http-private.h ../config.h http.h versioning.h md5.h ipp-private.h -file.32.o: file.c ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h -file.32.o: file.c i18n.h transcode.h debug.h +file.32.o: file.c file-private.h http-private.h ../config.h http.h versioning.h md5.h +file.32.o: file.c ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h +file.32.o: file.c language.h i18n.h transcode.h debug.h getdevices.32.o: getdevices.c globals.h string.h ../config.h http-private.h http.h getdevices.32.o: getdevices.c versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h getdevices.32.o: getdevices.c file.h language.h i18n.h transcode.h debug.h @@ -211,7 +212,7 @@ notify.32.o: notify.c md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h lan notify.32.o: notify.c i18n.h transcode.h options.32.o: options.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h options.32.o: options.c string.h ../config.h debug.h -page.32.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h +page.32.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h ppd.32.o: ppd.c ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h ppd.32.o: ppd.c language.h globals.h string.h ../config.h http-private.h md5.h ppd.32.o: ppd.c ipp-private.h i18n.h transcode.h debug.h @@ -246,6 +247,7 @@ testarray.32.o: testarray.c debug.h testconflicts.32.o: testconflicts.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h testconflicts.32.o: testconflicts.c language.h string.h ../config.h testcups.32.o: testcups.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h +testcups.32.o: testcups.c string.h ../config.h testfile.32.o: testfile.c string.h ../config.h file.h versioning.h debug.h testhttp.32.o: testhttp.c http-private.h ../config.h http.h versioning.h md5.h testhttp.32.o: testhttp.c ipp-private.h ipp.h string.h @@ -291,9 +293,9 @@ dir.64.o: dir.c dir.h versioning.h string.h ../config.h debug.h emit.64.o: emit.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h encode.64.o: encode.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h encode.64.o: encode.c ipp-private.h string.h ../config.h debug.h -file.64.o: file.c http-private.h ../config.h http.h versioning.h md5.h ipp-private.h -file.64.o: file.c ipp.h globals.h string.h cups.h ppd.h array.h file.h language.h -file.64.o: file.c i18n.h transcode.h debug.h +file.64.o: file.c file-private.h http-private.h ../config.h http.h versioning.h md5.h +file.64.o: file.c ipp-private.h ipp.h globals.h string.h cups.h ppd.h array.h file.h +file.64.o: file.c language.h i18n.h transcode.h debug.h getdevices.64.o: getdevices.c globals.h string.h ../config.h http-private.h http.h getdevices.64.o: getdevices.c versioning.h md5.h ipp-private.h ipp.h cups.h ppd.h array.h getdevices.64.o: getdevices.c file.h language.h i18n.h transcode.h debug.h @@ -342,7 +344,7 @@ notify.64.o: notify.c md5.h ipp-private.h ipp.h cups.h ppd.h array.h file.h lan notify.64.o: notify.c i18n.h transcode.h options.64.o: options.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h options.64.o: options.c string.h ../config.h debug.h -page.64.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h +page.64.o: page.c ppd.h array.h versioning.h file.h string.h ../config.h debug.h ppd.64.o: ppd.c ppd-private.h cups.h ipp.h http.h versioning.h ppd.h array.h file.h ppd.64.o: ppd.c language.h globals.h string.h ../config.h http-private.h md5.h ppd.64.o: ppd.c ipp-private.h i18n.h transcode.h debug.h @@ -377,6 +379,7 @@ testarray.64.o: testarray.c debug.h testconflicts.64.o: testconflicts.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h testconflicts.64.o: testconflicts.c language.h string.h ../config.h testcups.64.o: testcups.c cups.h ipp.h http.h versioning.h ppd.h array.h file.h language.h +testcups.64.o: testcups.c string.h ../config.h testfile.64.o: testfile.c string.h ../config.h file.h versioning.h debug.h testhttp.64.o: testhttp.c http-private.h ../config.h http.h versioning.h md5.h testhttp.64.o: testhttp.c ipp-private.h ipp.h string.h diff --git a/cups/adminutil.c b/cups/adminutil.c index 8ef12ad5b..318fb730e 100644 --- a/cups/adminutil.c +++ b/cups/adminutil.c @@ -4,7 +4,7 @@ * Administration utility API definitions for the Common UNIX Printing * System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 2001-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -1133,7 +1133,13 @@ _cupsAdminGetServerSettings( else if (!strcasecmp(value, "all")) remote_any = 1; } - else if (line[0] != '<' && !in_location && !in_policy) + else if (line[0] != '<' && !in_location && !in_policy && + strcasecmp(line, "Allow") && + strcasecmp(line, "AuthType") && + strcasecmp(line, "Deny") && + strcasecmp(line, "Order") && + strcasecmp(line, "Require") && + strcasecmp(line, "Satisfy")) cg->cupsd_num_settings = cupsAddOption(line, value, cg->cupsd_num_settings, &(cg->cupsd_settings)); @@ -1643,7 +1649,7 @@ _cupsAdminSetServerSettings( " \n" " Order deny,allow\n" " Require user @OWNER " - CUPS_DEFAULT_PRINTADMIN_AUTH "\n" + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); } @@ -1790,7 +1796,7 @@ _cupsAdminSetServerSettings( " \n" " Order deny,allow\n" " Require user @OWNER " - CUPS_DEFAULT_PRINTADMIN_AUTH "\n" + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); in_cancel_job = 0; @@ -2015,7 +2021,7 @@ _cupsAdminSetServerSettings( " \n" " Order deny,allow\n" " Require user @OWNER " - CUPS_DEFAULT_PRINTADMIN_AUTH "\n" + CUPS_DEFAULT_PRINTOPERATOR_AUTH "\n" " \n"); cupsFilePuts(temp, " \n" diff --git a/cups/cups.h b/cups/cups.h index 153ceb499..8742cf29d 100644 --- a/cups/cups.h +++ b/cups/cups.h @@ -117,6 +117,8 @@ enum cups_ptype_e /**** Printer type/capability bit constants ****/ CUPS_PRINTER_AUTHENTICATED = 0x400000,/* Printer requires authentication @since CUPS 1.2/Mac OS X 10.5@ */ CUPS_PRINTER_COMMANDS = 0x800000, /* Printer supports maintenance commands @since CUPS 1.2/Mac OS X 10.5@ */ CUPS_PRINTER_DISCOVERED = 0x1000000, /* Printer was automatically discovered and added @since CUPS 1.3/Mac OS X 10.5@ */ + CUPS_PRINTER_SCANNER = 0x2000000, /* Scanner-only device @since CUPS 1.4@ */ + CUPS_PRINTER_MFP = 0x4000000, /* Printer with scanning capabilities @since CUPS 1.4@ */ CUPS_PRINTER_OPTIONS = 0x6fffc /* ~(CLASS | REMOTE | IMPLICIT | DEFAULT | FAX | REJECTING | DELETE | NOT_SHARED | AUTHENTICATED | COMMANDS | DISCOVERED) @private@ */ }; diff --git a/cups/file-private.h b/cups/file-private.h new file mode 100644 index 000000000..978428d39 --- /dev/null +++ b/cups/file-private.h @@ -0,0 +1,98 @@ +/* + * "$Id$" + * + * Private file definitions for the Common UNIX Printing System (CUPS). + * + * Since stdio files max out at 256 files on many systems, we have to + * write similar functions without this limit. At the same time, using + * our own file functions allows us to provide transparent support of + * gzip'd print files, PPD files, etc. + * + * Copyright 2007-2009 by Apple Inc. + * Copyright 1997-2007 by Easy Software Products, all rights reserved. + * + * These coded instructions, statements, and computer programs are the + * property of Apple Inc. and are protected by Federal copyright + * law. Distribution and use rights are outlined in the file "LICENSE.txt" + * which should have been included with this file. If this file is + * file is missing or damaged, see the license at "http://www.cups.org/". + */ + +#ifndef _CUPS_FILE_PRIVATE_H_ +# define _CUPS_FILE_PRIVATE_H_ + +/* + * Include necessary headers... + */ + +# include +# include +# include +# include +# include +# include "http-private.h" +# include "globals.h" +# include "debug.h" + +# ifdef HAVE_LIBZ +# include +# endif /* HAVE_LIBZ */ +# ifdef WIN32 +# include +# include +# endif /* WIN32 */ + + +/* + * Some operating systems support large files via open flag O_LARGEFILE... + */ + +# ifndef O_LARGEFILE +# define O_LARGEFILE 0 +# endif /* !O_LARGEFILE */ + + +/* + * Some operating systems don't define O_BINARY, which is used by Microsoft + * and IBM to flag binary files... + */ + +# ifndef O_BINARY +# define O_BINARY 0 +# endif /* !O_BINARY */ + + +/* + * Types and structures... + */ + +struct _cups_file_s /**** CUPS file structure... ****/ + +{ + int fd; /* File descriptor */ + char mode, /* Mode ('r' or 'w') */ + compressed, /* Compression used? */ + is_stdio, /* stdin/out/err? */ + eof, /* End of file? */ + buf[4096], /* Buffer */ + *ptr, /* Pointer into buffer */ + *end; /* End of buffer data */ + off_t pos, /* Position in file */ + bufpos; /* File position for start of buffer */ + +#ifdef HAVE_LIBZ + z_stream stream; /* (De)compression stream */ + Bytef cbuf[4096]; /* (De)compression buffer */ + uLong crc; /* (De)compression CRC */ +#endif /* HAVE_LIBZ */ + + char *printf_buffer; /* cupsFilePrintf buffer */ + size_t printf_size; /* Size of cupsFilePrintf buffer */ +}; + + +#endif /* !_CUPS_FILE_PRIVATE_H_ */ + +/* + * End of "$Id$". + */ diff --git a/cups/file.c b/cups/file.c index 722a8323b..ed54f22fc 100644 --- a/cups/file.c +++ b/cups/file.c @@ -8,7 +8,7 @@ * our own file functions allows us to provide transparent support of * gzip'd print files, PPD files, etc. * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -58,71 +58,7 @@ * Include necessary headers... */ -#include -#include -#include -#include -#include -#include -#include "http-private.h" -#include "globals.h" -#include "debug.h" - -#ifdef HAVE_LIBZ -# include -#endif /* HAVE_LIBZ */ -#ifdef WIN32 -# include -# include -#endif /* WIN32 */ - - -/* - * Some operating systems support large files via open flag O_LARGEFILE... - */ - -#ifndef O_LARGEFILE -# define O_LARGEFILE 0 -#endif /* !O_LARGEFILE */ - - -/* - * Some operating systems don't define O_BINARY, which is used by Microsoft - * and IBM to flag binary files... - */ - -#ifndef O_BINARY -# define O_BINARY 0 -#endif /* !O_BINARY */ - - -/* - * Types and structures... - */ - -struct _cups_file_s /**** CUPS file structure... ****/ - -{ - int fd; /* File descriptor */ - char mode, /* Mode ('r' or 'w') */ - compressed, /* Compression used? */ - is_stdio, /* stdin/out/err? */ - eof, /* End of file? */ - buf[4096], /* Buffer */ - *ptr, /* Pointer into buffer */ - *end; /* End of buffer data */ - off_t pos, /* Position in file */ - bufpos; /* File position for start of buffer */ - -#ifdef HAVE_LIBZ - z_stream stream; /* (De)compression stream */ - Bytef cbuf[4096]; /* (De)compression buffer */ - uLong crc; /* (De)compression CRC */ -#endif /* HAVE_LIBZ */ - - char *printf_buffer; /* cupsFilePrintf buffer */ - size_t printf_size; /* Size of cupsFilePrintf buffer */ -}; +#include "file-private.h" /* diff --git a/cups/file.h b/cups/file.h index c8a2b4667..c5eb357fa 100644 --- a/cups/file.h +++ b/cups/file.h @@ -91,6 +91,7 @@ extern ssize_t cupsFilePutConf(cups_file_t *fp, const char *directive, const char *value) _CUPS_API_1_4; extern int cupsFilePuts(cups_file_t *fp, const char *s) _CUPS_API_1_2; extern ssize_t cupsFileRead(cups_file_t *fp, char *buf, size_t bytes) _CUPS_API_1_2; +extern ssize_t cupsFileReady(cups_file_t *fp) _CUPS_API_1_4; extern off_t cupsFileRewind(cups_file_t *fp) _CUPS_API_1_2; extern off_t cupsFileSeek(cups_file_t *fp, off_t pos) _CUPS_API_1_2; extern cups_file_t *cupsFileStderr(void) _CUPS_API_1_2; diff --git a/cups/localize.c b/cups/localize.c index 19a03e26c..236b8048e 100644 --- a/cups/localize.c +++ b/cups/localize.c @@ -115,7 +115,8 @@ ppdLocalize(ppd_file_t *ppd) /* I - PPD file */ k > 0; k --, choice ++) { - if (strcmp(choice->choice, "Custom")) + if (strcmp(choice->choice, "Custom") || + !ppdFindCustomOption(ppd, option->keyword)) locattr = _ppdLocalizedAttr(ppd, option->keyword, choice->choice, ll_CC); else diff --git a/cups/request.c b/cups/request.c index 21387fdee..2af5c2efd 100644 --- a/cups/request.c +++ b/cups/request.c @@ -206,6 +206,13 @@ cupsDoIORequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP DEBUG_printf(("cupsDoIORequest: Request length=%ld, total length=%ld", (long)ippLength(request), (long)length)); + /* + * Clear any "Local" authentication data since it is probably stale... + */ + + if (http->authstring && !strncmp(http->authstring, "Local ", 6)) + httpSetAuthString(http, NULL, NULL); + /* * Loop until we can send the request without authorization problems. */ @@ -591,13 +598,6 @@ cupsSendRequest(http_t *http, /* I - Connection to server or @code CUPS_HTTP return (HTTP_SERVICE_UNAVAILABLE); } - /* - * Clear any "Local" authentication data since it is probably stale... - */ - - if (http->authstring && !strncmp(http->authstring, "Local ", 6)) - httpSetAuthString(http, NULL, NULL); - /* * Loop until we can send the request without authorization problems. */ diff --git a/cups/sidechannel.c b/cups/sidechannel.c index 585d6cbc7..a59f5c305 100644 --- a/cups/sidechannel.c +++ b/cups/sidechannel.c @@ -301,7 +301,7 @@ cupsSideChannelSNMPGet( */ if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET, CUPS_SC_STATUS_NONE, oid, - (int)strlen(oid), timeout)) + (int)strlen(oid) + 1, timeout)) return (CUPS_SC_STATUS_TIMEOUT); real_datalen = sizeof(real_data); @@ -401,7 +401,7 @@ cupsSideChannelSNMPWalk( */ if (cupsSideChannelWrite(CUPS_SC_CMD_SNMP_GET_NEXT, CUPS_SC_STATUS_NONE, - current_oid, (int)strlen(current_oid), timeout)) + current_oid, (int)strlen(current_oid) + 1, timeout)) return (CUPS_SC_STATUS_TIMEOUT); real_datalen = sizeof(real_data); diff --git a/cups/transcode.c b/cups/transcode.c index b0382e14a..c04f0a71d 100644 --- a/cups/transcode.c +++ b/cups/transcode.c @@ -1664,7 +1664,6 @@ get_vbcs_charmap( * Save DBCS/VBCS charset map into memory for transcoding... */ - leadchar = 0; wide2uni = NULL; cupsFileRewind(fp); diff --git a/cups/util.c b/cups/util.c index 57340e6a9..1a6dd50a3 100644 --- a/cups/util.c +++ b/cups/util.c @@ -616,7 +616,7 @@ cupsGetJobs2(http_t *http, /* I - Connection to server or @code CUPS_HTTP_D } } else - strcpy(uri, "ipp://localhost/jobs"); + strcpy(uri, "ipp://localhost/"); if (!http) if ((http = _cupsConnect()) == NULL) diff --git a/doc/Makefile b/doc/Makefile index 0c894afaa..2be1141c9 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -185,7 +185,7 @@ install-languages: if test -d $$lang; then \ $(INSTALL_DIR) -m 755 $(DOCDIR)/$$lang; \ $(INSTALL_MAN) $$lang/index.html $(DOCDIR)/$$lang; \ - $(INSTALL_MAN) $$lang/cups.css $(DOCDIR)/$$lang 2>/dev/null || true; \ + test -f $$lang/cups.css && $(INSTALL_MAN) $$lang/cups.css $(DOCDIR)/$$lang; \ fi; \ done diff --git a/doc/help/spec-ipp.html b/doc/help/spec-ipp.html index 1949551c8..7f3bab908 100644 --- a/doc/help/spec-ipp.html +++ b/doc/help/spec-ipp.html @@ -2788,6 +2788,14 @@ summary='Printer Type Bits'> 0x01000000 Queue was automatically discovered and added. + + 0x02000000 + Queue is a scanner with no printing capabilities. + + + 0x04000000 + Queue is a printer with scanning capabilities. + diff --git a/doc/help/spec-ppd.html b/doc/help/spec-ppd.html index 1fc056013..11ff4a4cf 100644 --- a/doc/help/spec-ppd.html +++ b/doc/help/spec-ppd.html @@ -12,7 +12,7 @@ CUPS PPD extensions specification for the Common UNIX Printing System (CUPS). - Copyright 2007-2008 by Apple Inc. + Copyright 2007-2009 by Apple Inc. Copyright 1997-2007 by Easy Software Products. These coded instructions, statements, and computer programs are the @@ -1801,6 +1801,20 @@ information.

*APPrinterPrinterUtilityPath: "/Library/Printers/vendor/Tools/utility.app" +

Mac OS X 10.6APScannerOnly

+ +

*APScannerOnly: boolean

+ +

This attribute specifies whether the device has scanning but no printing +capabilities. The default is False.

+ +

Examples:

+ +
+*APICADriver: True
+*APScannerOnly: True
+
+

Mac OS X 10.3APScanAppBundleID

*APScanAppBundleID: "bundle ID"

diff --git a/doc/pl/index.html.in b/doc/pl/index.html.in new file mode 100644 index 000000000..5cb99e8dd --- /dev/null +++ b/doc/pl/index.html.in @@ -0,0 +1,107 @@ + + + + + Strona domowa - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + + + + + + +
+ + + + + + + + + + + + +
  Strona domowa    Administracja    Klasy    Pomoc online    Zadania    Drukowanie  
+ + + + + +
+ +

Wspólny uniksowy system drukowania @CUPS_VERSION@

+ +

CUPS jest opartym na standardach systemem drukowania na licencji open source, tworzonym przez +Apple Inc. dla Mac OS® X i +innych systemów operacyjnych podobnych do Uniksa®.

+ +
CUPS
+ + + +
+ +

CUPS dla użytkowników

+ +

Przegląd CUPS

+ +

Drukowanie i opcje w wierszu poleceń

+ +

Co nowego w CUPS 1.4

+ +

Forum użytkowników

+ +
+ +

CUPS dla administratorów

+ +

Dodawanie drukarek i klas

+ +

Zarządzanie politykami operacji

+ +

Podstawy kont drukowania

+ +

Bezpieczeństwo systemu

+ +

Używanie uwierzytelniania Kerberosa

+ +

Używanie drukarek sieciowych

+ +

Informacje o cupsd.conf

+ +

Wyszukiwanie sterowników drukarek

+ +
+ +

CUPS dla programistów

+ +

Wprowadzenie do programowania CUPS

+ +

API CUPS

+ +

Programowanie filtrów i modułów przetwarzających

+ +

API HTTP i IPP

+ +

API PPD

+ +

API rastrowe

+ +

Informacje o kompilatorze plików informacji o sterownikach PPD

+ +

Forum programistów

+ +
+ +
 
Wspólny uniksowy system drukowania, CUPS i logo CUPS +są znakami handlowymi Apple Inc. CUPS +copyright 2007-2009 Apple Inc. Wszystkie prawa zastrzeżone.
+ + diff --git a/locale/cups_ja.po b/locale/cups_ja.po index fc7d4844d..556471b94 100644 --- a/locale/cups_ja.po +++ b/locale/cups_ja.po @@ -1,2877 +1,6923 @@ +# +# "$Id$" +# +# Message catalog template for the Common UNIX Printing System (CUPS). +# +# Copyright 2007-2008 by Apple Inc. +# Copyright 2005-2007 by Easy Software Products. +# +# These coded instructions, statements, and computer programs are the +# property of Apple Inc. and are protected by Federal copyright +# law. Distribution and use rights are outlined in the file "LICENSE.txt" +# which should have been included with this file. If this file is +# file is missing or damaged, see the license at "http://www.cups.org/". +# + +# +# Notes for Translators: +# +# The following prefixes MUST NOT be translated: "ALERT:", "CRIT:", "INFO:", +# "NOTICE:", and "WARNING:". +# +# The "checkpo" program located in the "locale" source directory can be used +# to verify that your translations do not introduce formatting errors or other +# problems. Run with: +# +# cd locale +# ./checkpo cups_LL.po +# +# where "LL" is your locale. +# msgid "" msgstr "" "Project-Id-Version: CUPS 1.4\n" "Report-Msgid-Bugs-To: http://www.cups.org/str.php\n" "POT-Creation-Date: 2009-01-30 09:28-0800\n" -"PO-Revision-Date: 2009-02-16 12:00-0800\n" -"Last-Translator: Apple Inc.\n" -"Language-Team: Apple Inc.\n" +"PO-Revision-Date: 2009-02-20 16:43+0900\n" +"Last-Translator: OPFC TRANSCUPS \n" +"Language-Team: OPFC TRANSCUPS \n" "MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" +"Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" + +#: systemv/lpstat.c:1848 systemv/lpstat.c:1961 msgid "\t\t(all)\n" -msgstr "\t\t(すべて)\n" +msgstr "\t\t(すべて)\n" + +#: systemv/lpstat.c:1851 systemv/lpstat.c:1854 systemv/lpstat.c:1964 +#: systemv/lpstat.c:1967 msgid "\t\t(none)\n" -msgstr "\t\t(なし)\n" +msgstr "\t\t(なし)\n" + +#: berkeley/lpc.c:438 +#, c-format msgid "\t%d entries\n" -msgstr "\t%d エントリ\n" +msgstr "\t%d エントリー\n" + +#: systemv/lpstat.c:1829 systemv/lpstat.c:1942 msgid "\tAfter fault: continue\n" -msgstr "\t失敗後:継続\n" +msgstr "\t失敗後: 継続\n" + +#: systemv/lpstat.c:1461 systemv/lpstat.c:1795 systemv/lpstat.c:1908 msgid "\tAlerts:" -msgstr "\tアラート:" +msgstr "\t警告:" + +#: systemv/lpstat.c:1852 systemv/lpstat.c:1965 msgid "\tBanner required\n" msgstr "\tバナーが必要\n" + +#: systemv/lpstat.c:1853 systemv/lpstat.c:1966 msgid "\tCharset sets:\n" -msgstr "\t文字セット:\n" +msgstr "\t文字セット:\n" + +#: systemv/lpstat.c:1818 systemv/lpstat.c:1931 msgid "\tConnection: direct\n" -msgstr "\t接続:直結\n" +msgstr "\t接続: 直結\n" + +#: systemv/lpstat.c:1809 systemv/lpstat.c:1922 msgid "\tConnection: remote\n" -msgstr "\t接続:リモート\n" +msgstr "\t接続: リモート\n" + +#: systemv/lpstat.c:1856 systemv/lpstat.c:1969 msgid "\tDefault page size:\n" -msgstr "\tデフォルト用紙サイズ:\n" +msgstr "\tデフォルト用紙サイズ:\n" + +#: systemv/lpstat.c:1855 systemv/lpstat.c:1968 msgid "\tDefault pitch:\n" -msgstr "\tデフォルトピッチ:\n" +msgstr "\tデフォルトピッチ:\n" + +#: systemv/lpstat.c:1857 systemv/lpstat.c:1970 msgid "\tDefault port settings:\n" -msgstr "\tデフォルトポート設定:\n" +msgstr "\tデフォルトポート設定:\n" + +#: systemv/lpstat.c:1790 systemv/lpstat.c:1903 +#, c-format msgid "\tDescription: %s\n" -msgstr "\t説明:%s\n" -msgid "\tForm mounted:\n\tContent types: any\n\tPrinter types: unknown\n" -msgstr "\t用紙台:\n\t内容形式:すべて\n\tプリンタ形式:未知\n" +msgstr "\t説明: %s\n" + +#: systemv/lpstat.c:1784 systemv/lpstat.c:1897 +msgid "" +"\tForm mounted:\n" +"\tContent types: any\n" +"\tPrinter types: unknown\n" +msgstr "" +"\t設定されたフォーム:\n" +"\tコンテンツの種類: すべて\n" +"\tプリンターの種類: 不明\n" + +#: systemv/lpstat.c:1850 systemv/lpstat.c:1963 msgid "\tForms allowed:\n" -msgstr "\t許可されている用紙:\n" +msgstr "\t許可されているフォーム:\n" + +#: systemv/lpstat.c:1813 systemv/lpstat.c:1926 +#, c-format msgid "\tInterface: %s.ppd\n" -msgstr "\tインターフェイス:%s.ppd\n" +msgstr "\tインターフェイス: %s.ppd\n" + +#: systemv/lpstat.c:1822 systemv/lpstat.c:1935 +#, c-format msgid "\tInterface: %s/interfaces/%s\n" -msgstr "\tインターフェイス:%s/interfaces/%s\n" +msgstr "\tインターフェイス: %s/interfaces/%s\n" + +#: systemv/lpstat.c:1826 systemv/lpstat.c:1939 +#, c-format msgid "\tInterface: %s/ppd/%s.ppd\n" -msgstr "\tインターフェイス:%s/ppd/%s.ppd\n" +msgstr "\tインターフェイス: %s/ppd/%s.ppd\n" + +#: systemv/lpstat.c:1804 systemv/lpstat.c:1917 +#, c-format msgid "\tLocation: %s\n" -msgstr "\t場所:%s\n" +msgstr "\t場所: %s\n" + +#: systemv/lpstat.c:1828 systemv/lpstat.c:1941 msgid "\tOn fault: no alert\n" -msgstr "\t失敗時:警告なし\n" +msgstr "\t失敗時: 警告なし\n" + +#: systemv/lpstat.c:1833 systemv/lpstat.c:1847 systemv/lpstat.c:1946 +#: systemv/lpstat.c:1960 msgid "\tUsers allowed:\n" -msgstr "\t許可されているユーザ:\n" +msgstr "\t許可されているユーザー:\n" + +#: systemv/lpstat.c:1840 systemv/lpstat.c:1953 msgid "\tUsers denied:\n" -msgstr "\t拒否されているユーザ:\n" +msgstr "\t拒否されているユーザー:\n" + +#: berkeley/lpc.c:440 msgid "\tdaemon present\n" msgstr "\tデーモンは提供されています\n" + +#: berkeley/lpc.c:436 msgid "\tno entries\n" -msgstr "\tエントリがありません\n" +msgstr "\tエントリーがありません\n" + +#: berkeley/lpc.c:408 berkeley/lpc.c:420 +#, c-format msgid "\tprinter is on device '%s' speed -1\n" -msgstr "\tプリンタはデバイス '%s'上。速度 -1\n" +msgstr "\tデバイス '%s' 上のプリンター 速度 -1\n" + +#: berkeley/lpc.c:433 msgid "\tprinting is disabled\n" msgstr "\t印刷は無効です\n" + +#: berkeley/lpc.c:431 msgid "\tprinting is enabled\n" msgstr "\t印刷は有効です\n" + +#: systemv/lpstat.c:1467 +#, c-format msgid "\tqueued for %s\n" msgstr "\t%s にキューしました\n" + +#: berkeley/lpc.c:428 msgid "\tqueuing is disabled\n" msgstr "\tキューは無効です\n" + +#: berkeley/lpc.c:426 msgid "\tqueuing is enabled\n" msgstr "\tキューは有効です\n" + +#: systemv/lpstat.c:1777 systemv/lpstat.c:1890 msgid "\treason unknown\n" msgstr "\t未知の理由\n" -msgid "\n DETAILED CONFORMANCE TEST RESULTS\n" -msgstr "\n 適合テスト結果詳細\n" + +#: systemv/cupstestppd.c:380 +msgid "" +"\n" +" DETAILED CONFORMANCE TEST RESULTS\n" +msgstr "" +"\n" +" 適合テスト結果詳細\n" + +#: systemv/cupstestppd.c:341 systemv/cupstestppd.c:345 msgid " REF: Page 15, section 3.1.\n" -msgstr " REF:15 ページ、セクション 3.1。n" +msgstr " 参照: 15 ページ、セクション 3.1。\n" + +#: systemv/cupstestppd.c:337 msgid " REF: Page 15, section 3.2.\n" -msgstr " REF:15 ページ、セクション 3.2。\n" +msgstr " 参照: 15 ページ、セクション 3.2。\n" + +#: systemv/cupstestppd.c:353 msgid " REF: Page 19, section 3.3.\n" -msgstr " REF:19 ページ、セクション 3.3。\n" +msgstr " 参照: 19 ページ、セクション 3.3。\n" + +#: systemv/cupstestppd.c:315 msgid " REF: Page 20, section 3.4.\n" -msgstr " REF:20 ページ、セクション 3.4。\n" +msgstr " 参照: 20 ページ、セクション 3.4。\n" + +#: systemv/cupstestppd.c:357 msgid " REF: Page 27, section 3.5.\n" -msgstr " REF:27 ページ、セクション 3.5。\n" +msgstr " 参照: 27 ページ、セクション 3.5。\n" + +#: systemv/cupstestppd.c:311 msgid " REF: Page 42, section 5.2.\n" -msgstr " REF:42 ページ、セクション 5.2。\n" +msgstr " 参照: 42 ページ、セクション 5.2。\n" + +#: systemv/cupstestppd.c:349 msgid " REF: Pages 16-17, section 3.2.\n" -msgstr " REF:16 〜 17 ページ、セクション 3.2。\n" +msgstr " 参照: 16-17 ページ、セクション 3.2。\n" + +#: systemv/cupstestppd.c:325 msgid " REF: Pages 42-45, section 5.2.\n" -msgstr " REF:42 〜 45 ページ、セクション 5.2。\n" +msgstr " 参照: 42-45 ページ、セクション 5.2。\n" + +#: systemv/cupstestppd.c:320 msgid " REF: Pages 45-46, section 5.2.\n" -msgstr " REF:45 〜 46 ページ、セクション 5.2。\n" +msgstr " 参照: 45-46 ページ、セクション 5.2。\n" + +#: systemv/cupstestppd.c:329 msgid " REF: Pages 48-49, section 5.2.\n" -msgstr " REF:48 〜 49 ページ、セクション 5.2。\n" +msgstr " 参照: 48-49 ページ、セクション 5.2。\n" + +#: systemv/cupstestppd.c:333 msgid " REF: Pages 52-54, section 5.2.\n" -msgstr " REF:52 〜 54 ページ、セクション 5.2。\n" +msgstr " 参照: 52-54 ページ、セクション 5.2。\n" + +#: berkeley/lpq.c:547 +#, c-format msgid " %-39.39s %.0f bytes\n" msgstr " %-39.39s %.0f バイト\n" + +#: systemv/cupstestppd.c:497 +#, c-format msgid " PASS Default%s\n" msgstr " 合格 Default%s\n" + +#: systemv/cupstestppd.c:434 msgid " PASS DefaultImageableArea\n" msgstr " 合格 DefaultImageableArea\n" + +#: systemv/cupstestppd.c:468 msgid " PASS DefaultPaperDimension\n" msgstr " 合格 DefaultPaperDimension\n" + +#: systemv/cupstestppd.c:539 msgid " PASS FileVersion\n" msgstr " 合格 FileVersion\n" + +#: systemv/cupstestppd.c:583 msgid " PASS FormatVersion\n" msgstr " 合格 FormatVersion\n" + +#: systemv/cupstestppd.c:603 msgid " PASS LanguageEncoding\n" msgstr " 合格 LanguageEncoding\n" + +#: systemv/cupstestppd.c:623 msgid " PASS LanguageVersion\n" msgstr " 合格 LanguageVersion\n" + +#: systemv/cupstestppd.c:675 msgid " PASS Manufacturer\n" msgstr " 合格 Manufacturer\n" + +#: systemv/cupstestppd.c:715 msgid " PASS ModelName\n" msgstr " 合格 ModelName\n" + +#: systemv/cupstestppd.c:735 msgid " PASS NickName\n" msgstr " 合格 NickName\n" + +#: systemv/cupstestppd.c:795 msgid " PASS PCFileName\n" msgstr " 合格 PCFileName\n" + +#: systemv/cupstestppd.c:870 msgid " PASS PSVersion\n" msgstr " 合格 PSVersion\n" + +#: systemv/cupstestppd.c:775 msgid " PASS PageRegion\n" msgstr " 合格 PageRegion\n" + +#: systemv/cupstestppd.c:755 msgid " PASS PageSize\n" msgstr " 合格 PageSize\n" + +#: systemv/cupstestppd.c:830 msgid " PASS Product\n" msgstr " 合格 Product\n" + +#: systemv/cupstestppd.c:905 msgid " PASS ShortNickName\n" msgstr " 合格 ShortNickName\n" -msgid " WARN \"%s %s\" conflicts with \"%s %s\"\n (constraint=\"%s %s %s %s\")\n" -msgstr " 警告 “%s %s”が“%s %s”と競合します\n (constraint= “%s %s %s %s”)\n" + +#: systemv/cupstestppd.c:2861 +#, c-format +msgid "" +" WARN \"%s %s\" conflicts with \"%s %s\"\n" +" (constraint=\"%s %s %s %s\")\n" +msgstr "" +" 警告 \"%s %s\" は \"%s %s\" と競合します\n" +" (禁則=\"%s %s %s %s\")\n" + +#: systemv/cupstestppd.c:1270 +#, c-format msgid " WARN %s has no corresponding options!\n" -msgstr " 警告 %s に対応するオプションがありません!\n" -msgid " WARN %s shares a common prefix with %s\n REF: Page 15, section 3.2.\n" -msgstr " 警告 %s は %s と共通のプレフィックスを共有しています\n REF:15 ページ、セクション 3.2。\n" +msgstr " 警告 %s は相当するオプションがありません!\n" + +#: systemv/cupstestppd.c:1378 +#, c-format +msgid "" +" WARN %s shares a common prefix with %s\n" +" REF: Page 15, section 3.2.\n" +msgstr "" +" 警告 %s は %s と一般プレフィックスを共有します。\n" +" 参照: 15 ページ、セクション 3.2。\n" + +#: systemv/cupstestppd.c:1279 msgid " WARN Default choices conflicting!\n" -msgstr " 警告 デフォルトの選択が競合しています!\n" -msgid " WARN Duplex option keyword %s may not work as expected and should be named Duplex!\n REF: Page 122, section 5.17\n" -msgstr " 警告 両面オプションキーワード %s が予期した通りに機能しない可能性があります。Duplex という名前にする必要があります!\n REF:122 ページ、セクション 5.17\n" +msgstr " 警告 デフォルトの選択肢が競合しています!\n" + +#: systemv/cupstestppd.c:1241 +#, c-format +msgid "" +" WARN Duplex option keyword %s may not work as expected and should be named Duplex!\n" +" REF: Page 122, section 5.17\n" +msgstr "" +" 警告 Duplex オプションキーワード %s は期待通りに動作しないかもしれません。また、 Duplex という名前であるべきです!\n" +" 参照: 122 ページ、セクション 5.17\n" + +#: systemv/cupstestppd.c:1670 msgid " WARN File contains a mix of CR, LF, and CR LF line endings!\n" -msgstr " 警告 ファイルに CR、LF、CR LF 行末コードが混在しています!\n" -msgid " WARN LanguageEncoding required by PPD 4.3 spec.\n REF: Pages 56-57, section 5.3.\n" -msgstr " 警告 PPD 4.3 仕様では LanguageEncoding が必要です。\n REF:56 〜 57 ページ、セクション 5.3。\n" +msgstr " 警告 ファイルが CR、LF、CR LF の行末を混在して含んでいます!\n" + +#: systemv/cupstestppd.c:1295 +msgid "" +" WARN LanguageEncoding required by PPD 4.3 spec.\n" +" REF: Pages 56-57, section 5.3.\n" +msgstr "" +" 警告 LanguageEncoding は PPD 4.3 仕様で必須です。\n" +" 参照: 56-57 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1652 +#, c-format msgid " WARN Line %d only contains whitespace!\n" -msgstr " 警告 行 %d に空白しか含まれていません!\n" -msgid " WARN Manufacturer required by PPD 4.3 spec.\n REF: Pages 58-59, section 5.3.\n" -msgstr " 警告 PPD 4.3 仕様では Manufacturer が必要です。\n REF:58 〜 59 ページ、セクション 5.3。\n" +msgstr " 警告 %d 行が空白だけです!\n" + +#: systemv/cupstestppd.c:1303 +msgid "" +" WARN Manufacturer required by PPD 4.3 spec.\n" +" REF: Pages 58-59, section 5.3.\n" +msgstr "" +" 警告 Manufacturer は PPD 4.3 仕様で必須です。\n" +" 参照: 58-59 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1397 +#, c-format msgid " WARN Missing APDialogExtension file \"%s\"\n" -msgstr " 警告 APDialogExtension ファイル“%s”がありません\n" +msgstr " 警告 APDialogExtension ファイル \"%s\" が見つかりません\n" + +#: systemv/cupstestppd.c:1411 +#, c-format msgid " WARN Missing APPrinterIconPath file \"%s\"\n" -msgstr " 警告 APPrinterIconPath ファイル“%s”がありません\n" +msgstr " 警告 APPrinterIconPath ファイル \"%s\" が見つかりません\n" + +#: systemv/cupstestppd.c:1675 msgid " WARN Non-Windows PPD files should use lines ending with only LF, not CR LF!\n" -msgstr " 警告 Windows 以外の PPD ファイルでは行末コードとして LF だけを使用する必要があります。CR LF は使用しないでください!\n" -msgid " WARN Obsolete PPD version %.1f!\n REF: Page 42, section 5.2.\n" -msgstr " 警告 %.1f は古い PPD バージョンです!\n REF:42 ページ、セクション 5.2。\n" -msgid " WARN PCFileName longer than 8.3 in violation of PPD spec.\n REF: Pages 61-62, section 5.3.\n" -msgstr " 警告 8.3 より長い PCFileName は PPD 仕様に違反しています。\n REF:61 〜 62 ページ、セクション 5.3。\n" -msgid " WARN Protocols contains PJL but JCL attributes are not set.\n REF: Pages 78-79, section 5.7.\n" -msgstr " 警告 プロトコルに PJL が含まれていますが、JCL 属性が設定されていません。\n REF:78 〜 79 ページ、セクション 5.7。\n" -msgid " WARN Protocols contains both PJL and BCP; expected TBCP.\n REF: Pages 78-79, section 5.7.\n" -msgstr " 警告 プロトコルに PJL と BCP の両方が含まれています。TBCP が必要です。\n REF:78 〜 79 ページ、セクション 5.7。\n" -msgid " WARN ShortNickName required by PPD 4.3 spec.\n REF: Pages 64-65, section 5.3.\n" -msgstr " 警告 PPD 4.3 仕様では ShortNickName が必要です。\n REF:64 〜 65 ページ、セクション 5.3。\n" +msgstr " 警告 非 Windows PPD ファイルは、CR LF でなく LF のみを行末に使うべきです!\n" + +#: systemv/cupstestppd.c:1287 +#, c-format +msgid "" +" WARN Obsolete PPD version %.1f!\n" +" REF: Page 42, section 5.2.\n" +msgstr "" +" 警告 PPD バージョン %.1f は現在使われていません!\n" +" 参照: 42 ページ、セクション 5.2。\n" + +#: systemv/cupstestppd.c:1316 +msgid "" +" WARN PCFileName longer than 8.3 in violation of PPD spec.\n" +" REF: Pages 61-62, section 5.3.\n" +msgstr "" +" 警告 8.3 文字より長い PCFileName は PPD 仕様違反です。\n" +" 参照: 61-62 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1350 +msgid "" +" WARN Protocols contains PJL but JCL attributes are not set.\n" +" REF: Pages 78-79, section 5.7.\n" +msgstr "" +" 警告 プロトコルが PJL を含んでいますが JCL 属性が設定されていません。\n" +" 参照: 78-79 ページ、セクション 5.7。\n" + +#: systemv/cupstestppd.c:1341 +msgid "" +" WARN Protocols contains both PJL and BCP; expected TBCP.\n" +" REF: Pages 78-79, section 5.7.\n" +msgstr "" +" 警告 プロトコルが PJL と BCP の両方を含んでいます; TBCP を想定します。\n" +" 参照: 78-79 ページ、セクション 5.7。\n" + +#: systemv/cupstestppd.c:1324 +msgid "" +" WARN ShortNickName required by PPD 4.3 spec.\n" +" REF: Pages 64-65, section 5.3.\n" +msgstr "" +" 警告 ShortNickName は PPD 4.3 仕様で必須です。\n" +" 参照: 64-65 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:2140 +#, c-format msgid " %s %s %s does not exist!\n" -msgstr " %s %s %s が存在しません!\n" -msgid " %s Bad %s choice %s!\n REF: Page 122, section 5.17\n" -msgstr " %s %s 選択 %s が正しくありません!\n REF:122 ページ、セクション 5.17\n" +msgstr " %s %s %s が存在しません!\n" + +#: systemv/cupstestppd.c:2210 +#, c-format +msgid "" +" %s Bad %s choice %s!\n" +" REF: Page 122, section 5.17\n" +msgstr "" +" %s 不正な %s が %s を選んでいます!\n" +" 参照: 122 ページ、セクション 5.17\n" + +#: systemv/cupstestppd.c:2576 +#, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" -msgstr " %1$s オプション %3$s の UTF-8 “%2$s”変換文字列が正しくありません!\n" +msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 用)です!\n" + +#: systemv/cupstestppd.c:2622 systemv/cupstestppd.c:2671 +#: systemv/cupstestppd.c:2710 +#, c-format msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" -msgstr " %1$s オプション %3$s、選択 %4$s の UTF-8 “%2$s”変換文字列が正しくありません!\n" +msgstr " %s 不正な UTF-8 \"%s\" 翻訳文字列 (オプション %s 、選択 %s)です!\n" + +#: systemv/cupstestppd.c:2258 +#, c-format msgid " %s Bad cupsFilter value \"%s\"!\n" -msgstr " %s cupsFilter 値“%s”が正しくありません!\n" +msgstr " %s 不正な値が cupsFilter に設定されています \"%s\"!\n" + +#: systemv/cupstestppd.c:2393 +#, c-format msgid " %s Bad cupsICCProfile %s!\n" -msgstr " %s cupsICCProfile %s が正しくありません!\n" +msgstr " %s 不正な cupsICCProfile %sです!\n" + +#: systemv/cupstestppd.c:2309 +#, c-format msgid " %s Bad cupsPreFilter value \"%s\"!\n" -msgstr " %s cupsPreFilter 値“%s”が正しくありません!\n" +msgstr " %s 不正な値が cupsPreFilter に設定されています \"%s\"!\n" + +#: systemv/cupstestppd.c:1748 +#, c-format msgid " %s Bad cupsUIConstraints %s: \"%s\"!\n" -msgstr " %s cupsUIConstraints %s が正しくありません:“%s”!\n" +msgstr " %s 不正な cupsUIConstraints %s: \"%s\"です!\n" + +#: systemv/cupstestppd.c:2526 +#, c-format msgid " %s Bad language \"%s\"!\n" -msgstr " %s 言語 “%s”が正しくありません!\n" +msgstr " %s 無効な言語 \"%s\"です!\n" + +#: systemv/cupstestppd.c:1729 +#, c-format msgid " %s Empty cupsUIConstraints %s!\n" -msgstr " %s cupsUIConstraints %s が空です!\n" +msgstr " %s 空の cupsUIConstraints %sです!\n" + +#: systemv/cupstestppd.c:2562 +#, c-format msgid " %s Missing \"%s\" translation string for option %s!\n" -msgstr " %1$s オプション %3$s の“%2$s”変換文字列が見つかりません!\n" +msgstr " %s \"%s\" 翻訳文字列 (オプション %s 用) が見つかりません!\n" + +#: systemv/cupstestppd.c:2654 systemv/cupstestppd.c:2694 +#, c-format msgid " %s Missing \"%s\" translation string for option %s, choice %s!\n" -msgstr " %1$s オプション %3$s、選択 %4$s の“%2$s”変換文字列が見つかりません!\n" +msgstr " %s \"%s\" 翻訳文字列 (オプション %s 、選択 %s) が見つかりません!\n" + +#: systemv/cupstestppd.c:1921 systemv/cupstestppd.c:1962 +#, c-format msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" -msgstr " %s UIConstraints “*%s %s *%s %s”内に選択 *%s %s が見つかりません!\n" +msgstr " %s  選択 *%s %s が UIConstraints \"*%s %s *%s %s\" 内に見つかりません!\n" + +#: systemv/cupstestppd.c:1834 +#, c-format msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" -msgstr " %s cupsUIConstraints %s 内に選択 *%s %s が見つかりません:“%s”!\n" +msgstr " %s 選択 *%s %s が cupsUIConstraints %s: \"%s\" 内に見つかりません!\n" + +#: systemv/cupstestppd.c:2287 +#, c-format msgid " %s Missing cupsFilter file \"%s\"\n" -msgstr " %s cupsFilter ファイル“%s”が見つかりません\n" +msgstr " %s cupsFilter ファイル \"%s\" が見つかりません!\n" + +#: systemv/cupstestppd.c:2427 +#, c-format msgid " %s Missing cupsICCProfile file \"%s\"!\n" -msgstr " %s cupsICCProfile ファイル“%s”が見つかりません!\n" +msgstr " %s cupsPreFilter ファイル \"%s\" が見つかりません!\n" + +#: systemv/cupstestppd.c:2338 +#, c-format msgid " %s Missing cupsPreFilter file \"%s\"\n" -msgstr " %s cupsPreFilter ファイル“%s”が見つかりません\n" +msgstr " %s cupsPreFilter ファイル \"%s\" が見つかりません!\n" + +#: systemv/cupstestppd.c:1766 +#, c-format msgid " %s Missing cupsUIResolver %s!\n" -msgstr " %s cupsUIResolver %s が見つかりません!\n" +msgstr " %s cupsUIResolver ファイル %s が見つかりません!\n" + +#: systemv/cupstestppd.c:1907 systemv/cupstestppd.c:1948 +#, c-format msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" -msgstr " %s UIConstraints “*%s %s *%s %s”内にオプション %s が見つかりません!\n" +msgstr " %s オプション %s がUIConstraints \"*%s %s *%s %s\" に見つかりません!\n" + +#: systemv/cupstestppd.c:1818 +#, c-format msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" -msgstr " %s cupsUIConstraints %s内にオプション %s が見つかりません:“%s”!\n" +msgstr " %s オプション %s がcupsUIConstraints %s に見つかりません!: \"%s\"\n" + +#: systemv/cupstestppd.c:2748 +#, c-format msgid " %s No base translation \"%s\" is included in file!\n" -msgstr " %s ファイルにベース変換”%s”が取り込まれていません!\n" -msgid " %s REQUIRED %s does not define choice None!\n REF: Page 122, section 5.17\n" -msgstr " %s 必須の %s が選択肢 None を定義していません!\n REF:122 ページ、セクション 5.17\n" +msgstr " %s ファイルにベース翻訳文字列 \"%s\" がありません!\n" + +#: systemv/cupstestppd.c:2186 +#, c-format +msgid "" +" %s REQUIRED %s does not define choice None!\n" +" REF: Page 122, section 5.17\n" +msgstr "" +" %s 必須の %s が選択肢 None を定義していません!\n" +" 参照: 122 ページ、セクション 5.17\n" + +#: systemv/cupstestppd.c:2453 +#, c-format msgid " %s cupsICCProfile %s hash value collides with %s!\n" -msgstr " %s cupsICCProfile %s ハッシュ値が %s と衝突しています!\n" +msgstr " %s cupsICCProfileのハッシュ値 %s が %s と一致しません!\n" + +#: systemv/cupstestppd.c:1871 +#, c-format msgid " %s cupsUIResolver %s causes a loop!\n" -msgstr " %s cupsUIResolver %s がループになっています!\n" +msgstr " %s cupsUIResolverの %s がループしています!\n" + +#: systemv/cupstestppd.c:2071 +#, c-format msgid " **FAIL** %s choice names %s and %s differ only by case!\n" -msgstr " ** 失敗 ** %s 選択名 %s と %s の違いは大文字小文字だけです!\n" -msgid " **FAIL** %s must be 1284DeviceID!\n REF: Page 72, section 5.5\n" -msgstr " ** 失敗 ** %s は 1284DeviceID でなければなりません!\n REF:72 ページ、セクション 5.5\n" -msgid " **FAIL** BAD Default%s %s\n REF: Page 40, section 4.5.\n" -msgstr " ** 失敗 ** Default%s %s が正しくありません\n REF:40 ページ、セクション 4.5。\n" -msgid " **FAIL** BAD DefaultImageableArea %s!\n REF: Page 102, section 5.15.\n" -msgstr " ** 失敗 ** DefaultImageableArea %s が正しくありません!\n REF:102 ページ、セクション 5.15。\n" -msgid " **FAIL** BAD DefaultPaperDimension %s!\n REF: Page 103, section 5.15.\n" -msgstr " ** 失敗 ** DefaultPaperDimension %s が正しくありません!\n REF:103 ページ、セクション 5.15。\n" -msgid " **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4.\n" -msgstr " ** 失敗 ** ファイル内の JobPatchFile 属性が正しくありません\n REF:24 ページ、セクション 3.4。\n" -msgid " **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1.\n" -msgstr " ** 失敗 ** Manufacturer が正しくありません(“HP”でなければなりません)\n REF:211 ページ、表 D.1。\n" -msgid " **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1.\n" -msgstr " ** 失敗 ** Manufacturer が正しくありません(“Oki”でなければなりません)\n REF:211 ページ、表 D.1。\n" -msgid " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3.\n" -msgstr " ** 失敗 ** ModelName が正しくありません - “%c”は文字列内で許可されません。\n REF:59 〜 60 ページ、セクション 5.3。\n" -msgid " **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3.\n" -msgstr " ** 失敗 ** PSVersion が正しくありません - “(文字列) 正数”でありません。\n REF:62 〜 64 ページ、セクション 5.3。\n" -msgid " **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3.\n" -msgstr " ** 失敗 ** Product が正しくありません - “(文字列)”でありません。\n REF:62 ページ、セクション 5.3。\n" -msgid " **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3.\n" -msgstr " ** 失敗 ** ShortNickName が正しくありません - 31 文字より長いです。\n REF:64 〜 65 ページ、セクション 5.3。\n" -msgid " **FAIL** Bad %s choice %s!\n REF: Page 84, section 5.9\n" -msgstr " ** 失敗 ** %s 選択 %s が正しくありません!\n REF:84 ページ、セクション 5.9\n" -msgid " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3.\n" -msgstr " ** 失敗 ** FileVersion “%s” が正しくありません\n REF:56 ページ、セクション 5.3。\n" -msgid " **FAIL** Bad FormatVersion \"%s\"\n REF: Page 56, section 5.3.\n" -msgstr " ** 失敗 ** FormatVersion “%s” が正しくありません\n REF:56 ページ、セクション 5.3。\n" +msgstr " **失敗** %s が選択した %s と %s は大文字/小文字のみが違うだけです!\n" + +#: systemv/cupstestppd.c:1072 +#, c-format +msgid "" +" **FAIL** %s must be 1284DeviceID!\n" +" REF: Page 72, section 5.5\n" +msgstr "" +" **失敗** %s は 1284DeviceID でなければなりません!\n" +" 参照: 72 ページ、セクション 5.5\n" + +#: systemv/cupstestppd.c:488 +#, c-format +msgid "" +" **FAIL** BAD Default%s %s\n" +" REF: Page 40, section 4.5.\n" +msgstr "" +" **失敗** 不正な Default%s %s\n" +" 参照: 40 ページ、セクション 4.5。\n" + +#: systemv/cupstestppd.c:424 +#, c-format +msgid "" +" **FAIL** BAD DefaultImageableArea %s!\n" +" REF: Page 102, section 5.15.\n" +msgstr "" +" **失敗** %s は不正な DefaultImageableArea です!\n" +" 参照: 102 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:460 +#, c-format +msgid "" +" **FAIL** BAD DefaultPaperDimension %s!\n" +" REF: Page 103, section 5.15.\n" +msgstr "" +" **失敗** %s は不正な DefaultPaperDimension です!\n" +" 参照: 103 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:931 +msgid "" +" **FAIL** BAD JobPatchFile attribute in file\n" +" REF: Page 24, section 3.4.\n" +msgstr "" +" **失敗** ファイルに不正な JobPatchFile 属性があります\n" +" 参照: 24 ページ、セクション 3.4。\n" + +#: systemv/cupstestppd.c:651 +msgid "" +" **FAIL** BAD Manufacturer (should be \"HP\")\n" +" REF: Page 211, table D.1.\n" +msgstr "" +" **失敗** 不正な Manufacturer (\"HP\" でなければなりません)\n" +" 参照: 211 ページ、表 D.1。\n" + +#: systemv/cupstestppd.c:667 +msgid "" +" **FAIL** BAD Manufacturer (should be \"Oki\")\n" +" REF: Page 211, table D.1.\n" +msgstr "" +" **失敗** 不正な Manufacturer (\"Oki\" でなければなりません)\n" +" 参照: 211 ページ、表 D.1。\n" + +#: systemv/cupstestppd.c:706 +#, c-format +msgid "" +" **FAIL** BAD ModelName - \"%c\" not allowed in string.\n" +" REF: Pages 59-60, section 5.3.\n" +msgstr "" +" **失敗** 不正な ModelName - 文字列に \"%c\" は許可されていません。\n" +" 参照: 59-60 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:862 +msgid "" +" **FAIL** BAD PSVersion - not \"(string) int\".\n" +" REF: Pages 62-64, section 5.3.\n" +msgstr "" +" **失敗** 不正な PSVersion - \"(文字列) 整数\" ではありません。\n" +" 参照: 62-64 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:823 +msgid "" +" **FAIL** BAD Product - not \"(string)\".\n" +" REF: Page 62, section 5.3.\n" +msgstr "" +" **失敗** 不正な Product - \"(文字列)\" ではありません。\n" +" 参照: 62 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:897 +msgid "" +" **FAIL** BAD ShortNickName - longer than 31 chars.\n" +" REF: Pages 64-65, section 5.3.\n" +msgstr "" +" **失敗** 不正な ShortNickName - 31 文字を超えています。\n" +" 参照: 64-65 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1053 +#, c-format +msgid "" +" **FAIL** Bad %s choice %s!\n" +" REF: Page 84, section 5.9\n" +msgstr "" +" **失敗** 不正な %s が %s を選んでいます!\n" +" 参照: 84 ページ、セクション 5.9\n" + +#: systemv/cupstestppd.c:531 +#, c-format +msgid "" +" **FAIL** Bad FileVersion \"%s\"\n" +" REF: Page 56, section 5.3.\n" +msgstr "" +" **失敗** 不正なFileVersion \"%s\"\n" +" 参照: 56 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:575 +#, c-format +msgid "" +" **FAIL** Bad FormatVersion \"%s\"\n" +" REF: Page 56, section 5.3.\n" +msgstr "" +" **失敗** FormatVersion が違います \"%s\"\n" +" 参照: 56 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1114 +#, c-format msgid " **FAIL** Bad LanguageEncoding %s - must be ISOLatin1!\n" -msgstr " ** 失敗 ** LanguageEncoding %s が正しくありません - ISOLatin1 でなければなりません!\n" +msgstr " **失敗** 無効な LanguageEncoding %s - ISOLatin1 でなければなりません!\n" + +#: systemv/cupstestppd.c:1128 +#, c-format msgid " **FAIL** Bad LanguageVersion %s - must be English!\n" -msgstr " ** 失敗 ** LanguageVersion %s が正しくありません - English でなければなりません!\n" +msgstr " **失敗** 無効な LanguageVersion %s - English でなければなりません!\n" + +#: systemv/cupstestppd.c:2888 systemv/cupstestppd.c:2910 +#, c-format msgid " **FAIL** Default option code cannot be interpreted: %s\n" -msgstr " ** 失敗 ** デフォルトのオプションコードを解釈できません:%s\n" +msgstr " **失敗** デフォルトのオプションコードが解釈できません: %s\n" + +#: systemv/cupstestppd.c:1187 +#, c-format msgid " **FAIL** Default translation string for option %s choice %s contains 8-bit characters!\n" -msgstr " ** 失敗 ** オプション %s 選択 %s のデフォルト変換文字列に 8 ビット文字が含まれています!\n" +msgstr " **失敗** オプション %s、選択 %s のデフォルトの翻訳文字列が 8 ビット文字を含んでいます!\n" + +#: systemv/cupstestppd.c:1160 +#, c-format msgid " **FAIL** Default translation string for option %s contains 8-bit characters!\n" -msgstr " ** 失敗 ** オプション %s のデフォルト変換文字列に 8 ビット文字が含まれています!\n" +msgstr " **失敗** オプション %s のデフォルトの翻訳文字列が 8 ビット文字を含んでいます!\n" + +#: systemv/cupstestppd.c:2009 +#, c-format msgid " **FAIL** Group names %s and %s differ only by case!\n" -msgstr " ** 失敗 ** グループ名 %s と %s の違いは大文字小文字だけです!\n" +msgstr " **失敗** グループ名 %s と %s は大文字/小文字が違うだけです!\n" + +#: systemv/cupstestppd.c:2054 +#, c-format msgid " **FAIL** Multiple occurrences of %s choice name %s!\n" -msgstr " ** 失敗 ** %s 選択名 %s が複数回出現します!\n" +msgstr " **失敗** %s で複数のオプション %s が選択されています!\n" + +#: systemv/cupstestppd.c:2031 +#, c-format msgid " **FAIL** Option names %s and %s differ only by case!\n" -msgstr " ** 失敗 ** オプション名 %s と %s の違いは大文字小文字だけです!\n" -msgid " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5.\n" -msgstr " ** 失敗 ** Default%s が必要です\n REF:40 ページ、セクション 4.5。\n" -msgid " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15.\n" -msgstr " ** 失敗 ** DefaultImageableArea が必要です\n REF:102 ページ、セクション 5.15。\n" -msgid " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15.\n" -msgstr " ** 失敗 ** DefaultPaperDimension が必要です\n REF:103 ページ、セクション 5.15。\n" -msgid " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3.\n" -msgstr " ** 失敗 ** FileVersion が必要です\n REF:56 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3.\n" -msgstr " ** 失敗 ** FormatVersion が必要です\n REF:56 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15.\n" -msgstr " ** 失敗 ** PageSize %s に ImageableArea が必要です\n REF:41 ページ、セクション 5。\n REF:102 ページ、セクション 5.15。\n" -msgid " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3.\n" -msgstr " ** 失敗 ** LanguageEncoding が必要です\n REF:56 〜 57 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3.\n" -msgstr " ** 失敗 ** LanguageVersion が必要です\n REF:57 〜 58 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3.\n" -msgstr " ** 失敗 ** Manufacturer が必要です\n REF:58 〜 59 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3.\n" -msgstr " ** 失敗 ** ModelName が必要です\n REF:59 〜 60 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3.\n" -msgstr " ** 失敗 ** NickName が必要です\n REF:60 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3.\n" -msgstr " ** 失敗 ** PCFileName が必要です\n REF:61 〜 62 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3.\n" -msgstr " ** 失敗 ** PSVersion が必要です\n REF:62 〜 64 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14.\n" -msgstr " ** 失敗 ** PageRegion が必要です\n REF:100 ページ、セクション 5.14。\n" -msgid " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14.\n" -msgstr " ** 失敗 ** PageSize が必要です\n REF:41 ページ、セクション 5。\n REF:99 ページ、セクション 5.14。\n" -msgid " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14.\n" -msgstr " ** 失敗 ** PageSize が必要です\n REF:99 〜 100 ページ、セクション 5.14。\n" -msgid " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15.\n" -msgstr " ** 失敗 ** PageSize %s に PaperDimension が必要です\n REF:41 ページ、セクション 5。\n REF:103 ページ、セクション 5.15。\n" -msgid " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3.\n" -msgstr " ** 失敗 ** Product が必要です\n REF:62 ページ、セクション 5.3。\n" -msgid " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3.\n" -msgstr " ** 失敗 ** ShortNickName が必要です\n REF:64 〜 65 ページ、セクション 5.3。\n" +msgstr " **失敗** オプション名 %s と %s は大文字/小文字が違うだけです!\n" + +#: systemv/cupstestppd.c:508 +#, c-format +msgid "" +" **FAIL** REQUIRED Default%s\n" +" REF: Page 40, section 4.5.\n" +msgstr "" +" **失敗** Default%s は必須\n" +" 参照: 40 ページ、セクション 4.5。\n" + +#: systemv/cupstestppd.c:409 +msgid "" +" **FAIL** REQUIRED DefaultImageableArea\n" +" REF: Page 102, section 5.15.\n" +msgstr "" +" **失敗** DefaultImageableArea は必須\n" +" 参照: 102 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:445 +msgid "" +" **FAIL** REQUIRED DefaultPaperDimension\n" +" REF: Page 103, section 5.15.\n" +msgstr "" +" **失敗** DefaultPaperDimension は必須\n" +" 参照: 103 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:549 +msgid "" +" **FAIL** REQUIRED FileVersion\n" +" REF: Page 56, section 5.3.\n" +msgstr "" +" **失敗** FileVersion は必須\n" +" 参照: 56 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:593 +msgid "" +" **FAIL** REQUIRED FormatVersion\n" +" REF: Page 56, section 5.3.\n" +msgstr "" +" **失敗** FormatVersion は必須\n" +" 参照: 56 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:982 +#, c-format +msgid "" +" **FAIL** REQUIRED ImageableArea for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 102, section 5.15.\n" +msgstr "" +" **失敗** PageSize %s に ImageableArea は必須\n" +" 参照: 41 ページ、セクション 5。\n" +" 参照: 102 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:613 +msgid "" +" **FAIL** REQUIRED LanguageEncoding\n" +" REF: Pages 56-57, section 5.3.\n" +msgstr "" +" **失敗** LanguageEncoding は必須\n" +" 参照: 56-57 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:633 +msgid "" +" **FAIL** REQUIRED LanguageVersion\n" +" REF: Pages 57-58, section 5.3.\n" +msgstr "" +" **失敗** LanguageVersion は必須\n" +" 参照: 57-58 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:685 +msgid "" +" **FAIL** REQUIRED Manufacturer\n" +" REF: Pages 58-59, section 5.3.\n" +msgstr "" +" **失敗** Manufacturer は必須\n" +" 参照: 58-59 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:725 +msgid "" +" **FAIL** REQUIRED ModelName\n" +" REF: Pages 59-60, section 5.3.\n" +msgstr "" +" **失敗** ModelName は必須\n" +" 参照: 59-60 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:745 +msgid "" +" **FAIL** REQUIRED NickName\n" +" REF: Page 60, section 5.3.\n" +msgstr "" +" **失敗** NickName は必須\n" +" 参照: 60 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:805 +msgid "" +" **FAIL** REQUIRED PCFileName\n" +" REF: Pages 61-62, section 5.3.\n" +msgstr "" +" **失敗** PCFileName は必須\n" +" 参照: 61-62 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:880 +msgid "" +" **FAIL** REQUIRED PSVersion\n" +" REF: Pages 62-64, section 5.3.\n" +msgstr "" +" **失敗** PSVersion は必須\n" +" 参照: 62-64 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:785 +msgid "" +" **FAIL** REQUIRED PageRegion\n" +" REF: Page 100, section 5.14.\n" +msgstr "" +" **失敗** PageRegion は必須\n" +" 参照: 100 ページ、セクション 5.14。\n" + +#: systemv/cupstestppd.c:951 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Page 41, section 5.\n" +" REF: Page 99, section 5.14.\n" +msgstr "" +" **失敗** PageSize は必須\n" +" 参照: 41 ページ、セクション 5。\n" +" 参照: 99 ページ、セクション 5.14。\n" + +#: systemv/cupstestppd.c:765 +msgid "" +" **FAIL** REQUIRED PageSize\n" +" REF: Pages 99-100, section 5.14.\n" +msgstr "" +" **失敗** PageSize は必須\n" +" 参照: 99-100 ページ、セクション 5.14。\n" + +#: systemv/cupstestppd.c:1004 +#, c-format +msgid "" +" **FAIL** REQUIRED PaperDimension for PageSize %s\n" +" REF: Page 41, section 5.\n" +" REF: Page 103, section 5.15.\n" +msgstr "" +" **失敗** PageSize %s に PaperDimension は必須\n" +" 参照: 41 ページ、セクション 5。\n" +" 参照: 103 ページ、セクション 5.15。\n" + +#: systemv/cupstestppd.c:840 +msgid "" +" **FAIL** REQUIRED Product\n" +" REF: Page 62, section 5.3.\n" +msgstr "" +" **失敗** Product は必須\n" +" 参照: 62 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:915 +msgid "" +" **FAIL** REQUIRED ShortNickName\n" +" REF: Page 64-65, section 5.3.\n" +msgstr "" +" **失敗** ShortNickName は必須\n" +" 参照: 64-65 ページ、セクション 5.3。\n" + +#: systemv/cupstestppd.c:1420 +#, c-format msgid " %d ERRORS FOUND\n" msgstr " %d 個のエラーが見つかりました\n" -msgid " Bad %%%%BoundingBox: on line %d!\n REF: Page 39, %%%%BoundingBox:\n" -msgstr " %%%%BoundingBox が正しくありません:行 %d!\n REF:39 ページ、%%%%BoundingBox:\n" -msgid " Bad %%%%Page: on line %d!\n REF: Page 53, %%%%Page:\n" -msgstr " %%%%Page が正しくありません:行 %d!\n REF:53 ページ、%%%%Page:\n" -msgid " Bad %%%%Pages: on line %d!\n REF: Page 43, %%%%Pages:\n" -msgstr " %%%%Pages が正しくありません:行 %d!\n REF:43 ページ、%%%%Pages:\n" -msgid " Line %d is longer than 255 characters (%d)!\n REF: Page 25, Line Length\n" -msgstr " %d 行が 255 文字より長くなっています(%d)!\n REF:25 ページ、Line Length\n" -msgid " Missing %!PS-Adobe-3.0 on first line!\n REF: Page 17, 3.1 Conforming Documents\n" -msgstr " 先頭行に %!PS-Adobe-3.0 がありません!\n REF:17 ページ、3.1 Conforming Documents\n" -msgid " Missing %%EndComments comment!\n REF: Page 41, %%EndComments\n" -msgstr " %%EndComments コメントが見つかりません!\n REF:41 ページ、%%EndComments\n" -msgid " Missing or bad %%BoundingBox: comment!\n REF: Page 39, %%BoundingBox:\n" -msgstr " %%BoundingBox が見つからないか正しくありません:コメント!\n REF:39 ページ、%%BoundingBox:\n" -msgid " Missing or bad %%Page: comments!\n REF: Page 53, %%Page:\n" -msgstr " %%Page が見つからないか正しくありません:コメント!\n REF:53 ページ、%%Page:\n" -msgid " Missing or bad %%Pages: comment!\n REF: Page 43, %%Pages:\n" -msgstr " %%Pages が見つからないか正しくありません:コメント!\n REF:43 ページ、%%Pages:\n" + +#: systemv/cupstestdsc.c:238 systemv/cupstestdsc.c:280 +#, c-format +msgid "" +" Bad %%%%BoundingBox: on line %d!\n" +" REF: Page 39, %%%%BoundingBox:\n" +msgstr "" +" 不正な %%%%BoundingBox: (%d 行)!\n" +" 参照: 39 ページ、%%%%BoundingBox:\n" + +#: systemv/cupstestdsc.c:309 +#, c-format +msgid "" +" Bad %%%%Page: on line %d!\n" +" REF: Page 53, %%%%Page:\n" +msgstr "" +" 不正な %%%%Page: (%d 行)!\n" +" 参照: 53 ページ、%%%%Page:\n" + +#: systemv/cupstestdsc.c:222 systemv/cupstestdsc.c:262 +#, c-format +msgid "" +" Bad %%%%Pages: on line %d!\n" +" REF: Page 43, %%%%Pages:\n" +msgstr "" +" 不正な %%%%Pages: (%d 行)!\n" +" 参照: 43 ページ、%%%%Pages:\n" + +#: systemv/cupstestdsc.c:180 +#, c-format +msgid "" +" Line %d is longer than 255 characters (%d)!\n" +" REF: Page 25, Line Length\n" +msgstr "" +" %d 行が 255文字より長くなっています (%d)!\n" +" 参照: 25 ページ、Line Length\n" + +#: systemv/cupstestdsc.c:196 +msgid "" +" Missing %!PS-Adobe-3.0 on first line!\n" +" REF: Page 17, 3.1 Conforming Documents\n" +msgstr "" +" 先頭行に %!PS-Adobe-3.0 がありません!\n" +" 参照: 17 ページ、3.1 Conforming Documents\n" + +#: systemv/cupstestdsc.c:366 +#, c-format +msgid "" +" Missing %%EndComments comment!\n" +" REF: Page 41, %%EndComments\n" +msgstr "" +" %%EndComments コメントが見つかりません!\n" +" 参照: 41 ページ、%%EndComments\n" + +#: systemv/cupstestdsc.c:346 +#, c-format +msgid "" +" Missing or bad %%BoundingBox: comment!\n" +" REF: Page 39, %%BoundingBox:\n" +msgstr "" +" %%BoundingBox: コメントが見つからないか不正です!\n" +" 参照: 39 ページ、%%BoundingBox:\n" + +#: systemv/cupstestdsc.c:376 +#, c-format +msgid "" +" Missing or bad %%Page: comments!\n" +" REF: Page 53, %%Page:\n" +msgstr "" +" %%Page: コメントが見つからないか不正です!\n" +" 参照: 53 ページ、%%Page:\n" + +#: systemv/cupstestdsc.c:356 +#, c-format +msgid "" +" Missing or bad %%Pages: comment!\n" +" REF: Page 43, %%Pages:\n" +msgstr "" +" %%Pages: コメントが見つからないか不正です!\n" +" 参照: 43 ページ、%%Pages:\n" + +#: systemv/cupstestppd.c:1422 msgid " NO ERRORS FOUND\n" -msgstr " エラーが見つかりませんでした\n" +msgstr " エラーは見つかりませんでした\n" + +#: systemv/cupstestdsc.c:399 +#, c-format msgid " Saw %d lines that exceeded 255 characters!\n" -msgstr " 255 文字を超える行が %d 個ありました!\n" +msgstr " 255文字を超える %d 行が見つかりました!\n" + +#: systemv/cupstestdsc.c:394 +#, c-format msgid " Too many %%BeginDocument comments!\n" -msgstr " %%BeginDocument コメントが多すぎます!\n" +msgstr " %%BeginDocument コメントが多すぎます!\n" + +#: systemv/cupstestdsc.c:386 +#, c-format msgid " Too many %%EndDocument comments!\n" -msgstr " %%EndDocument コメントが多すぎます!\n" +msgstr " %%EndDocument コメントが多すぎます!\n" + +#: systemv/cupstestdsc.c:406 msgid " Warning: file contains binary data!\n" -msgstr " 警告:ファイル内にバイナリデータが含まれています!\n" +msgstr " 警告: ファイルにバイナリデータが含まれています!\n" + +#: systemv/cupstestdsc.c:414 +#, c-format msgid " Warning: no %%EndComments comment in file!\n" -msgstr " 警告:ファイル内に %%EndComments コメントがありません!\n" +msgstr " 警告: ファイルに %%EndComments コメントがありません!\n" + +#: systemv/cupstestdsc.c:410 +#, c-format msgid " Warning: obsolete DSC version %.1f in file!\n" -msgstr " 警告:ファイル内に古い DSC バージョン %.1f があります!\n" +msgstr " 警告: ファイルは時代遅れの DSC バージョン %.1f です!\n" + +#: systemv/cupstestppd.c:406 systemv/cupstestppd.c:421 +#: systemv/cupstestppd.c:442 systemv/cupstestppd.c:457 +#: systemv/cupstestppd.c:485 systemv/cupstestppd.c:505 +#: systemv/cupstestppd.c:528 systemv/cupstestppd.c:546 +#: systemv/cupstestppd.c:572 systemv/cupstestppd.c:590 +#: systemv/cupstestppd.c:610 systemv/cupstestppd.c:630 +#: systemv/cupstestppd.c:648 systemv/cupstestppd.c:664 +#: systemv/cupstestppd.c:682 systemv/cupstestppd.c:703 +#: systemv/cupstestppd.c:722 systemv/cupstestppd.c:742 +#: systemv/cupstestppd.c:762 systemv/cupstestppd.c:782 +#: systemv/cupstestppd.c:802 systemv/cupstestppd.c:820 +#: systemv/cupstestppd.c:837 systemv/cupstestppd.c:859 +#: systemv/cupstestppd.c:877 systemv/cupstestppd.c:894 +#: systemv/cupstestppd.c:912 systemv/cupstestppd.c:928 +#: systemv/cupstestppd.c:948 systemv/cupstestppd.c:979 +#: systemv/cupstestppd.c:1001 systemv/cupstestppd.c:1050 +#: systemv/cupstestppd.c:1069 systemv/cupstestppd.c:1110 +#: systemv/cupstestppd.c:1124 systemv/cupstestppd.c:1156 +#: systemv/cupstestppd.c:1183 systemv/cupstestppd.c:1726 +#: systemv/cupstestppd.c:1745 systemv/cupstestppd.c:1763 +#: systemv/cupstestppd.c:1815 systemv/cupstestppd.c:1831 +#: systemv/cupstestppd.c:1868 systemv/cupstestppd.c:1904 +#: systemv/cupstestppd.c:1918 systemv/cupstestppd.c:1945 +#: systemv/cupstestppd.c:1959 systemv/cupstestppd.c:2005 +#: systemv/cupstestppd.c:2027 systemv/cupstestppd.c:2050 +#: systemv/cupstestppd.c:2067 systemv/cupstestppd.c:2136 +#: systemv/cupstestppd.c:2183 systemv/cupstestppd.c:2207 +#: systemv/cupstestppd.c:2254 systemv/cupstestppd.c:2284 +#: systemv/cupstestppd.c:2305 systemv/cupstestppd.c:2335 +#: systemv/cupstestppd.c:2389 systemv/cupstestppd.c:2424 +#: systemv/cupstestppd.c:2449 systemv/cupstestppd.c:2522 +#: systemv/cupstestppd.c:2558 systemv/cupstestppd.c:2572 +#: systemv/cupstestppd.c:2618 systemv/cupstestppd.c:2650 +#: systemv/cupstestppd.c:2667 systemv/cupstestppd.c:2690 +#: systemv/cupstestppd.c:2706 systemv/cupstestppd.c:2744 +#: systemv/cupstestppd.c:2884 systemv/cupstestppd.c:2906 msgid " FAIL\n" msgstr " 失敗\n" -msgid " FAIL\n **FAIL** Unable to open PPD file - %s\n" -msgstr " 失敗\n ** 失敗 ** PPD ファイルを開けません - %s\n" -msgid " FAIL\n **FAIL** Unable to open PPD file - %s on line %d.\n" -msgstr " 失敗\n ** 失敗 ** PPD ファイルを開けません - %s、行 %d\n" + +#: systemv/cupstestppd.c:291 +#, c-format +msgid "" +" FAIL\n" +" **FAIL** Unable to open PPD file - %s\n" +msgstr "" +" 失敗\n" +" **失敗** PPD ファイルを開けません - %s\n" + +#: systemv/cupstestppd.c:302 +#, c-format +msgid "" +" FAIL\n" +" **FAIL** Unable to open PPD file - %s on line %d.\n" +msgstr "" +" 失敗\n" +" **失敗** PPD ファイルを開けません - %s (%d 行)。\n" + +#: systemv/cupstestppd.c:1207 msgid " PASS\n" msgstr " 合格\n" + +#: ppdc/sample.c:51 msgid "#10 Envelope" msgstr "#10 封筒" + +#: ppdc/sample.c:52 msgid "#11 Envelope" msgstr "#11 封筒" + +#: ppdc/sample.c:53 msgid "#12 Envelope" msgstr "#12 封筒" + +#: ppdc/sample.c:54 msgid "#14 Envelope" msgstr "#14 封筒" + +#: ppdc/sample.c:55 msgid "#9 Envelope" msgstr "#9 封筒" + +#: berkeley/lpq.c:553 +#, c-format msgid "%-6s %-10.10s %-4d %-10d %-27.27s %.0f bytes\n" msgstr "%-6s %-10.10s %-4d %-10d %-27.27s %.0f バイト\n" + +#: berkeley/lpq.c:558 +#, c-format msgid "%-7s %-7.7s %-7d %-31.31s %.0f bytes\n" msgstr "%-7s %-7.7s %-7d %-31.31s %.0f バイト\n" + +#: filter/bannertops.c:780 +#, c-format msgid "%.0f x %.0f millimeters" msgstr "%.0f x %.0f ミリメートル" + +#: filter/bannertops.c:801 +#, c-format msgid "%.0f x %.0f to %.0f x %.0f millimeters" -msgstr "%.0f x %.0f 〜 %.0f x %.0f ミリメートル" +msgstr "%.0f x %.0f to %.0f x %.0f ミリメートル" + +#: filter/bannertops.c:771 +#, c-format msgid "%.2f x %.2f inches" msgstr "%.2f x %.2f インチ" + +#: filter/bannertops.c:790 +#, c-format msgid "%.2f x %.2f to %.2f x %.2f inches" -msgstr "%.2f x %.2f 〜 %.2f x %.2f インチ" +msgstr "%.2f x %.2f to %.2f x %.2f インチ" + +#: systemv/lpstat.c:754 +#, c-format msgid "%s accepting requests since %s\n" -msgstr "%s は 以降の要求を受け入れ中 -\n\t%s\n" +msgstr "%s は %s からリクエストを受け付けています\n" + +#: scheduler/ipp.c:10466 +#, c-format msgid "%s cannot be changed." -msgstr "%s を変更できません。" +msgstr "%s は変更できません。" + +#: berkeley/lpc.c:194 +#, c-format msgid "%s is not implemented by the CUPS version of lpc.\n" -msgstr "%s は CUPS 版の lpc では実装されていません。\n" +msgstr "%s は lpc の CUPS バージョンでは実装されていません。\n" + +#: berkeley/lpq.c:644 +#, c-format msgid "%s is not ready\n" msgstr "%s は準備ができていません\n" + +#: berkeley/lpq.c:637 +#, c-format msgid "%s is ready\n" msgstr "%s は準備ができています\n" + +#: berkeley/lpq.c:640 +#, c-format msgid "%s is ready and printing\n" -msgstr "%s は準備ができていてプリント中です\n" -msgid "%s not accepting requests since %s -\n\t%s\n" -msgstr "%s は %s 以降の要求を受け入れません -\n\t%s\n" +msgstr "%s は準備ができており印刷しています\n" + +#: systemv/lpstat.c:757 +#, c-format +msgid "" +"%s not accepting requests since %s -\n" +"\t%s\n" +msgstr "" +"%s は %s からリクエストを受け付けていません\n" +"\t%s\n" + +#: scheduler/ipp.c:689 +#, c-format msgid "%s not supported!" -msgstr "%s には対応していません!" +msgstr "%s はサポートされていません!" + +#: systemv/lpstat.c:767 +#, c-format msgid "%s/%s accepting requests since %s\n" -msgstr "%s/%s は であるため要求を受け入れ中 -\n\t%s\n" -msgid "%s/%s not accepting requests since %s -\n\t%s\n" -msgstr "%s/%s は %s 以降の要求を受け入れません -\n\t%s\n" +msgstr "%s/%s は %s からリクエストを受け付けています\n" + +#: systemv/lpstat.c:770 +#, c-format +msgid "" +"%s/%s not accepting requests since %s -\n" +"\t%s\n" +msgstr "" +"%s/%s は %s からリクエストを受け付けていません\n" +"\t%s\n" + +#: berkeley/lpq.c:545 +#, c-format msgid "%s: %-33.33s [job %d localhost]\n" -msgstr "%s:%-33.33s [ジョブ %d localhost]\n" +msgstr "%s:%-33.33s [ジョブ %d localhost]\n" + +#: systemv/cancel.c:303 systemv/cancel.c:367 +#, c-format msgid "%s: %s failed: %s\n" -msgstr "%s:%s が失敗しました:%s\n" +msgstr "%s: %s に失敗しました: %s\n" + +#: systemv/cupsaccept.c:73 +#, c-format msgid "%s: Don't know what to do!\n" -msgstr "%s:対処方法が不明です!\n" +msgstr "%s: 何が起きているか不明です!\n" + +#: berkeley/lpr.c:356 systemv/lp.c:603 +#, c-format msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "%s:エラー - %s 環境変数名に存在しない送信先“%s”が指定されています!\n" +msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n" + +#: systemv/lp.c:240 +#, c-format msgid "%s: Error - bad job ID!\n" -msgstr "%s:エラー - ジョブ ID が正しくありません!\n" +msgstr "%s: エラー - 不正なジョブ ID です!\n" + +#: systemv/lp.c:227 +#, c-format msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" -msgstr "%s:エラー - ファイルのプリントとジョブの変更を同時にすることはできません!\n" +msgstr "%s: エラー - ファイルを印刷できず、ジョブを同時に変えることができません!\n" + +#: systemv/lp.c:523 +#, c-format msgid "%s: Error - cannot print from stdin if files or a job ID are provided!\n" -msgstr "%s:エラー - ファイルまたはジョブ ID が渡される場合は stdin からプリントできません!\n" +msgstr "%s: エラー - ファイルまたはジョブ ID が提供されている場合、標準入力から印刷できません。 \n" + +#: systemv/lp.c:477 +#, c-format msgid "%s: Error - expected character set after '-S' option!\n" -msgstr "%s:エラー - ‘-S’オプションの後に文字セットが必要です!\n" +msgstr "%s: エラー - '-S' オプションのあとには文字セットが必要です!\n" + +#: systemv/lp.c:497 +#, c-format msgid "%s: Error - expected content type after '-T' option!\n" -msgstr "%s:エラー - ‘-T’オプションの後にコンテンツタイプが必要です!\n" +msgstr "%s: エラー - '-T' オプションのあとにはコンテンツタイプが必要です!\n" + +#: systemv/lp.c:273 +#, c-format msgid "%s: Error - expected copies after '-n' option!\n" -msgstr "%s:エラー - ‘-n’オプションの後に部数が必要です!\n" +msgstr "%s: エラー - '-n' オプションのあとにはコピー数が必要です!\n" + +#: berkeley/lpr.c:251 +#, c-format msgid "%s: Error - expected copy count after '-#' option!\n" -msgstr "%s:エラー - ‘-#’オプションの後に部数が必要です!\n" +msgstr "%s: エラー - '-#' オプションのあとにはコピー数が必要です!\n" + +#: berkeley/lpr.c:219 +#, c-format msgid "%s: Error - expected destination after '-P' option!\n" -msgstr "%s:エラー - ‘-P’オプションの後に送信先が必要です!\n" +msgstr "%s: エラー - '-P' オプションのあとには宛先が必要です!\n" + +#: systemv/lpstat.c:238 +#, c-format msgid "%s: Error - expected destination after '-b' option!\n" -msgstr "%s:エラー - ‘-b’オプションの後に送信先が必要です!\n" +msgstr "%s: エラー - '-b' オプションのあとに宛先が必要です!\n" + +#: systemv/lp.c:145 +#, c-format msgid "%s: Error - expected destination after '-d' option!\n" -msgstr "%s:エラー - ‘-d’オプションの後に送信先が必要です!\n" +msgstr "%s: エラー - '-d' オプションのあとにはプリンター名が必要です!\n" + +#: systemv/lp.c:175 +#, c-format msgid "%s: Error - expected form after '-f' option!\n" -msgstr "%s:エラー - ‘-f’オプションの後にフォームが必要です!\n" +msgstr "%s: エラー - '-f' オプションのあとには用紙名が必要です!\n" + +#: systemv/lp.c:404 +#, c-format msgid "%s: Error - expected hold name after '-H' option!\n" -msgstr "%s:エラー - ‘-H’オプションの後に保留リストの名前が必要です!\n" +msgstr "%s: エラー - '-H' オプションのあとにはホールド名が必要です!\n" + +#: berkeley/lpr.c:111 +#, c-format msgid "%s: Error - expected hostname after '-H' option!\n" -msgstr "%s:エラー - ‘-H’オプションの後にホスト名が必要です!\n" +msgstr "%s: エラー - '-H' オプションのあとにはホスト名が必要です!\n" + +#: berkeley/lpq.c:188 berkeley/lprm.c:130 systemv/cancel.c:130 +#: systemv/cupsaccept.c:131 systemv/lp.c:196 systemv/lpstat.c:298 +#, c-format msgid "%s: Error - expected hostname after '-h' option!\n" -msgstr "%s:エラー - ‘-h’オプションの後にホスト名が必要です!\n" +msgstr "%s: エラー - '-h' オプションのあとにはホスト名が必要です!\n" + +#: systemv/lp.c:382 +#, c-format msgid "%s: Error - expected mode list after '-y' option!\n" -msgstr "%s:エラー - ‘-y’オプションの後にモードリストが必要です!\n" +msgstr "%s: エラー - '-y' オプションのあとにはモードリストが必要です!\n" + +#: berkeley/lpr.c:275 +#, c-format msgid "%s: Error - expected name after '-%c' option!\n" -msgstr "%s:エラー - ‘-%c’オプションの後に名前が必要です!\n" +msgstr "%s: エラー - '-%c' オプションのあとには名前が必要です!\n" + +#: systemv/lp.c:296 +#, c-format msgid "%s: Error - expected option string after '-o' option!\n" -msgstr "%s:エラー - ‘-o’オプションの後にオプション文字列が必要です!\n" +msgstr "%s: エラー - '-o' オプションのあとには文字列が必要です!\n" + +#: systemv/lp.c:456 +#, c-format msgid "%s: Error - expected page list after '-P' option!\n" -msgstr "%s:エラー - ‘-P’オプションの後にページリストが必要です!\n" +msgstr "%s: エラー - '-P' オプションのあとにはページリストが必要です!\n" + +#: systemv/lp.c:317 +#, c-format msgid "%s: Error - expected priority after '-%c' option!\n" -msgstr "%s:エラー - ‘-%c’オプションの後に優先順位が必要です!\n" +msgstr "%s: エラー - '-%c' オプションのあとには優先度が必要です!\n" + +#: systemv/cupsaccept.c:150 +#, c-format msgid "%s: Error - expected reason text after '-r' option!\n" -msgstr "%s:エラー - ‘-r’オプションの後に理由テキストが必要です!\n" +msgstr "%s: エラー - '-r' のあとには理由のテキストが必要です!\n" + +#: systemv/lp.c:364 +#, c-format msgid "%s: Error - expected title after '-t' option!\n" -msgstr "%s:エラー - ‘-t’オプションの後にタイトルが必要です!\n" +msgstr "%s: エラー - '-t' オプションのあとにはタイトルが必要です!\n" + +#: berkeley/lpq.c:117 berkeley/lpr.c:91 berkeley/lprm.c:110 +#: systemv/cancel.c:99 systemv/cupsaccept.c:108 systemv/lp.c:122 +#: systemv/lpadmin.c:471 systemv/lpstat.c:144 +#, c-format msgid "%s: Error - expected username after '-U' option!\n" -msgstr "%s:エラー - ‘-U’オプションの後にユーザ名が必要です!\n" +msgstr "%s: エラー - '-U' オプションのあとにはユーザ名が必要です!\n" + +#: systemv/cancel.c:152 +#, c-format msgid "%s: Error - expected username after '-u' option!\n" -msgstr "%s:エラー - ‘-u’オプションの後にユーザ名が必要です!\n" +msgstr "%s: エラー - '-u' オプションのあとにはユーザ名が必要です!\n" + +#: berkeley/lpr.c:134 +#, c-format msgid "%s: Error - expected value after '-%c' option!\n" -msgstr "%s:エラー - ‘-%c’オプションの後に値が必要です!\n" +msgstr "%s: エラー - '-%c' オプションのあとには値が必要です!\n" + +#: systemv/lpstat.c:164 systemv/lpstat.c:178 +#, c-format msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n" -msgstr "%s:エラー - ‘-W’オプションの後に“completed”、“not-completed”、または“all”が必要です!\n" +msgstr "%s: エラー - '-W' オプションのあとには、\"completed\"、\"not-completed\"、\"all\" のいずれかが必要です!\n" + +#: berkeley/lpr.c:361 systemv/lp.c:608 +#, c-format msgid "%s: Error - no default destination available.\n" -msgstr "%s:エラー - 利用できるデフォルト送信先がありません。\n" +msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n" + +#: systemv/lp.c:340 +#, c-format msgid "%s: Error - priority must be between 1 and 100.\n" -msgstr "%s:エラー - 優先順位は 1 〜 100 でなければなりません。\n" +msgstr "%s: エラー - 優先度は 1 から 100 の間である必要があります。\n" + +#: berkeley/lpr.c:365 systemv/lp.c:612 +#, c-format msgid "%s: Error - scheduler not responding!\n" -msgstr "%s:エラー - スケジューラが応答しません!\n" +msgstr "%s: エラー - スケジューラが応答していません!\n" + +#: berkeley/lpr.c:317 systemv/lp.c:556 +#, c-format msgid "%s: Error - too many files - \"%s\"\n" -msgstr "%s:エラー - ファイルが多すぎます - “%s”\n" +msgstr "%s: エラー - ファイルが多すぎます - \"%s\"\n" + +#: berkeley/lpr.c:299 systemv/lp.c:539 +#, c-format msgid "%s: Error - unable to access \"%s\" - %s\n" -msgstr "%s:エラー - “%s”にアクセスできません - %s\n" +msgstr "%s: エラー - \"%s\" にアクセスできません - %s\n" + +#: berkeley/lpr.c:410 systemv/lp.c:645 +#, c-format msgid "%s: Error - unable to queue from stdin - %s\n" -msgstr "%s:エラー - stdin からキューに入れることはできません - %s\n" +msgstr "%s: エラー - 標準入力からキューにデータを入力できません! - %s\n" + +#: berkeley/lprm.c:93 berkeley/lprm.c:182 systemv/cancel.c:222 +#, c-format msgid "%s: Error - unknown destination \"%s\"!\n" -msgstr "%s:エラー - “%s”は不明な送信先です!\n" +msgstr "%s: エラー - \"%s\" は未知の宛先です!\n" + +#: berkeley/lpq.c:157 +#, c-format msgid "%s: Error - unknown destination \"%s/%s\"!\n" -msgstr "%s:エラー - “%s/%s”は不明な送信先です!\n" +msgstr "%s: エラー - \"%s/%s\" は未知の宛先です!\n" + +#: berkeley/lpr.c:286 berkeley/lprm.c:148 systemv/cancel.c:164 +#: systemv/cupsaccept.c:174 systemv/lp.c:514 systemv/lpstat.c:459 +#, c-format msgid "%s: Error - unknown option '%c'!\n" -msgstr "%s:エラー - ‘-%c’は不明なオプションです!\n" +msgstr "%s: エラー - '%c' は未知のオプションです!\n" + +#: systemv/cupsaccept.c:167 +#, c-format msgid "%s: Error - unknown option '%s'!\n" -msgstr "%s:エラー - ‘-%s’は不明なオプションです!\n" +msgstr "%s: エラー - '%s' は未知のオプションです!\n" + +#: systemv/lp.c:216 +#, c-format msgid "%s: Expected job ID after '-i' option!\n" -msgstr "%s:‘-i’オプションの後にジョブ ID が必要です!\n" +msgstr "%s: '-i' オプションのあとにはジョブ ID が必要です!\n" + +#: scheduler/cupsfilter.c:540 +#, c-format msgid "%s: Filter \"%s\" not available: %s\n" -msgstr "%s: フィルタ“%s”は利用できません:%s\n" +msgstr "%s: フィルタ \"%s\" は利用できません: %s\n" + +#: systemv/lpstat.c:511 systemv/lpstat.c:550 +#, c-format msgid "%s: Invalid destination name in list \"%s\"!\n" -msgstr "%s:リスト“%s”に無効な送信先名があります!\n" +msgstr "%s: リスト \"%s\" に無効な宛先名があります!\n" + +#: scheduler/cupsfilter.c:521 +#, c-format msgid "%s: Invalid filter string \"%s\"\n" -msgstr "%s:“%s”は無効なフィルタ文字列です\n" +msgstr "%s: 無効なフィルタ文字列です \"%s\"\n" + +#: systemv/lp.c:432 +#, c-format msgid "%s: Need job ID ('-i jobid') before '-H restart'!\n" -msgstr "%s:‘-H restart’の前にジョブ ID(‘-i jobid’)が必要です!\n" +msgstr "%s: '-H restart' の前にはジョブ ID ('-i ジョブID') が必要です!\n" + +#: scheduler/cupsfilter.c:436 +#, c-format msgid "%s: No filter to convert from %s/%s to %s/%s!\n" -msgstr "%s:%s/%s から %s/%s に変換するフィルタはありません!\n" +msgstr "%s: %s/%s から %s/%s に変換するフィルタがありません!\n" + +#: systemv/cupsaccept.c:208 +#, c-format msgid "%s: Operation failed: %s\n" -msgstr "%s:操作が失敗しました:%s\n" +msgstr "%s: 操作に失敗しました: %s\n" + +#: berkeley/lpq.c:103 berkeley/lpr.c:77 berkeley/lprm.c:72 systemv/cancel.c:85 +#: systemv/cupsaccept.c:94 systemv/cupsaddsmb.c:91 systemv/lp.c:108 +#: systemv/lpadmin.c:277 systemv/lpinfo.c:94 systemv/lpmove.c:79 +#: systemv/lpstat.c:109 +#, c-format msgid "%s: Sorry, no encryption support compiled in!\n" -msgstr "%s:暗号化サポートがコンパイルされていません!\n" +msgstr "%s: すみません、暗号化サポートはコンパイル時に組み込まれていません!\n" + +#: berkeley/lpq.c:304 scheduler/cupsfilter.c:1073 systemv/cupsaddsmb.c:149 +#: systemv/cupsaddsmb.c:175 +#, c-format msgid "%s: Unable to connect to server\n" -msgstr "%s:サーバに接続できません\n" +msgstr "%s: サーバーに接続できません\n" + +#: systemv/cancel.c:245 systemv/cancel.c:326 +#, c-format msgid "%s: Unable to contact server!\n" -msgstr "%s:サーバに接続できません!\n" +msgstr "%s: サーバーに連絡できません!\n" + +#: scheduler/cupsfilter.c:404 +#, c-format msgid "%s: Unable to determine MIME type of \"%s\"!\n" -msgstr "%s:“%s”の MIME タイプを判断できません!\n" +msgstr "%s: \"%s\" の MIME タイプを判別できません!\n" + +#: ppdc/ppdmerge.cxx:99 +#, c-format msgid "%s: Unable to open %s - %s\n" -msgstr "%s:%s を開けません - %s\n" +msgstr "%s: %s を開けません - %s\n" + +#: ppdc/ppdmerge.cxx:113 +#, c-format msgid "%s: Unable to open %s - %s on line %d.\n" -msgstr "%s:%s を開けません - %s、行 %d\n" +msgstr "%s: %s を開けません。- %s の %d 行目。\n" + +#: ppdc/ppdc-file.cxx:50 +#, c-format msgid "%s: Unable to open %s: %s\n" -msgstr "%s:%s を開けません:%s\n" +msgstr "%s: %sを開けません: %s\n" + +#: scheduler/cupsfilter.c:583 +#, c-format msgid "%s: Unable to open PPD file: %s on line %d\n" -msgstr "%s:PPD ファイルを開けません:%s、行 %d\n" +msgstr "%s: PPD ファイルを開けません: %s の %d 行目\n" + +#: scheduler/cupsfilter.c:377 +#, c-format msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" -msgstr "%s:“%s”または“%s”から MIME データベースを読み取れません!\n" +msgstr "%s: \"%s\" または \"%s\" から MIME データベースを読み取ることができません!\n" + +#: berkeley/lpq.c:161 systemv/lpstat.c:565 +#, c-format msgid "%s: Unknown destination \"%s\"!\n" -msgstr "%s:“%s”は不明な送信先です!\n" +msgstr "%s: \"%s\" は未知の宛先です!\n" + +#: scheduler/cupsfilter.c:415 +#, c-format msgid "%s: Unknown destination MIME type %s/%s!\n" -msgstr "%s:%s/%s は不明な送信先 MIME タイプです!\n" +msgstr "%s: %s/%s は未知の宛先 MIME タイプです!\n" + +#: scheduler/cupsfilter.c:1281 +#, c-format msgid "%s: Unknown option '%c'!\n" -msgstr "%s:‘-%c’は不明なオプションです!\n" +msgstr "%s: '%c' は未知のオプションです!\n" + +#: scheduler/cupsfilter.c:396 +#, c-format msgid "%s: Unknown source MIME type %s/%s!\n" -msgstr "%s:%s/%s は不明な送信元 MIME タイプです!\n" +msgstr "%s: %s/%s は未知のソース MIME タイプです!\n" + +#: berkeley/lpr.c:148 +#, c-format msgid "%s: Warning - '%c' format modifier not supported - output may not be correct!\n" -msgstr "%s:警告 - '%c' フォーマット修飾子には対応していません - 出力が正しくない可能性があります!\n" +msgstr "%s: 警告 - '%c' 形式修飾子はサポートされていません - 出力は正しくないものになるかもしれません!\n" + +#: systemv/lp.c:485 +#, c-format msgid "%s: Warning - character set option ignored!\n" -msgstr "%s:警告 - 文字セットオプションは無視されました!\n" +msgstr "%s: 警告 - 文字セットオプションは無視されます!\n" + +#: systemv/lp.c:505 +#, c-format msgid "%s: Warning - content type option ignored!\n" -msgstr "%s:警告 - コンテンツ・タイプ・オプションは無視されました!\n" +msgstr "%s: 警告 - コンテンツタイプオプションは無視されます!\n" + +#: systemv/lp.c:182 +#, c-format msgid "%s: Warning - form option ignored!\n" -msgstr "%s:警告 - フォームオプションは無視されました!\n" +msgstr "%s: 警告 - 用紙オプションは無視されます!\n" + +#: systemv/lp.c:390 +#, c-format msgid "%s: Warning - mode option ignored!\n" -msgstr "%s:警告 - モードオプションは無視されました!\n" +msgstr "%s: 警告 - モードオプションは無視されます!\n" + +#: berkeley/lpq.c:245 +#, c-format msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "%s:エラー - %s 環境変数名に存在しない送信先“%s”が指定されています!\n" +msgstr "%s: エラー - 環境変数 %s が存在しない宛先 \"%s\" を指しています!\n" + +#: berkeley/lpr.c:162 +#, c-format msgid "%s: error - expected option=value after '-o' option!\n" -msgstr "%s:エラー - ‘-o’オプションの後に option=value が必要です!\n" +msgstr "%s: エラー - '-o' オプションのあとには オプション=値 が必要です!\n" + +#: berkeley/lpq.c:250 +#, c-format msgid "%s: error - no default destination available.\n" -msgstr "%s:エラー - 利用できるデフォルト送信先がありません。\n" +msgstr "%s: エラー - 利用可能なデフォルトの宛先がありません。\n" + +#: ppdc/sample.c:282 msgid "-1" msgstr "-1" + +#: ppdc/sample.c:273 msgid "-10" msgstr "-10" + +#: ppdc/sample.c:365 msgid "-100" msgstr "-100" + +#: ppdc/sample.c:364 msgid "-105" msgstr "-105" + +#: ppdc/sample.c:272 msgid "-11" msgstr "-11" + +#: ppdc/sample.c:363 msgid "-110" msgstr "-110" + +#: ppdc/sample.c:362 msgid "-115" msgstr "-115" + +#: ppdc/sample.c:271 msgid "-12" msgstr "-12" + +#: ppdc/sample.c:361 msgid "-120" msgstr "-120" + +#: ppdc/sample.c:270 msgid "-13" msgstr "-13" + +#: ppdc/sample.c:269 msgid "-14" msgstr "-14" + +#: ppdc/sample.c:268 msgid "-15" msgstr "-15" + +#: ppdc/sample.c:281 msgid "-2" msgstr "-2" + +#: ppdc/sample.c:381 msgid "-20" msgstr "-20" + +#: ppdc/sample.c:380 msgid "-25" msgstr "-25" + +#: ppdc/sample.c:280 msgid "-3" msgstr "-3" + +#: ppdc/sample.c:379 msgid "-30" msgstr "-30" + +#: ppdc/sample.c:378 msgid "-35" msgstr "-35" + +#: ppdc/sample.c:279 msgid "-4" msgstr "-4" + +#: ppdc/sample.c:377 msgid "-40" msgstr "-40" + +#: ppdc/sample.c:376 msgid "-45" msgstr "-45" + +#: ppdc/sample.c:278 msgid "-5" msgstr "-5" + +#: ppdc/sample.c:375 msgid "-50" msgstr "-50" + +#: ppdc/sample.c:374 msgid "-55" msgstr "-55" + +#: ppdc/sample.c:277 msgid "-6" msgstr "-6" + +#: ppdc/sample.c:373 msgid "-60" msgstr "-60" + +#: ppdc/sample.c:372 msgid "-65" msgstr "-65" + +#: ppdc/sample.c:276 msgid "-7" msgstr "-7" + +#: ppdc/sample.c:371 msgid "-70" msgstr "-70" + +#: ppdc/sample.c:370 msgid "-75" msgstr "-75" + +#: ppdc/sample.c:275 msgid "-8" msgstr "-8" + +#: ppdc/sample.c:369 msgid "-80" msgstr "-80" + +#: ppdc/sample.c:368 msgid "-85" msgstr "-85" + +#: ppdc/sample.c:274 msgid "-9" msgstr "-9" + +#: ppdc/sample.c:367 msgid "-90" msgstr "-90" + +#: ppdc/sample.c:366 msgid "-95" msgstr "-95" + +#: ppdc/sample.c:283 msgid "0" msgstr "0" + +#: ppdc/sample.c:284 msgid "1" msgstr "1" + +#: ppdc/sample.c:356 msgid "1 inch/sec." -msgstr "1 インチ/秒" +msgstr "1 インチ/秒" + +#: ppdc/sample.c:144 msgid "1.25x0.25\"" -msgstr "1.25 x 0.25\"" +msgstr "1.25x0.25インチ" + +#: ppdc/sample.c:145 msgid "1.25x2.25\"" -msgstr "1.25 x 2.25\"" +msgstr "1.25x2.25インチ" + +#: ppdc/sample.c:404 msgid "1.5 inch/sec." -msgstr "1.5 インチ/秒" +msgstr "1.5 インチ/秒" + +#: ppdc/sample.c:146 msgid "1.50x0.25\"" -msgstr "1.50 x 0.25\"" +msgstr "1.50x0.25インチ" + +#: ppdc/sample.c:147 msgid "1.50x0.50\"" -msgstr "1.50 x 0.50\"" +msgstr "1.50x0.50インチ" + +#: ppdc/sample.c:148 msgid "1.50x1.00\"" -msgstr "1.50 x 1.00\"" +msgstr "1.50x1.00インチ" + +#: ppdc/sample.c:149 msgid "1.50x2.00\"" -msgstr "1.50 x 2.00\"" +msgstr "1.50x2.00インチ" + +#: ppdc/sample.c:293 msgid "10" msgstr "10" + +#: ppdc/sample.c:415 msgid "10 inches/sec." -msgstr "10 インチ/秒" +msgstr "10 インチ/秒" + +#: ppdc/sample.c:1 msgid "10 x 11\"" -msgstr "10 x 11\"" +msgstr "10 x 11インチ" + +#: ppdc/sample.c:2 msgid "10 x 13\"" -msgstr "10 x 13\"" +msgstr "10 x 13インチ" + +#: ppdc/sample.c:3 msgid "10 x 14\"" -msgstr "10 x 14\"" +msgstr "10 x 14インチ" + +#: ppdc/sample.c:395 msgid "100" msgstr "100" + +#: ppdc/sample.c:306 msgid "100 mm/sec." -msgstr "100 mm/秒" +msgstr "100 ミリメートル/秒" + +#: ppdc/sample.c:396 msgid "105" msgstr "105" + +#: ppdc/sample.c:294 msgid "11" msgstr "11" + +#: ppdc/sample.c:416 msgid "11 inches/sec." -msgstr "11 インチ/秒" +msgstr "11 インチ/秒" + +#: ppdc/sample.c:397 msgid "110" msgstr "110" + +#: ppdc/sample.c:398 msgid "115" msgstr "115" + +#: ppdc/sample.c:295 msgid "12" msgstr "12" + +#: ppdc/sample.c:417 msgid "12 inches/sec." -msgstr "12 インチ/秒" +msgstr "12 インチ/秒" + +#: ppdc/sample.c:4 msgid "12 x 11\"" -msgstr "12 x 11\"" +msgstr "12 x 11インチ" + +#: ppdc/sample.c:399 msgid "120" msgstr "120" + +#: ppdc/sample.c:307 msgid "120 mm/sec." -msgstr "120 mm/秒" +msgstr "120 ミリメートル/秒" + +#: ppdc/sample.c:215 msgid "120x60dpi" -msgstr "120 x 60 dpi" +msgstr "120x60dpi" + +#: ppdc/sample.c:221 msgid "120x72dpi" -msgstr "120 x 72 dpi" +msgstr "120x72dpi" + +#: ppdc/sample.c:296 msgid "13" msgstr "13" + +#: ppdc/sample.c:204 msgid "136dpi" -msgstr "136 dpi" +msgstr "136dpi" + +#: ppdc/sample.c:297 msgid "14" msgstr "14" + +#: ppdc/sample.c:298 msgid "15" msgstr "15" + +#: ppdc/sample.c:300 msgid "15 mm/sec." -msgstr "15 mm/秒" +msgstr "15 ミリメートル/秒" + +#: ppdc/sample.c:5 msgid "15 x 11\"" -msgstr "15 x 11\"" +msgstr "15 x 11インチ" + +#: ppdc/sample.c:308 msgid "150 mm/sec." -msgstr "150 mm/秒" +msgstr "150 ミリメートル/秒" + +#: ppdc/sample.c:254 msgid "150dpi" -msgstr "150 dpi" +msgstr "150dpi" + +#: ppdc/sample.c:340 msgid "16" msgstr "16" + +#: ppdc/sample.c:341 msgid "17" msgstr "17" + +#: ppdc/sample.c:342 msgid "18" msgstr "18" + +#: ppdc/sample.c:216 msgid "180dpi" -msgstr "180 dpi" +msgstr "180dpi" + +#: ppdc/sample.c:343 msgid "19" msgstr "19" + +#: ppdc/sample.c:285 msgid "2" msgstr "2" + +#: ppdc/sample.c:357 msgid "2 inches/sec." -msgstr "2 インチ/秒" +msgstr "2 インチ/秒" + +#: ppdc/sample.c:242 msgid "2-Sided Printing" msgstr "両面印刷" + +#: ppdc/sample.c:150 msgid "2.00x0.37\"" -msgstr "2.00 x 0.37\"" +msgstr "2.00x0.37インチ" + +#: ppdc/sample.c:151 msgid "2.00x0.50\"" -msgstr "2.00 x 0.50\"" +msgstr "2.00x0.50インチ" + +#: ppdc/sample.c:152 msgid "2.00x1.00\"" -msgstr "2.00 x 1.00\"" +msgstr "2.00x1.00インチ" + +#: ppdc/sample.c:153 msgid "2.00x1.25\"" -msgstr "2.00 x 1.25\"" +msgstr "2.00x1.25インチ" + +#: ppdc/sample.c:154 msgid "2.00x2.00\"" -msgstr "2.00 x 2.00\"" +msgstr "2.00x2.00インチ" + +#: ppdc/sample.c:155 msgid "2.00x3.00\"" -msgstr "2.00 x 3.00\"" +msgstr "2.00x3.00インチ" + +#: ppdc/sample.c:156 msgid "2.00x4.00\"" -msgstr "2.00 x 4.00\"" +msgstr "2.00x4.00インチ" + +#: ppdc/sample.c:157 msgid "2.00x5.50\"" -msgstr "2.00 x 5.50\"" +msgstr "2.00x5.50インチ" + +#: ppdc/sample.c:158 msgid "2.25x0.50\"" -msgstr "2.25 x 0.50\"" +msgstr "2.25x0.50インチ" + +#: ppdc/sample.c:159 msgid "2.25x1.25\"" -msgstr "2.25 x 1.50\"" +msgstr "2.25x1.25インチ" + +#: ppdc/sample.c:160 msgid "2.25x4.00\"" -msgstr "2.25 x 4.00\"" +msgstr "2.25x4.00インチ" + +#: ppdc/sample.c:161 msgid "2.25x5.50\"" -msgstr "2.25 x 5.50\"" +msgstr "2.25x5.50インチ" + +#: ppdc/sample.c:162 msgid "2.38x5.50\"" -msgstr "2.38 x 5.50\"" +msgstr "2.38x5.50インチ" + +#: ppdc/sample.c:405 msgid "2.5 inches/sec." -msgstr "2.5 インチ/秒" +msgstr "2.5 インチ/秒" + +#: ppdc/sample.c:163 msgid "2.50x1.00\"" -msgstr "2.50 x 1.00\"" +msgstr "2.50x1.00インチ" + +#: ppdc/sample.c:164 msgid "2.50x2.00\"" -msgstr "2.50 x 2.00\"" +msgstr "2.50x2.00インチ" + +#: ppdc/sample.c:165 msgid "2.75x1.25\"" -msgstr "2.75 x 1.25\"" +msgstr "2.75x1.25インチ" + +#: ppdc/sample.c:166 msgid "2.9 x 1\"" -msgstr "2.9 x 1\"" +msgstr "2.9 x 1インチ" + +#: ppdc/sample.c:344 msgid "20" msgstr "20" + +#: ppdc/sample.c:301 msgid "20 mm/sec." -msgstr "20 mm/秒" +msgstr "20 ミリメートル/秒" + +#: ppdc/sample.c:309 msgid "200 mm/sec." -msgstr "200 mm/秒" +msgstr "200 ミリメートル/秒" + +#: ppdc/sample.c:205 msgid "203dpi" -msgstr "203 dpi" +msgstr "203dpi" + +#: ppdc/sample.c:345 msgid "21" msgstr "21" + +#: ppdc/sample.c:346 msgid "22" msgstr "22" + +#: ppdc/sample.c:347 msgid "23" msgstr "23" + +#: ppdc/sample.c:348 msgid "24" msgstr "24" + +#: ppdc/sample.c:213 msgid "24-Pin Series" -msgstr "24 ピンシリーズ" +msgstr "24ピンシリーズ" + +#: ppdc/sample.c:222 msgid "240x72dpi" -msgstr "240 x 72 dpi" +msgstr "240x72dpi" + +#: ppdc/sample.c:349 msgid "25" msgstr "25" + +#: ppdc/sample.c:310 msgid "250 mm/sec." -msgstr "250 mm/秒" +msgstr "250 ミリメートル/秒" + +#: ppdc/sample.c:350 msgid "26" msgstr "26" + +#: ppdc/sample.c:351 msgid "27" msgstr "27" + +#: ppdc/sample.c:352 msgid "28" msgstr "28" + +#: ppdc/sample.c:353 msgid "29" msgstr "29" + +#: ppdc/sample.c:286 msgid "3" msgstr "3" + +#: ppdc/sample.c:358 msgid "3 inches/sec." -msgstr "3 インチ/秒" +msgstr "3 インチ/秒" + +#: ppdc/sample.c:167 msgid "3.00x1.00\"" -msgstr "3.00 x 1.00\"" +msgstr "3.00x1.00インチ" + +#: ppdc/sample.c:168 msgid "3.00x1.25\"" -msgstr "3.00 x 1.25\"" +msgstr "3.00x1.25インチ" + +#: ppdc/sample.c:169 msgid "3.00x2.00\"" -msgstr "3.00 x 2.00\"" +msgstr "3.00x2.00インチ" + +#: ppdc/sample.c:170 msgid "3.00x3.00\"" -msgstr "3.00 x 3.00\"" +msgstr "3.00x3.00インチ" + +#: ppdc/sample.c:171 msgid "3.00x5.00\"" -msgstr "3.00 x 5.00\"" +msgstr "3.00x5.00インチ" + +#: ppdc/sample.c:172 msgid "3.25x2.00\"" -msgstr "3.25 x 2.00\"" +msgstr "3.25x2.00インチ" + +#: ppdc/sample.c:173 msgid "3.25x5.00\"" -msgstr "3.25 x 5.00\"" +msgstr "3.25x5.00インチ" + +#: ppdc/sample.c:174 msgid "3.25x5.50\"" -msgstr "3.25 x 5.50\"" +msgstr "3.25x5.50インチ" + +#: ppdc/sample.c:175 msgid "3.25x5.83\"" -msgstr "3.25 x 5.83\"" +msgstr "3.25x5.83インチ" + +#: ppdc/sample.c:176 msgid "3.25x7.83\"" -msgstr "3.25 x 7.83\"" +msgstr "3.25x7.83インチ" + +#: ppdc/sample.c:134 msgid "3.5\" Disk" -msgstr "3.5\" ディスク" +msgstr "3.5 インチDisk" + +#: ppdc/sample.c:143 msgid "3.5\" Disk - 2 1/8 x 2 3/4\"" -msgstr "3.5\" ディスク - 2 1/8 x 2 3/4\"" +msgstr "3.5インチ Disk - 2 1/8 x 2 3/4インチ" + +#: ppdc/sample.c:177 msgid "3.50x1.00\"" -msgstr "3.50 x 1.00\"" +msgstr "3.50x1.00インチ" + +#: ppdc/sample.c:354 msgid "30" msgstr "30" + +#: ppdc/sample.c:302 msgid "30 mm/sec." -msgstr "30 mm/秒" +msgstr "30 ミリメートル/秒" + +#: ppdc/sample.c:311 msgid "300 mm/sec." -msgstr "300 mm/秒" +msgstr "300 ミリメートル/秒" + +#: ppdc/sample.c:206 msgid "300dpi" -msgstr "300 dpi" +msgstr "300dpi" + +#: ppdc/sample.c:382 msgid "35" msgstr "35" + +#: ppdc/sample.c:218 msgid "360dpi" -msgstr "360 dpi" +msgstr "360dpi" + +#: ppdc/sample.c:217 msgid "360x180dpi" -msgstr "360 x 180 dpi" +msgstr "360x180dpi" + +#: ppdc/sample.c:287 msgid "4" msgstr "4" + +#: ppdc/sample.c:359 msgid "4 inches/sec." -msgstr "4 インチ/秒" +msgstr "4 インチ/秒" + +#: ppdc/sample.c:178 msgid "4.00x1.00\"" -msgstr "4.00 x 1.00\"" +msgstr "4.00x1.00インチ" + +#: ppdc/sample.c:186 msgid "4.00x13.00\"" -msgstr "4.00 x 13.00\"" +msgstr "4.00x13.00インチ" + +#: ppdc/sample.c:179 msgid "4.00x2.00\"" -msgstr "4.00 x 2.00\"" +msgstr "4.00x2.00インチ" + +#: ppdc/sample.c:180 msgid "4.00x2.50\"" -msgstr "4.00 x 2.50\"" +msgstr "4.00x2.50インチ" + +#: ppdc/sample.c:181 msgid "4.00x3.00\"" -msgstr "4.00 x 3.00\"" +msgstr "4.00x3.00インチ" + +#: ppdc/sample.c:182 msgid "4.00x4.00\"" -msgstr "4.00 x 4.00\"" +msgstr "4.00x4.00インチ" + +#: ppdc/sample.c:183 msgid "4.00x5.00\"" -msgstr "4.00 x 5.00\"" +msgstr "4.00x5.00インチ" + +#: ppdc/sample.c:184 msgid "4.00x6.00\"" -msgstr "4.00 x 6.00\"" +msgstr "4.00x6.00インチ" + +#: ppdc/sample.c:185 msgid "4.00x6.50\"" -msgstr "4.00 x 6.50\"" +msgstr "4.00x6.50インチ" + +#: ppdc/sample.c:383 msgid "40" msgstr "40" + +#: ppdc/sample.c:303 msgid "40 mm/sec." -msgstr "40 mm/秒" +msgstr "40 ミリメートル/秒" + +#: ppdc/sample.c:384 msgid "45" msgstr "45" + +#: ppdc/sample.c:288 msgid "5" msgstr "5" + +#: ppdc/sample.c:409 msgid "5 inches/sec." -msgstr "5 インチ/秒" +msgstr "5 インチ/秒" + +#: ppdc/sample.c:385 msgid "50" msgstr "50" + +#: ppdc/sample.c:386 msgid "55" msgstr "55" + +#: ppdc/sample.c:289 msgid "6" msgstr "6" + +#: ppdc/sample.c:410 msgid "6 inches/sec." -msgstr "6 インチ/秒" +msgstr "6 インチ/秒" + +#: ppdc/sample.c:187 msgid "6.00x1.00\"" -msgstr "6.00 x 1.00\"" +msgstr "6.00x1.00\"" + +#: ppdc/sample.c:188 msgid "6.00x2.00\"" -msgstr "6.00 x 2.00\"" +msgstr "6.00x2.00\"" + +#: ppdc/sample.c:189 msgid "6.00x3.00\"" -msgstr "6.00 x 3.00\"" +msgstr "6.00x3.00\"" + +#: ppdc/sample.c:190 msgid "6.00x4.00\"" -msgstr "6.00 x 4.00\"" +msgstr "6.00x4.00\"" + +#: ppdc/sample.c:191 msgid "6.00x5.00\"" -msgstr "6.00 x 5.00\"" +msgstr "6.00x5.00\"" + +#: ppdc/sample.c:192 msgid "6.00x6.00\"" -msgstr "6.00 x 6.00\"" +msgstr "6.00x6.00\"" + +#: ppdc/sample.c:193 msgid "6.00x6.50\"" -msgstr "6.00 x 6.50\"" +msgstr "6.00x6.50\"" + +#: ppdc/sample.c:387 msgid "60" msgstr "60" + +#: ppdc/sample.c:304 msgid "60 mm/sec." -msgstr "60 mm/秒" +msgstr "60 mm/秒" + +#: ppdc/sample.c:255 msgid "600 DPI Grayscale" -msgstr "600 DPI グレイスケール" +msgstr "600 DPI グレースケール" + +#: ppdc/sample.c:233 msgid "600dpi" -msgstr "600 dpi" +msgstr "600dpi" + +#: ppdc/sample.c:214 msgid "60dpi" -msgstr "60 dpi" +msgstr "60dpi" + +#: ppdc/sample.c:220 msgid "60x720dpi" -msgstr "60 x 720 dpi" +msgstr "60x720dpi" + +#: ppdc/sample.c:388 msgid "65" msgstr "65" + +#: ppdc/sample.c:290 msgid "7" msgstr "7" + +#: ppdc/sample.c:412 msgid "7 inches/sec." -msgstr "7 インチ/秒" +msgstr "7 インチ/秒" + +#: ppdc/sample.c:6 msgid "7 x 9\"" msgstr "7 x 9\"" + +#: ppdc/sample.c:389 msgid "70" msgstr "70" + +#: ppdc/sample.c:224 msgid "720dpi" -msgstr "720 dpi" +msgstr "720dpi" + +#: ppdc/sample.c:390 msgid "75" msgstr "75" + +#: ppdc/sample.c:291 msgid "8" msgstr "8" + +#: ppdc/sample.c:413 msgid "8 inches/sec." -msgstr "8 インチ/秒" +msgstr "8 インチ/秒" + +#: ppdc/sample.c:7 msgid "8 x 10\"" msgstr "8 x 10\"" + +#: ppdc/sample.c:194 msgid "8.00x1.00\"" -msgstr "8.00 x 1.00\"" +msgstr "8.00x1.00\"" + +#: ppdc/sample.c:195 msgid "8.00x2.00\"" -msgstr "8.00 x 2.00\"" +msgstr "8.00x2.00\"" + +#: ppdc/sample.c:196 msgid "8.00x3.00\"" -msgstr "8.00 x 3.00\"" +msgstr "8.00x3.00\"" + +#: ppdc/sample.c:197 msgid "8.00x4.00\"" -msgstr "8.00 x 4.00\"" +msgstr "8.00x4.00\"" + +#: ppdc/sample.c:198 msgid "8.00x5.00\"" -msgstr "8.00 x 5.00\"" +msgstr "8.00x5.00\"" + +#: ppdc/sample.c:199 msgid "8.00x6.00\"" -msgstr "8.00 x 6.00\"" +msgstr "8.00x6.00\"" + +#: ppdc/sample.c:200 msgid "8.00x6.50\"" -msgstr "8.00 x 6.50\"" +msgstr "8.00x6.50\"" + +#: ppdc/sample.c:391 msgid "80" msgstr "80" + +#: ppdc/sample.c:305 msgid "80 mm/sec." -msgstr "80 mm/秒" +msgstr "80 mm/秒" + +#: ppdc/sample.c:392 msgid "85" msgstr "85" + +#: ppdc/sample.c:292 msgid "9" msgstr "9" + +#: ppdc/sample.c:414 msgid "9 inches/sec." -msgstr "9 インチ/秒" +msgstr "9 インチ/秒" + +#: ppdc/sample.c:8 msgid "9 x 11\"" msgstr "9 x 11\"" + +#: ppdc/sample.c:9 msgid "9 x 12\"" msgstr "9 x 12\"" + +#: ppdc/sample.c:219 msgid "9-Pin Series" -msgstr "9 ピンシリーズ" +msgstr "9-Pin Series" + +#: ppdc/sample.c:393 msgid "90" msgstr "90" + +#: ppdc/sample.c:394 msgid "95" msgstr "95" + +#: berkeley/lpc.c:218 msgid "?Invalid help command unknown\n" -msgstr "?無効なヘルプコマンド 不明\n" +msgstr "?無効なヘルプコマンドです\n" + +#: cgi-bin/admin.c:2331 msgid "A Samba password is required to export printer drivers!" -msgstr "プリンタドライバを書き出すには Samba パスワードが必要です!" +msgstr "プリンタードライバーをエクスポートするには Samba のパスワードが必要です!" + +#: cgi-bin/admin.c:2327 msgid "A Samba username is required to export printer drivers!" -msgstr "プリンタドライバを書き出すには Samba ユーザ名が必要です!" +msgstr "プリンタードライバーをエクスポートするには、Samba のユーザー名が必要です!" + +#: scheduler/ipp.c:2378 +#, c-format msgid "A class named \"%s\" already exists!" -msgstr "“%s”という名前のクラスはすでに存在します!" +msgstr "\"%s\" という名前のクラスはすでに存在します!" + +#: scheduler/ipp.c:1001 +#, c-format msgid "A printer named \"%s\" already exists!" -msgstr "“%s”という名前のプリンタはすでに存在します!" +msgstr "\"%s\" という名前のプリンターはすでに存在します!" + +#: ppdc/sample.c:10 msgid "A0" msgstr "A0" + +#: ppdc/sample.c:11 msgid "A1" msgstr "A1" + +#: ppdc/sample.c:24 msgid "A10" msgstr "A10" + +#: ppdc/sample.c:12 msgid "A2" msgstr "A2" + +#: ppdc/sample.c:13 msgid "A3" msgstr "A3" + +#: ppdc/sample.c:14 msgid "A3 (Oversize)" -msgstr "A3(特大)" +msgstr "A3 (特大)" + +#: ppdc/sample.c:15 msgid "A4" msgstr "A4" + +#: ppdc/sample.c:16 msgid "A4 (Oversize)" -msgstr "A4(特大)" +msgstr "A4 (特大)" + +#: ppdc/sample.c:17 msgid "A4 (Small)" -msgstr "A4(小)" +msgstr "A4 (小)" + +#: ppdc/sample.c:18 msgid "A5" msgstr "A5" + +#: ppdc/sample.c:19 msgid "A5 (Oversize)" -msgstr "A5(特大)" +msgstr "A5 (特大)" + +#: ppdc/sample.c:20 msgid "A6" msgstr "A6" + +#: ppdc/sample.c:21 msgid "A7" msgstr "A7" + +#: ppdc/sample.c:22 msgid "A8" msgstr "A8" + +#: ppdc/sample.c:23 msgid "A9" msgstr "A9" + +#: ppdc/sample.c:25 msgid "ANSI A" msgstr "ANSI A" + +#: ppdc/sample.c:26 msgid "ANSI B" msgstr "ANSI B" + +#: ppdc/sample.c:27 msgid "ANSI C" msgstr "ANSI C" + +#: ppdc/sample.c:28 msgid "ANSI D" msgstr "ANSI D" + +#: ppdc/sample.c:29 msgid "ANSI E" msgstr "ANSI E" + +#: ppdc/sample.c:30 msgid "ARCH A" msgstr "ARCH A" + +#: ppdc/sample.c:31 msgid "ARCH B" msgstr "ARCH B" + +#: ppdc/sample.c:32 msgid "ARCH C" msgstr "ARCH C" + +#: ppdc/sample.c:33 msgid "ARCH D" msgstr "ARCH D" + +#: ppdc/sample.c:34 msgid "ARCH E" msgstr "ARCH E" + +#: cgi-bin/classes.c:154 cgi-bin/printers.c:157 msgid "Accept Jobs" -msgstr "ジョブを受け入れる" +msgstr "ジョブの受け付け" + +#: cups/http-support.c:1194 msgid "Accepted" -msgstr "受け入れ済み" +msgstr "受け付けました" + +#: cgi-bin/admin.c:480 msgid "Add Class" -msgstr "クラスを追加" +msgstr "クラスの追加" + +#: cgi-bin/admin.c:772 msgid "Add Printer" -msgstr "プリンタを追加" +msgstr "プリンターの追加" + +#: cgi-bin/admin.c:355 cgi-bin/admin.c:388 cgi-bin/admin.c:436 +#: cgi-bin/admin.c:446 msgid "Add RSS Subscription" -msgstr "RSS 照会先を追加" +msgstr "RSS 購読を追加" + +#: ppdc/sample.c:126 msgid "Address" -msgstr "住所" +msgstr "アドレス" + +#: ppdc/sample.c:135 msgid "Address - 1 1/8 x 3 1/2\"" -msgstr "住所 - 1 1/8 x 3 1/2\"" +msgstr "アドレス - 1 1/8 x 3 1/2\"" + +#: cgi-bin/admin.c:187 cgi-bin/admin.c:218 cgi-bin/admin.c:2749 msgid "Administration" msgstr "管理" + +#: ppdc/sample.c:401 msgid "Always" -msgstr "常に" +msgstr "常に有効" + +#: backend/socket.c:126 msgid "AppSocket/HP JetDirect" -msgstr "AppSocket/HP JetDirect" +msgstr "AppSocket/HP JetDirect" + +#: ppdc/sample.c:422 msgid "Applicator" -msgstr "アプリケータ" +msgstr "アプリケーター" + +#: scheduler/ipp.c:1123 +#, c-format msgid "Attempt to set %s printer-state to bad value %d!" -msgstr "%s printer-state に不正な値 %d を設定しようとしています!" +msgstr "%s printer-state に 不正な値 %d を設定しようとしています!" + +#: scheduler/ipp.c:331 +#, c-format msgid "Attribute groups are out of order (%x < %x)!" -msgstr "属性グループの順序が正しくありません(%x < %x)!" +msgstr "属性グループは範囲外です (%x < %x)!" + +#: ppdc/sample.c:35 msgid "B0" msgstr "B0" + +#: ppdc/sample.c:37 msgid "B1" msgstr "B1" + +#: ppdc/sample.c:36 msgid "B10" msgstr "B10" + +#: ppdc/sample.c:38 msgid "B2" msgstr "B2" + +#: ppdc/sample.c:39 msgid "B3" msgstr "B3" + +#: ppdc/sample.c:40 msgid "B4" msgstr "B4" + +#: ppdc/sample.c:41 msgid "B5" msgstr "B5" + +#: ppdc/sample.c:42 msgid "B6" msgstr "B6" + +#: ppdc/sample.c:43 msgid "B7" msgstr "B7" + +#: ppdc/sample.c:44 msgid "B8" msgstr "B8" + +#: ppdc/sample.c:45 msgid "B9" msgstr "B9" + +#: cups/dest.c:317 msgid "Bad NULL dests pointer" -msgstr "NULL 送信先サーバポインタは正しくありません" +msgstr "不正な NULL 送信先ポインター" + +#: cups/ppd.c:341 msgid "Bad OpenGroup" -msgstr "OpenGroup が正しくありません" +msgstr "不正な OpenGroup" + +#: cups/ppd.c:343 msgid "Bad OpenUI/JCLOpenUI" -msgstr "OpenUI/JCLOpenUI が正しくありません" +msgstr "不正な OpenUI/JCLOpenUI" + +#: cups/ppd.c:345 msgid "Bad OrderDependency" -msgstr "OrderDependency が正しくありません" +msgstr "不正な OrderDependency" + +#: cups/http-support.c:1209 msgid "Bad Request" -msgstr "Request が正しくありません" +msgstr "不正なリクエスト" + +#: cups/snmp.c:1001 msgid "Bad SNMP version number" -msgstr "SNMP バージョン番号が正しくありません" +msgstr "不正な SNMP バージョン番号" + +#: cups/ppd.c:346 msgid "Bad UIConstraints" -msgstr "UIConstraints が正しくありません" +msgstr "不正な UIConstraints" + +#: scheduler/ipp.c:1423 +#, c-format msgid "Bad copies value %d." -msgstr "部数値 %d が正しくありません。" +msgstr "%d は不正なコピー値です。" + +#: cups/ppd.c:354 msgid "Bad custom parameter" -msgstr "カスタムパラメータが正しくありません" +msgstr "不正なカスタムパラメーター" + +#: cups/http-support.c:1333 +#, c-format msgid "Bad device URI \"%s\"!\n" -msgstr "デバイス URI “%s”が正しくありません!\n" +msgstr "\"%s\" は無効なデバイス URI です!\n" + +#: scheduler/ipp.c:2496 +#, c-format msgid "Bad device-uri \"%s\"!" -msgstr "device-uri “%s”が正しくありません!" +msgstr "\"%s\" は無効な device-uri です!" + +#: scheduler/ipp.c:2536 +#, c-format msgid "Bad device-uri scheme \"%s\"!" -msgstr "device-uri スキーム“%s”が正しくありません!" +msgstr "\"%s\" は無効な device-uri スキーマです!" + +#: scheduler/ipp.c:9887 scheduler/ipp.c:11362 +#, c-format msgid "Bad document-format \"%s\"!" -msgstr "document-format “%s”が正しくありません!" +msgstr "\"%s\" は不正な document-format です!" + +#: cups/util.c:936 msgid "Bad filename buffer!" -msgstr "ファイル名バッファが正しくありません!" +msgstr "不正なファイル名バッファーです!" + +#: ppdc/ppdc-import.cxx:230 +#, c-format msgid "Bad font attribute: %s\n" -msgstr "フォント属性が正しくありません:%s\n" +msgstr "不正なフォント属性: %s\n" + +#: scheduler/ipp.c:10482 msgid "Bad job-priority value!" -msgstr "job-priority 値が正しくありません!" +msgstr "不正な job-priority 値です!" + +#: scheduler/ipp.c:1453 +#, c-format msgid "Bad job-sheets value \"%s\"!" -msgstr "job-sheets 値“%s”が正しくありません!" +msgstr "\"%s\" は不正な job-sheets 値です!" + +#: scheduler/ipp.c:1437 msgid "Bad job-sheets value type!" -msgstr "job-sheets 値タイプが正しくありません!" +msgstr "不正な job-sheets 値タイプ です!" + +#: scheduler/ipp.c:10512 msgid "Bad job-state value!" -msgstr "job-state 値が正しくありません!" +msgstr "不正な job-state 値です!" + +#: scheduler/ipp.c:3656 scheduler/ipp.c:4017 scheduler/ipp.c:6622 +#: scheduler/ipp.c:6764 scheduler/ipp.c:8034 scheduler/ipp.c:8315 +#: scheduler/ipp.c:9158 scheduler/ipp.c:9383 scheduler/ipp.c:9800 +#: scheduler/ipp.c:10375 +#, c-format msgid "Bad job-uri attribute \"%s\"!" -msgstr "job-uri 属性“%s”が正しくありません!" +msgstr "\"%s\" は無効な job-uri 属性です!" + +#: scheduler/ipp.c:2117 scheduler/ipp.c:6169 +#, c-format msgid "Bad notify-pull-method \"%s\"!" -msgstr "notify-pull-method “%s”が正しくありません!" +msgstr "\"%s\" は無効な notify-pull-method です!" + +#: scheduler/ipp.c:2081 scheduler/ipp.c:6133 +#, c-format msgid "Bad notify-recipient-uri URI \"%s\"!" -msgstr "notify-recipient-uri URI “%s”が正しくありません!" +msgstr "URI \"%s\" は不正な notify-recipient-uri です!" + +#: scheduler/ipp.c:1469 +#, c-format msgid "Bad number-up value %d." -msgstr "number-up 値 %d が正しくありません。" +msgstr "%d は不正な number-up 値です。" + +#: cups/adminutil.c:303 +#, c-format msgid "Bad option + choice on line %d!" -msgstr "行 %d のオプションと選択が正しくありません!" +msgstr "%d 行に不正なオプションと選択があります!" + +#: scheduler/ipp.c:1486 +#, c-format msgid "Bad page-ranges values %d-%d." -msgstr "page-ranges 値 %d 〜 %d が正しくありません。" +msgstr "%d-%d は不正な page-ranges 値です。" + +#: scheduler/ipp.c:2580 +#, c-format msgid "Bad port-monitor \"%s\"!" -msgstr "port-monitor “%s”が正しくありません!" +msgstr "\"%s\" は無効な port-monitor です!" + +#: scheduler/ipp.c:2628 +#, c-format msgid "Bad printer-state value %d!" -msgstr "printer-state 値 %d が正しくありません!" +msgstr "%d は無効な printer-state 値です!" + +#: scheduler/ipp.c:298 +#, c-format msgid "Bad request version number %d.%d!" -msgstr "要求バージョン番号 %d.%d が正しくありません!" +msgstr "バージョン番号 %d.%d は無効なリクエストです!" + +#: cgi-bin/admin.c:1377 msgid "Bad subscription ID!" -msgstr "照会先 ID が正しくありません!" +msgstr "不正なサブスクリプション ID です!" + +#: cgi-bin/admin.c:3289 cgi-bin/admin.c:3512 msgid "Banners" msgstr "バナー" + +#: filter/bannertops.c:662 msgid "Billing Information: " -msgstr "請求情報:" +msgstr "課金情報: " + +#: ppdc/sample.c:259 msgid "Bond Paper" msgstr "ボンド紙" + +#: ppdc/sample.c:56 msgid "C0 Envelope" -msgstr "C0 封筒" +msgstr "C0 Envelope" + +#: ppdc/sample.c:57 msgid "C1 Envelope" -msgstr "C1 封筒" +msgstr "C1 Envelope" + +#: ppdc/sample.c:58 msgid "C2 Envelope" -msgstr "C2 封筒" +msgstr "C2 Envelope" + +#: ppdc/sample.c:59 msgid "C3 Envelope" -msgstr "C3 封筒" +msgstr "C3 Envelope" + +#: ppdc/sample.c:46 msgid "C4" msgstr "C4" + +#: ppdc/sample.c:60 msgid "C4 Envelope" -msgstr "C4 封筒" +msgstr "C4 Envelope" + +#: ppdc/sample.c:47 msgid "C5" msgstr "C5" + +#: ppdc/sample.c:61 msgid "C5 Envelope" -msgstr "C5 封筒" +msgstr "C5 Envelope" + +#: ppdc/sample.c:48 msgid "C6" msgstr "C6" + +#: ppdc/sample.c:63 msgid "C6 Envelope" -msgstr "C6 封筒" +msgstr "C6 Envelope" + +#: ppdc/sample.c:62 msgid "C65 Envelope" -msgstr "C65 封筒" +msgstr "C65 Envelope" + +#: ppdc/sample.c:64 msgid "C7 Envelope" -msgstr "C7 封筒" +msgstr "C7 Envelope" + +#: ppdc/sample.c:226 msgid "CMYK" msgstr "CMYK" + +#: ppdc/sample.c:335 msgid "CPCL Label Printer" -msgstr "CPCL ラベルプリンタ" +msgstr "CPCL Label Printer" + +#: cgi-bin/admin.c:1378 cgi-bin/admin.c:1417 cgi-bin/admin.c:1427 msgid "Cancel RSS Subscription" -msgstr "RSS 照会先をキャンセル" +msgstr "RSS 購読をキャンセル" + +#: cgi-bin/admin.c:1596 cgi-bin/admin.c:1760 cgi-bin/admin.c:1772 +#: cgi-bin/admin.c:1783 msgid "Change Settings" -msgstr "設定を変更" +msgstr "設定の変更" + +#: scheduler/ipp.c:2129 scheduler/ipp.c:6181 +#, c-format msgid "Character set \"%s\" not supported!" -msgstr "文字セット“%s”には対応していません!" +msgstr "文字セット \"%s\" はサポートされていません!" + +#: ppdc/sample.c:65 msgid "Chou3 Envelope" -msgstr "長 3 封筒" +msgstr "封筒 長形3号" + +#: ppdc/sample.c:66 msgid "Chou4 Envelope" -msgstr "長 4 封筒" +msgstr "封筒 長形4号" + +#: cgi-bin/classes.c:180 cgi-bin/classes.c:307 msgid "Classes" msgstr "クラス" + +#: cgi-bin/printers.c:167 msgid "Clean Print Heads" -msgstr "印字ヘッドを清掃" +msgstr "プリントヘッドクリーニング" + +#: ppdc/sample.c:253 msgid "Color" msgstr "カラー" + +#: ppdc/sample.c:225 msgid "Color Mode" msgstr "カラーモード" -msgid "Commands may be abbreviated. Commands are:\n\nexit help quit status ?\n" -msgstr "コマンドは短縮形でもかまいません。コマンド:\n\nexit help quit status ?\n" + +#: berkeley/lpc.c:209 +msgid "" +"Commands may be abbreviated. Commands are:\n" +"\n" +"exit help quit status ?\n" +msgstr "" +"コマンドは短縮できます。 コマンド:\n" +"\n" +"exit help quit status ?\n" + +#: cups/snmp.c:1005 msgid "Community name uses indefinite length" -msgstr "コミュニティ名に使われている長さが不定です" +msgstr "コミュニティ名の長さが不定" + +#: cups/http-support.c:1182 msgid "Continue" -msgstr "続ける" +msgstr "継続" + +#: ppdc/sample.c:337 msgid "Continuous" msgstr "連続" + +#: scheduler/ipp.c:8608 scheduler/ipp.c:8624 scheduler/ipp.c:9903 +#, c-format msgid "Could not scan type \"%s\"!" -msgstr "タイプ“%s”をスキャンできませんでした!" +msgstr "タイプ \"%s\" を検査できませんでした!" + +#: backend/ipp.c:1668 msgid "Cover open." msgstr "カバーが開いています。" + +#: cups/http-support.c:1191 msgid "Created" -msgstr "作成済み" +msgstr "ジョブ作成" + +#: filter/bannertops.c:850 msgid "Created On: " -msgstr "作成日時:" +msgstr "ジョブ作成日: " + +#: cups/ppd.c:1068 cups/ppd.c:1108 cups/ppd.c:1322 cups/ppd.c:1425 msgid "Custom" msgstr "カスタム" + +#: ppdc/sample.c:331 msgid "CustominCutInterval" msgstr "CustominCutInterval" + +#: ppdc/sample.c:329 msgid "CustominTearInterval" msgstr "CustominTearInterval" + +#: ppdc/sample.c:315 msgid "Cut" msgstr "カット" + +#: ppdc/sample.c:423 msgid "Cutter" msgstr "カッター" + +#: ppdc/sample.c:49 msgid "DL" msgstr "DL" + +#: ppdc/sample.c:67 msgid "DL Envelope" -msgstr "DL 封筒" +msgstr "DL Envelope" + +#: ppdc/sample.c:211 msgid "Dark" msgstr "濃い" + +#: ppdc/sample.c:207 msgid "Darkness" msgstr "濃さ" + +#: cgi-bin/admin.c:2056 cgi-bin/admin.c:2067 cgi-bin/admin.c:2112 msgid "Delete Class" -msgstr "クラスを削除" +msgstr "クラスの削除" + +#: cgi-bin/admin.c:2141 cgi-bin/admin.c:2152 cgi-bin/admin.c:2197 msgid "Delete Printer" -msgstr "プリンタを削除" +msgstr "プリンターの削除" + +#: filter/bannertops.c:731 msgid "Description: " -msgstr "説明:" +msgstr "説明: " + +#: ppdc/sample.c:252 msgid "DeskJet Series" -msgstr "DeskJet シリーズ" +msgstr "DeskJet Series" + +#: scheduler/ipp.c:1389 +#, c-format msgid "Destination \"%s\" is not accepting jobs." -msgstr "送信先“%s”がジョブを受け入れません。" +msgstr "宛先 \"%s\" はジョブを受け付けていません。" + +#: backend/ipp.c:1702 msgid "Developer almost empty." -msgstr "現像液がもうすぐ空になります。" +msgstr "現像剤が無くなりかけています。" + +#: backend/ipp.c:1704 msgid "Developer empty!" -msgstr "現像液が空です!" -msgid "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n" -msgstr "デバイス:uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n" +msgstr "現像剤が無くなりました!" + +#: systemv/lpinfo.c:305 +#, c-format +msgid "" +"Device: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s\n" +msgstr "" +"デバイス: uri = %s\n" +" class = %s\n" +" info = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +" location = %s\n" + +#: ppdc/sample.c:408 msgid "Direct Thermal Media" -msgstr "直接感熱メディア" +msgstr "感熱紙" + +#: ppdc/sample.c:317 msgid "Disabled" msgstr "無効" + +#: scheduler/ipp.c:6669 +#, c-format msgid "Document %d not found in job %d." -msgstr "書類 %d がジョブ %d 内で見つかりませんでした。" +msgstr "ドキュメント %d がジョブ %d に見つかりません。" + +#: backend/ipp.c:1672 msgid "Door open." msgstr "ドアが開いています。" + +#: ppdc/sample.c:50 msgid "Double Postcard" msgstr "往復はがき" + +#: filter/bannertops.c:816 msgid "Driver Name: " -msgstr "ドライバ名:" +msgstr "ドライバー名: " + +#: filter/bannertops.c:827 msgid "Driver Version: " -msgstr "ドライバのバージョン:" +msgstr "ドライバーバージョン: " + +#: ppdc/sample.c:247 msgid "Duplexer" -msgstr "両面印刷機構" +msgstr "両面オプション" + +#: ppdc/sample.c:201 msgid "Dymo" msgstr "Dymo" + +#: filter/pstops.c:443 +#, c-format msgid "EMERG: Unable to allocate memory for page info: %s\n" -msgstr "EMERG: ページ情報にメモリを割り当てることができません:%s\n" +msgstr "EMERG: ページ情報のメモリー割り当てができません: %s\n" + +#: filter/pstops.c:436 +#, c-format msgid "EMERG: Unable to allocate memory for pages array: %s\n" -msgstr "EMERG: ページ配列にメモリを割り当てることができません:%s\n" +msgstr "EMERG: ページアレイのメモリー割り当てができません: %s\n" + +#: ppdc/sample.c:403 msgid "EPL1 Label Printer" -msgstr "EPL1 ラベルプリンタ" +msgstr "EPL1 Label Printer" + +#: ppdc/sample.c:406 msgid "EPL2 Label Printer" -msgstr "EPL2 ラベルプリンタ" +msgstr "EPL2 Label Printer" + +#: filter/pstops.c:703 +#, c-format msgid "ERROR: Bad %%BoundingBox: comment seen!\n" -msgstr "ERROR: %%BoundingBox が正しくありません:コメントがあります!\n" +msgstr "ERROR: 不正な %%BoundingBox: コメントがあります!\n" + +#: filter/pstops.c:2210 +#, c-format msgid "ERROR: Bad %%IncludeFeature: comment!\n" -msgstr "ERROR: %%IncludeFeature が正しくありません:コメント!\n" +msgstr "ERROR: 不正な %%IncludeFeature: コメントです!\n" + +#: filter/pstops.c:1280 filter/pstops.c:1286 +#, c-format msgid "ERROR: Bad %%Page: comment in file!\n" -msgstr "ERROR: %%Page が正しくありません:ファイルにコメントがあります!\n" +msgstr "ERROR: 不正な %%Page: コメントがファイルにあります!\n" + +#: filter/pstops.c:1356 +#, c-format msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" -msgstr "ERROR: %%PageBoundingBox が正しくありません:ファイルにコメントがあります!\n" +msgstr "ERROR: 不正な %%PageBoundingBox: コメントがファイルにあります!\n" + +#: backend/scsi-irix.c:100 backend/scsi-linux.c:114 +#, c-format msgid "ERROR: Bad SCSI device file \"%s\"!\n" -msgstr "ERROR: SCSI デバイスファイル“%s”が正しくありません!\n" +msgstr "ERROR: 不正な SCSI デバイスファイル \"%s\" です!\n" + +#: filter/pstext.c:276 filter/texttops.c:284 filter/texttops.c:295 +#, c-format msgid "ERROR: Bad charset file %s\n" -msgstr "ERROR: 文字セットファイル %s が正しくありません\n" +msgstr "ERROR: 不正な charset ファイル %s です\n" + +#: filter/texttops.c:453 +#, c-format msgid "ERROR: Bad charset type %s\n" -msgstr "ERROR: 文字セットタイプ %s が正しくありません\n" +msgstr "ERROR: 不正な charset タイプ %s です\n" + +#: filter/textcommon.c:613 +#, c-format msgid "ERROR: Bad columns value %d!\n" -msgstr "ERROR: 列値 %d が正しくありません!\n" +msgstr "ERROR: 不正な columns 値 %d です!\n" + +#: filter/textcommon.c:624 +#, c-format msgid "ERROR: Bad cpi value %f!\n" -msgstr "ERROR: cpi 値 %f が正しくありません!\n" +msgstr "ERROR: 不正な cpi 値 %f です!\n" + +#: filter/pstext.c:320 filter/pstext.c:357 filter/texttops.c:348 +#: filter/texttops.c:384 +#, c-format msgid "ERROR: Bad font description line: %s\n" -msgstr "ERROR: フォント説明行が正しくありません:%s\n" +msgstr "ERROR: 不正なフォント記述行: %s\n" + +#: filter/textcommon.c:635 +#, c-format msgid "ERROR: Bad lpi value %f!\n" -msgstr "ERROR: lpi 値 %f が正しくありません!\n" +msgstr "ERROR: 不正な lpi 値 %f です!\n" + +#: filter/imagetoraster.c:460 msgid "ERROR: Bad page setup!\n" -msgstr "ERROR: ページ設定が正しくありません!\n" +msgstr "ERROR: 不正なページ設定です!\n" + +#: filter/pstext.c:334 filter/texttops.c:361 +#, c-format msgid "ERROR: Bad text direction %s\n" -msgstr "ERROR: テキスト方向 %s が正しくありません\n" +msgstr "ERROR: 不正な テキスト方向 %s です\n" + +#: filter/pstext.c:371 filter/texttops.c:397 +#, c-format msgid "ERROR: Bad text width %s\n" -msgstr "ERROR: テキスト幅 %s が正しくありません\n" +msgstr "ERROR: 不正な テキスト幅 %s です\n" + +#: backend/ipp.c:735 msgid "ERROR: Destination printer does not exist!\n" -msgstr "ERROR: 送信先プリンタが存在しません!\n" +msgstr "ERROR: 送信先のプリンターが存在しません!\n" + +#: filter/pstops.c:692 +#, c-format msgid "ERROR: Duplicate %%BoundingBox: comment seen!\n" -msgstr "ERROR: %%BoundingBox が重複しています:コメントがあります!\n" +msgstr "ERROR: 重複した %%BoundingBox: コメントがあります!\n" + +#: filter/pstops.c:645 +#, c-format msgid "ERROR: Duplicate %%Pages: comment seen!\n" -msgstr "ERROR: %%Pages が重複しています:コメントがあります!\n" +msgstr "ERROR: 重複した %%Pages: コメントがあります!\n" + +#: backend/ipp.c:457 filter/pstops.c:302 msgid "ERROR: Empty print file!\n" -msgstr "ERROR: プリントファイルが空です!\n" +msgstr "ERROR: 空のプリントファイルです!\n" + +#: backend/pap.c:838 +#, c-format msgid "ERROR: Error %d sending PAPSendData request: %s\n" -msgstr "ERROR: PAPSendData 要求を送信中のエラー %d:%s\n" +msgstr "ERROR: エラー %d PAPSendData request の送信: %s\n" + +#: ppdc/ppdc-catalog.cxx:335 ppdc/ppdc-catalog.cxx:347 +#, c-format msgid "ERROR: Expected quoted string on line %d of %s!\n" -msgstr "ERROR: %2$s の行 %1$d に引用文字列が必要です!\n" +msgstr "ERROR: %d 行: %s には引用符で囲まれた文字列が必要です!\n" + +#: backend/usb-darwin.c:364 backend/usb-darwin.c:422 backend/usb-darwin.c:487 +#: backend/usb-darwin.c:505 msgid "ERROR: Fatal USB error!\n" -msgstr "ERROR: 致命的な USB エラー!\n" +msgstr "ERROR: 致命的な USB エラーです!\n" + +#: filter/hpgl-input.c:139 msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" -msgstr "ERROR: 無効な HP-GL/2 コマンドがあるため、ファイルをプリントできません!\n" +msgstr "ERROR: 無効な HP-GL/2 コマンドがあり、ファイルをプリントできません!\n" + +#: filter/pstops.c:1764 +#, c-format msgid "ERROR: Missing %%EndProlog!\n" -msgstr "ERROR: %%EndProlog がありません!\n" +msgstr "ERROR: %%EndProlog が見つかりません!\n" + +#: filter/pstops.c:1835 +#, c-format msgid "ERROR: Missing %%EndSetup!\n" -msgstr "ERROR: %%EndSetup がありません!\n" +msgstr "ERROR: %%EndSetup が見つかりません!\n" + +#: backend/ipp.c:243 msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n" -msgstr "ERROR: コマンドラインにデバイス URI が入力されていないので、DEVICE_URI 環境変数がありません!\n" +msgstr "ERROR: コマンドラインにデバイス URI が見つからず、環境変数 DEVICE_URI も見つかりません!\n" + +#: filter/bannertops.c:222 +#, c-format msgid "ERROR: Missing value on line %d of banner file!\n" -msgstr "ERROR: バナーファイルの行 %d に値がありません!\n" +msgstr "ERROR: バナーファイルの %d 行目に値が見つかりません!\n" + +#: ppdc/ppdc-catalog.cxx:412 +#, c-format msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n" -msgstr "ERROR: %2$s の行 %1$d の変換文字列の前に msgid 行が必要です!\n" +msgstr "ERROR: %d 行: %s の翻訳文字列の前に msgid 行が必要です!\n" + +#: filter/pstops.c:755 +#, c-format msgid "ERROR: No %%BoundingBox: comment in header!\n" -msgstr "ERROR: %%BoundingBox がありません:ヘッダにコメントがあります!\n" +msgstr "ERROR: %%BoundingBox: コメントがありません!\n" + +#: filter/pstops.c:758 +#, c-format msgid "ERROR: No %%Pages: comment in header!\n" -msgstr "ERROR: %%Pages がありません:ヘッダにコメントがあります!\n" +msgstr "ERROR: %%Pages: コメントがヘッダーにありません!\n" + +#: backend/usb.c:200 msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n" -msgstr "ERROR: argv[0] または DEVICE_URI 環境変数にデバイス URI が見つかりませんでした!\n" +msgstr "ERROR: argv[0] または 環境変数 DEVICE_URI にデバイス URI が見つかりません!\n" + +#: filter/pstext.c:433 +#, c-format msgid "ERROR: No fonts in charset file %s\n" -msgstr "ERROR: 文字セットファイル %s 内にフォントがありません\n" +msgstr "ERROR: charset ファイル %s にフォントが見つかりません\n" + +#: filter/rastertoepson.c:1124 filter/rastertohp.c:854 +#: filter/rastertolabel.c:1279 msgid "ERROR: No pages found!\n" -msgstr "ERROR: ページが見つかりませんでした!\n" +msgstr "ERROR: ページが見つかりません!\n" + +#: backend/runloop.c:348 msgid "ERROR: Out of paper!\n" -msgstr "ERROR: 用紙がありません!\n" +msgstr "ERROR: 用紙切れです!\n" + +#: backend/ipp.c:1792 msgid "ERROR: PRINTER environment variable not defined!\n" -msgstr "ERROR: PRINTER 環境設定が定義されていません!\n" +msgstr "ERROR: PRINTER 環境変数が定義されていません!\n" + +#: backend/ipp.c:1044 +#, c-format msgid "ERROR: Print file was not accepted (%s)!\n" -msgstr "ERROR: プリントファイルが受け入れられませんでした(%s)!\n" +msgstr "ERROR: プリントファイルが受け付けられませんでした (%s)!\n" + +#: backend/pap.c:521 msgid "ERROR: Printer not responding\n" -msgstr "ERROR: プリンタが応答しません\n" +msgstr "ERROR: プリンターが応答していません\n" + +#: backend/ipp.c:571 backend/ipp.c:702 backend/lpd.c:821 backend/socket.c:311 msgid "ERROR: Printer not responding!\n" -msgstr "ERROR: プリンタが応答しません!\n" +msgstr "ERROR: プリンターが応答していません!\n" + +#: backend/pap.c:858 msgid "ERROR: Printer sent unexpected EOF\n" -msgstr "ERROR: プリンタから予期しない EOF を受け取りました\n" +msgstr "ERROR: プリンターが 想定外の EOF を送信しました\n" + +#: backend/lpd.c:1025 backend/lpd.c:1172 +#, c-format msgid "ERROR: Remote host did not accept control file (%d)\n" -msgstr "ERROR: リモートホストが制御ファイルを受け入れませんでした(%d)\n" +msgstr "ERROR: リモートホストがコントロールファイルを受け付けませんでした (%d)\n" + +#: backend/lpd.c:1120 +#, c-format msgid "ERROR: Remote host did not accept data file (%d)\n" -msgstr "ERROR: リモートホストがデータファイルを受け入れませんでした(%d)\n" +msgstr "ERROR: リモートホストがデータファイルを受け付けませんでした (%d)\n" + +#: backend/pap.c:1694 msgid "ERROR: There was a timeout error while sending data to the printer\n" -msgstr "ERROR: プリンタにデータを送信しているときにタイムアウトエラーが起きました\n" +msgstr "ERROR: プリンターへのデータ送信中にタイムアウトエラーが発生しました\n" + +#: backend/ipp.c:1107 +#, c-format msgid "ERROR: Unable to add file %d to job: %s\n" -msgstr "ERROR: ファイル %d をジョブに追加できません:%s\n" +msgstr "ERROR: ファイル %d をジョブに追加できません: %s\n" + +#: backend/ipp.c:1355 +#, c-format msgid "ERROR: Unable to cancel job %d: %s\n" -msgstr "ERROR: ジョブ %d をキャンセルできません:%s\n" +msgstr "ERROR: ジョブ %d をキャンセルできません: %s\n" + +#: filter/pdftops.c:126 msgid "ERROR: Unable to copy PDF file" msgstr "ERROR: PDF ファイルをコピーできません" + +#: backend/lpd.c:745 msgid "ERROR: Unable to create socket" msgstr "ERROR: ソケットを作成できません" + +#: backend/ipp.c:1445 +#, c-format msgid "ERROR: Unable to create temporary compressed print file: %s\n" -msgstr "ERROR: 圧縮された一時プリントファイルを作成できません:%s\n" +msgstr "ERROR: テンポラリーの圧縮プリントファイルを作成できません: %s\n" + +#: backend/ipp.c:424 backend/lpd.c:433 msgid "ERROR: Unable to create temporary file" -msgstr "ERROR: 一時ファイルを作成できません" +msgstr "ERROR: テンポラリーファイルを作成できません" + +#: backend/ipp.c:1814 +#, c-format msgid "ERROR: Unable to create temporary file - %s.\n" -msgstr "ERROR: 一時ファイルを作成できません - %s。\n" +msgstr "ERROR: テンポラリーファイルを作成できません - %s\n" + +#: filter/pstops.c:2708 +#, c-format msgid "ERROR: Unable to create temporary file: %s\n" -msgstr "ERROR: 一時ファイルを作成できません:%s\n" +msgstr "ERROR: テンポラリーファイルを作成できません: %s\n" + +#: backend/ipp.c:1871 +#, c-format msgid "ERROR: Unable to exec pictwpstops: %s\n" -msgstr "ERROR: pictwpstops を実行できません:%s\n" +msgstr "ERROR: pictwpstops を実行できません: %s\n" + +#: filter/pdftops.c:317 filter/pdftops.c:331 msgid "ERROR: Unable to execute gs program" msgstr "ERROR: gs プログラムを実行できません" + +#: filter/pdftops.c:314 filter/pdftops.c:329 msgid "ERROR: Unable to execute pdftops program" msgstr "ERROR: pdftops プログラムを実行できません" + +#: backend/ipp.c:1884 +#, c-format msgid "ERROR: Unable to fork pictwpstops: %s\n" -msgstr "ERROR: pictwpstops を分岐できません:%s\n" +msgstr "ERROR: pictwpstops をフォークできません: %s\n" + +#: backend/pap.c:712 msgid "ERROR: Unable to get PAP request" -msgstr "ERROR: PAP 要求を取得できません" +msgstr "ERROR: PAP リクエストを取得できません" + +#: backend/pap.c:701 msgid "ERROR: Unable to get PAP response" -msgstr "ERROR: PAP 応答を取得できません" +msgstr "ERROR: PAP レスポンスを取得できません" + +#: backend/ipp.c:1799 +#, c-format msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" -msgstr "ERROR: プリンタ“%s”のPPD ファイルを取得できません - %s。\n" +msgstr "ERROR: プリンター \"%s\" の PPD ファイルを取得できません - %s\n" + +#: backend/pap.c:302 msgid "ERROR: Unable to get default AppleTalk zone" msgstr "ERROR: デフォルトの AppleTalk ゾーンを取得できません" + +#: backend/ipp.c:1194 +#, c-format msgid "ERROR: Unable to get job %d attributes (%s)!\n" -msgstr "ERROR: ジョブ %d の属性を取得できません(%s)!\n" +msgstr "ERROR: ジョブ %d の属性 (%s) を取得できません!\n" + +#: backend/ipp.c:745 +#, c-format msgid "ERROR: Unable to get printer status (%s)!\n" -msgstr "ERROR: プリンタの状況を取得できません(%s)!\n" +msgstr "ERROR: プリンターのステータス (%s) を取得できません!\n" + +#: backend/ipp.c:589 backend/lpd.c:677 backend/socket.c:266 +#, c-format msgid "ERROR: Unable to locate printer '%s'!\n" -msgstr "ERROR: プリンタ‘%s’を特定できません!\n" +msgstr "ERROR: プリンター '%s' が見つかりません\"!\n" + +#: backend/pap.c:688 msgid "ERROR: Unable to look for PAP response" -msgstr "ERROR: PAP 応答を検索できません" +msgstr "ERROR: PAP レスポンスが見つかりません" + +#: backend/pap.c:322 msgid "ERROR: Unable to lookup AppleTalk printers" -msgstr "ERROR: AppleTalk プリンタを検索できません" +msgstr "ERROR: AppleTalk プリンターが見つかりません" + +#: backend/pap.c:451 msgid "ERROR: Unable to make AppleTalk address" msgstr "ERROR: AppleTalk アドレスを作成できません" + +#: filter/pstext.c:247 filter/texttops.c:248 +#, c-format msgid "ERROR: Unable to open \"%s\" - %s\n" -msgstr "ERROR: “%s”を開けません - %s\n" +msgstr "ERROR: \"%s\" を開けません - %s\n" + +#: filter/pstext.c:264 filter/texttops.c:268 +#, c-format msgid "ERROR: Unable to open %s: %s\n" -msgstr "ERROR: %s を開けません:%s\n" +msgstr "ERROR: %s を開けません: %s\n" + +#: filter/bannertops.c:184 +#, c-format msgid "ERROR: Unable to open banner file \"%s\" - %s\n" -msgstr "ERROR: バナーファイル“%s”を開けません - %s\n" +msgstr "ERROR: バナーファイル \"%s\" を開けません - %s\n" + +#: backend/parallel.c:249 backend/scsi-irix.c:140 backend/scsi-linux.c:154 +#: backend/serial.c:262 backend/usb-unix.c:146 +#, c-format msgid "ERROR: Unable to open device file \"%s\": %s\n" -msgstr "ERROR: デバイスファイル“%s”を開けません:%s\n" +msgstr "ERROR: デバイスファイル \"%s\" を開けません: %s\n" + +#: filter/pstops.c:290 +#, c-format msgid "ERROR: Unable to open file \"%s\" - %s\n" -msgstr "ERROR: ファイル“%s”を開けません - %s\n" +msgstr "ERROR: ファイル \"%s\" を開けません - %s\n" + +#: filter/gziptoany.c:74 +#, c-format msgid "ERROR: Unable to open file \"%s\": %s\n" -msgstr "ERROR: ファイル“%s”を開けません:%s\n" +msgstr "ERROR: ファイル \"%s\" を開けません: %s\n" + +#: filter/imagetops.c:313 filter/imagetoraster.c:637 msgid "ERROR: Unable to open image file for printing!\n" -msgstr "ERROR: プリント用のイメージファイルを開けません!\n" +msgstr "ERROR: 印刷のためのイメージファイルを開けません!\n" + +#: backend/ipp.c:1461 backend/pap.c:249 backend/parallel.c:151 +#: backend/scsi.c:181 backend/serial.c:189 backend/socket.c:156 +#, c-format msgid "ERROR: Unable to open print file \"%s\": %s\n" -msgstr "ERROR: プリントファイル“%s”を開けません:%s\n" +msgstr "ERROR: プリントファイル \"%s\" を開けません: %s\n" + +#: backend/usb.c:237 +#, c-format msgid "ERROR: Unable to open print file %s - %s\n" msgstr "ERROR: プリントファイル %s を開けません - %s\n" + +#: backend/lpd.c:462 +#, c-format msgid "ERROR: Unable to open print file %s: %s\n" -msgstr "ERROR: プリントファイル %s を開けません:%s\n" +msgstr "ERROR: プリントファイル %s を開けません: %s\n" + +#: backend/ipp.c:1453 +#, c-format msgid "ERROR: Unable to open temporary compressed print file: %s\n" -msgstr "ERROR: 圧縮された一時プリントファイルを開けません:%s\n" +msgstr "ERROR: テンポラリーの圧縮プリントファイルを開けません: %s\n" + +#: backend/ipp.c:430 msgid "ERROR: Unable to open temporary file" -msgstr "ERROR: 一時ファイルを開けません" +msgstr "ERROR: テンポラリーファイルを開けません" + +#: filter/texttops.c:200 +#, c-format msgid "ERROR: Unable to print %d text columns!\n" -msgstr "ERROR: %d 個のテキスト列をプリントできません!\n" +msgstr "ERROR: テキストカラム %d をプリントできません!\n" + +#: filter/texttops.c:179 +#, c-format msgid "ERROR: Unable to print %dx%d text page!\n" -msgstr "ERROR: %d x %d のテキストページをプリントできません!\n" +msgstr "ERROR: テキストページ %dx%d をプリントできません!\n" + +#: backend/serial.c:615 msgid "ERROR: Unable to read print data" -msgstr "ERROR: プリントデータを読み取れません" +msgstr "ERROR: プリントデータを読み込めません" + +#: backend/usb-darwin.c:589 backend/usb-darwin.c:622 msgid "ERROR: Unable to read print data!\n" -msgstr "ERROR: プリントデータを読み取れません!\n" +msgstr "ERROR: プリントデータを読み込めません!\n" + +#: backend/lpd.c:762 msgid "ERROR: Unable to reserve port" msgstr "ERROR: ポートを予約できません" + +#: filter/pstops.c:560 +#, c-format msgid "ERROR: Unable to seek to offset %ld in file - %s\n" -msgstr "ERROR: ファイル内のオフセット %ld にシークできません - %s\n" +msgstr "ERROR: ファイルでのオフセット %ld へシークできません - %s\n" + +#: filter/pstops.c:558 +#, c-format msgid "ERROR: Unable to seek to offset %lld in file - %s\n" -msgstr "ERROR: ファイル内のオフセット %lld にシークできません - %s\n" +msgstr "ERROR: ファイルでのオフセット %lld へシークできません - %s\n" + +#: backend/lpd.c:578 msgid "ERROR: Unable to send LPD command" msgstr "ERROR: LPD コマンドを送信できません" + +#: backend/pap.c:571 msgid "ERROR: Unable to send PAP tickle request" -msgstr "ERROR: PAP チケット要求を送信できません" +msgstr "ERROR: PAP tickle 要求を送信できません" + +#: backend/pap.c:580 msgid "ERROR: Unable to send initial PAP send data request" -msgstr "ERROR: 初期 PAP データ送信要求を送信できません" +msgstr "ERROR: PAP の初期データ送信要求を送信できません" + +#: backend/scsi-irix.c:219 backend/scsi-linux.c:237 +#, c-format msgid "ERROR: Unable to send print data (%d)\n" -msgstr "ERROR: プリントデータを送信できません(%d)\n" +msgstr "ERROR: プリントデータを送信できません (%d)\n" + +#: backend/usb-darwin.c:665 msgid "ERROR: Unable to send print data!\n" -msgstr "ERROR: プリントデータを送信できません!\n" +msgstr "ERROR: プリントデータを送信できません!\n" + +#: backend/lpd.c:1076 msgid "ERROR: Unable to send print file to printer" -msgstr "ERROR: プリントファイルをプリンタに送信できません" +msgstr "ERROR: プリントファイルをプリンターへ送信できません" + +#: backend/lpd.c:1090 msgid "ERROR: Unable to send trailing nul to printer" -msgstr "ERROR: 末尾の null をプリンタに送信できません" +msgstr "ERROR: 最後の NUL をプリンターへ送信できません" + +#: backend/ipp.c:1897 +#, c-format msgid "ERROR: Unable to wait for pictwpstops: %s\n" -msgstr "ERROR: pictwpstops を待機できません:%s\n" +msgstr "ERROR: pictwpstops を待つことができません: %s\n" + +#: backend/ipp.c:1472 +#, c-format msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" -msgstr "ERROR: %d バイトを“%s”に書き込めません:%s\n" +msgstr "ERROR: %d バイトを \"%s\" に書き込めません: %s\n" + +#: backend/usb-libusb.c:169 backend/usb-libusb.c:765 +#, c-format msgid "ERROR: Unable to write %d bytes to printer!\n" -msgstr "ERROR: %d バイトをプリンタに書き込めません!\n" +msgstr "ERROR: %d バイトをプリンターに書き込めません!\n" + +#: backend/lpd.c:1006 backend/lpd.c:1153 msgid "ERROR: Unable to write control file" -msgstr "ERROR: 制御ファイルに書き込めません" +msgstr "ERROR: コントロールファイルを書き込めません" + +#: backend/serial.c:691 msgid "ERROR: Unable to write print data" msgstr "ERROR: プリントデータを書き込めません" + +#: backend/runloop.c:122 backend/runloop.c:363 +#, c-format msgid "ERROR: Unable to write print data: %s\n" -msgstr "ERROR: プリントデータを書き込めません:%s\n" +msgstr "ERROR: プリントデータを書き込めません: %s\n" + +#: filter/imagetoraster.c:1199 filter/imagetoraster.c:1295 +#: filter/imagetoraster.c:1335 msgid "ERROR: Unable to write raster data to driver!\n" -msgstr "ERROR: ラスタデータをドライバに書き込めません!\n" +msgstr "ERROR: ラスターデータをドライバーへ書き込めません!\n" + +#: backend/ipp.c:441 backend/lpd.c:440 msgid "ERROR: Unable to write to temporary file" -msgstr "ERROR: 一時ファイルに書き込めません" +msgstr "ERROR: テンポラリーファイルへ書き込めません" + +#: filter/gziptoany.c:96 +#, c-format msgid "ERROR: Unable to write uncompressed document data: %s\n" -msgstr "ERROR: 非圧縮書類データを書き込めません:%s\n" +msgstr "ERROR: 非圧縮ドキュメントデータを書き込めません: %s\n" + +#: ppdc/ppdc-catalog.cxx:429 +#, c-format msgid "ERROR: Unexpected text on line %d of %s!\n" -msgstr "ERROR: %2$s の行 %1$d に予期しないテキストがあります!\n" +msgstr "ERROR: %d 行: %s は予期せぬテキストです!\n" + +#: backend/ipp.c:351 +#, c-format msgid "ERROR: Unknown encryption option value \"%s\"!\n" -msgstr "ERROR: “%s”は不明な暗号化オプション値です!\n" +msgstr "ERROR: \"%s\" は未知の暗号オプション値です!\n" + +#: backend/lpd.c:355 +#, c-format msgid "ERROR: Unknown file order \"%s\"\n" -msgstr "ERROR: “%s”は不明なファイル順序です\n" +msgstr "ERROR: \"%s\" は未知のファイルオーダーです\n" + +#: backend/lpd.c:327 +#, c-format msgid "ERROR: Unknown format character \"%c\"\n" -msgstr "ERROR: “%c”は不明なフォーマット文字です\n" +msgstr "ERROR: \"%c\" は未知の書式文字です\n" + +#: ppdc/ppdc-catalog.cxx:457 +#, c-format msgid "ERROR: Unknown message catalog format for \"%s\"!\n" -msgstr "ERROR: “%s”のメッセージ・カタログ・フォーマットが不明です!\n" +msgstr "ERROR: \"%s\" は未知のメッセージカタログの書式です!\n" + +#: backend/ipp.c:397 +#, c-format msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" -msgstr "ERROR: 値“%2$s”、オプション“%1$s”は不明です!\n" +msgstr "ERROR: \"%s\" (値 \"%s\") は未知のオプションです!\n" + +#: backend/lpd.c:341 +#, c-format msgid "ERROR: Unknown print mode \"%s\"\n" -msgstr "ERROR: “%s”は不明なプリントモードです\n" +msgstr "ERROR: \"%s\" は未知のプリントモードです\n" + +#: backend/ipp.c:368 +#, c-format msgid "ERROR: Unknown version option value \"%s\"!\n" -msgstr "ERROR: “%s”は不明なバージョンオプション値です!\n" +msgstr "ERROR: \"%s\" は未知のバージョンオプション値です!\n" + +#: filter/pstops.c:2407 +#, c-format msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" -msgstr "ERROR: 輝度値 %s に対応していないため、brightness=100 を使用します!\n" +msgstr "ERROR: %s はサポートされていない輝度値です。brightness=100 を使用します!\n" + +#: filter/pstops.c:2476 +#, c-format msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" -msgstr "ERROR: ガンマ値 %s に対応していないため、gamma=1000 を使用します!\n" +msgstr "ERROR: %s はサポートされていないガンマ値です。gamma=1000 を使用します!\n" + +#: filter/pstops.c:2530 +#, c-format msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" -msgstr "ERROR: number-up 値 %d に対応していないため、number-up=1 を使用します!\n" +msgstr "ERROR: %d はサポートされていない number-up 値です。number-up=1 を使用します!\n" + +#: filter/pstops.c:2563 +#, c-format msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n" -msgstr "ERROR: number-up-layout 値 %s に対応していないため、number-up-layout=lrtb を使用します!\n" +msgstr "ERROR: %s はサポートされていない number-up-layout 値です。number-up-layout=lrtb を使用します!\n" + +#: filter/pstops.c:2613 +#, c-format msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" -msgstr "ERROR: page-border 値 %s に対応していないため、page-border=none を使用します!\n" +msgstr "ERROR: %s はサポートされていない page-border 値です。page-border=none を使用します!\n" + +#: filter/pstops.c:2080 +#, c-format msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" -msgstr "ERROR: doc_printf オーバーフロー(%d バイト)が検出されたため、中止しました!\n" +msgstr "ERROR: doc_printf オーバーフロー (%d バイト) が検出され、中断しました!\n" + +#: filter/pdftops.c:370 +#, c-format msgid "ERROR: pdftops filter crashed on signal %d!\n" -msgstr "ERROR: シグナル %d で pdftops フィルタがクラッシュしました!\n" +msgstr "ERROR: pdftops フィルターはシグナル %d で異常終了しました!\n" + +#: filter/pdftops.c:362 +#, c-format msgid "ERROR: pdftops filter exited with status %d!\n" -msgstr "ERROR: 状況 %d で pdftops フィルタが終了しました!\n" +msgstr "ERROR: pdftops フィルターは状態 %d で終了しました!\n" + +#: backend/ipp.c:1916 +#, c-format msgid "ERROR: pictwpstops exited on signal %d!\n" -msgstr "ERROR: シグナル %d で pictwpstops が終了しました!\n" +msgstr "ERROR: pictwpstops はシグナル %d で終了しました!\n" + +#: backend/ipp.c:1913 +#, c-format msgid "ERROR: pictwpstops exited with status %d!\n" -msgstr "ERROR: 状況 %d で pictwpstops フィルタが終了しました!\n" +msgstr "ERROR: pictwpstops は状態 %d で終了しました!\n" + +#: backend/ipp.c:599 backend/lpd.c:850 backend/socket.c:334 msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n" -msgstr "ERROR: 回復可能:プリンタに接続できません。30 秒後に再試行します...\n" +msgstr "ERROR: 回復可能: プリンターに接続できません。30 秒後に再試行します...\n" + +#: backend/pap.c:629 msgid "ERROR: select() failed" -msgstr "ERROR: select() に失敗しました" +msgstr "ERROR: select() が失敗しました" + +#: backend/lpd.c:913 msgid "ERROR: unable to stat print file" -msgstr "ERROR: プリントファイルの統計情報を取得できません" +msgstr "ERROR: プリントファイルの状態を取得できません" + +#: cgi-bin/admin.c:1811 cgi-bin/admin.c:1823 cgi-bin/admin.c:1877 +#: cgi-bin/admin.c:1884 cgi-bin/admin.c:1919 cgi-bin/admin.c:1932 +#: cgi-bin/admin.c:1956 cgi-bin/admin.c:2029 msgid "Edit Configuration File" -msgstr "構成ファイルを編集" +msgstr "設定ファイルの編集" + +#: cups/adminutil.c:348 msgid "Empty PPD file!" -msgstr "PPD ファイルが空です!" +msgstr "PPD ファイルが空です!" + +#: cgi-bin/admin.c:3533 msgid "Ending Banner" msgstr "終了バナー" + +#: systemv/lppasswd.c:205 msgid "Enter old password:" -msgstr "古いパスワードを入力:" +msgstr "古いパスワードを入力:" + +#: systemv/lppasswd.c:234 msgid "Enter password again:" -msgstr "もう一度パスワードを入力:" +msgstr "パスワードを再度入力:" + +#: systemv/lppasswd.c:223 msgid "Enter password:" -msgstr "パスワードを入力:" +msgstr "パスワードを入力:" + +#: scheduler/client.c:2409 msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." -msgstr "このページにアクセスするには、自分のユーザ名とパスワード、またはルートのユーザ名とパスワードを入力してください。Kerberos 認証を使用する場合は、有効な Kerberos チケットを持っていることを確認してください。" +msgstr "このページにアクセスするために、あなたのユーザー名とパスワード、あるいは root のユーザー名とパスワードを入力してください。Kerberos 認証を使用している場合、有効な Kerberos チケットがあることを確認してください。" + +#: ppdc/sample.c:241 msgid "Envelope Feed" -msgstr "封筒配信" +msgstr "封筒フィード" + +#: ppdc/sample.c:212 msgid "Epson" msgstr "Epson" + +#: cgi-bin/admin.c:3576 msgid "Error Policy" msgstr "エラーポリシー" + +#: systemv/lpinfo.c:109 systemv/lpmove.c:94 msgid "Error: need hostname after '-h' option!\n" -msgstr "エラー:‘-h’オプションの後にホスト名が必要です!\n" +msgstr "Error: '-h' オプションのあとにはホスト名が必要です!\n" + +#: ppdc/sample.c:327 msgid "Every 10 Labels" msgstr "10 ラベルごと" + +#: ppdc/sample.c:319 msgid "Every 2 Labels" msgstr "2 ラベルごと" + +#: ppdc/sample.c:320 msgid "Every 3 Labels" msgstr "3 ラベルごと" + +#: ppdc/sample.c:321 msgid "Every 4 Labels" msgstr "4 ラベルごと" + +#: ppdc/sample.c:322 msgid "Every 5 Labels" msgstr "5 ラベルごと" + +#: ppdc/sample.c:323 msgid "Every 6 Labels" msgstr "6 ラベルごと" + +#: ppdc/sample.c:324 msgid "Every 7 Labels" msgstr "7 ラベルごと" + +#: ppdc/sample.c:325 msgid "Every 8 Labels" msgstr "8 ラベルごと" + +#: ppdc/sample.c:326 msgid "Every 9 Labels" msgstr "9 ラベルごと" + +#: ppdc/sample.c:318 msgid "Every Label" -msgstr "1 ラベルごと" +msgstr "すべてのラベル" + +#: cups/http-support.c:1236 msgid "Expectation Failed" -msgstr "Expect リクエストに失敗しました" +msgstr "Expectation Failed" + +#: cgi-bin/admin.c:2319 cgi-bin/admin.c:2338 msgid "Export Printers to Samba" -msgstr "プリンタを Samba に書き出す" +msgstr "Samba へプリンターをエクスポート" + +#: systemv/cupstestdsc.c:176 systemv/cupstestdsc.c:193 +#: systemv/cupstestdsc.c:218 systemv/cupstestdsc.c:235 +#: systemv/cupstestdsc.c:259 systemv/cupstestdsc.c:277 +#: systemv/cupstestdsc.c:306 systemv/cupstestdsc.c:343 +#: systemv/cupstestdsc.c:353 systemv/cupstestdsc.c:363 +#: systemv/cupstestdsc.c:373 systemv/cupstestdsc.c:383 +#: systemv/cupstestdsc.c:391 msgid "FAIL\n" msgstr "失敗\n" + +#: ppdc/sample.c:132 msgid "File Folder" -msgstr "ファイルフォルダ" +msgstr "ファイルフォルダー" + +#: ppdc/sample.c:141 msgid "File Folder - 9/16 x 3 7/16\"" -msgstr "ファイルフォルダ - 9/16 x 3 7/16\"" +msgstr "ファイルフォルダー - 9/16 x 3 7/16\"" + +#: scheduler/ipp.c:2516 +#, c-format msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"." -msgstr "ファイルデバイス URI が無効になっています!有効にするには、“%s/cupsd.conf”の FileDevice ディレクティブを参照してください。" +msgstr "ファイルデバイス URI は無効になっています! 有効にするには、\"%s/cupsd.conf\" の FileDevice ディレクティブを参照してください。" + +#: ppdc/sample.c:92 msgid "Folio" -msgstr "Folio" +msgstr "フォリオ" + +#: cups/http-support.c:1215 msgid "Forbidden" -msgstr "アクセス権がありません" +msgstr "Forbidden" + +#: backend/ipp.c:1694 msgid "Fuser temperature high!" -msgstr "定着器の温度が高くなっています!" +msgstr "定着器の温度が上っています!" + +#: backend/ipp.c:1696 msgid "Fuser temperature low!" -msgstr "定着器の温度が低くなっています!" +msgstr "定着器の温度が下っています!" + +#: cups/ppd.c:697 cups/ppd.c:1226 msgid "General" msgstr "一般" + +#: ppdc/sample.c:231 msgid "Generic" msgstr "汎用" + +#: ppdc/sample.c:89 msgid "German FanFold" msgstr "German FanFold" + +#: ppdc/sample.c:90 msgid "German FanFold Legal" -msgstr "German FanFold リーガル" +msgstr "German FanFold Legal" + +#: cups/snmp.c:1015 msgid "Get-Response-PDU uses indefinite length" -msgstr "Get-Response-PDU に使われている長さが不定です" +msgstr "Get-Response-PDU は不確定の長さを使用しています" + +#: ppdc/sample.c:262 msgid "Glossy Paper" msgstr "光沢紙" + +#: scheduler/ipp.c:3634 scheduler/ipp.c:3937 scheduler/ipp.c:6599 +#: scheduler/ipp.c:6741 scheduler/ipp.c:8011 scheduler/ipp.c:9135 +#: scheduler/ipp.c:9360 scheduler/ipp.c:9777 scheduler/ipp.c:10352 msgid "Got a printer-uri attribute but no job-id!" -msgstr "printer-uri 属性を取得しましたが、job-id がありません!" +msgstr "printer-uri 属性を取得しましたが、job-id を取得できませんでした!" + +#: ppdc/sample.c:227 msgid "Grayscale" -msgstr "グレイスケール" +msgstr "グレースケール" + +#: ppdc/sample.c:251 msgid "HP" msgstr "HP" + +#: ppdc/sample.c:133 msgid "Hanging Folder" -msgstr "ハンギングフォルダ" +msgstr "Hanging Folder" + +#: ppdc/sample.c:142 msgid "Hanging Folder - 9/16 x 2\"" -msgstr "ハンギングフォルダ - 9/16 x 2\"" +msgstr "Hanging Folder - 9/16 x 2\"" + +#: backend/pap.c:296 msgid "INFO: AppleTalk disabled in System Preferences\n" -msgstr "INFO: AppleTalk は“システム環境設定”で無効になっています\n" +msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています\n" + +#: backend/pap.c:511 msgid "INFO: AppleTalk disabled in System Preferences.\n" -msgstr "INFO: AppleTalk は“システム環境設定”で無効になっています。\n" +msgstr "INFO: AppleTalk がシステムプレファレンスで無効にされています。\n" + +#: backend/ipp.c:1334 msgid "INFO: Canceling print job...\n" -msgstr "INFO: プリントジョブをキャンセル中...\n" +msgstr "INFO: プリントジョブをキャンセルしています...\n" + +#: backend/ipp.c:619 backend/lpd.c:869 backend/socket.c:356 msgid "INFO: Connected to printer...\n" -msgstr "INFO: プリンタに接続されました...\n" +msgstr "INFO: プリンターに接続しました...\n" + +#: backend/ipp.c:534 backend/lpd.c:702 backend/socket.c:273 msgid "INFO: Connecting to printer...\n" -msgstr "INFO: プリンタに接続中...\n" +msgstr "INFO: プリンターに接続中...\n" + +#: backend/lpd.c:1028 backend/lpd.c:1175 msgid "INFO: Control file sent successfully\n" -msgstr "INFO: 制御ファイルの送信に成功しました\n" +msgstr "INFO: コントロールファイルが正常に送信されました\n" + +#: backend/lpd.c:1123 msgid "INFO: Data file sent successfully\n" -msgstr "INFO: データファイルの送信に成功しました\n" +msgstr "INFO: データファイルが正常に送信されました\n" + +#: filter/imagetoraster.c:1142 +#, c-format msgid "INFO: Formatting page %d...\n" -msgstr "INFO: %d ページをフォーマット中...\n" +msgstr "INFO: ページ %d をフォーマット中...\n" + +#: filter/imagetoraster.c:623 msgid "INFO: Loading image file...\n" -msgstr "INFO: イメージファイルを読み込み中...\n" +msgstr "INFO: イメージファイルをロード中...\n" + +#: cups/http-support.c:1400 msgid "INFO: Looking for printer...\n" -msgstr "INFO: プリンタを検索中...\n" +msgstr "INFO: プリンターを探しています...\n" + +#: backend/pap.c:928 msgid "INFO: Opening connection\n" -msgstr "INFO: 接続を開いています\n" +msgstr "INFO: コネクションを開いています\n" + +#: backend/socket.c:427 msgid "INFO: Print file sent, waiting for printer to finish...\n" -msgstr "INFO: プリントファイルが送信されました、プリンタの終了を待機中...\n" +msgstr "INFO: プリントファイルを送信し、プリンターが作業を完了するのを待っています...\n" + +#: backend/ipp.c:1027 backend/usb-unix.c:132 msgid "INFO: Printer busy; will retry in 10 seconds...\n" -msgstr "INFO: プリンタでの処理が混み合っています。10 秒後に再試行します...\n" +msgstr "INFO: プリンターがビジー状態です。10 秒後に再試行します...\n" + +#: backend/parallel.c:236 backend/scsi-irix.c:147 backend/scsi-linux.c:161 +#: backend/serial.c:256 msgid "INFO: Printer busy; will retry in 30 seconds...\n" -msgstr "INFO: プリンタでの処理が混み合っています。30 秒後に再試行します...\n" +msgstr "INFO: プリンターがビジー状態です。30 秒後に再試行します...\n" + +#: backend/usb-unix.c:437 msgid "INFO: Printer busy; will retry in 5 seconds...\n" -msgstr "INFO: プリンタでの処理が混み合っています。5 秒後に再試行します...\n" +msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n" + +#: backend/ipp.c:728 backend/ipp.c:1038 +#, c-format msgid "INFO: Printer does not support IPP/%d.%d, trying IPP/1.0...\n" -msgstr "INFO: プリンタは IPP/%d.%d に対応していません。IPP/1.0 を試行中...\n" +msgstr "INFO: プリンターが IPP/%d.%d をサポートしていません。IPP/1.0 を試します...\n" + +#: backend/usb-unix.c:521 msgid "INFO: Printer is busy; will retry in 5 seconds...\n" -msgstr "INFO: プリンタでの処理が混み合っています。5 秒後に再試行します...\n" +msgstr "INFO: プリンターがビジー状態です。5 秒後に再試行します...\n" + +#: backend/runloop.c:357 msgid "INFO: Printer is currently off-line.\n" -msgstr "INFO: プリンタは現在オフラインです。\n" +msgstr "INFO: プリンターは現在オフラインです。\n" + +#: backend/runloop.c:243 msgid "INFO: Printer is currently offline.\n" -msgstr "INFO: プリンタは現在オフラインです。\n" +msgstr "INFO: プリンターは現在オフラインです。\n" + +#: backend/runloop.c:379 backend/usb-darwin.c:1144 msgid "INFO: Printer is now online.\n" -msgstr "INFO: プリンタがオンラインになりました。\n" +msgstr "INFO: プリンターは現在オンラインです。\n" + +#: backend/usb-darwin.c:1162 msgid "INFO: Printer is offline.\n" -msgstr "INFO: プリンタはオフラインです。\n" +msgstr "INFO: プリンターはオフラインです。\n" + +#: backend/parallel.c:242 backend/usb-unix.c:139 msgid "INFO: Printer not connected; will retry in 30 seconds...\n" -msgstr "INFO: プリンタが接続されていません。30 秒後に再試行します...\n" +msgstr "INFO: プリンターに接続できません。30 秒後に再試行します...\n" + +#: filter/rastertoepson.c:1076 filter/rastertohp.c:801 +#: filter/rastertolabel.c:1232 +#, c-format msgid "INFO: Printing page %d, %d%% complete...\n" -msgstr "INFO: %d ページをプリント中。%d%% が完了しました...\n" +msgstr "INFO: ページ %d をプリント中、%d%% 完了しました...\n" + +#: filter/imagetops.c:808 +#, c-format msgid "INFO: Printing page %d...\n" -msgstr "INFO: %d ページをプリント中...\n" +msgstr "INFO: ページ %d をプリント中...\n" + +#: backend/socket.c:459 filter/rastertoepson.c:1126 filter/rastertohp.c:856 +#: filter/rastertolabel.c:1281 msgid "INFO: Ready to print.\n" -msgstr "INFO: プリントの準備が整いました。\n" +msgstr "INFO: プリントの準備ができています\n" + +#: backend/lpd.c:1147 +#, c-format msgid "INFO: Sending control file (%lu bytes)\n" -msgstr "INFO: 制御ファイル(%lu バイト)を送信中\n" +msgstr "INFO: コントロールファイルを送信中 (%lu バイト)\n" + +#: backend/lpd.c:1000 +#, c-format msgid "INFO: Sending control file (%u bytes)\n" -msgstr "INFO: 制御ファイル(%u バイト)を送信中\n" +msgstr "INFO: コントロールファイルを送信中 (%u バイト)\n" + +#: backend/pap.c:564 msgid "INFO: Sending data\n" msgstr "INFO: データを送信中\n" + +#: backend/lpd.c:1059 +#, c-format msgid "INFO: Sending data file (%ld bytes)\n" -msgstr "INFO: データファイル(%ld バイト)を送信中\n" +msgstr "INFO: データファイルを送信中 (%ld バイト)\n" + +#: backend/lpd.c:1057 +#, c-format msgid "INFO: Sending data file (%lld bytes)\n" -msgstr "INFO: データファイル(%lld バイト)を送信中\n" +msgstr "INFO: データファイルを送信中 (%lld バイト)\n" + +#: backend/usb-darwin.c:521 msgid "INFO: Sending print data...\n" msgstr "INFO: プリントデータを送信中...\n" + +#: backend/parallel.c:294 backend/socket.c:406 backend/usb-unix.c:201 +#, c-format msgid "INFO: Sent print file, %ld bytes...\n" -msgstr "INFO: プリントファイル %ld バイトが送信されました...\n" +msgstr "INFO: プリントファイルを送信、%ld バイト...\n" + +#: backend/parallel.c:292 backend/socket.c:404 backend/usb-unix.c:199 +#, c-format msgid "INFO: Sent print file, %lld bytes...\n" -msgstr "INFO: プリントファイル %lld バイトが送信されました...\n" +msgstr "INFO: プリントファイルを送信、%lld バイト...\n" + +#: backend/lpd.c:1071 +#, c-format msgid "INFO: Spooling LPR job, %.0f%% complete...\n" -msgstr "INFO: LPR ジョブをスプール中、%.0f%% が完了しました...\n" +msgstr "INFO: LPR ジョブをスプール中、%.0f%% 完了しました...\n" + +#: backend/ipp.c:551 backend/ipp.c:809 backend/lpd.c:802 +#: backend/parallel.c:221 backend/scsi-irix.c:125 backend/scsi-linux.c:139 +#: backend/serial.c:241 backend/socket.c:294 backend/usb-unix.c:117 msgid "INFO: Unable to contact printer, queuing on next printer in class...\n" -msgstr "INFO: プリンタに接続できません。クラス内の次のプリンタのキューに入ります...\n" +msgstr "INFO: プリンターと交信できません。クラス内の次のプリンターにキューします...\n" + +#: backend/pap.c:309 +#, c-format msgid "INFO: Using default AppleTalk zone \"%s\"\n" -msgstr "INFO: デフォルトの AppleTalk ゾーン“%s”を使用中\n" +msgstr "INFO: デフォルトの AppleTalk ゾーン \"%s\" を使います\n" + +#: backend/ipp.c:1132 msgid "INFO: Waiting for job to complete...\n" -msgstr "INFO: ジョブの完了を待機中...\n" +msgstr "INFO: ジョブが完了するのを待っています...\n" + +#: backend/usb-darwin.c:441 backend/usb-libusb.c:117 msgid "INFO: Waiting for printer to become available...\n" -msgstr "INFO: プリンタが利用可能になるのを待機中...\n" +msgstr "INFO: プリンターが使用可能になるのを待っています...\n" + +#: ppdc/sample.c:93 msgid "ISO B0" msgstr "ISO B0" + +#: ppdc/sample.c:94 msgid "ISO B1" msgstr "ISO B1" + +#: ppdc/sample.c:104 msgid "ISO B10" msgstr "ISO B10" + +#: ppdc/sample.c:95 msgid "ISO B2" msgstr "ISO B2" + +#: ppdc/sample.c:96 msgid "ISO B3" msgstr "ISO B3" + +#: ppdc/sample.c:97 msgid "ISO B4" msgstr "ISO B4" + +#: ppdc/sample.c:69 msgid "ISO B4 Envelope" msgstr "ISO B4 封筒" + +#: ppdc/sample.c:98 msgid "ISO B5" msgstr "ISO B5" + +#: ppdc/sample.c:99 msgid "ISO B5 (Oversize)" -msgstr "ISO B5(特大)" +msgstr "ISO B5 (特大)" + +#: ppdc/sample.c:70 msgid "ISO B5 Envelope" msgstr "ISO B5 封筒" + +#: ppdc/sample.c:100 msgid "ISO B6" msgstr "ISO B6" + +#: ppdc/sample.c:71 msgid "ISO B6 Envelope" msgstr "ISO B6 封筒" + +#: ppdc/sample.c:101 msgid "ISO B7" msgstr "ISO B7" + +#: ppdc/sample.c:102 msgid "ISO B8" msgstr "ISO B8" + +#: ppdc/sample.c:103 msgid "ISO B9" msgstr "ISO B9" + +#: cups/ppd.c:349 msgid "Illegal control character" -msgstr "制御文字が不正です" +msgstr "不正な制御文字" + +#: cups/ppd.c:350 msgid "Illegal main keyword string" -msgstr "メインキーワード文字列が不正です" +msgstr "不正なメインキーワード文字列" + +#: cups/ppd.c:351 msgid "Illegal option keyword string" -msgstr "オプションキーワード文字列が不正です" +msgstr "不正なオプションキーワード文字列" + +#: cups/ppd.c:352 msgid "Illegal translation string" -msgstr "変換文字列が不正です" +msgstr "不正な翻訳文字列" + +#: cups/ppd.c:353 msgid "Illegal whitespace character" -msgstr "空白文字が不正です" +msgstr "不正な空白文字" + +#: backend/ipp.c:1686 msgid "Ink/toner almost empty." -msgstr "インク/トナーがもうすぐ空になります。" +msgstr "インクまたはトナーがほとんどありません。" + +#: backend/ipp.c:1688 msgid "Ink/toner empty!" -msgstr "インク/トナーが空です!" +msgstr "インクまたはトナーがありません!" + +#: backend/ipp.c:1690 msgid "Ink/toner waste bin almost full." -msgstr "廃インクまたは廃トナーボックスがほとんど一杯です。" +msgstr "廃インクまたは廃トナー容器がほとんど一杯です。" + +#: backend/ipp.c:1692 msgid "Ink/toner waste bin full!" -msgstr "廃インクまたは廃トナーボックスが一杯です!" +msgstr "廃インクまたは廃トナー容器が一杯です!" + +#: ppdc/sample.c:246 msgid "Installable Options" -msgstr "インストール可能なオプション" +msgstr "インストール可能オプション" + +#: ppdc/sample.c:249 msgid "Installed" -msgstr "インストール済み" +msgstr "インストールされています" + +#: ppdc/sample.c:265 msgid "IntelliBar Label Printer" -msgstr "IntelliBar ラベルプリンタ" +msgstr "IntelliBar ラベルプリンター" + +#: ppdc/sample.c:264 msgid "Intellitech" msgstr "Intellitech" + +#: backend/ipp.c:1670 msgid "Interlock open." msgstr "インターロックが開いています。" + +#: cups/ppd.c:340 msgid "Internal error" msgstr "内部エラー" + +#: ppdc/sample.c:130 msgid "Internet Postage 2-Part" msgstr "Internet Postage 2-Part" + +#: ppdc/sample.c:139 msgid "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" msgstr "Internet Postage 2-Part - 2 1/4 x 7 1/2\"" + +#: ppdc/sample.c:131 msgid "Internet Postage 3-Part" msgstr "Internet Postage 3-Part" + +#: ppdc/sample.c:140 msgid "Internet Postage 3-Part - 2 1/4 x 7\"" msgstr "Internet Postage 3-Part - 2 1/4 x 7\"" + +#: backend/ipp.c:204 msgid "Internet Printing Protocol" -msgstr "IPP(Internet Printing Protocol)" +msgstr "インターネット印刷プロトコル" + +#: ppdc/sample.c:68 msgid "Invite Envelope" msgstr "招待状封筒" + +#: ppdc/sample.c:72 msgid "Italian Envelope" -msgstr "イタリア標準封筒" +msgstr "イタリア封筒" + +#: cups/ppd.c:1344 msgid "JCL" msgstr "JCL" + +#: scheduler/ipp.c:9433 +#, c-format msgid "Job #%d cannot be restarted - no files!" -msgstr "ジョブ #%d を再開できません - ファイルがありません!" +msgstr "ジョブ番号 %d を再開できません - ファイルが見つかりません!" + +#: scheduler/ipp.c:3675 scheduler/ipp.c:4045 scheduler/ipp.c:6640 +#: scheduler/ipp.c:6782 scheduler/ipp.c:7888 scheduler/ipp.c:8052 +#: scheduler/ipp.c:8288 scheduler/ipp.c:8333 scheduler/ipp.c:9176 +#: scheduler/ipp.c:9401 scheduler/ipp.c:9818 scheduler/ipp.c:10393 +#, c-format msgid "Job #%d does not exist!" -msgstr "ジョブ #%d が存在しません!" +msgstr "ジョブ番号 %d は存在しません!" + +#: scheduler/ipp.c:4076 +#, c-format msgid "Job #%d is already aborted - can't cancel." -msgstr "ジョブ #%d はすでに破棄されています - キャンセルできません。" +msgstr "ジョブ番号 %d はすでに中断されています - キャンセルできません。" + +#: scheduler/ipp.c:4070 +#, c-format msgid "Job #%d is already canceled - can't cancel." -msgstr "ジョブ #%d はすでにキャンセルされています - キャンセルできません。" +msgstr "ジョブ番号 %d はすでにキャンセルされています - キャンセルできません。" + +#: scheduler/ipp.c:4082 +#, c-format msgid "Job #%d is already completed - can't cancel." -msgstr "ジョブ #%d はすでに完了しています - キャンセルできません。" +msgstr "ジョブ番号 %d はすでに完了しています - キャンセルできません。" + +#: scheduler/ipp.c:8375 scheduler/ipp.c:10408 +#, c-format msgid "Job #%d is finished and cannot be altered!" -msgstr "ジョブ #%d は終了しているため変更できません!" +msgstr "ジョブ番号 %d はすでに終了し、変更できません!" + +#: scheduler/ipp.c:9415 +#, c-format msgid "Job #%d is not complete!" -msgstr "ジョブ #%d は完了していません!" +msgstr "ジョブ番号 %d は完了していません!" + +#: scheduler/ipp.c:3690 +#, c-format msgid "Job #%d is not held for authentication!" -msgstr "ジョブ #%d は認証のために保留中ではありません!" +msgstr "ジョブ番号 %d は認証のために保留されていません!" + +#: scheduler/ipp.c:9190 +#, c-format msgid "Job #%d is not held!" -msgstr "ジョブ #%d は保留中ではありません!" +msgstr "ジョブ番号 %d は保留されていません!" + +#: scheduler/ipp.c:7866 +#, c-format msgid "Job #%s does not exist!" -msgstr "ジョブ #%s が存在しません!" +msgstr "ジョブ番号 #%s は存在しません!" + +#: scheduler/ipp.c:6267 +#, c-format msgid "Job %d not found!" -msgstr "ジョブ %d が見つかりません!" +msgstr "ジョブ番号 %d は見つかりません!" + +#: cgi-bin/ipp-var.c:1031 msgid "Job Completed" -msgstr "ジョブが完了しました" +msgstr "ジョブ完了" + +#: cgi-bin/ipp-var.c:1029 msgid "Job Created" -msgstr "ジョブが作成されました" +msgstr "ジョブ作成" + +#: filter/bannertops.c:619 msgid "Job ID: " -msgstr "ジョブ ID:" +msgstr "ジョブ ID: " + +#: cgi-bin/ipp-var.c:1035 msgid "Job Options Changed" -msgstr "ジョブのオプションが変更されました" +msgstr "ジョブオプション変更" + +#: cgi-bin/ipp-var.c:1033 msgid "Job Stopped" -msgstr "ジョブが停止されました" +msgstr "ジョブ中止" + +#: filter/bannertops.c:627 msgid "Job UUID: " -msgstr "ジョブ UUID:" +msgstr "ジョブ UUID: " + +#: scheduler/ipp.c:10490 msgid "Job is completed and cannot be changed." -msgstr "ジョブは完了しているため変更できません。" +msgstr "ジョブは完了し変更できません。" + +#: cgi-bin/jobs.c:197 msgid "Job operation failed:" -msgstr "ジョブの操作に失敗しました:" +msgstr "ジョブ操作失敗:" + +#: scheduler/ipp.c:10526 scheduler/ipp.c:10547 scheduler/ipp.c:10558 msgid "Job state cannot be changed." -msgstr "ジョブの状況を変更できません。" +msgstr "ジョブの状態を変更できません。" + +#: scheduler/ipp.c:9280 msgid "Job subscriptions cannot be renewed!" -msgstr "ジョブ照会先を更新できません!" +msgstr "ジョブサブスクリプションが更新できません!" + +#: cgi-bin/jobs.c:102 cgi-bin/jobs.c:113 cgi-bin/jobs.c:194 msgid "Jobs" msgstr "ジョブ" + +#: ppdc/sample.c:73 msgid "Kaku2 Envelope" msgstr "角 2 封筒" + +#: ppdc/sample.c:74 msgid "Kaku3 Envelope" msgstr "角 3 封筒" + +#: backend/lpd.c:178 msgid "LPD/LPR Host or Printer" -msgstr "LPD/LPR ホストまたはプリンタ" +msgstr "LPD/LPR ホストまたはプリンター" + +#: ppdc/sample.c:202 msgid "Label Printer" -msgstr "ラベルプリンタ" +msgstr "ラベルプリンター" + +#: ppdc/sample.c:418 msgid "Label Top" -msgstr "ラベル上部" +msgstr "ラベルトップ" + +#: scheduler/ipp.c:2138 scheduler/ipp.c:6190 +#, c-format msgid "Language \"%s\" not supported!" -msgstr "言語“%s”には対応していません!" +msgstr "言語 \"%s\" はサポートされていません!" + +#: ppdc/sample.c:127 msgid "Large Address" -msgstr "住所(大)" +msgstr "ラージアドレス" + +#: ppdc/sample.c:136 msgid "Large Address - 1 4/10 x 3 1/2\"" -msgstr "住所(大) - 1 4/10 x 3 1/2\"" +msgstr "ラージアドレス - 1 4/10 x 3 1/2\"" + +#: ppdc/sample.c:263 msgid "LaserJet Series PCL 4/5" -msgstr "LaserJet シリーズ PCL 4/5" +msgstr "LaserJet Series PCL 4/5" + +#: ppdc/sample.c:208 msgid "Light" msgstr "薄い" + +#: cups/ppd.c:348 msgid "Line longer than the maximum allowed (255 characters)" -msgstr "行が最大許容文字数(255 文字)を超えています" +msgstr "1 行が最大値 (255 文字) を超えています" + +#: cgi-bin/admin.c:2356 msgid "List Available Printers" -msgstr "使用可能なプリンタをリスト表示" +msgstr "使用可能なプリンターをリスト化" + +#: filter/bannertops.c:740 msgid "Location: " -msgstr "場所:" +msgstr "場所: " + +#: ppdc/sample.c:244 msgid "Long-Edge (Portrait)" -msgstr "長辺(縦)" +msgstr "長辺給紙 (縦向き)" + +#: filter/bannertops.c:749 msgid "Make and Model: " -msgstr "製造元と機種:" +msgstr "プリンタードライバー: " + +#: ppdc/sample.c:240 msgid "Manual Feed" msgstr "手差し" + +#: filter/bannertops.c:776 msgid "Media Dimensions: " -msgstr "メディアの大きさ:" +msgstr "用紙の大きさ: " + +#: filter/bannertops.c:796 msgid "Media Limits: " -msgstr "メディアの制限:" +msgstr "用紙の印字領域: " + +#: filter/bannertops.c:765 msgid "Media Name: " -msgstr "メディアの名前:" +msgstr "用紙名:" + +#: cups/ppd.c:744 cups/ppd.c:1281 msgid "Media Size" -msgstr "メディアサイズ" +msgstr "用紙サイズ" + +#: cups/ppd.c:748 cups/ppd.c:1285 ppdc/sample.c:234 msgid "Media Source" -msgstr "メディアソース" +msgstr "給紙" + +#: ppdc/sample.c:336 msgid "Media Tracking" -msgstr "メディアトラッキング" +msgstr "用紙の経路" + +#: cups/ppd.c:746 cups/ppd.c:1283 ppdc/sample.c:257 msgid "Media Type" -msgstr "メディアタイプ" +msgstr "用紙種類" + +#: backend/ipp.c:1657 msgid "Media jam!" -msgstr "メディアが詰まっています!" +msgstr "紙詰まりです!" + +#: backend/ipp.c:1676 msgid "Media tray almost empty." -msgstr "メディアトレイがもうすぐ空になります。" +msgstr "用紙トレイが空になりかけています。" + +#: backend/ipp.c:1678 msgid "Media tray empty!" -msgstr "メディアトレイが空です!" +msgstr "用紙トレイが空になりました!" + +#: backend/ipp.c:1674 msgid "Media tray missing!" -msgstr "メディアトレイがありません!" +msgstr "用紙トレイが見つかりません!" + +#: backend/ipp.c:1655 msgid "Media tray needs to be filled." -msgstr "メディアトレイに補充が必要です。" +msgstr "用紙トレイに補充が必要です。" + +#: ppdc/sample.c:209 msgid "Medium" -msgstr "中" +msgstr "紙質" + +#: cups/ppd.c:337 msgid "Memory allocation error" -msgstr "メモリの割り当てエラー" +msgstr "メモリ割り当てエラー" + +#: cups/ppd.c:338 msgid "Missing PPD-Adobe-4.x header" msgstr "PPD-Adobe-4.x ヘッダがありません" + +#: cups/ppd.c:347 msgid "Missing asterisk in column 1" msgstr "1 列目にアスタリスクがありません" + +#: scheduler/ipp.c:6662 msgid "Missing document-number attribute!" -msgstr "document-number 属性がありません!" +msgstr "document-number 属性がありません!" + +#: cups/adminutil.c:284 +#, c-format msgid "Missing double quote on line %d!" -msgstr "%d 行目に二重引用符がありません!" +msgstr "%d 行に二重引用符がありません!" + +#: cgi-bin/admin.c:2068 cgi-bin/admin.c:2153 cgi-bin/admin.c:2789 +#: cgi-bin/admin.c:3043 cgi-bin/admin.c:3154 cgi-bin/admin.c:3832 msgid "Missing form variable!" -msgstr "フォーム変数がありません!" +msgstr "form 変数がありません!" + +#: scheduler/ipp.c:7062 msgid "Missing notify-subscription-ids attribute!" -msgstr "notify-subscription-ids 属性がありません!" +msgstr "notify-subscription-ids 属性がありません!" + +#: scheduler/ipp.c:3812 msgid "Missing requesting-user-name attribute!" -msgstr "requesting-user-name 属性がありません!" +msgstr "requesting-user-name 属性が設定されていません!" + +#: scheduler/ipp.c:465 msgid "Missing required attributes!" -msgstr "必要な属性がありません!" +msgstr "必須の属性が設定されていません!" + +#: cups/adminutil.c:265 +#, c-format msgid "Missing value on line %d!" -msgstr "%d 行目に値がありません!" +msgstr "%d 行に値がありません!" + +#: cups/ppd.c:339 msgid "Missing value string" msgstr "値文字列がありません" -msgid "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n" -msgstr "機種:name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n" + +#: systemv/lpinfo.c:475 +#, c-format +msgid "" +"Model: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" +msgstr "" +"モデル: name = %s\n" +" natural_language = %s\n" +" make-and-model = %s\n" +" device-id = %s\n" + +#: cgi-bin/admin.c:480 msgid "Modify Class" -msgstr "クラスを変更" +msgstr "クラスの変更" + +#: cgi-bin/admin.c:772 msgid "Modify Printer" -msgstr "プリンタを変更" +msgstr "プリンターの変更" + +#: ppdc/sample.c:111 msgid "Monarch" msgstr "Monarch" + +#: ppdc/sample.c:75 msgid "Monarch Envelope" msgstr "Monarch 封筒" + +#: cgi-bin/ipp-var.c:416 cgi-bin/ipp-var.c:493 msgid "Move All Jobs" -msgstr "すべてのジョブを移動" +msgstr "すべてのジョブの移動" + +#: cgi-bin/ipp-var.c:361 cgi-bin/ipp-var.c:414 cgi-bin/ipp-var.c:491 msgid "Move Job" -msgstr "ジョブを移動" +msgstr "ジョブの移動" + +#: cups/http-support.c:1200 msgid "Moved Permanently" -msgstr "完全に移動されました" +msgstr "別の場所へ移動しました" + +#: backend/ipp.c:1057 +#, c-format msgid "NOTICE: Print file accepted - job ID %d.\n" -msgstr "NOTICE: プリントファイルは受け入れ済みです - ジョブ ID %d。\n" +msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID %d。\n" + +#: backend/ipp.c:1051 msgid "NOTICE: Print file accepted - job ID unknown.\n" -msgstr "NOTICE: プリントファイルは受け入れ済みです - ジョブ ID 不明。\n" +msgstr "NOTICE: プリントファイルを受け付けました - ジョブ ID 不明。\n" + +#: cups/ppd.c:336 msgid "NULL PPD file pointer" -msgstr "NULL PPD ファイルポインタ" +msgstr "PPD ファイルポインターが NULL です" + +#: cups/snmp.c:1052 msgid "Name OID uses indefinite length" -msgstr "名前 OID に使われている長さが不定です" +msgstr "OID 名は限定的な長さを使用します" + +#: ppdc/sample.c:402 msgid "Never" -msgstr "しない" +msgstr "Never" + +#: ppdc/sample.c:228 msgid "New Stylus Color Series" -msgstr "新しい Stylus Color シリーズ" +msgstr "New Stylus Color シリーズ" + +#: ppdc/sample.c:230 msgid "New Stylus Photo Series" -msgstr "新しい Stylus Photo シリーズ" +msgstr "New Stylus Photo シリーズ" + +#: cups/ppd.c:1867 msgid "No" msgstr "いいえ" + +#: cups/http-support.c:1197 msgid "No Content" -msgstr "内容がありません" +msgstr "中身がありません" + +#: cups/util.c:1308 msgid "No PPD name!" -msgstr "PPD 名がありません!" +msgstr "PPD の名前がありません!" + +#: cups/snmp.c:1046 msgid "No VarBind SEQUENCE" msgstr "VarBind SEQUENCE がありません" + +#: cups/adminutil.c:799 msgid "No Windows printer drivers are installed!" -msgstr "Windows プリンタドライバがインストールされていません!" +msgstr "Windows プリンタードライバーがインストールされていません!" + +#: cups/request.c:504 cups/request.c:763 msgid "No active connection" -msgstr "アクティブな接続がありません" +msgstr "アクティブな接続はありません" + +#: scheduler/ipp.c:3992 +#, c-format msgid "No active jobs on %s!" -msgstr "%s にアクティブなジョブがありません!" +msgstr "%s にはアクティブなジョブはありません!" + +#: scheduler/ipp.c:308 msgid "No attributes in request!" -msgstr "要求に属性が含まれていません!" +msgstr "リクエストに属性がありません!" + +#: scheduler/ipp.c:3718 msgid "No authentication information provided!" -msgstr "認証情報が提供されていません!" +msgstr "認証情報が提供されていません!" + +#: cups/snmp.c:1003 msgid "No community name" msgstr "コミュニティ名がありません" + +#: scheduler/ipp.c:6462 msgid "No default printer" -msgstr "デフォルトプリンタがありません" +msgstr "デフォルトのプリンターはありません" + +#: scheduler/ipp.c:7637 msgid "No destinations added." -msgstr "送信先は追加されませんでした。" +msgstr "追加された宛先はありません" + +#: cups/snmp.c:1033 msgid "No error-index" -msgstr "error-index がありません" +msgstr "エラーインデックスがありません" + +#: cups/snmp.c:1025 msgid "No error-status" -msgstr "error-status がありません" +msgstr "エラーステータスがありません" + +#: scheduler/ipp.c:8574 scheduler/ipp.c:9869 msgid "No file!?!" -msgstr "ファイルがありません!?!" +msgstr "ファイルがありません!?!" + +#: cups/util.c:930 msgid "No modification time!" -msgstr "変更時刻がありません!" +msgstr "変更時刻がありません!" + +#: cups/snmp.c:1050 msgid "No name OID" -msgstr "名前 OID がありません" +msgstr "OID 名がありません" + +#: cups/util.c:924 msgid "No printer name!" -msgstr "プリンタ名がありません!" +msgstr "プリンター名がありません!" + +#: cups/util.c:1861 msgid "No printer-uri found for class!" -msgstr "クラスの printer-uri が見つかりませんでした!" +msgstr "クラスのプリンターURI が見つかりません!" + +#: cups/util.c:1876 msgid "No printer-uri found!" -msgstr "printer-uri が見つかりませんでした!" +msgstr "プリンターURI が見つかりません!" + +#: scheduler/ipp.c:6847 msgid "No printer-uri in request!" -msgstr "要求に printer-uri が含まれていません!" +msgstr "プリンターURI のリクエストがありません!" + +#: cups/snmp.c:1017 msgid "No request-id" -msgstr "request-id がありません" +msgstr "リクエストID がありません" + +#: scheduler/ipp.c:6075 msgid "No subscription attributes in request!" -msgstr "要求に subscription 属性が含まれていません!" +msgstr "リクエストにサブスクリプション属性がありません!" + +#: scheduler/ipp.c:7951 msgid "No subscriptions found." -msgstr "照会先が見つかりませんでした。" +msgstr "サブスクリプションが見つかりません。" + +#: cups/snmp.c:1041 msgid "No variable-bindings SEQUENCE" msgstr "variable-bindings SEQUENCE がありません" + +#: cups/snmp.c:996 msgid "No version number" -msgstr "バージョン番号がありません" +msgstr "バージョン名がありません" + +#: ppdc/sample.c:339 msgid "Non-continuous (Mark sensing)" -msgstr "非連続(マーク感知)" +msgstr "非連続です (Mark sensing)" + +#: ppdc/sample.c:338 msgid "Non-continuous (Web sensing)" -msgstr "非連続(Web 感知)" +msgstr "非連続です (Web sensing)" + +#: ppdc/sample.c:210 msgid "Normal" -msgstr "通常" +msgstr "標準" + +#: cups/http-support.c:1218 msgid "Not Found" -msgstr "見つかりませんでした" +msgstr "見つかりません" + +#: cups/http-support.c:1230 msgid "Not Implemented" msgstr "実装されていません" + +#: ppdc/sample.c:248 msgid "Not Installed" msgstr "インストールされていません" + +#: cups/http-support.c:1206 msgid "Not Modified" msgstr "変更されていません" + +#: cups/http-support.c:1233 msgid "Not Supported" -msgstr "対応していません" +msgstr "サポートされていません" + +#: scheduler/ipp.c:1517 msgid "Not allowed to print." -msgstr "プリントが許可されていません。" +msgstr "印刷が許可されていません。" + +#: ppdc/sample.c:112 msgid "Note" -msgstr "メモ" +msgstr "注意" + +#: cups/http-support.c:1188 cups/ppd.c:334 msgid "OK" msgstr "OK" + +#: backend/ipp.c:1698 msgid "OPC almost at end-of-life." -msgstr "OPC がもうすぐ寿命になります。" +msgstr "OPC はもうすぐ交換が必要になります。" + +#: backend/ipp.c:1700 msgid "OPC at end-of-life!" -msgstr "OPC の寿命が切れました!" +msgstr "OPC は交換時期です!" + +#: ppdc/sample.c:243 msgid "Off (1-Sided)" -msgstr "オフ(片面)" +msgstr "Off (片面)" + +#: ppdc/sample.c:333 msgid "Oki" msgstr "Oki" + +#: cgi-bin/help.c:89 cgi-bin/help.c:130 cgi-bin/help.c:140 cgi-bin/help.c:171 msgid "Online Help" msgstr "オンラインヘルプ" + +#: cups/adminutil.c:983 +#, c-format msgid "Open of %s failed: %s" -msgstr "%s を開けませんでした:%s" +msgstr "%s のオープンに失敗しました: %s" + +#: cups/ppd.c:342 msgid "OpenGroup without a CloseGroup first" -msgstr "OpenGroup の前に CloseGroup がありません" +msgstr "OpenGroup の前にまず CloseGroup が必要です" + +#: cups/ppd.c:344 msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" -msgstr "OpenUI/JCLOpenUI の前に CloseUI/JCLCloseUI がありません" +msgstr "OpenUI/JCLOpenUI の前にまず CloseUI/JCLCloseUI が必要です" + +#: cgi-bin/admin.c:3603 msgid "Operation Policy" msgstr "操作ポリシー" + +#: cgi-bin/admin.c:3280 cgi-bin/admin.c:3340 msgid "Options Installed" msgstr "インストールされたオプション" + +#: filter/bannertops.c:670 msgid "Options: " -msgstr "オプション:" +msgstr "オプション:" + +#: backend/ipp.c:1666 msgid "Out of toner!" -msgstr "トナーが切れています!" +msgstr "トナー切れです!" + +#: cups/ppd.c:750 cups/ppd.c:1287 msgid "Output Mode" msgstr "出力モード" + +#: backend/ipp.c:1682 msgid "Output bin almost full." msgstr "排紙トレイがほとんど一杯です。" + +#: backend/ipp.c:1684 msgid "Output bin full!" -msgstr "排紙トレイが一杯です!" +msgstr "排紙トレイが一杯です!" + +#: systemv/lpstat.c:1191 systemv/lpstat.c:1195 +#, c-format msgid "Output for printer %s is sent to %s\n" -msgstr "プリンタ %s の出力は %s に送信されます\n" +msgstr "プリンター %s の出力は %s に送られます\n" + +#: systemv/lpstat.c:1185 +#, c-format msgid "Output for printer %s is sent to remote printer %s on %s\n" -msgstr "プリンタ %1$s の出力は %3$s 上のリモートプリンタ %2$s に送信されます\n" +msgstr "プリンター %s の出力は、リモートプリンター %s (%s 上) に送られます\n" + +#: systemv/lpstat.c:1209 systemv/lpstat.c:1213 +#, c-format msgid "Output for printer %s/%s is sent to %s\n" -msgstr "プリンタ %s/%s の出力は %s に送信されます\n" +msgstr "プリンター %s/%s の出力は %s に送られます\n" + +#: systemv/lpstat.c:1203 +#, c-format msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" -msgstr "プリンタ %1$s/%2$s の出力は %4$s 上のリモートプリンタ %3$s に送信されます\n" +msgstr "プリンター %s/%s の出力は、リモートプリンター %s (%s 上) に送られます\n" + +#: backend/ipp.c:1680 msgid "Output tray missing!" -msgstr "排紙トレイがありません!" +msgstr "排紙トレイが見つかりません!" + +#: systemv/cupstestdsc.c:403 msgid "PASS\n" msgstr "合格\n" + +#: ppdc/sample.c:232 msgid "PCL Laser Printer" -msgstr "PCL レーザープリンタ" +msgstr "PCL レーザープリンター" + +#: ppdc/sample.c:77 msgid "PRC1 Envelope" msgstr "PRC1 封筒" + +#: ppdc/sample.c:86 msgid "PRC10 Envelope" msgstr "PRC10 封筒" + +#: ppdc/sample.c:114 msgid "PRC16K" msgstr "PRC16K" + +#: ppdc/sample.c:78 msgid "PRC2 Envelope" msgstr "PRC2 封筒" + +#: ppdc/sample.c:79 msgid "PRC3 Envelope" msgstr "PRC3 封筒" + +#: ppdc/sample.c:115 msgid "PRC32K" msgstr "PRC32K" + +#: ppdc/sample.c:116 msgid "PRC32K (Oversize)" -msgstr "PRC32K(特大)" +msgstr "PRC32K (特大)" + +#: ppdc/sample.c:80 msgid "PRC4 Envelope" msgstr "PRC4 封筒" + +#: ppdc/sample.c:81 msgid "PRC5 Envelope" msgstr "PRC5 封筒" + +#: ppdc/sample.c:82 msgid "PRC6 Envelope" msgstr "PRC6 封筒" + +#: ppdc/sample.c:83 msgid "PRC7 Envelope" msgstr "PRC7 封筒" + +#: ppdc/sample.c:84 msgid "PRC8 Envelope" msgstr "PRC8 封筒" + +#: ppdc/sample.c:85 msgid "PRC9 Envelope" msgstr "PRC9 封筒" + +#: cups/snmp.c:1013 msgid "Packet does not contain a Get-Response-PDU" -msgstr "パケットに Get-Response-PDU が含まれていません" +msgstr "パケットが Get-Response-PDU を含んでいません" + +#: cups/snmp.c:992 msgid "Packet does not start with SEQUENCE" -msgstr "パケットが SEQUENCE で始まっていません" +msgstr "パケットが SEQUENCE から始まりません" + +#: ppdc/sample.c:332 msgid "ParamCustominCutInterval" msgstr "ParamCustominCutInterval" + +#: ppdc/sample.c:330 msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" + +#: cups/auth.c:149 +#, c-format msgid "Password for %s on %s? " -msgstr "%2$s 上の %1$s のパスワードを入力してください。" +msgstr "%s のパスワード (%s 上)? " + +#: systemv/cupsaddsmb.c:256 +#, c-format msgid "Password for %s required to access %s via SAMBA: " -msgstr "SAMBA 経由で %2$s にアクセスするには %1$s のパスワードが必要です:" +msgstr "%s のパスワード (SAMBA 経由で %s にアクセスするのに必要):" + +#: cgi-bin/classes.c:152 msgid "Pause Class" -msgstr "クラスを一時停止" +msgstr "クラスの休止" + +#: cgi-bin/printers.c:155 msgid "Pause Printer" -msgstr "プリンタを一時停止" +msgstr "プリンターの休止" + +#: ppdc/sample.c:420 msgid "Peel-Off" -msgstr "ガイドに沿って切り取る" +msgstr "Peel-Off" + +#: ppdc/sample.c:76 msgid "Personal Envelope" -msgstr "個人用封筒" +msgstr "パーソナル封筒" + +#: ppdc/sample.c:123 msgid "Photo" msgstr "写真" + +#: ppdc/sample.c:124 msgid "Photo Labels" msgstr "写真ラベル" + +#: ppdc/sample.c:258 msgid "Plain Paper" msgstr "普通紙" + +#: cgi-bin/admin.c:3298 cgi-bin/admin.c:3552 msgid "Policies" msgstr "ポリシー" + +#: cgi-bin/admin.c:3305 cgi-bin/admin.c:3621 cgi-bin/admin.c:3634 msgid "Port Monitor" -msgstr "ポートモニタ" +msgstr "ポートモニター" + +#: ppdc/sample.c:250 msgid "PostScript Printer" -msgstr "PostScript プリンタ" +msgstr "ポストスクリプトプリンター" + +#: ppdc/sample.c:113 msgid "Postcard" -msgstr "はがき" +msgstr "ハガキ" + +#: ppdc/sample.c:267 msgid "Print Density" -msgstr "プリント濃度" +msgstr "印刷密度" + +#: cups/notify.c:82 msgid "Print Job:" -msgstr "プリントジョブ:" +msgstr "ジョブの印刷:" + +#: ppdc/sample.c:312 msgid "Print Mode" -msgstr "プリントモード" +msgstr "印刷モード" + +#: ppdc/sample.c:355 msgid "Print Rate" -msgstr "プリントレート" +msgstr "印刷レート" + +#: cgi-bin/printers.c:164 msgid "Print Self-Test Page" -msgstr "セルフテストページをプリント" +msgstr "自己テストページの印刷" + +#: ppdc/sample.c:299 msgid "Print Speed" -msgstr "プリント速度" +msgstr "印刷速度" + +#: cgi-bin/ipp-var.c:768 msgid "Print Test Page" -msgstr "テストページをプリント" +msgstr "テストページの印刷" + +#: ppdc/sample.c:328 msgid "Print and Cut" -msgstr "プリントしてカット" +msgstr "Print and Cut" + +#: ppdc/sample.c:316 msgid "Print and Tear" -msgstr "プリントして切り取る" +msgstr "Print and Tear" + +#: filter/bannertops.c:644 msgid "Printed For: " -msgstr "プリント対象:" +msgstr "Printed For: " + +#: filter/bannertops.c:652 msgid "Printed From: " -msgstr "プリント元:" +msgstr "Printed From: " + +#: filter/bannertops.c:872 msgid "Printed On: " -msgstr "プリント先:" +msgstr "Printed On: " + +#: cgi-bin/ipp-var.c:1023 msgid "Printer Added" -msgstr "プリンタが追加されました" +msgstr "追加されたプリンター" + +#: ppdc/sample.c:235 msgid "Printer Default" -msgstr "プリンタのデフォルト" +msgstr "デフォルトのプリンター" + +#: cgi-bin/ipp-var.c:1027 msgid "Printer Deleted" -msgstr "プリンタが削除されました" +msgstr "削除されたプリンター" + +#: cgi-bin/ipp-var.c:1025 msgid "Printer Modified" -msgstr "プリンタが変更されました" +msgstr "変更されたプリンター" + +#: filter/bannertops.c:610 msgid "Printer Name: " -msgstr "プリンタ名:" +msgstr "プリンター名:" + +#: cgi-bin/ipp-var.c:1021 msgid "Printer Paused" -msgstr "プリンタを一時停止中" +msgstr "プリンターの休止" + +#: ppdc/sample.c:266 msgid "Printer Settings" -msgstr "プリンタ設定" +msgstr "プリンター設定" + +#: backend/ipp.c:1662 msgid "Printer offline." -msgstr "プリンタはオフラインです。" +msgstr "プリンターはオフラインです。" + +#: cups/notify.c:126 msgid "Printer:" -msgstr "プリンタ:" +msgstr "プリンター:" + +#: cgi-bin/printers.c:189 cgi-bin/printers.c:317 msgid "Printers" -msgstr "プリンタ" +msgstr "プリンター" + +#: cgi-bin/classes.c:158 cgi-bin/printers.c:161 msgid "Purge Jobs" -msgstr "ジョブを消去" +msgstr "ジョブの削除" + +#: ppdc/sample.c:117 msgid "Quarto" msgstr "Quarto" + +#: scheduler/ipp.c:1512 msgid "Quota limit reached." -msgstr "割り当て容量の制限に達しました。" +msgstr "Quota の制限に達しました。" + +#: berkeley/lpq.c:508 msgid "Rank Owner Job File(s) Total Size\n" -msgstr "ランク 所有者 ジョブ ファイル 合計サイズ\n" +msgstr "ランク 所有者 ジョブ ファイル 合計サイズ\n" + +#: berkeley/lpq.c:504 msgid "Rank Owner Pri Job Files Total Size\n" msgstr "ランク 所有者 優先 ジョブ ファイル 合計サイズ\n" + +#: cgi-bin/classes.c:156 cgi-bin/printers.c:159 msgid "Reject Jobs" -msgstr "ジョブを拒否" +msgstr "ジョブの拒否" + +#: ppdc/sample.c:400 msgid "Reprint After Error" -msgstr "エラー後に再プリント" +msgstr "エラー後の再印刷" + +#: cups/http-support.c:1221 msgid "Request Entity Too Large" -msgstr "要求エンティティが大きすぎます" +msgstr "要求するエンティティが大きすぎます" + +#: cups/ppd.c:752 cups/ppd.c:1289 ppdc/sample.c:203 msgid "Resolution" msgstr "解像度" + +#: cgi-bin/classes.c:150 msgid "Resume Class" -msgstr "クラスを再開" +msgstr "クラスを再開する" + +#: cgi-bin/printers.c:152 msgid "Resume Printer" -msgstr "プリンタを再開" +msgstr "プリンターを再開する" + +#: ppdc/sample.c:128 msgid "Return Address" -msgstr "差出人住所" +msgstr "アドレスを戻す" + +#: ppdc/sample.c:137 msgid "Return Address - 3/4 x 2\"" -msgstr "差出人住所 - 3/4 x 2\"" +msgstr "アドレスを戻す ー 3/4 x 2\"" + +#: ppdc/sample.c:421 msgid "Rewind" -msgstr "巻き戻す" +msgstr "戻る" + +#: cups/adminutil.c:2159 +#, c-format msgid "Running command: %s %s -N -A %s -c '%s'\n" -msgstr "コマンドを実行中:%s %s -N -A %s -c '%s'\n" +msgstr "コマンドを実行中: %s %s -N -A %s -c '%s'\n" + +#: backend/scsi-irix.c:70 backend/scsi-linux.c:83 msgid "SCSI Printer" -msgstr "SCSI プリンタ" +msgstr "SCSI プリンター" + +#: cups/snmp.c:994 msgid "SEQUENCE uses indefinite length" -msgstr "SEQUENCE に使われている長さが不定です" +msgstr "SEQUENCE は不定長を使用しています" + +#: cups/http-support.c:1203 msgid "See Other" -msgstr "その他を参照" +msgstr "残りを見てください" + +#: backend/serial.c:784 backend/serial.c:943 backend/serial.c:1066 +#: backend/serial.c:1160 +#, c-format msgid "Serial Port #%d" -msgstr "シリアルポート #%d" +msgstr "シリアルーポート #%d" + +#: cgi-bin/ipp-var.c:1037 msgid "Server Restarted" -msgstr "サーバが再起動されました" +msgstr "再起動されたサーバー" + +#: cgi-bin/ipp-var.c:1043 msgid "Server Security Auditing" -msgstr "サーバのセキュリティ監査" +msgstr "サーバーのセキュリティーチェック" + +#: cgi-bin/ipp-var.c:1039 msgid "Server Started" -msgstr "サーバが開始されました" +msgstr "開始されたサーバー" + +#: cgi-bin/ipp-var.c:1041 msgid "Server Stopped" -msgstr "サーバが停止されました" +msgstr "停止されたサーバー" + +#: cups/http-support.c:1239 msgid "Service Unavailable" -msgstr "サービスを利用できません" +msgstr "利用できないサービス" + +#: cgi-bin/admin.c:2790 cgi-bin/admin.c:2836 cgi-bin/admin.c:2993 +#: cgi-bin/admin.c:3012 msgid "Set Allowed Users" -msgstr "許可するユーザを設定" +msgstr "許可するユーザーの設定" + +#: cgi-bin/admin.c:3039 msgid "Set As Server Default" -msgstr "サーバのデフォルトとして設定" +msgstr "サーバーをデフォルトに設定" + +#: cgi-bin/admin.c:3139 msgid "Set Class Options" msgstr "クラスオプションを設定" + +#: cgi-bin/admin.c:3139 cgi-bin/admin.c:3308 cgi-bin/admin.c:3663 msgid "Set Printer Options" -msgstr "プリンタオプションを設定" +msgstr "プリンターオプションの設定" + +#: cgi-bin/admin.c:3833 cgi-bin/admin.c:3877 cgi-bin/admin.c:3895 msgid "Set Publishing" -msgstr "公開を設定" +msgstr "公開の設定" + +#: ppdc/sample.c:129 msgid "Shipping Address" -msgstr "送付先住所" +msgstr "発送アドレス" + +#: ppdc/sample.c:138 msgid "Shipping Address - 2 5/16 x 4\"" -msgstr "送付先住所 - 2 5/16 x 4\"" +msgstr "発送アドレス - 2 5/16 x 4\"" + +#: ppdc/sample.c:245 msgid "Short-Edge (Landscape)" -msgstr "短辺(横)" +msgstr "短辺 (横原稿)" + +#: ppdc/sample.c:260 msgid "Special Paper" -msgstr "特殊紙" +msgstr "スペシャルペーパー" + +#: ppdc/sample.c:313 msgid "Standard" msgstr "標準" + +#: cgi-bin/admin.c:3526 msgid "Starting Banner" msgstr "開始バナー" + +#: ppdc/sample.c:118 msgid "Statement" -msgstr "ステートメント" +msgstr "記述" + +#: ppdc/sample.c:223 msgid "Stylus Color Series" msgstr "Stylus Color シリーズ" + +#: ppdc/sample.c:229 msgid "Stylus Photo Series" msgstr "Stylus Photo シリーズ" + +#: ppdc/sample.c:119 msgid "Super A" -msgstr "Super A" +msgstr "スーパー A" + +#: ppdc/sample.c:120 msgid "Super B" -msgstr "Super B" +msgstr "スーパー B" + +#: ppdc/sample.c:125 msgid "Super B/A3" -msgstr "Super B/A3" +msgstr "スーパー B/A3" + +#: cups/http-support.c:1185 msgid "Switching Protocols" -msgstr "プロトコルを切り替え中" +msgstr "プロトコルの変更" + +#: ppdc/sample.c:121 msgid "Tabloid" -msgstr "Tabloid" +msgstr "タブロイド" + +#: ppdc/sample.c:122 msgid "Tabloid (Oversize)" -msgstr "Tabloid(特大)" +msgstr "タブロイド (特大)" + +#: ppdc/sample.c:314 msgid "Tear" -msgstr "切り取る" +msgstr "Tear" + +#: ppdc/sample.c:419 msgid "Tear-Off" -msgstr "切り取る" +msgstr "Tear-Off" + +#: ppdc/sample.c:360 msgid "Tear-Off Adjust Position" -msgstr "切り取り調整位置" +msgstr "Tear-Off 位置調節" + +#: scheduler/ipp.c:7309 +#, c-format msgid "The PPD file \"%s\" could not be found." -msgstr "PPD ファイル“%s”が見つかりませんでした。" +msgstr "PPD ファイル \"%s\" が見つかりません。" + +#: scheduler/ipp.c:7296 +#, c-format msgid "The PPD file \"%s\" could not be opened: %s" -msgstr "PPD ファイル“%s”を開けませんでした:%s" +msgstr "PPD ファイル \"%s\" が開きませんでした: %s" + +#: cgi-bin/admin.c:638 msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." -msgstr "クラス名には 127 文字以下のプリント可能な文字だけを使用できます。空白、スラッシュ(/)、ポンド記号(#)を含めることはできません。" +msgstr "クラス名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポンド記号 (#) を含んではなりません。" + +#: scheduler/ipp.c:2165 msgid "The notify-lease-duration attribute cannot be used with job subscriptions." -msgstr "notify-lease-duration 属性はジョブ照会先では使用できません。" +msgstr "notify-lease-duration 属性は、ジョブサブスクリプションと一緒に使うことはできません。" + +#: scheduler/ipp.c:2148 scheduler/ipp.c:6200 +#, c-format msgid "The notify-user-data value is too large (%d > 63 octets)!" -msgstr "notify-user-data 値が大きすぎます(%d は 63 オクテットを超えています)!" +msgstr "notify-user-data 値が大きすぎます (%d > 63 オクテット)!" + +#: cgi-bin/admin.c:821 msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." -msgstr "プリンタ名には 127 文字以下のプリント可能な文字だけを使用できます。空白、スラッシュ(/)、ポンド記号(#)を含めることはできません。" +msgstr "プリンター名は 127 文字以内の表示可能文字から成り、空白、スラッシュ (/)、ポンド記号 (#) を含んではなりません。" + +#: scheduler/ipp.c:1347 msgid "The printer or class is not shared!" -msgstr "プリンタまたはクラスが共有されていません!" +msgstr "プリンターまたはクラスは共有できません!" + +#: scheduler/ipp.c:872 scheduler/ipp.c:1178 scheduler/ipp.c:3848 +#: scheduler/ipp.c:3954 scheduler/ipp.c:5731 scheduler/ipp.c:6034 +#: scheduler/ipp.c:6347 scheduler/ipp.c:6884 scheduler/ipp.c:7514 +#: scheduler/ipp.c:7570 scheduler/ipp.c:7878 scheduler/ipp.c:8146 +#: scheduler/ipp.c:8236 scheduler/ipp.c:8269 scheduler/ipp.c:8589 +#: scheduler/ipp.c:8980 scheduler/ipp.c:9060 scheduler/ipp.c:10261 +#: scheduler/ipp.c:10714 scheduler/ipp.c:11042 scheduler/ipp.c:11109 +#: scheduler/ipp.c:11392 msgid "The printer or class was not found." -msgstr "プリンタまたはクラスが見つかりませんでした。" +msgstr "プリンターまたはクラスが見つかりませんでした。" + +#: scheduler/ipp.c:978 scheduler/ipp.c:2355 +#, c-format msgid "The printer-uri \"%s\" contains invalid characters." -msgstr "printer-uri“%s”に無効な文字が含まれています。" +msgstr "printer-uri \"%s\" には、無効な文字が含まれています。" + +#: scheduler/ipp.c:3793 msgid "The printer-uri attribute is required!" -msgstr "printer-uri 属性は必須です!" +msgstr "printer-uri 属性は必須です!" + +#: scheduler/ipp.c:962 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/classes/CLASSNAME\"." -msgstr "printer-uri は“ipp://HOSTNAME/classes/CLASSNAME”の形式である必要があります。" +msgstr "printer-uri は、\"ipp://ホスト名/classes/クラス名\" 形式でなければなりません。" + +#: scheduler/ipp.c:2339 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." -msgstr "printer-uri は“ipp://HOSTNAME/printers/PRINTERNAME”の形式である必要があります。" +msgstr "printer-uri は \"ipp://ホスト名/printers/プリンター名\" 形式でなければなりません。" + +#: cgi-bin/admin.c:385 msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." -msgstr "照会先名には空白、スラッシュ(/)、疑問符(?)、ポンド記号(#)を含めることはできません。" +msgstr "サブスクリプション名には、スペース、スラッシュ (/)、疑問府 (?)、ポンド記号 (#) を使用しないでください。" + +#: scheduler/ipp.c:6277 msgid "There are too many subscriptions." -msgstr "照会先が多すぎます。" +msgstr "サブスクリプションが多すぎます。" + +#: ppdc/sample.c:407 msgid "Thermal Transfer Media" msgstr "熱転写メディア" + +#: filter/bannertops.c:636 msgid "Title: " -msgstr "タイトル:" +msgstr "タイトル: " + +#: backend/ipp.c:1664 msgid "Toner low." msgstr "トナーが少なくなっています。" + +#: scheduler/ipp.c:1506 msgid "Too many active jobs." msgstr "アクティブなジョブが多すぎます。" + +#: scheduler/ipp.c:1444 +#, c-format msgid "Too many job-sheets values (%d > 2)!" -msgstr "job-sheets 値が多すぎます(%d は 2 を超えています)!" +msgstr "job-sheets 値が多すぎます (%d > 2)!" + +#: scheduler/ipp.c:2659 +#, c-format msgid "Too many printer-state-reasons values (%d > %d)!" -msgstr "printer-state-reasons 値が多すぎます(%d は %d を超えています)!" +msgstr "printer-state-reasons 値が多すぎます (%d > %d)!" + +#: ppdc/sample.c:261 msgid "Transparency" -msgstr "透明度" +msgstr "OHP シート" + +#: ppdc/sample.c:256 msgid "Tray" msgstr "トレイ" + +#: ppdc/sample.c:236 msgid "Tray 1" msgstr "トレイ 1" + +#: ppdc/sample.c:237 msgid "Tray 2" msgstr "トレイ 2" + +#: ppdc/sample.c:238 msgid "Tray 3" msgstr "トレイ 3" + +#: ppdc/sample.c:239 msgid "Tray 4" msgstr "トレイ 4" + +#: cups/http-support.c:1224 msgid "URI Too Long" -msgstr "URI が長すぎます" +msgstr "URI が長過ぎます" + +#: ppdc/sample.c:88 msgid "US Executive" -msgstr "US Executive" +msgstr "US エグゼクティブ" + +#: ppdc/sample.c:91 msgid "US Fanfold" msgstr "US Fanfold" + +#: ppdc/sample.c:105 msgid "US Ledger" -msgstr "US Ledger" +msgstr "US レジャー" + +#: ppdc/sample.c:106 msgid "US Legal" -msgstr "リーガル" +msgstr "US リーガル" + +#: ppdc/sample.c:107 msgid "US Legal (Oversize)" -msgstr "リーガル(特大)" +msgstr "US リーガル (特大)" + +#: ppdc/sample.c:108 msgid "US Letter" -msgstr "レター" +msgstr "US レター" + +#: ppdc/sample.c:109 msgid "US Letter (Oversize)" -msgstr "レター(特大)" +msgstr "US レター (特大)" + +#: ppdc/sample.c:110 msgid "US Letter (Small)" -msgstr "レター(小)" +msgstr "US レター (小)" + +#: backend/serial.c:797 +#, c-format msgid "USB Serial Port #%d" msgstr "USB シリアルポート #%d" + +#: cgi-bin/admin.c:1921 cgi-bin/admin.c:1934 cgi-bin/admin.c:1958 msgid "Unable to access cupsd.conf file:" -msgstr "cupsd.conf ファイルにアクセスできません:" +msgstr "cupsd.conf ファイルにアクセスできません:" + +#: cgi-bin/admin.c:437 msgid "Unable to add RSS subscription:" -msgstr "RSS 照会先を追加できません:" +msgstr " RSS 購読を追加できません:" + +#: cgi-bin/admin.c:704 msgid "Unable to add class:" -msgstr "クラスを追加できません:" +msgstr "クラスを追加できません:" + +#: scheduler/ipp.c:1550 +#, c-format msgid "Unable to add job for destination \"%s\"!" -msgstr "送信先“%s”のジョブを追加できません!" +msgstr "宛先\"%s\"にジョブを追加できません!" + +#: cgi-bin/admin.c:953 cgi-bin/admin.c:1312 msgid "Unable to add printer:" -msgstr "プリンタを追加できません:" +msgstr "プリンターを追加ができません:" + +#: scheduler/ipp.c:1292 msgid "Unable to allocate memory for file types!" -msgstr "ファイルタイプ用にメモリを割り当てられません!" +msgstr "ファイルタイプ用にメモリを割り当てられません!" + +#: cgi-bin/admin.c:1418 msgid "Unable to cancel RSS subscription:" -msgstr "RSS 照会先をキャンセルできません:" +msgstr "RSS 購読をキャンセルできません:" + +#: cgi-bin/admin.c:3878 msgid "Unable to change printer-is-shared attribute:" -msgstr "printer-is-shared 属性を変更できません:" +msgstr "printer-is-shared 属性を変更することができません:" + +#: cgi-bin/admin.c:2994 msgid "Unable to change printer:" -msgstr "プリンタを変更できません:" +msgstr "プリンターを変更できません:" + +#: cgi-bin/admin.c:1598 cgi-bin/admin.c:1762 msgid "Unable to change server settings:" -msgstr "サーバ設定を変更できません:" +msgstr "サーバーの設定を変更できません:" + +#: cups/adminutil.c:941 cups/util.c:1672 msgid "Unable to connect to host." -msgstr "ホストに接続できません。" +msgstr "ホストに接続できません" + +#: cups/adminutil.c:737 +#, c-format msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" -msgstr "64 ビット CUPS プリンタ・ドライバ・ファイルをコピーできません(%d)!" +msgstr "64-bit 版の CUPS プリンタードライバーファイルをコピーできません (%d)!" + +#: cups/adminutil.c:702 +#, c-format msgid "Unable to copy 64-bit Windows printer driver files (%d)!" -msgstr "64 ビット Windows プリンタ・ドライバ・ファイルをコピーできません(%d)!" +msgstr "64-bit 版の Windows プリンタードライバーをコピーできません (%d)!" + +#: cups/adminutil.c:533 +#, c-format msgid "Unable to copy CUPS printer driver files (%d)!" -msgstr "CUPS プリンタ・ドライバ・ファイルをコピーできません(%d)!" +msgstr "複数の CUPS プリンタードライバーファイルをコピーできません (%d)!" + +#: scheduler/ipp.c:2776 +#, c-format msgid "Unable to copy PPD file - %s!" -msgstr "PPD ファイルをコピーできません - %s!" +msgstr "PPD ファイルをコピーできません! - %s" + +#: scheduler/ipp.c:2842 msgid "Unable to copy PPD file!" -msgstr "PPD ファイルをコピーできません!" +msgstr "PPD ファイルをコピーできません!" + +#: cups/adminutil.c:498 +#, c-format msgid "Unable to copy Windows 2000 printer driver files (%d)!" -msgstr "Windows 2000 プリンタ・ドライバ・ファイルをコピーできません(%d)!" +msgstr "複数の Windows 2000 プリンタードライバーファイルをコピーできません (%d)!" + +#: cups/adminutil.c:621 +#, c-format msgid "Unable to copy Windows 9x printer driver files (%d)!" -msgstr "Windows 9x プリンタ・ドライバ・ファイルをコピーできません(%d)!" +msgstr "複数の Windows 9x プリンタードライバーファイルをコピーできません (%d)!" + +#: scheduler/ipp.c:2753 +#, c-format msgid "Unable to copy interface script - %s!" -msgstr "インターフェイス・スクリプトをコピーできません - %s!" +msgstr "インターフェイススクリプトをコピーできません! - %s" + +#: cups/util.c:613 cups/util.c:1732 msgid "Unable to create printer-uri!" -msgstr "printer-uri を作成できません!" +msgstr "printer-uri を作成できません!" + +#: cgi-bin/admin.c:1812 cgi-bin/admin.c:1824 msgid "Unable to create temporary file:" -msgstr "一時ファイルを作成できません:" +msgstr "テンポラリファイルを作成できません:" + +#: cgi-bin/admin.c:2115 msgid "Unable to delete class:" -msgstr "クラスを削除できません:" +msgstr "クラスを削除できません:" + +#: cgi-bin/admin.c:2200 msgid "Unable to delete printer:" -msgstr "プリンタを削除できません:" +msgstr "プリンターを削除できません:" + +#: cgi-bin/classes.c:245 cgi-bin/printers.c:254 msgid "Unable to do maintenance command:" -msgstr "保守コマンドを実行できません:" +msgstr "メンテナンスコマンドを実行できません:" + +#: cgi-bin/admin.c:1936 msgid "Unable to edit cupsd.conf files larger than 1MB!" -msgstr "1MB を超える cupsd.conf ファイルは編集できません!" +msgstr "1MB 以上の cupsd.conf ファイルは編集できません!" + +#: cgi-bin/ipp-var.c:362 msgid "Unable to find destination for job!" -msgstr "ジョブの送信先が見つかりません!" +msgstr "ジョブの宛先が見つかりません!" + +#: cups/http-support.c:1430 msgid "Unable to find printer!\n" -msgstr "プリンタが見つかりません!\n" +msgstr "プリンターが見つかりません!\n" + +#: cgi-bin/classes.c:435 msgid "Unable to get class list:" -msgstr "クラスリストを取得できません:" +msgstr "クラスリストを取得できません:" + +#: cgi-bin/classes.c:534 msgid "Unable to get class status:" -msgstr "クラスの状況を取得できません:" +msgstr "クラスの状態を取得できません:" + +#: cgi-bin/admin.c:1213 msgid "Unable to get list of printer drivers:" -msgstr "プリンタドライバのリストを取得できません:" +msgstr "プリンタードライバーのリストを取得できません:" + +#: cgi-bin/admin.c:2844 msgid "Unable to get printer attributes:" -msgstr "プリンタ属性を取得できません:" +msgstr "プリンター属性を取得できません:" + +#: cgi-bin/printers.c:452 msgid "Unable to get printer list:" -msgstr "プリンタリストを取得できません:" +msgstr "プリンターリストを取得できません:" + +#: cgi-bin/printers.c:554 msgid "Unable to get printer status:" -msgstr "プリンタの状況を取得できません:" +msgstr "プリンターの状態を取得できません:" + +#: cups/adminutil.c:576 cups/adminutil.c:780 +#, c-format msgid "Unable to install Windows 2000 printer driver files (%d)!" -msgstr "Windows 2000 プリンタ・ドライバ・ファイルをインストールできません(%d)!" +msgstr "複数の Windows 2000 プリンタードライバーファイルをインストールできません (%d)!" + +#: cups/adminutil.c:650 +#, c-format msgid "Unable to install Windows 9x printer driver files (%d)!" -msgstr "Windows 9x プリンタ・ドライバ・ファイルをインストールできません(%d)!" +msgstr "複数の Windows 9x プリンタードライバーファイルをインストールできません (%d)!" + +#: cgi-bin/admin.c:703 msgid "Unable to modify class:" -msgstr "クラスを変更できません:" +msgstr "クラスを変更できません:" + +#: cgi-bin/admin.c:952 cgi-bin/admin.c:1311 msgid "Unable to modify printer:" -msgstr "プリンタを変更できません:" +msgstr "プリンターを変更できません:" + +#: cgi-bin/ipp-var.c:498 msgid "Unable to move job" msgstr "ジョブを移動できません" + +#: cgi-bin/ipp-var.c:500 msgid "Unable to move jobs" -msgstr "ジョブを移動できません" +msgstr "複数のジョブを移動できません" + +#: cups/ppd.c:335 msgid "Unable to open PPD file" -msgstr "PPD ファイルを開けません" +msgstr "PPD ファイルを読み込むことができません" + +#: cgi-bin/admin.c:3190 msgid "Unable to open PPD file:" -msgstr "PPD ファイルを開けません:" +msgstr "PPD ファイルを読み込むことができません:" + +#: cgi-bin/admin.c:2570 msgid "Unable to open cupsd.conf file:" -msgstr "cupsd.conf ファイルを開けません:" +msgstr "cupsd.conf ファイルを開けません:" + +#: scheduler/ipp.c:6682 +#, c-format msgid "Unable to open document %d in job %d!" -msgstr "ジョブ %2$d で書類 %1$d を開けません!" +msgstr "ドキュメント %d (ジョブ %d)を開けません!" + +#: cgi-bin/ipp-var.c:771 msgid "Unable to print test page:" -msgstr "テストページをプリントできません:" +msgstr "テストページを印刷できません:" + +#: cups/adminutil.c:2190 +#, c-format msgid "Unable to run \"%s\": %s\n" -msgstr "“%s”を実行できません:%s\n" +msgstr "\"%s\" を実行できません: %s\n" + +#: cgi-bin/ipp-var.c:575 cgi-bin/ipp-var.c:595 msgid "Unable to send command to printer driver!" -msgstr "プリンタドライバにコマンドを送信できません!" +msgstr "プリンタードライバーにコマンドを送信できません!" + +#: cups/adminutil.c:832 +#, c-format msgid "Unable to set Windows printer driver (%d)!" -msgstr "Windows プリンタドライバを設定できません(%d)!" +msgstr "Windows プリンタードライバーを設定できません (%d)!" + +#: cgi-bin/admin.c:3779 msgid "Unable to set options:" -msgstr "オプションを設定できません:" +msgstr "オプションを設定できません:" + +#: cgi-bin/admin.c:3081 msgid "Unable to set server default:" -msgstr "サーバのデフォルトを設定できません:" +msgstr "サーバーをデフォルトに設定できません:" + +#: cgi-bin/admin.c:1874 msgid "Unable to upload cupsd.conf file:" -msgstr "cupsd.conf ファイルをアップロードできません:" +msgstr "cupsd.conf ファイルをアップロードできません:" + +#: backend/usb-darwin.c:1816 backend/usb-darwin.c:1838 msgid "Unable to use legacy USB class driver!\n" -msgstr "古い USB クラスドライバは使用できません!\n" +msgstr "古いタイプの USB クラスドライバーは使用できません!\n" + +#: cups/http-support.c:1212 msgid "Unauthorized" -msgstr "未承認" +msgstr "不許可" + +#: cgi-bin/admin.c:3479 msgid "Units" msgstr "ユニット" + +#: cups/http-support.c:1243 cups/ppd.c:359 msgid "Unknown" -msgstr "不明" +msgstr "未知" + +#: backend/ipp.c:1711 +#, c-format msgid "Unknown printer error (%s)!" -msgstr "不明なプリンタエラーです(%s)!" +msgstr "未知のプリンターエラー (%s) です!" + +#: scheduler/ipp.c:10915 +#, c-format msgid "Unknown printer-error-policy \"%s\"." -msgstr "printer-error-policy“%s”が不明です。" +msgstr "\"%s\" は未知の printer-error-policy です。" + +#: scheduler/ipp.c:10899 +#, c-format msgid "Unknown printer-op-policy \"%s\"." -msgstr "printer-op-policy“%s”が不明です。" +msgstr "\"%s\" は未知の printer-op-policy です。" + +#: scheduler/ipp.c:406 +#, c-format msgid "Unsupported character set \"%s\"!" -msgstr "文字セット“%s”には対応していません!" +msgstr "\"%s\" はサポートされていない文字セットです!" + +#: scheduler/ipp.c:8555 scheduler/ipp.c:9850 +#, c-format msgid "Unsupported compression \"%s\"!" -msgstr "圧縮“%s”には対応していません!" +msgstr "\"%s\" はサポートされていない圧縮形式です!" + +#: scheduler/ipp.c:11345 +#, c-format msgid "Unsupported compression attribute %s!" -msgstr "圧縮属性 %s には対応していません!" +msgstr "%s はサポートされていない圧縮属性です!" + +#: scheduler/ipp.c:11373 +#, c-format msgid "Unsupported format \"%s\"!" -msgstr "“%s”の形式には対応していません!" +msgstr "\"%s\" はサポートされていない形式です!" + +#: scheduler/ipp.c:1410 scheduler/ipp.c:9984 +#, c-format msgid "Unsupported format '%s'!" -msgstr "‘%s’の形式には対応していません!" +msgstr "'%s' はサポートされていない形式です!" + +#: scheduler/ipp.c:8689 scheduler/ipp.c:9967 +#, c-format msgid "Unsupported format '%s/%s'!" -msgstr "‘%s/%s’の形式には対応していません!" +msgstr "'%s/%s' はサポートされていない形式です!" + +#: cups/snmp.c:1111 msgid "Unsupported value type" -msgstr "対応していない値タイプです" +msgstr "サポートされていない型の値です" + +#: cups/http-support.c:1227 msgid "Upgrade Required" msgstr "アップグレードが必要です" -msgid "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n" -msgstr "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n" + +#: systemv/lpadmin.c:805 +msgid "" +"Usage:\n" +"\n" +" lpadmin [-h server] -d destination\n" +" lpadmin [-h server] -x destination\n" +" lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n" +" [-r remove-class] [-v device] [-D description]\n" +" [-P ppd-file] [-o name=value]\n" +" [-u allow:user,user] [-u deny:user,user]\n" +"\n" +msgstr "" +"Usage:\n" +"\n" +" lpadmin [-h サーバー] -d 宛先\n" +" lpadmin [-h サーバー] -x 宛先\n" +" lpadmin [-h サーバー] -p プリンター [-c 追加クラス] [-i インターフェイス]\n" +" [-m モデル] [-r 削除クラス] [-v デバイス]\n" +" [-D 宛先] [-P PPD ファイル] [-o 名前=値]\n" +" [-u allow:ユーザー,ユーザー] [-u deny:ユーザー,ユーザー]\n" +"\n" + +#: filter/pdftops.c:93 +#, c-format msgid "Usage: %s job user title copies options [filename]\n" -msgstr "Usage: %s job user title copies options [filename]\n" +msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル名]\n" + +#: backend/ipp.c:210 backend/lpd.c:184 backend/pap.c:228 +#: backend/parallel.c:127 backend/scsi.c:157 backend/serial.c:165 +#: backend/socket.c:132 backend/usb.c:183 filter/bannertops.c:118 +#: filter/hpgl-main.c:148 filter/imagetops.c:115 filter/imagetoraster.c:207 +#: filter/pstops.c:254 filter/rastertoepson.c:985 filter/rastertohp.c:712 +#: filter/rastertolabel.c:1133 filter/textcommon.c:518 +#, c-format msgid "Usage: %s job-id user title copies options [file]\n" -msgstr "Usage: %s job-id user title copies options [file]\n" +msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション [ファイル]\n" + +#: filter/gziptoany.c:53 +#, c-format msgid "Usage: %s job-id user title copies options file\n" -msgstr "Usage: %s job-id user title copies options file\n" -msgid "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n" -msgstr "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n" -msgid "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n" -msgstr "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n" -msgid "Usage: cupsctl [options] [param=value ... paramN=valueN]\n\nOptions:\n\n -E Enable encryption\n -U username Specify username\n -h server[:port] Specify server address\n\n --[no-]debug-logging Turn debug logging on/off\n --[no-]remote-admin Turn remote administration on/off\n --[no-]remote-any Allow/prevent access from the Internet\n --[no-]remote-printers Show/hide remote printers\n --[no-]share-printers Turn printer sharing on/off\n --[no-]user-cancel-any Allow/prevent users to cancel any job\n" -msgstr "Usage: cupsctl [options] [param=value ... paramN=valueN]\n\nOptions:\n\n -E Enable encryption\n -U username Specify username\n -h server[:port] Specify server address\n\n --[no-]debug-logging Turn debug logging on/off\n --[no-]remote-admin Turn remote administration on/off\n --[no-]remote-any Allow/prevent access from the Internet\n --[no-]remote-printers Show/hide remote printers\n --[no-]share-printers Turn printer sharing on/off\n --[no-]user-cancel-any Allow/prevent users to cancel any job\n" -msgid "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n\n-c config-file Load alternate configuration file\n-f Run in the foreground\n-F Run in the foreground but detach\n-h Show this usage message\n-l Run cupsd from launchd(8)\n" -msgstr "Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n\n-c config-file Load alternate configuration file\n-f Run in the foreground\n-F Run in the foreground but detach\n-h Show this usage message\n-l Run cupsd from launchd(8)\n" -msgid "Usage: cupsfilter -m mime/type [ options ] filename\n\nOptions:\n\n -c cupsd.conf Set cupsd.conf file to use\n -j job-id[,N] Filter file N from the specified job (default is file 1)\n -n copies Set number of copies\n -o name=value Set option(s)\n -p filename.ppd Set PPD file\n -t title Set title\n" -msgstr "Usage: cupsfilter -m mime/type [ options ] filename\n\nOptions:\n\n -c cupsd.conf Set cupsd.conf file to use\n -j job-id[,N] Filter file N from the specified job (default is file 1)\n -n copies Set number of copies\n -o name=value Set option(s)\n -p filename.ppd Set PPD file\n -t title Set title\n" -msgid "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n cupstestdsc [options] -\n\nOptions:\n\n -h Show program usage\n\n Note: this program only validates the DSC comments, not the PostScript itself.\n" -msgstr "Usage: cupstestdsc [options] filename.ps [... filename.ps]\n cupstestdsc [options] -\n\nOptions:\n\n -h Show program usage\n\n Note: this program only validates the DSC comments, not the PostScript itself.\n" -msgid "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n program | cupstestppd [options] -\n\nOptions:\n\n -R root-directory Set alternate root\n -W {all,none,constraints,defaults,duplex,filters,translations}\n Issue warnings instead of errors\n -q Run silently\n -r Use 'relaxed' open mode\n -v Be slightly verbose\n -vv Be very verbose\n" -msgstr "Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n program | cupstestppd [options] -\n\nOptions:\n\n -R root-directory Set alternate root\n -W {all,none,constraints,defaults,duplex,filters,translations}\n Issue warnings instead of errors\n -q Run silently\n -r Use 'relaxed' open mode\n -v Be slightly verbose\n -vv Be very verbose\n" +msgstr "使い方: %s ジョブID ユーザー タイトル コピー数 オプション ファイル\n" + +#: scheduler/cupsfilter.c:1297 +msgid "" +"Usage: convert [ options ]\n" +"\n" +"Options:\n" +"\n" +" -f filename Set file to be converted (otherwise stdin)\n" +" -o filename Set file to be generated (otherwise stdout)\n" +" -i mime/type Set input MIME type (otherwise auto-typed)\n" +" -j mime/type Set output MIME type (otherwise application/pdf)\n" +" -P filename.ppd Set PPD file\n" +" -a 'name=value ...' Set option(s)\n" +" -U username Set username for job\n" +" -J title Set title\n" +" -c copies Set number of copies\n" +" -u Remove the PPD file when finished\n" +" -D Remove the input file when finished\n" +msgstr "" +"使い方: convert [ オプション ]\n" +"\n" +"オプション:\n" +"\n" +" -f ファイル名 変換するファイルを指定する (省略すると標準入力)\n" +" -o ファイル名 生成されるファイルを指定する (省略すると標準出力)\n" +" -i MIME/タイプ 入力 MIME タイプを指定する (省略すると自動設定)\n" +" -j MIME/タイプ 出力 MIME タイプを指定する (省略すると application/pdf)\n" +" -P ファイル名.ppd PPD ファイルを指定する\n" +" -a '名前=値 ...' オプションを指定する\n" +" -U ユーザー名 ジョブのユーザー名を指定する\n" +" -J タイトル タイトルを指定する\n" +" -c コピー数 コピー数を指定する\n" +" -u 完了時に PPD ファイルを削除する\n" +" -D 完了時に入力ファイルを削除する\n" + +#: systemv/cupsaddsmb.c:286 +msgid "" +"Usage: cupsaddsmb [options] printer1 ... printerN\n" +" cupsaddsmb [options] -a\n" +"\n" +"Options:\n" +" -E Encrypt the connection to the server\n" +" -H samba-server Use the named SAMBA server\n" +" -U samba-user Authenticate using the named SAMBA user\n" +" -a Export all printers\n" +" -h cups-server Use the named CUPS server\n" +" -v Be verbose (show commands)\n" +msgstr "" +"使い方: cupsaddsmb [オプション] プリンター ... プリンターN\n" +" cupsaddsmb [オプション] -a\n" +"\n" +"オプション:\n" +" -E サーバーとの接続を暗号化する\n" +" -H sambaサーバー 指定の SAMBA サーバーを使う\n" +" -U sambaユーザー 指定の SAMBA ユーザーを使って認証する\n" +" -a すべてのプリンターをエキスポートする\n" +" -h cupsサーバー 指定の CUPS サーバーを使う\n" +" -v 冗長にする (コマンドを表示する)\n" + +#: systemv/cupsctl.c:202 +msgid "" +"Usage: cupsctl [options] [param=value ... paramN=valueN]\n" +"\n" +"Options:\n" +"\n" +" -E Enable encryption\n" +" -U username Specify username\n" +" -h server[:port] Specify server address\n" +"\n" +" --[no-]debug-logging Turn debug logging on/off\n" +" --[no-]remote-admin Turn remote administration on/off\n" +" --[no-]remote-any Allow/prevent access from the Internet\n" +" --[no-]remote-printers Show/hide remote printers\n" +" --[no-]share-printers Turn printer sharing on/off\n" +" --[no-]user-cancel-any Allow/prevent users to cancel any job\n" +msgstr "" +"使い方: cupsctl [オプション] [パラメータ=値 ... パラメータN=値N]\n" +"\n" +"オプション:\n" +"\n" +" -E 暗号化を有効にする\n" +" -U ユーザ名 ユーザー名を指定する\n" +" -h サーバー[:ポート] サーバーアドレスを指定する\n" +"\n" +" --[no-]debug-logging デバッグログの有効/無効を切り替える\n" +" --[no-]remote-admin リモート管理の有効/無効を切り替える\n" +" --[no-]remote-any インターネットからのアクセスを許可/禁止する\n" +" --[no-]remote-printers リモートプリンターを表示/非表示にする\n" +" --[no-]share-printers プリンター共有の有効/無効を切り替える\n" +" --[no-]user-cancel-any あらゆるジョブのキャンセルをユーザーに許可/禁止する\n" + +#: scheduler/main.c:2057 +msgid "" +"Usage: cupsd [-c config-file] [-f] [-F] [-h] [-l]\n" +"\n" +"-c config-file Load alternate configuration file\n" +"-f Run in the foreground\n" +"-F Run in the foreground but detach\n" +"-h Show this usage message\n" +"-l Run cupsd from launchd(8)\n" +msgstr "" +"使い方: cupsd [-c 設定ファイル] [-f] [-F] [-h] [-l]\n" +"\n" +"-c 設定ファイル 別の設定ファイルをロードする\n" +"-f フォアグラウンドで実行する\n" +"-F フォアグラウンドで実行するがデタッチする\n" +"-h この使い方を表示する\n" +"-l launchd(8) から cupsd を実行する\n" + +#: scheduler/cupsfilter.c:1285 +msgid "" +"Usage: cupsfilter -m mime/type [ options ] filename\n" +"\n" +"Options:\n" +"\n" +" -c cupsd.conf Set cupsd.conf file to use\n" +" -j job-id[,N] Filter file N from the specified job (default is file 1)\n" +" -n copies Set number of copies\n" +" -o name=value Set option(s)\n" +" -p filename.ppd Set PPD file\n" +" -t title Set title\n" +msgstr "" +"使い方: cupsfilter -m MIME/タイプ [ オプション ] ファイル名\n" +"\n" +"オプション:\n" +"\n" +" -c cupsd.conf 利用する cupsd.conf ファイルを指定する\n" +" -n コピー数 コピー数を指定する\n" +" -o 名前=値 オプションを指定する\n" +" -p ファイル名.ppd PPD ファイルを指定する\n" +" -t タイトル タイトルを指定する\n" + +#: systemv/cupstestdsc.c:430 +msgid "" +"Usage: cupstestdsc [options] filename.ps [... filename.ps]\n" +" cupstestdsc [options] -\n" +"\n" +"Options:\n" +"\n" +" -h Show program usage\n" +"\n" +" Note: this program only validates the DSC comments, not the PostScript itself.\n" +msgstr "" +"使い方: cupstestdsc [オプション] ファイル名.ps [... ファイル名.ps]\n" +" cupstestdsc [オプション] -\n" +"\n" +"オプション:\n" +"\n" +" -h プログラムの使い方を表示する\n" +"\n" +" 注意: このプログラムは DSC コメントを検証するだけで、PostScript 自身を検証するものではありません。\n" + +#: systemv/cupstestppd.c:2928 +msgid "" +"Usage: cupstestppd [options] filename1.ppd[.gz] [... filenameN.ppd[.gz]]\n" +" program | cupstestppd [options] -\n" +"\n" +"Options:\n" +"\n" +" -R root-directory Set alternate root\n" +" -W {all,none,constraints,defaults,duplex,filters,translations}\n" +" Issue warnings instead of errors\n" +" -q Run silently\n" +" -r Use 'relaxed' open mode\n" +" -v Be slightly verbose\n" +" -vv Be very verbose\n" +msgstr "" +"使い方: cupstestppd [オプション] ファイル名1.ppd[.gz] [...ファイル名N.ppd[.gz]]\n" +" プログラム | cupstestppd [オプション] -\n" +"\n" +"オプション:\n" +"\n" +" -R ルートディレクトリ 別のルートを指定する\n" +" -W {all,none,constraints,defaults,filters,translations}\n" +" エラーの代わりに警告を発行する\n" +" -q 詳細は表示しない\n" +" -r 寛容モード\n" +" -v やや詳細に表示する\n" +" -vv 非常に詳細に表示する\n" + +#: systemv/lpmove.c:132 msgid "Usage: lpmove job/src dest\n" -msgstr "Usage: lpmove job/src dest\n" -msgid "Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer\n" -msgstr "Usage: lpoptions [-h server] [-E] -d printer\n lpoptions [-h server] [-E] [-p printer] -l\n lpoptions [-h server] [-E] -p printer -o option[=value] ...\n lpoptions [-h server] [-E] -x printer\n" +msgstr "使い方: lpmove ジョブ/ソース 宛先\n" + +#: systemv/lpoptions.c:540 +msgid "" +"Usage: lpoptions [-h server] [-E] -d printer\n" +" lpoptions [-h server] [-E] [-p printer] -l\n" +" lpoptions [-h server] [-E] -p printer -o option[=value] ...\n" +" lpoptions [-h server] [-E] -x printer\n" +msgstr "" +"使い方: lpoptions [-h サーバー] [-E] -d プリンター\n" +"   lpoptions [-h サーバー] [-E] [-p プリンター] -l\n" +" lpoptions [-h サーバー] [-E] -p プリンター -o オプション[=値] ...\n" +" lpoptions [-h サーバー] [-E] -x プリンター\n" + +#: systemv/lppasswd.c:493 msgid "Usage: lppasswd [-g groupname]\n" -msgstr "Usage: lppasswd [-g groupname]\n" -msgid "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]\n" -msgstr "Usage: lppasswd [-g groupname] [username]\n lppasswd [-g groupname] -a [username]\n lppasswd [-g groupname] -x [username]\n" +msgstr "使い方: lppasswd [-g グループ名]\n" + +#: systemv/lppasswd.c:496 +msgid "" +"Usage: lppasswd [-g groupname] [username]\n" +" lppasswd [-g groupname] -a [username]\n" +" lppasswd [-g groupname] -x [username]\n" +msgstr "" +"使い方: lppasswd [-g グループ名] [ユーザ名]\n" +" lppasswd [-g グループ名] -a [ユーザ名]\n" +" lppasswd [-g グループ名] -x [ユーザ名]\n" + +#: berkeley/lpq.c:663 msgid "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" -msgstr "Usage: lpq [-P dest] [-U username] [-h hostname[:port]] [-l] [+interval]\n" -msgid "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -c catalog.po Load the specified message catalog.\n -d output-dir Specify the output directory.\n -l lang[,lang,...] Specify the output language(s) (locale).\n -m Use the ModelName value as the filename.\n -t Test PPDs instead of generating them.\n -v Be verbose (more v's for more verbosity).\n -z Compress PPD files using GNU zip.\n --cr End lines with CR (Mac OS 9).\n --crlf End lines with CR + LF (Windows).\n --lf End lines with LF (UNIX/Linux/Mac OS X).\n" -msgstr "Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -c catalog.po Load the specified message catalog.\n -d output-dir Specify the output directory.\n -l lang[,lang,...] Specify the output language(s) (locale).\n -m Use the ModelName value as the filename.\n -t Test PPDs instead of generating them.\n -v Be verbose (more v's for more verbosity).\n -z Compress PPD files using GNU zip.\n --cr End lines with CR (Mac OS 9).\n --crlf End lines with CR + LF (Windows).\n --lf End lines with LF (UNIX/Linux/Mac OS X).\n" -msgid "Usage: ppdhtml [options] filename.drv >filename.html\n -D name=value Set named variable to value.\nOptions:\n -I include-dir Add include directory to search path.\n" -msgstr "Usage: ppdhtml [options] filename.drv >filename.html\n -D name=value Set named variable to value.\nOptions:\n -I include-dir Add include directory to search path.\n" -msgid "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -I include-dir\n -o filename.drv\n" -msgstr "Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -I include-dir\n -o filename.drv\n" -msgid "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -o filename.ppd[.gz]\n" -msgstr "Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\nOptions:\n -o filename.ppd[.gz]\n" -msgid "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -v Be verbose (more v's for more verbosity).\n" -msgstr "Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\nOptions:\n -D name=value Set named variable to value.\n -I include-dir Add include directory to search path.\n -v Be verbose (more v's for more verbosity).\n" +msgstr "使い方: lpq [-P 宛先] [-U ユーザー名] [-h ホスト名[:ポート]] [-l] [+間隔]\n" + +#: ppdc/ppdc.cxx:393 +msgid "" +"Usage: ppdc [options] filename.drv [ ... filenameN.drv ]\n" +"Options:\n" +" -D name=value Set named variable to value.\n" +" -I include-dir Add include directory to search path.\n" +" -c catalog.po Load the specified message catalog.\n" +" -d output-dir Specify the output directory.\n" +" -l lang[,lang,...] Specify the output language(s) (locale).\n" +" -m Use the ModelName value as the filename.\n" +" -t Test PPDs instead of generating them.\n" +" -v Be verbose (more v's for more verbosity).\n" +" -z Compress PPD files using GNU zip.\n" +" --cr End lines with CR (Mac OS 9).\n" +" --crlf End lines with CR + LF (Windows).\n" +" --lf End lines with LF (UNIX/Linux/Mac OS X).\n" +msgstr "" +"Usage: ppdc [オプション] ファイル名.drv [ ... ファイル名N.drv ]\n" +"オプション:\n" +" -D 変数名=値 変数名で指定した変数に値をセットする\n" +" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n" +" -c catalog.po 指定したメッセージカタログをロードする\n" +" -d output-dir 出力ディレクトリ(output-dir)を指定する\n" +" -l lang[,lang,...] 出力言語を指定する。(複数可能)\n" +" -m ModelName の値をファイル名として使用する\n" +" -t PPD を出力しないでテストする\n" +" -v 冗長出力を行う (v を追加してさらに冗長に)\n" +" -z PPD ファイルを GNU zip を使って圧縮する\n" +" --cr ラインの最後は CR (Mac OS 9 方式).\n" +" --crlf ラインの最後は CR + LF (Windows 方式).\n" +" --lf ラインの最後は LF (UNIX/Linux/Mac OS X 方式).\n" + +#: ppdc/ppdhtml.cxx:174 +msgid "" +"Usage: ppdhtml [options] filename.drv >filename.html\n" +" -D name=value Set named variable to value.\n" +"Options:\n" +" -I include-dir Add include directory to search path.\n" +msgstr "" +"使い方: ppdhtml [オプション] ファイル名.drv >ファイル名.html\n" +" -D 変数名=値 変数名で指定した変数に値をセットする\n" +"オプション:\n" +" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n" + +#: ppdc/ppdi.cxx:130 +msgid "" +"Usage: ppdi [options] filename.ppd [ ... filenameN.ppd ]\n" +"Options:\n" +" -I include-dir\n" +" -o filename.drv\n" +msgstr "" +"使い方: ppdi [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n" +"オプション:\n" +" -I インクルードディレクトリ\n" +" -o ファイル名.drv\n" + +#: ppdc/ppdmerge.cxx:370 +msgid "" +"Usage: ppdmerge [options] filename.ppd [ ... filenameN.ppd ]\n" +"Options:\n" +" -o filename.ppd[.gz]\n" +msgstr "" +"使い方: ppdmerge [オプション] ファイル名.ppd [ ... ファイル名N.ppd ]\n" +"オプション:\n" +" -o ファイル名.ppd[.gz]\n" + +#: ppdc/ppdpo.cxx:255 +msgid "" +"Usage: ppdpo [options] -o filename.po filename.drv [ ... filenameN.drv ]\n" +"Options:\n" +" -D name=value Set named variable to value.\n" +" -I include-dir Add include directory to search path.\n" +" -v Be verbose (more v's for more verbosity).\n" +msgstr "" +"使い方: ppdpo [オプション] -o ファイル名.po ファイル名.drv [ ... ファイル名N.drv ]\n" +"オプション:\n" +" -D 変数名=値 変数名で指定した変数に値をセットする\n" +" -I include-dir include-dir で指定したディレクトリをサーチパスに追加\n" +" -v 冗長出力を行う (v を追加してさらに冗長に)\n" + +#: backend/snmp.c:224 msgid "Usage: snmp [host-or-ip-address]\n" -msgstr "Usage: snmp [host-or-ip-address]\n" +msgstr "使い方: snmp [ホストまたはIPアドレス]\n" + +#: cups/snmp.c:1063 msgid "Value uses indefinite length" -msgstr "値に使われている長さが不定です" +msgstr "値は不定長です" + +#: cups/snmp.c:1048 msgid "VarBind uses indefinite length" -msgstr "VarBind に使われている長さが不定です" +msgstr "VarBind は不定長です" + +#: cups/snmp.c:998 msgid "Version uses indefinite length" -msgstr "バージョンに使われている長さが不定です" +msgstr "Version は不定長です" + +#: backend/pap.c:328 +#, c-format msgid "WARNING: Adding only the first %d printers found" -msgstr "WARNING: 見つかったプリンタのうち最初の %d 台だけが追加されます" +msgstr "WARNING: 発見した順番に %d 台のプリンターだけ追加します" + +#: backend/pap.c:1460 backend/usb-darwin.c:1679 +#, c-format msgid "WARNING: Boolean expected for waiteof option \"%s\"\n" -msgstr "WARNING: waiteof オプション“%s”は論理値でなければなりません\n" +msgstr "WARNING: 論理値は、waiteof オプション \"%s\" であるべきです\n" + +#: backend/network.c:83 backend/pap.c:1293 backend/parallel.c:638 +#: backend/serial.c:1285 backend/usb-libusb.c:747 backend/usb-unix.c:583 msgid "WARNING: Failed to read side-channel request!\n" -msgstr "WARNING: side-channel 要求の読み取りに失敗しました!\n" +msgstr "WARNING: サイドチャンネルの読み出しに失敗しました!\n" + +#: filter/pstops.c:2227 +#, c-format msgid "WARNING: Option \"%s\" cannot be included via IncludeFeature!\n" -msgstr "WARNING: オプション“%s”は IncludeFeature 経由で取り込むことはできません!\n" +msgstr "WARNING: オプション \"%s\" は IncludeFeature 経由で含めることはできません!\n" + +#: backend/pap.c:503 msgid "WARNING: Printer not responding\n" -msgstr "WARNING: プリンタが応答しません\n" +msgstr "WARNING: プリンターが反応しません\n" + +#: backend/pap.c:831 backend/pap.c:854 msgid "WARNING: Printer sent unexpected EOF\n" -msgstr "WARNING: プリンタが予期しない EOF を送信しました\n" +msgstr "WARNING: プリンターが意図しない EOF を返しました\n" + +#: backend/lpd.c:593 +#, c-format msgid "WARNING: Remote host did not respond with command status byte after %d seconds!\n" -msgstr "WARNING: リモートホストが %d 秒後にコマンド・ステータス・バイトで応答しませんでした!\n" +msgstr "WARNING: リモートホストは %d 秒経ってもコマンド・ステータス・バイトを返しませんでした!\n" + +#: backend/lpd.c:1015 backend/lpd.c:1162 +#, c-format msgid "WARNING: Remote host did not respond with control status byte after %d seconds!\n" -msgstr "WARNING: リモートホストが %d 秒後に制御ステータスバイトで応答しませんでした!\n" +msgstr "WARNING: リモートホストは %d 秒経ってもコントロール・ステータス・バイトを返しませんでした!\n" + +#: backend/lpd.c:1107 +#, c-format msgid "WARNING: Remote host did not respond with data status byte after %d seconds!\n" -msgstr "WARNING: リモートホストが %d 秒後にデータ・ステータス・バイトで応答しませんでした!\n" +msgstr "WARNING: リモートホストは %d 秒経ってもデータ・ステータス・バイトを返しませんでした!\n" + +#: backend/scsi-irix.c:210 backend/scsi-linux.c:228 +#, c-format msgid "WARNING: SCSI command timed out (%d); retrying...\n" -msgstr "WARNING: SCSI コマンドがタイムアウトになりました(%d)。再試行中...\n" +msgstr "WARNING: SCSI コマンドはタイムアウトしました (%d)。再試行中...\n" + +#: filter/pstops.c:1091 msgid "WARNING: This document does not conform to the Adobe Document Structuring Conventions and may not print correctly!\n" -msgstr "WARNING: この書類は Adobe Document Structuring Conventions に適合していないため、正しくプリントできない可能性があります!\n" +msgstr "WARNING: この書類は Adobe Document Structuring Conventions に適合しておらず、正しくプリントできない可能性があります!\n" + +#: backend/pap.c:492 +#, c-format msgid "WARNING: Unable to open \"%s:%s\": %s\n" -msgstr "WARNING: “%s:%s”を開けません:%s\n" +msgstr "WARNING: \"%s:%s\": %s を開けません\n" + +#: backend/pap.c:637 msgid "WARNING: Unable to send PAP status request" -msgstr "WARNING: PAP 状況要求を送信できません" +msgstr "WARNING: PAP ステータス・リクエストを送信できません" + +#: backend/pap.c:867 +#, c-format msgid "WARNING: Unexpected PAP packet of type %d\n" -msgstr "WARNING: %d は予期しない PAP パケットタイプです\n" +msgstr "WARNING: %d タイプの意図しない PAP パケット\n" + +#: backend/pap.c:872 +#, c-format msgid "WARNING: Unknown PAP packet of type %d\n" -msgstr "WARNING: %d は不明な PAP パケットタイプです\n" +msgstr "WARNING: 未知の PAP パケットのタイプ %d\n" + +#: filter/pstops.c:2234 +#, c-format msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" -msgstr "WARNING: オプション“%2$s”に不明な“%1$s”が選択されています!\n" +msgstr "WARNING: \"%s\" (オプション \"%s\" 用) は未知の設定です!\n" + +#: filter/pstops.c:2220 +#, c-format msgid "WARNING: Unknown option \"%s\"!\n" -msgstr "WARNING: “%s”は不明なオプションです!\n" +msgstr "WARNING: \"%s\" は未知のオプションです!\n" + +#: backend/serial.c:380 +#, c-format msgid "WARNING: Unsupported baud rate %s!\n" -msgstr "WARNING: ボーレート %s には対応していません!\n" +msgstr "WARNING: %s はサポートしないボーレートです!\n" + +#: backend/pap.c:1474 +#, c-format msgid "WARNING: number expected for status option \"%s\"\n" -msgstr "WARNING: 状況オプション“%s”は数値でなければなりません\n" +msgstr "WARNING: ステータス・オプションの期待値は \"%s\"\n" + +#: backend/ipp.c:578 backend/ipp.c:709 backend/lpd.c:828 backend/socket.c:318 +#, c-format msgid "WARNING: recoverable: Network host '%s' is busy; will retry in %d seconds...\n" -msgstr "WARNING: 回復可能:ネットワークホスト‘%s’はビジー状態です。%d 秒後に再試行します...\n" +msgstr "WARNING: 回復可能: ネットワークホスト '%s' はビジー状態です (%d 秒後に再試行します...)\n" + +#: cups/adminutil.c:804 msgid "Warning, no Windows 2000 printer drivers are installed!" -msgstr "警告、Windows 2000 プリンタドライバがインストールされていません!" +msgstr "警告、Windows 2000 プリンタードライバーがインストールされていません!" + +#: cups/ppd.c:1865 msgid "Yes" msgstr "はい" + +#: scheduler/client.c:2419 +#, c-format msgid "You must access this page using the URL https://%s:%d%s." -msgstr "このページにアクセスするには URL https://%s:%d%s を使用する必要があります。" +msgstr "このページには URL https://%s:%d%s を使ってアクセスする必要があります。" + +#: ppdc/sample.c:87 msgid "You4 Envelope" -msgstr "You4 封筒" +msgstr "洋形 4 号" + +#: ppdc/sample.c:411 msgid "ZPL Label Printer" -msgstr "ZPL ラベルプリンタ" +msgstr "ZPL ラベル・プリンター" + +#: ppdc/sample.c:334 msgid "Zebra" -msgstr "Zebra" +msgstr "ゼブラ" + +#: cups/notify.c:102 msgid "aborted" -msgstr "破棄されました" +msgstr "停止" + +#: cups/notify.c:99 msgid "canceled" -msgstr "キャンセルされました" +msgstr "キャンセル" + +#: cups/notify.c:105 msgid "completed" -msgstr "完了しました" +msgstr "完了" + +#: scheduler/cupsfilter.c:335 msgid "convert: Use the -f option to specify a file to convert.\n" -msgstr "convert:-f オプションを使って、変換するファイルを指定してください。\n" +msgstr "convert: 変換するファイルを指定するには、-f オプションを使ってください。\n" + +#: scheduler/ipp.c:6555 msgid "cups-deviced failed to execute." msgstr "cups-deviced の実行に失敗しました。" + +#: scheduler/ipp.c:7231 scheduler/ipp.c:7481 msgid "cups-driverd failed to execute." msgstr "cups-driverd の実行に失敗しました。" + +#: systemv/cupsaddsmb.c:236 +#, c-format msgid "cupsaddsmb: No PPD file for printer \"%s\" - %s\n" -msgstr "cupsaddsmb:プリンタ“%s”の PPD ファイルがありません - %s\n" +msgstr "cupsaddsmb: プリンター \"%s\" の PPD ファイルがありません - %s\n" + +#: systemv/cupsctl.c:153 +#, c-format msgid "cupsctl: Unable to connect to server: %s\n" -msgstr "cupsctl:サーバに接続できません:%s\n" +msgstr "cupsctl: サーバー: %s に接続できません\n" + +#: systemv/cupsctl.c:196 +#, c-format msgid "cupsctl: Unknown option \"%s\"!\n" -msgstr "cupsctl:“%s”は不明なオプションです!\n" +msgstr "cupsctl: \"%s\" は未知のオプションです!\n" + +#: systemv/cupsctl.c:198 +#, c-format msgid "cupsctl: Unknown option \"-%c\"!\n" -msgstr "cupsctl:“-%c”は不明なオプションです!\n" +msgstr "cupsctl: \"-%c\"は未知のオプションです!\n" + +#: scheduler/main.c:200 msgid "cupsd: Expected config filename after \"-c\" option!\n" -msgstr "cupsd:“-c”オプションの後に構成ファイル名が必要です!\n" +msgstr "cupsd: -c オプションのあとには設定ファイル名が必要です!\n" + +#: scheduler/main.c:232 scheduler/main.c:239 msgid "cupsd: Unable to get current directory!\n" -msgstr "cupsd:現在のディレクトリを取得できません!\n" +msgstr "cupsd: カレント・ディレクトリを取得できません!\n" + +#: scheduler/main.c:291 +#, c-format msgid "cupsd: Unknown argument \"%s\" - aborting!\n" -msgstr "cupsd:“%s”は不明な引数です - 破棄されます!\n" +msgstr "cupsd: \"%s\" は未知の引数です - 停止します!\n" + +#: scheduler/main.c:284 +#, c-format msgid "cupsd: Unknown option \"%c\" - aborting!\n" -msgstr "cupsd:“%c”は不明なオプションです - 破棄されます!\n" +msgstr "cupsd: \"%c\" は未知のオプションです - 停止します!\n" + +#: scheduler/main.c:266 msgid "cupsd: launchd(8) support not compiled in, running in normal mode.\n" -msgstr "cupsd:launchd(8) サポートがコンパイルされていないため、通常モードで実行します。\n" +msgstr "cupsd: launchd(8) サポートがコンパイルされていないので、通常モードで動作します。\n" + +#: scheduler/cupsfilter.c:1061 +#, c-format msgid "cupsfilter: Invalid document number %d!\n" -msgstr "cupsfilter:書類番号 %d が無効です!\n" +msgstr "cupsfilter: 不正な文書番号 %d です!\n" + +#: scheduler/cupsfilter.c:1055 +#, c-format msgid "cupsfilter: Invalid job ID %d!\n" -msgstr "cupsfilter:ジョブ ID %d が無効です!\n" +msgstr "cupsfilter: 不正なジョブID %d です!\n" + +#: scheduler/cupsfilter.c:343 msgid "cupsfilter: Only one filename can be specified!\n" -msgstr "cupsfilter:指定できるファイル名は 1 つだけです!\n" +msgstr "cupsfilter: ひとつのファイル名のみを指定できます!\n" + +#: scheduler/cupsfilter.c:1089 +#, c-format msgid "cupsfilter: Unable to create temporary file: %s\n" -msgstr "cupsfilter:一時ファイルを作成できません:%s\n" +msgstr "cupsfilter: テンポラリー・ファイル: %s を作成できません\n" + +#: scheduler/cupsfilter.c:1105 +#, c-format msgid "cupsfilter: Unable to get job file - %s\n" -msgstr "cupsfilter:ジョブファイルを取得できません - %s\n" +msgstr "cupsfilter: ジョブ・ファイルを取得できません - %s\n" + +#: systemv/cupstestppd.c:218 msgid "cupstestppd: The -q option is incompatible with the -v option.\n" -msgstr "cupstestppd:-q オプションは -v オプションと同時には使用できません。\n" +msgstr "cupstestppd: -q オプションは -v オプションと両立できません。\n" + +#: systemv/cupstestppd.c:234 msgid "cupstestppd: The -v option is incompatible with the -q option.\n" -msgstr "cupstestppd:-v オプションは -q オプションと同時には使用できません。\n" +msgstr "cupstestppd: -v オプションは -q オプションと両立できません。\n" + +#: systemv/lpstat.c:1231 systemv/lpstat.c:1234 systemv/lpstat.c:1237 +#, c-format msgid "device for %s/%s: %s\n" -msgstr "%s/%s のデバイス:%s\n" +msgstr "%s/%s のデバイス: %s\n" + +#: systemv/lpstat.c:1218 systemv/lpstat.c:1221 systemv/lpstat.c:1224 +#, c-format msgid "device for %s: %s\n" -msgstr "%s のデバイス:%s\n" +msgstr "%s のデバイス: %s\n" + +#: cups/snmp.c:1035 msgid "error-index uses indefinite length" -msgstr "error-index に使われている長さが不定です" +msgstr "エラー・インデックスは不定長です" + +#: cups/snmp.c:1027 msgid "error-status uses indefinite length" -msgstr "error-status に使われている長さが不定です" +msgstr "エラー・ステータスは不定長です" + +#: cups/notify.c:90 msgid "held" -msgstr "保留中" +msgstr "ホールド" + +#: berkeley/lpc.c:214 msgid "help\t\tget help on commands\n" -msgstr "help\t\tコマンドのヘルプを表示します\n" +msgstr "help\t\tコマンドのヘルプを取得\n" + +#: cups/notify.c:131 msgid "idle" msgstr "待機中" + +#: scheduler/ipp.c:8225 msgid "job-printer-uri attribute missing!" -msgstr "job-printer-uri 属性がありません!" +msgstr "job-printer-uri 属性がありません!" + +#: systemv/lpadmin.c:141 systemv/lpadmin.c:453 msgid "lpadmin: Class name can only contain printable characters!\n" -msgstr "lpadmin:クラス名に使用できるのはプリント可能な文字だけです!\n" +msgstr "lpadmin: クラス名は表示可能文字のみで構成されなければなりません!\n" + +#: systemv/lpadmin.c:750 msgid "lpadmin: Expected PPD after '-P' option!\n" -msgstr "lpadmin:‘-P’オプションの後に PPD が必要です!\n" +msgstr "lpadmin: '-P' オプションのあとに PPD が必要です!\n" + +#: systemv/lpadmin.c:491 msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" -msgstr "lpadmin:‘-u’オプションの後に allow/deny:userlist が必要です!\n" +msgstr "lpadmin: '-u' オプションのあとには allow/deny:ユーザリスト が必要です!\n" + +#: systemv/lpadmin.c:442 msgid "lpadmin: Expected class after '-r' option!\n" -msgstr "lpadmin:‘-r’オプションの後にクラスが必要です!\n" +msgstr "lpadmin: '-r' オプションのあとにはクラス名が必要です!\n" + +#: systemv/lpadmin.c:130 msgid "lpadmin: Expected class name after '-c' option!\n" -msgstr "lpadmin:‘-c’オプションの後にクラス名が必要です!\n" +msgstr "lpadmin: '-c' オプションのあとにはクラス名が必要です!\n" + +#: systemv/lpadmin.c:643 msgid "lpadmin: Expected description after '-D' option!\n" -msgstr "lpadmin:‘-D’オプションの後に説明が必要です!\n" +msgstr "lpadmin: '-D' オプションのあとに説明が必要です!\n" + +#: systemv/lpadmin.c:550 msgid "lpadmin: Expected device URI after '-v' option!\n" -msgstr "lpadmin:‘-v’オプションの後にデバイス URI が必要です!\n" +msgstr "lpadmin: '-v' オプションのあとにはデバイス URI が必要です!\n" + +#: systemv/lpadmin.c:659 msgid "lpadmin: Expected file type(s) after '-I' option!\n" -msgstr "lpadmin:‘-I’オプションの後にファイルタイプが必要です!\n" +msgstr "lpadmin: '-I' オプションのあとにファイル形式が必要です!\n" + +#: systemv/lpadmin.c:212 msgid "lpadmin: Expected hostname after '-h' option!\n" -msgstr "lpadmin:‘-h’オプションの後にホスト名が必要です!\n" +msgstr "lpadmin: '-h' オプションのあとにはホスト名が必要です!\n" + +#: systemv/lpadmin.c:257 msgid "lpadmin: Expected interface after '-i' option!\n" -msgstr "lpadmin:‘-i’オプションの後にインターフェイスが必要です!\n" +msgstr "lpadmin: '-i' オプションのあとにはインターフェイス名が必要です!\n" + +#: systemv/lpadmin.c:704 msgid "lpadmin: Expected location after '-L' option!\n" -msgstr "lpadmin:‘-L’オプションの後に場所が必要です!\n" +msgstr "lpadmin: '-L' オプションのあとに場所が必要です!\n" + +#: systemv/lpadmin.c:338 msgid "lpadmin: Expected model after '-m' option!\n" -msgstr "lpadmin:‘-m’オプションの後に機種が必要です!\n" +msgstr "lpadmin: '-m' オプションのあとにはモデル名が必要です!\n" + +#: systemv/lpadmin.c:358 msgid "lpadmin: Expected name=value after '-o' option!\n" -msgstr "lpadmin:‘-o’オプションの後に name=value が必要です!\n" +msgstr "lpadmin: '-o' オプションのあとには 変数名=値 が必要です!\n" + +#: systemv/lpadmin.c:391 msgid "lpadmin: Expected printer after '-p' option!\n" -msgstr "lpadmin:‘-p’オプションの後にプリンタが必要です!\n" +msgstr "lpadmin: '-p' オプションのあとにはプリンター名が必要です!\n" + +#: systemv/lpadmin.c:174 msgid "lpadmin: Expected printer name after '-d' option!\n" -msgstr "lpadmin:‘-d’オプションの後にプリンタ名が必要です!\n" +msgstr "lpadmin: '-d' オプションのあとにはプリンター名が必要です!\n" + +#: systemv/lpadmin.c:584 msgid "lpadmin: Expected printer or class after '-x' option!\n" -msgstr "lpadmin:‘-x’オプションの後にプリンタまたはクラスが必要です!\n" +msgstr "lpadmin: '-x' オプションのあとにはプリンター名またはクラス名が必要です!\n" + +#: systemv/lpadmin.c:1128 msgid "lpadmin: No member names were seen!\n" -msgstr "lpadmin:メンバー名が見つかりませんでした!\n" +msgstr "lpadmin: メンバー名が見当たりません!\n" + +#: systemv/lpadmin.c:893 +#, c-format msgid "lpadmin: Printer %s is already a member of class %s.\n" -msgstr "lpadmin:プリンタ %s はすでにクラス %s のメンバーです。\n" +msgstr "lpadmin: プリンター %s はすでにクラス %s のメンバーです。\n" + +#: systemv/lpadmin.c:1142 +#, c-format msgid "lpadmin: Printer %s is not a member of class %s.\n" -msgstr "lpadmin:プリンタ %s はクラス %s のメンバーではありません。\n" +msgstr "lpadmin: プリンター %s はクラス %s のメンバーではありません。\n" + +#: systemv/lpadmin.c:185 systemv/lpadmin.c:402 systemv/lpadmin.c:595 msgid "lpadmin: Printer name can only contain printable characters!\n" -msgstr "lpadmin:プリンタ名に使用できるのはプリント可能な文字だけです!\n" -msgid "lpadmin: Unable to add a printer to the class:\n You must specify a printer name first!\n" -msgstr "lpadmin:クラスにプリンタを追加できません:\n 先にプリンタ名を指定する必要があります!\n" +msgstr "lpadmin: プリンター名には印字可能な文字のみ使用できます!\n" + +#: systemv/lpadmin.c:115 +msgid "" +"lpadmin: Unable to add a printer to the class:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: クラスにプリンターを追加できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:106 systemv/lpadmin.c:159 systemv/lpadmin.c:230 +#: systemv/lpadmin.c:291 systemv/lpadmin.c:310 systemv/lpadmin.c:376 +#: systemv/lpadmin.c:417 systemv/lpadmin.c:523 systemv/lpadmin.c:569 +#: systemv/lpadmin.c:615 systemv/lpadmin.c:677 systemv/lpadmin.c:723 +#: systemv/lpadmin.c:784 +#, c-format msgid "lpadmin: Unable to connect to server: %s\n" -msgstr "lpadmin:サーバに接続できません:%s\n" +msgstr "lpadmin: サーバーに接続できません: %s\n" + +#: systemv/lpadmin.c:1845 +#, c-format msgid "lpadmin: Unable to create temporary file - %s\n" -msgstr "lpadmin:一時ファイルを作成できません - %s\n" +msgstr "lpadmin: テンポラリファイルを作成できません - %s\n" + +#: systemv/lpadmin.c:1454 +#, c-format msgid "lpadmin: Unable to create temporary file: %s\n" -msgstr "lpadmin:一時ファイルを作成できません:%s\n" +msgstr "lpadmin: テンポラリファイルを作成できません: %s\n" + +#: systemv/lpadmin.c:1855 +#, c-format msgid "lpadmin: Unable to open PPD file \"%s\" - %s\n" -msgstr "lpadmin:PPD ファイル“%s”を開けません - %s\n" +msgstr "lpadmin: PPD ファイル \"%s\" を開けません - %s\n" + +#: systemv/lpadmin.c:1462 +#, c-format msgid "lpadmin: Unable to open file \"%s\": %s\n" -msgstr "lpadmin:ファイル“%s”を開けません:%s\n" -msgid "lpadmin: Unable to remove a printer from the class:\n You must specify a printer name first!\n" -msgstr "lpadmin:クラスからプリンタを取り除けません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the PPD file:\n You must specify a printer name first!\n" -msgstr "lpadmin:PPD ファイルを設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the device URI:\n You must specify a printer name first!\n" -msgstr "lpadmin:デバイス URI を設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the interface script or PPD file:\n You must specify a printer name first!\n" -msgstr "lpadmin:インターフェイス・スクリプトまたは PPD ファイルを設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the interface script:\n You must specify a printer name first!\n" -msgstr "lpadmin:インターフェイス・スクリプトを設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the printer description:\n You must specify a printer name first!\n" -msgstr "lpadmin:プリンタの説明を設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the printer location:\n You must specify a printer name first!\n" -msgstr "lpadmin:プリンタの場所を設定できません:\n 先にプリンタ名を指定する必要があります!\n" -msgid "lpadmin: Unable to set the printer options:\n You must specify a printer name first!\n" -msgstr "lpadmin:プリンタオプションを設定できません:\n 先にプリンタ名を指定する必要があります!\n" +msgstr "lpadmin: ファイル \"%s\" を開けません: %s\n" + +#: systemv/lpadmin.c:426 +msgid "" +"lpadmin: Unable to remove a printer from the class:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: クラスからプリンターを削除できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:732 +msgid "" +"lpadmin: Unable to set the PPD file:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: PPD ファイルを設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:532 +msgid "" +"lpadmin: Unable to set the device URI:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: デバイス URI を設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:319 +msgid "" +"lpadmin: Unable to set the interface script or PPD file:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: インターフェイス・スクリプトまたは PPD ファイルを設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:239 +msgid "" +"lpadmin: Unable to set the interface script:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: インターフェイススクリプトを設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:624 +msgid "" +"lpadmin: Unable to set the printer description:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: プリンターの説明を設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:686 +msgid "" +"lpadmin: Unable to set the printer location:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: プリンターの場所が設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:793 +msgid "" +"lpadmin: Unable to set the printer options:\n" +" You must specify a printer name first!\n" +msgstr "" +"lpadmin: プリンター・オプションを設定できません:\n" +" 先にプリンター名を指定する必要があります!\n" + +#: systemv/lpadmin.c:508 +#, c-format msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" -msgstr "lpadmin:“%s”は不明な許可/拒否オプションです!\n" +msgstr "lpadmin:\"%s\" は未知の allow/deny オプションです!\n" + +#: systemv/lpadmin.c:766 +#, c-format msgid "lpadmin: Unknown argument '%s'!\n" -msgstr "lpadmin:‘%s’は不明な引数です!\n" +msgstr "lpadmin: '%s' は未知の引数です!\n" + +#: systemv/lpadmin.c:761 +#, c-format msgid "lpadmin: Unknown option '%c'!\n" -msgstr "lpadmin:‘%c’は不明なオプションです!\n" +msgstr "lpadmin: '%c' は未知のオプションです!\n" + +#: systemv/lpadmin.c:665 msgid "lpadmin: Warning - content type list ignored!\n" -msgstr "lpadmin:警告 - コンテンツ・タイプ・リストは無視されました!\n" +msgstr "lpadmin: 警告 - コンテンツタイプリストは無視されます!\n" + +#: berkeley/lpc.c:81 berkeley/lpc.c:109 berkeley/lpc.c:145 msgid "lpc> " msgstr "lpc> " + +#: systemv/lpinfo.c:143 msgid "lpinfo: Expected 1284 device ID string after --device-id!\n" -msgstr "lpinfo:--device-id の後に 1284 デバイス ID 文字列が必要です!\n" +msgstr "lpinfo: --device-id の後には、1284デバイスIDを指定する必要があります!\n" + +#: systemv/lpinfo.c:196 msgid "lpinfo: Expected language after --language!\n" -msgstr "lpinfo:--language の後に言語が必要です!\n" +msgstr "lpinfo: --language の後には、言語を指定する必要があります!\n" + +#: systemv/lpinfo.c:213 msgid "lpinfo: Expected make and model after --make-and-model!\n" -msgstr "lpinfo:--make-and-model の後に製造元と機種が必要です!\n" +msgstr "lpinfo: --make-and-model の後には、メーカーとモデルを指定する必要があります!\n" + +#: systemv/lpinfo.c:230 msgid "lpinfo: Expected product string after --product!\n" -msgstr "lpinfo:--product の後に製品文字列が必要です!\n" +msgstr "lpinfo: --product の後には、製品名を指定する必要があります!\n" + +#: systemv/lpinfo.c:161 msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" -msgstr "lpinfo:--exclude-schemes の後にスキームリストが必要です!\n" +msgstr "lpinfo: --exclude-schemes の後には、スキーマ・リストを指定する必要があります!\n" + +#: systemv/lpinfo.c:179 msgid "lpinfo: Expected scheme list after --include-schemes!\n" -msgstr "lpinfo:--include-schemes の後にスキームリストが必要です!\n" +msgstr "lpinfo: --include-schemes の後には、スキーマ・リストを指定する必要があります!\n" + +#: systemv/lpinfo.c:247 msgid "lpinfo: Expected timeout after --timeout!\n" -msgstr "lpinfo:--timeout の後にタイムアウトが必要です!\n" +msgstr "lpinfo: --timeout の後には、タイムアウト値を指定する必要があります!\n" + +#: systemv/lpinfo.c:270 +#, c-format msgid "lpinfo: Unknown argument '%s'!\n" -msgstr "lpinfo:‘%s’は不明な引数です!\n" +msgstr "lpinfo: 未知の引数 '%s'!\n" + +#: systemv/lpinfo.c:264 +#, c-format msgid "lpinfo: Unknown option '%c'!\n" -msgstr "lpinfo:‘%c’は不明なオプションです!\n" +msgstr "lpinfo: 未知のオプション '%c'!\n" + +#: systemv/lpinfo.c:257 +#, c-format msgid "lpinfo: Unknown option '%s'!\n" -msgstr "lpinfo:‘%s’は不明なオプションです!\n" +msgstr "lpinfo: 未知のオプション '%s'!\n" + +#: systemv/lpmove.c:141 +#, c-format msgid "lpmove: Unable to connect to server: %s\n" -msgstr "lpmove:サーバに接続できません:%s\n" +msgstr "lpmove: サーバーに接続できません: %s!\n" + +#: systemv/lpmove.c:125 +#, c-format msgid "lpmove: Unknown argument '%s'!\n" -msgstr "lpmove:‘%s’は不明な引数です!\n" +msgstr "lpmove: 未知の引数 '%s'!\n" + +#: systemv/lpmove.c:103 +#, c-format msgid "lpmove: Unknown option '%c'!\n" -msgstr "lpmove:‘%c’は不明なオプションです!\n" +msgstr "lpmove: 未知のオプション '%c'!\n" + +#: systemv/lpoptions.c:154 systemv/lpoptions.c:172 systemv/lpoptions.c:248 msgid "lpoptions: No printers!?!\n" -msgstr "lpoptions:プリンタがありません!?!\n" +msgstr "lpoptions: プリンターがありません!?!\n" + +#: systemv/lpoptions.c:223 +#, c-format msgid "lpoptions: Unable to add printer or instance: %s\n" -msgstr "lpoptions:プリンタまたはインスタンスを追加できません:%s\n" +msgstr "lpoptions: プリンターまたはインスタンスを追加できません: %s\n" + +#: systemv/lpoptions.c:507 +#, c-format msgid "lpoptions: Unable to get PPD file for %s: %s\n" -msgstr "lpoptions:%s の PPD ファイルを取得できません:%s\n" +msgstr "lpoptions: %s の PPD ファイルを開けません!: %s\n" + +#: systemv/lpoptions.c:516 +#, c-format msgid "lpoptions: Unable to open PPD file for %s!\n" -msgstr "lpoptions:%s の PPD ファイルを開けません!n" +msgstr "lpoptions: %s の PPD ファイルを開けません!\n" + +#: systemv/lpoptions.c:104 msgid "lpoptions: Unknown printer or class!\n" -msgstr "lpoptions:プリンタまたはクラスが不明です!\n" +msgstr "lpoptions: 未知のプリンターまたはクラスです!\n" + +#: systemv/lppasswd.c:185 msgid "lppasswd: Only root can add or delete passwords!\n" -msgstr "lppasswd:パスワードを追加または削除できるのはルートだけです!\n" +msgstr "lppasswd: root だけがパスワードの追加と削除を行えます!\n" + +#: systemv/lppasswd.c:314 msgid "lppasswd: Password file busy!\n" -msgstr "lppasswd:パスワードファイルがビジー状態です!\n" +msgstr "lppasswd: パスワードファイルがビジー状態です!\n" + +#: systemv/lppasswd.c:447 msgid "lppasswd: Password file not updated!\n" -msgstr "lppasswd:パスワードファイルはアップデートされませんでした!\n" +msgstr "lppasswd: パスワードファイルは更新されません!\n" + +#: systemv/lppasswd.c:414 msgid "lppasswd: Sorry, password doesn't match!\n" -msgstr "lppasswd:パスワードが一致しません!\n" -msgid "lppasswd: Sorry, password rejected.\nYour password must be at least 6 characters long, cannot contain\nyour username, and must contain at least one letter and number.\n" -msgstr "lppasswd:パスワードが拒否されました。\nパスワードの長さは 6 文字以上でなければならず、ユーザ名を含めることは\nできず、英字と数字をそれぞれ 1 文字以上含める必要があります。\n" +msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n" + +#: systemv/lppasswd.c:264 +msgid "" +"lppasswd: Sorry, password rejected.\n" +"Your password must be at least 6 characters long, cannot contain\n" +"your username, and must contain at least one letter and number.\n" +msgstr "" +"lppasswd: すみませんが、パスワードは拒否されました。\n" +"パスワードは少なくとも 6 文字以上で、あなたのユーザー名を含んではならず、\n" +"少なくとも 1 つの英字および数値を含んでなければなりません。\n" + +#: systemv/lppasswd.c:240 msgid "lppasswd: Sorry, passwords don't match!\n" -msgstr "lppasswd:パスワードが一致しません!\n" +msgstr "lppasswd: すみませんが、パスワードがマッチしません!\n" + +#: systemv/lppasswd.c:211 systemv/lppasswd.c:229 +#, c-format msgid "lppasswd: Unable to copy password string: %s\n" -msgstr "lppasswd:パスワード文字列をコピーできません:%s\n" +msgstr "lppasswd: パスワード文字列をコピーできません: %s\n" + +#: systemv/lppasswd.c:317 systemv/lppasswd.c:326 systemv/lppasswd.c:344 +#, c-format msgid "lppasswd: Unable to open password file: %s\n" -msgstr "lppasswd:パスワードファイルを開けません:%s\n" +msgstr "lppasswd: パスワードファイルを開けません: %s\n" + +#: systemv/lppasswd.c:379 systemv/lppasswd.c:392 systemv/lppasswd.c:424 +#, c-format msgid "lppasswd: Unable to write to password file: %s\n" -msgstr "lppasswd:パスワードファイルに書き込めません:%s\n" +msgstr "lppasswd: パスワードファイルに書き込めません: %s\n" + +#: systemv/lppasswd.c:462 +#, c-format msgid "lppasswd: failed to backup old password file: %s\n" -msgstr "lppasswd:古いパスワードファイルのバックアップ作成に失敗しました:%s\n" +msgstr "lppasswd: 古いパスワードファイルのバックアップに失敗しました: %s\n" + +#: systemv/lppasswd.c:475 +#, c-format msgid "lppasswd: failed to rename password file: %s\n" -msgstr "lppasswd:パスワードファイルの名称変更に失敗しました:%s\n" +msgstr "lppasswd: パスワードファイルの名前の変更に失敗しました: %s\n" + +#: systemv/lppasswd.c:404 +#, c-format msgid "lppasswd: user \"%s\" and group \"%s\" do not exist.\n" -msgstr "lppasswd:ユーザ“%s”とグループ“%s”が存在しません。\n" +msgstr "lppasswd: ユーザー \"%s\" およびグループ \"%s\" は存在しません。\n" + +#: systemv/lpstat.c:1039 +#, c-format msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "lpstat:エラー - %s 環境変数に存在しない送信先“%s”が指定されています!\n" +msgstr "lpstat: エラー - 環境変数 %s が、存在しない宛先 \"%s\" を指しています!\n" + +#: systemv/lpstat.c:969 +#, c-format msgid "members of class %s:\n" -msgstr "クラス %s のメンバー:\n" +msgstr "クラス %s のメンバー:\n" + +#: berkeley/lpq.c:575 msgid "no entries\n" msgstr "エントリーがありません\n" + +#: systemv/lpstat.c:1043 msgid "no system default destination\n" -msgstr "システムのデフォルトの送信先がありません\n" +msgstr "システムのデフォルトの宛先がありません\n" + +#: scheduler/ipp.c:6249 msgid "notify-events not specified!" -msgstr "notify-events が指定されていません!" +msgstr "notify-events が指定されていません!" + +#: scheduler/ipp.c:2102 scheduler/ipp.c:6154 +#, c-format msgid "notify-recipient-uri URI \"%s\" is already used!" -msgstr "notify-recipient-uri の URI“%s”はすでに使用されています!" +msgstr "notify-recipient-uri URI \"%s\" はすでに使われています!" + +#: scheduler/ipp.c:2092 scheduler/ipp.c:6144 +#, c-format msgid "notify-recipient-uri URI \"%s\" uses unknown scheme!" -msgstr "notify-recipient-uri の URI“%s”に不明なスキームが使用されています!" +msgstr "notify-recipient-uri URI \"%s\" には未知のスキームが使われています!" + +#: scheduler/ipp.c:4136 scheduler/ipp.c:7079 scheduler/ipp.c:7780 +#: scheduler/ipp.c:9269 +#, c-format msgid "notify-subscription-id %d no good!" -msgstr "notify-subscription-id %d が正しくありません!" +msgstr "notify-subscription-id %d は良くありません!" + +#: cups/notify.c:87 msgid "pending" -msgstr "保留中" +msgstr "保留" + +#: ppdc/ppdc.cxx:108 ppdc/ppdpo.cxx:94 +#, c-format msgid "ppdc: Adding include directory \"%s\"...\n" -msgstr "ppdc:インクルードディレクトリ“%s”を追加中...\n" +msgstr "ppdc: ディレクトリー \"%s\" を追加しています...\n" + +#: ppdc/ppdpo.cxx:136 +#, c-format msgid "ppdc: Adding/updating UI text from %s...\n" -msgstr "ppdc:%s から UI テキストを追加/アップデート中...\n" +msgstr "ppdc: %s から UI テキストを追加または更新しています...\n" + +#: ppdc/ppdc-source.cxx:375 +#, c-format msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" -msgstr "ppdc:%3$s の %2$d 行目の論理値(%1$s)が正しくありません。\n" +msgstr "ppdc: 不正な boolean 値 (%s) があります。%d 行目、ファイル名 %s。\n" + +#: ppdc/ppdc-source.cxx:1750 +#, c-format msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の解像度名“%1$s”が正しくありません!\n" +msgstr "ppdc: 不正な resolution 名 \"%s\" があります。%d 行目、ファイル名 %s !\n" + +#: ppdc/ppdc-source.cxx:1078 +#, c-format msgid "ppdc: Bad status keyword %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の状況キーワード %1$s が正しくありません!\n" +msgstr "ppdc: 不正な status キーワード %s があります。%d 行目、ファイル名 %s !\n" + +#: ppdc/ppdc-source.cxx:1987 +#, c-format msgid "ppdc: Bad variable substitution ($%c) on line %d of %s.\n" -msgstr "ppdc:%3$s の %2$d 行目の変数代入($%1$c)が正しくありません。\n" +msgstr "ppdc: 不正な数値置換 ($%c) があります。%d 行目、ファイル名 %s。\n" + +#: ppdc/ppdc-source.cxx:2657 +#, c-format msgid "ppdc: Choice found on line %d of %s with no Option!\n" -msgstr "ppdc:%2$s の %1$d 行目にオプションのない選択が見つかりました!\n" +msgstr "ppdc: %d 行目、ファイル名 %s で、Option がないのに Choice が見つかりました!\n" + +#: ppdc/ppdc-source.cxx:1654 +#, c-format msgid "ppdc: Duplicate #po for locale %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のロケール %1$s の #po が重複しています!\n" +msgstr "ppdc: locale %s に対して #po が2重に定義されています。%d 行目、ファイル名 %s !\n" + +#: ppdc/ppdc-source.cxx:897 +#, c-format msgid "ppdc: Expected a filter definition on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にフィルタ定義が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s においてフィルター定義が必要です!\n" + +#: ppdc/ppdc-source.cxx:920 +#, c-format msgid "ppdc: Expected a program name on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にプログラム名が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s においてプログラム名が必要です!\n" + +#: ppdc/ppdc-source.cxx:359 +#, c-format msgid "ppdc: Expected boolean value on line %d of %s.\n" -msgstr "ppdc:%2$s の %1$d 行目に論理値が必要です。\n" +msgstr "ppdc: %d 行目、ファイル名 %s において boolean 値が必要です。\n" + +#: ppdc/ppdc-source.cxx:1058 +#, c-format msgid "ppdc: Expected charset after Font on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Font の後に文字セットが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に charset が必要です!\n" + +#: ppdc/ppdc-source.cxx:412 +#, c-format msgid "ppdc: Expected choice code on line %d of %s.\n" -msgstr "ppdc:%2$s の %1$d 行目に選択コードが必要です。\n" +msgstr "ppdc: %d 行目、ファイル名 %s において choice code が必要です。\n" + +#: ppdc/ppdc-source.cxx:400 +#, c-format msgid "ppdc: Expected choice name/text on line %d of %s.\n" -msgstr "ppdc:%2$s の %1$d 行目に選択名/テキストが必要です。\n" +msgstr "ppdc: %d 行目、ファイル名 %s において choice name/text が必要です。\n" + +#: ppdc/ppdc-source.cxx:468 +#, c-format msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に ColorModel の色順序が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する color order が必要です!\n" + +#: ppdc/ppdc-source.cxx:457 +#, c-format msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に ColorModel の色空間が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する colorspace が必要です!\n" + +#: ppdc/ppdc-source.cxx:479 +#, c-format msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に ColorModel の圧縮が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する compression が必要です!\n" + +#: ppdc/ppdc-source.cxx:660 +#, c-format msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に UIConstraints の制約文字列が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において UIConstraints に対する constraint が必要です!\n" + +#: ppdc/ppdc-source.cxx:2834 +#, c-format msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の DriverType の後にドライバ・タイプ・キーワードが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において DriverType の後に driver type keyword が必要です!\n" + +#: ppdc/ppdc-source.cxx:791 +#, c-format msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目び Duplex の後に両面タイプが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Duplex の後に type が必要です!\n" + +#: ppdc/ppdc-source.cxx:1042 +#, c-format msgid "ppdc: Expected encoding after Font on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Font の後にエンコーディングが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に encoding が必要です!\n" + +#: ppdc/ppdc-source.cxx:1645 +#, c-format msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の #po %1$s の後にファイル名が必要です!\n" +msgstr "ppdc: #po %s の後にファイル名が必要です! (%d 行目, ファイル %s)\n" + +#: ppdc/ppdc-source.cxx:1170 +#, c-format msgid "ppdc: Expected group name/text on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にグループ名/テキストが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において group name/text が必要です!\n" + +#: ppdc/ppdc-source.cxx:2557 +#, c-format msgid "ppdc: Expected include filename on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にインクルードファイル名が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において include ファイル名が必要です!\n" + +#: ppdc/ppdc-source.cxx:1466 +#, c-format msgid "ppdc: Expected integer on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に整数が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において整数指定が必要です!\n" + +#: ppdc/ppdc-source.cxx:1637 +#, c-format msgid "ppdc: Expected locale after #po on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の #po の後にロケールが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において #po の後に locale が必要です!\n" + +#: ppdc/ppdc-source.cxx:318 +#, c-format msgid "ppdc: Expected name after %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に名前が必要です!\n" +msgstr "ppdc: %s の後に name が必要です。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:3178 +#, c-format msgid "ppdc: Expected name after FileName on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の FileName の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において FileName の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:1023 +#, c-format msgid "ppdc: Expected name after Font on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Font の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:3018 +#, c-format msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Manufacturer の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Manufacturer の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:3051 +#, c-format msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の MediaSize の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において MediaSize の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:3132 +#, c-format msgid "ppdc: Expected name after ModelName on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の ModelName の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ModelName の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:3195 +#, c-format msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の PCFileName の後に名前が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において PCFileName の後に name が必要です!\n" + +#: ppdc/ppdc-source.cxx:1121 +#, c-format msgid "ppdc: Expected name/text after %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に名前/テキストが必要です!\n" +msgstr "ppdc: %s の後に name/text が必要です。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:1210 +#, c-format msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Installable の後に名前/テキストが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Installable の後に name/text が必要です!\n" + +#: ppdc/ppdc-source.cxx:1736 +#, c-format msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Resolution の後に名前/テキストが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Resolution の後に name/text が必要です!\n" + +#: ppdc/ppdc-source.cxx:444 +#, c-format msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の ColorModel に名前/テキストの組み合わせが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ColorModel に対する name/text が必要です!\n" + +#: ppdc/ppdc-source.cxx:1537 +#, c-format msgid "ppdc: Expected option name/text on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にオプション名/テキストが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において option name/text が必要です!\n" + +#: ppdc/ppdc-source.cxx:1571 +#, c-format msgid "ppdc: Expected option section on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にオプションセクションが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において option section が必要です!\n" + +#: ppdc/ppdc-source.cxx:1549 +#, c-format msgid "ppdc: Expected option type on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目にオプションタイプが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において option type が必要です!\n" + +#: ppdc/ppdc-source.cxx:1719 +#, c-format msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Resolution の後にオーバーライドフィールドが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Resolution の後に override field が必要です!\n" + +#: ppdc/ppdc-source.cxx:969 +#, c-format msgid "ppdc: Expected real number on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に実数が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において実数が必要です!\n" + +#: ppdc/ppdc-source.cxx:537 +#, c-format msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の ColorProfile の後に解像度/メディアタイプが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において ColorProfile に続いて resolution/mediatype が必要です!\n" + +#: ppdc/ppdc-source.cxx:1817 +#, c-format msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の SimpleColorProfile の後に解像度/メディアタイプが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において SimpleColorProfile に続いて resolution/mediatype が必要です!\n" + +#: ppdc/ppdc-source.cxx:326 +#, c-format msgid "ppdc: Expected selector after %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の %1$s の後にセレクタが必要です!\n" +msgstr "ppdc: %s の後に selector が必要です。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:1066 +#, c-format msgid "ppdc: Expected status after Font on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Font の後に状況が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に status が必要です!\n" + +#: ppdc/ppdc-source.cxx:2732 +#, c-format msgid "ppdc: Expected string after Copyright on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Copyright の後に文字列が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Copyright の後に文字列が必要です!\n" + +#: ppdc/ppdc-source.cxx:3289 +#, c-format msgid "ppdc: Expected string after Version on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Version の後に文字列が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Version の後に文字列が必要です!\n" + +#: ppdc/ppdc-source.cxx:693 +#, c-format msgid "ppdc: Expected two option names on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に 2 つのオプション名が必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において 2 つのオプション名が必要です!\n" + +#: ppdc/ppdc-source.cxx:337 +#, c-format msgid "ppdc: Expected value after %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の %1$s の後に値が必要です!\n" +msgstr "ppdc: %s の後に value が必要です。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:1050 +#, c-format msgid "ppdc: Expected version after Font on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目の Font の後にバージョンが必要です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Font の後に version が必要です!\n" + +#: ppdc/ppdc-source.cxx:192 +#, c-format msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" -msgstr "ppdc:#include/#po ファイル名“%s”が無効です!\n" +msgstr "ppdc: 無効な #include/#po ファイル名です \"%s\"!\n" + +#: ppdc/ppdc-source.cxx:937 +#, c-format msgid "ppdc: Invalid cost for filter on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目のフィルタのコストが無効です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な cost があります!\n" + +#: ppdc/ppdc-source.cxx:929 +#, c-format msgid "ppdc: Invalid empty MIME type for filter on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目のフィルタの MIME タイプが空であるのは無効です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の MIME type があります!\n" + +#: ppdc/ppdc-source.cxx:945 +#, c-format msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目のフィルタのプログラム名が空であるのは無効です!\n" +msgstr "ppdc: %d 行目、ファイル名 %s においてフィルターに対する無効な空の program name があります!\n" + +#: ppdc/ppdc-source.cxx:1591 +#, c-format msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のオプションセクション“%1$s”が無効です!\n" +msgstr "ppdc: 無効な option section があります \"%s\"。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:1563 +#, c-format msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のオプションタイプ“%1$s”が無効です!\n" +msgstr "ppdc: 無効な option type があります \"%s\"。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc.cxx:244 ppdc/ppdpo.cxx:124 +#, c-format msgid "ppdc: Loading driver information file \"%s\"...\n" -msgstr "ppdc:ドライバ情報ファイル“%s”を読み込み中...\n" +msgstr "ppdc: ドライバー情報ファイル \"%s\" を読み込んでいます...\n" + +#: ppdc/ppdc.cxx:180 +#, c-format msgid "ppdc: Loading messages for locale \"%s\"...\n" -msgstr "ppdc:ロケール“%s”のメッセージを読み込み中...\n" +msgstr "ppdc: ロケール \"%s\" のメッセージを読み込んでいます...\n" + +#: ppdc/ppdc.cxx:121 +#, c-format msgid "ppdc: Loading messages from \"%s\"...\n" -msgstr "ppdc:“%s”からメッセージを読み込み中...\n" +msgstr "ppdc: \"%s\" からメッセージを読み込んでいます...\n" + +#: ppdc/ppdc-source.cxx:2354 ppdc/ppdc-source.cxx:2582 +#, c-format msgid "ppdc: Missing #endif at end of \"%s\"!\n" -msgstr "ppdc:“%s”の最後に #endif がありません!\n" +msgstr "ppdc: \"%s\" の最後に #endif が見つかりません!\n" + +#: ppdc/ppdc-source.cxx:2451 ppdc/ppdc-source.cxx:2486 +#: ppdc/ppdc-source.cxx:2516 +#, c-format msgid "ppdc: Missing #if on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に #if がありません!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において #if が見つかりません!\n" + +#: ppdc/ppdc-driver.cxx:683 +#, c-format msgid "ppdc: No message catalog provided for locale %s!\n" -msgstr "ppdc:ロケール %s にメッセージカタログが渡されていません!\n" +msgstr "ppdc: ロケール %s に対するメッセージカタログが見つかりません!\n" + +#: ppdc/ppdc-source.cxx:1607 +#, c-format msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" -msgstr "ppdc:オプション %1$s は %3$s の %2$d 行目で別のタイプで再定義されています!\n" +msgstr "ppdc: オプション %s は異なる型で再定義されています。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:670 +#, c-format msgid "ppdc: Option constraint must *name on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目のオプション制約は *name である必要があります!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において Option constraint は *name で指定します!\n" + +#: ppdc/ppdc-source.cxx:2433 +#, c-format msgid "ppdc: Too many nested #if's on line %d of %s!\n" -msgstr "ppdc:%2$s の %1$d 行目に #if の入れ子が多すぎます!\n" +msgstr "ppdc: %d 行目、ファイル名 %s において #if のネストが多すぎます!\n" + +#: ppdc/ppdc.cxx:348 +#, c-format msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" -msgstr "ppdc:PPD ファイル“%s”を作成できません - %s。\n" +msgstr "ppdc: PPD ファイル \"%s\" を作成できません - %s。\n" + +#: ppdc/ppdc.cxx:259 +#, c-format msgid "ppdc: Unable to create output directory %s: %s\n" -msgstr "ppdc:出力ディレクトリ %s を作成できません:%s\n" +msgstr "ppdc: ディレクトリー \"%s\" を作成できません - %s\n" + +#: ppdc/ppdc.cxx:280 +#, c-format msgid "ppdc: Unable to create output pipes: %s\n" -msgstr "ppdc:出力パイプを作成できません:%s\n" +msgstr "ppdc: 出力 pipe が作成できません: %s\n" + +#: ppdc/ppdc.cxx:297 ppdc/ppdc.cxx:304 +#, c-format msgid "ppdc: Unable to execute cupstestppd: %s\n" -msgstr "ppdc:cupstestppd を実行できません:%s\n" +msgstr "ppdc: cupstestppd を実行できません: %s\n" + +#: ppdc/ppdc-source.cxx:1684 +#, c-format msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目に #po ファイル %1$s が見つかりません!\n" +msgstr "ppdc: #po ファイル %s が見つかりません。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:2589 +#, c-format msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目にインクルードファイル“%1$s”が見つかりません!\n" +msgstr "ppdc: インクルードファイル %s が見つかりません。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc.cxx:191 +#, c-format msgid "ppdc: Unable to find localization for \"%s\" - %s\n" -msgstr "ppdc:“%s”のローカリゼーションが見つかりません - %s\n" +msgstr "ppdc: \"%s\" に対する地域化情報が見つかりません - %s \n" + +#: ppdc/ppdc.cxx:130 +#, c-format msgid "ppdc: Unable to load localization file \"%s\" - %s\n" -msgstr "ppdc:ローカリゼーションファイル“%s”を読み込めません - %s\n" +msgstr "ppdc: \"%s\" に対する地域化情報を読み込めません - %s \n" + +#: ppdc/ppdc-source.cxx:2007 +#, c-format msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" -msgstr "ppdc:%3$s の %2$d 行目の変数(%1$s)が未定義です。\n" +msgstr "ppdc: 変数 (%s) は未定義です。%d 行目、ファイル名 %s。\n" + +#: ppdc/ppdc-source.cxx:2853 +#, c-format msgid "ppdc: Unknown driver type %s on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のドライバタイプ %1$s が不明です!\n" +msgstr "ppdc: %s は未知のドライバータイプです。%d 行目、ファイル名 %s。\n" + +#: ppdc/ppdc-source.cxx:871 +#, c-format msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の両面タイプ“%1$s”が不明です!\n" +msgstr "ppdc: \"%s\" は未知の両面タイプです。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:3064 +#, c-format msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のメディアサイズ“%1$s”が不明です!\n" +msgstr "ppdc: \"%s\" は未知の用紙サイズです。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:3300 +#, c-format msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目のトークン“%1$s”が不明です!\n" +msgstr "ppdc: 未知の token \"%s\" があります。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:979 +#, c-format msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の実数“%1$s”の後続文字列が不明です!\n" +msgstr "ppdc: 実数に未知の終了文字 \"%s\" があります。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc-source.cxx:2116 +#, c-format msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" -msgstr "ppdc:%3$s の %2$d 行目の %1$c で始まる文字列が終了していません!\n" +msgstr "ppdc: %c で始まる文字に対して終端文字がありません。%d 行目、ファイル名 %s!\n" + +#: ppdc/ppdc.cxx:354 +#, c-format msgid "ppdc: Writing %s...\n" -msgstr "ppdc:%s を書き込み中...\n" +msgstr "ppdc: %s を書き込んでいます...\n" + +#: ppdc/ppdc.cxx:143 +#, c-format msgid "ppdc: Writing PPD files to directory \"%s\"...\n" -msgstr "ppdc:ディレクトリ“%s”に PPD ファイルを書き込み中...\n" +msgstr "ppdc: ディレクトリー \"%s\" に PPD ファイルを書き込んでいます...\n" + +#: ppdc/ppdmerge.cxx:138 +#, c-format msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" -msgstr "ppdmerge:%2$s の LanguageVersion“%1$s”が正しくありません!\n" +msgstr "ppdmerge: 不正な LanguageVersion \"%s\" が %s にあります!\n" + +#: ppdc/ppdmerge.cxx:178 +#, c-format msgid "ppdmerge: Ignoring PPD file %s...\n" -msgstr "ppdmerge:PPD ファイル %s は無視されます...\n" +msgstr "ppdmerge: PPD ファイル %s を無視します...\n" + +#: ppdc/ppdmerge.cxx:162 +#, c-format msgid "ppdmerge: Unable to backup %s to %s- %s\n" -msgstr "ppdmerge:%s のバックアップを %s に作成できません - %s\n" +msgstr "ppdmerge: %s を %s にバックアップできません - %s\n" + +#: systemv/lpstat.c:1769 +#, c-format msgid "printer %s disabled since %s -\n" -msgstr "プリンタ %s は %s 以来無効になっています -\n" +msgstr "プリンター %s は %s から無効です -\n" + +#: systemv/lpstat.c:1758 +#, c-format msgid "printer %s is idle. enabled since %s\n" -msgstr "プリンタ %s は待機中です。%s 以来有効になっています\n" +msgstr "プリンター %s は待機中です。%s 以来有効です\n" + +#: systemv/lpstat.c:1763 +#, c-format msgid "printer %s now printing %s-%d. enabled since %s\n" -msgstr "プリンタ %s は現在 %s-%d をプリント中です。%s 以来有効になっています\n" +msgstr "プリンター %s は %s-%d を印刷しています。%s 以来有効です\n" + +#: systemv/lpstat.c:1881 +#, c-format msgid "printer %s/%s disabled since %s -\n" -msgstr "プリンタ %s/%s は %s 以来無効になっています -\n" +msgstr "プリンター %s/%s は %s から無効です -\n" + +#: systemv/lpstat.c:1867 +#, c-format msgid "printer %s/%s is idle. enabled since %s\n" -msgstr "プリンタ %s/%s は待機中です。%s 以来有効になっています\n" +msgstr "プリンター %s/%s は待機中です。%s 以来有効です\n" + +#: systemv/lpstat.c:1874 +#, c-format msgid "printer %s/%s now printing %s-%d. enabled since %s\n" -msgstr "プリンタ %s/%s は現在 %s-%d をプリント中です。%s 以来有効になっています\n" +msgstr "プリンター %s/%s は現在 %s-%d を印刷中です。%s 以来有効です\n" + +#: cups/notify.c:93 cups/notify.c:134 msgid "processing" msgstr "処理中" + +#: systemv/lp.c:660 +#, c-format msgid "request id is %s-%d (%d file(s))\n" -msgstr "要求 ID は %s-%d です(%d 個のファイル)\n" +msgstr "リクエスト ID は %s-%d です (%d 個のファイル)\n" + +#: cups/snmp.c:1019 msgid "request-id uses indefinite length" -msgstr "request-id に使われている長さが不定です" +msgstr "リクエスト ID の長さが不定" + +#: systemv/lpstat.c:2008 msgid "scheduler is not running\n" -msgstr "スケジューラは実行されていません\n" +msgstr "スケジューラーは動作していません\n" + +#: systemv/lpstat.c:2004 msgid "scheduler is running\n" -msgstr "スケジューラは実行中です\n" +msgstr "スケジューラーは動作中です\n" + +#: cups/adminutil.c:2261 +#, c-format msgid "stat of %s failed: %s" -msgstr "%s の統計情報を取得できませんでした:%s" +msgstr "%s の状態取得に失敗しました: %s" + +#: berkeley/lpc.c:216 msgid "status\t\tshow status of daemon and queue\n" -msgstr "status\t\tデーモンとキューの状況を表示します\n" +msgstr "status\t\tデーモンとキューの状態を表示\n" + +#: cups/notify.c:96 cups/notify.c:137 msgid "stopped" -msgstr "停止中" +msgstr "停止" + +#: systemv/lpstat.c:1017 +#, c-format msgid "system default destination: %s\n" -msgstr "システムのデフォルトの送信先:%s\n" +msgstr "システムのデフォルトの宛先: %s\n" + +#: systemv/lpstat.c:1014 +#, c-format msgid "system default destination: %s/%s\n" -msgstr "システムのデフォルトの送信先:%s/%s\n" +msgstr "システムのデフォルトの宛先: %s/%s\n" + +#: cups/notify.c:108 cups/notify.c:140 msgid "unknown" -msgstr "不明" +msgstr "未知" + +#: cups/notify.c:117 msgid "untitled" -msgstr "名称未設定" +msgstr "タイトルなし" + +#: cups/snmp.c:1044 msgid "variable-bindings uses indefinite length" -msgstr "variable-bindings に使われている長さが不定です" +msgstr "variable-bindings の長さが不定" + + +# +# End of "$Id$". +# diff --git a/locale/cups_ko.po b/locale/cups_ko.po index 6d53d00fe..6ccd38e99 100644 --- a/locale/cups_ko.po +++ b/locale/cups_ko.po @@ -168,9 +168,9 @@ msgstr " %s %s %s이(가) 존재하지 않습니다!\n" msgid " %s Bad %s choice %s!\n REF: Page 122, section 5.17\n" msgstr " %s 잘못된 %s - 선택사항 %s!\n REF: 122페이지, 섹션 5.17\n" msgid " %s Bad UTF-8 \"%s\" translation string for option %s!\n" -msgstr " %s %s 옵션에 대한 잘못된 \"%s\" UTF-8 번역 스트링!\n" +msgstr " %1$s %3$s 옵션에 대한 잘못된 UTF-8 \"%2$s\" 번역 스트링!\n" msgid " %s Bad UTF-8 \"%s\" translation string for option %s, choice %s!\n" -msgstr " %s %s 옵션에 대한 잘못된 \"%s\" UTF-8 번역 스트링, %s 선택사항!\n" +msgstr " %1$s %3$s 옵션, %4$s 선택사항에 대한 잘못된 UTF-8 \"%2$s\" 번역 스트링!\n" msgid " %s Bad cupsFilter value \"%s\"!\n" msgstr " %s 잘못된 \"%s\" cupsFilter 값!\n" msgid " %s Bad cupsICCProfile %s!\n" @@ -184,13 +184,13 @@ msgstr " %s 잘못된 \"%s\" 언어!\n" msgid " %s Empty cupsUIConstraints %s!\n" msgstr " %s cupsUIConstraints %s이(가) 비어있음!\n" msgid " %s Missing \"%s\" translation string for option %s!\n" -msgstr " %s %s 옵션에 대한 \"%s\" 번역 스트링 유실됨!\n" +msgstr " %1$s %3$s 옵션에 대한 \"%2$s\" 번역 스트링 유실됨!\n" msgid " %s Missing \"%s\" translation string for option %s, choice %s!\n" -msgstr " %s %s 옵션에 대한 \"%s\" 번역 스트링 유실됨, %s 선택사항!\n" +msgstr " %1$s %3$s 옵션, %4$s 선택사항에 대한 \"%2$s\" 번역 스트링 유실됨!\n" msgid " %s Missing choice *%s %s in UIConstraints \"*%s %s *%s %s\"!\n" -msgstr " %s UIConstraint \"*%s %s *%s %s\"에 있는 *%s %s 선택사항 유실됨!\n" +msgstr " %1$s \"*%4$s %5$s *%6$s %7$s\" UIConstraints에 있는 *%2$s %3$s 선택사항 유실됨!\n" msgid " %s Missing choice *%s %s in cupsUIConstraints %s: \"%s\"!\n" -msgstr " %s %s cupsUIConstraints에 있는 *%s %s 선택사항 유실됨: \"%s\"!\n" +msgstr " %1$s %4$s cupsUIConstraints에 있는 *%2$s %3$s 선택사항 유실됨: \"%5$s\"!\n" msgid " %s Missing cupsFilter file \"%s\"\n" msgstr " %s \"%s\" cupsFilter 파일이 유실됨\n" msgid " %s Missing cupsICCProfile file \"%s\"!\n" @@ -200,13 +200,13 @@ msgstr " %s \"%s\" cupsPreFilter 파일 유실됨\n" msgid " %s Missing cupsUIResolver %s!\n" msgstr " %s %s cupsUIResolver 유실됨!\n" msgid " %s Missing option %s in UIConstraints \"*%s %s *%s %s\"!\n" -msgstr " %s UIConstraint \"*%s %s *%s %s\"에 있는 %s 옵션 유실됨!\n" +msgstr " %1$s \"*%3$s %4$s *%5$s %6$s\" UIConstraints에 있는 %2$s 옵션 유실됨!\n" msgid " %s Missing option %s in cupsUIConstraints %s: \"%s\"!\n" -msgstr " %s %s cupsUIConstraints에 있는 %s 옵션 유실됨: \"%s\"!\n" +msgstr " %1$s %3$s cupsUIConstraints에 있는 %2$s 옵션 유실됨: \"%4$s\"!\n" msgid " %s No base translation \"%s\" is included in file!\n" -msgstr " %s \"%s\" 기초 번역이 없는 것이 파일에 포함되어 있습니다!\n" +msgstr " %s 파일에 \"%s\" 기초 번역이 포함되어 있지 않습니다!\n" msgid " %s REQUIRED %s does not define choice None!\n REF: Page 122, section 5.17\n" -msgstr " %s 선택사항을 정의하지 않는 필요한 %s이(가) 없음!\n REF: 122페이지, 섹션 5.17\n" +msgstr " %s 선택사항 없음을 정의하지 않은 %s이(가) 필요!\n REF: 122페이지, 섹션 5.17\n" msgid " %s cupsICCProfile %s hash value collides with %s!\n" msgstr " %s 불필요한 %s cupsICCProfile 값이 %s와(과) 충돌함!\n" msgid " %s cupsUIResolver %s causes a loop!\n" @@ -224,17 +224,17 @@ msgstr " **FAIL** 잘못된 DefaultPaperDimension %s!\n REF msgid " **FAIL** BAD JobPatchFile attribute in file\n REF: Page 24, section 3.4.\n" msgstr " **FAIL** 파일에 있는 잘못된 JobPatchFile 속성\n REF: 24페이지, 섹션 3.4.\n" msgid " **FAIL** BAD Manufacturer (should be \"HP\")\n REF: Page 211, table D.1.\n" -msgstr " **FAIL** 잘못된 Manufacturer(\"HP\"이어야 함)\n REF: 211페이지, table D.1.\n" +msgstr " **FAIL** 잘못된 Manufacturer(\"HP\"이어야 함)\n REF: 211페이지, 표 D.1.\n" msgid " **FAIL** BAD Manufacturer (should be \"Oki\")\n REF: Page 211, table D.1.\n" -msgstr " **FAIL** 잘못된 Manufacturer(\"Oki\"이어야 함)\n REF: 211페이지, table D.1.\n" +msgstr " **FAIL** 잘못된 Manufacturer(\"Oki\"이어야 함)\n REF: 211페이지, 표 D.1.\n" msgid " **FAIL** BAD ModelName - \"%c\" not allowed in string.\n REF: Pages 59-60, section 5.3.\n" -msgstr " **FAIL** 잘못된 ModelName - \"%c\"은(는) 스트링에서 허용되지 않습니다.\n REF: 59-60페이지, section 5.3.\n" +msgstr " **FAIL** 잘못된 ModelName - \"%c\"은(는) 스트링에서 허용되지 않습니다.\n REF: 59-60페이지, 섹션 5.3.\n" msgid " **FAIL** BAD PSVersion - not \"(string) int\".\n REF: Pages 62-64, section 5.3.\n" msgstr " **FAIL** 잘못된 PSVersion - \"(string) int\"이(가) 아닙니다.\n REF: 62-64페이지, 섹션 5.3.\n" msgid " **FAIL** BAD Product - not \"(string)\".\n REF: Page 62, section 5.3.\n" msgstr " **FAIL** 잘못된 Product - \"(string)\"이(가) 아닙니다.\n REF: 62페이지, 섹션 5.3.\n" msgid " **FAIL** BAD ShortNickName - longer than 31 chars.\n REF: Pages 64-65, section 5.3.\n" -msgstr " **FAIL** 잘못된 ShortNickName - 31자 이상입니다.\n REF: 64-65페이지, 섹션 5.3.\n" +msgstr " **FAIL** 잘못된 ShortNickName - 31자보다 깁니다.\n REF: 64-65페이지, 섹션 5.3.\n" msgid " **FAIL** Bad %s choice %s!\n REF: Page 84, section 5.9\n" msgstr " **FAIL** 잘못된 %s - 선택사항 %s!\n REF: 84페이지, 섹션 5.9\n" msgid " **FAIL** Bad FileVersion \"%s\"\n REF: Page 56, section 5.3.\n" @@ -258,45 +258,45 @@ msgstr " **FAIL** 다중 %s 항목이 %s 이름을 선택!\n" msgid " **FAIL** Option names %s and %s differ only by case!\n" msgstr " **FAIL** %s 및 %s 옵션 이름이 경우별로만 다름!\n" msgid " **FAIL** REQUIRED Default%s\n REF: Page 40, section 4.5.\n" -msgstr " **FAIL** 필요한 Default%s\n REF: 40페이지, section 4.5.\n" +msgstr " **FAIL** Default%s 필요\n REF: 40페이지, 섹션 4.5.\n" msgid " **FAIL** REQUIRED DefaultImageableArea\n REF: Page 102, section 5.15.\n" -msgstr " **FAIL** 필요한 DefaultImageableArea\n REF: 102페이지, 섹션 5.15.\n" +msgstr " **FAIL** DefaultImageableArea 필요\n REF: 102페이지, 섹션 5.15.\n" msgid " **FAIL** REQUIRED DefaultPaperDimension\n REF: Page 103, section 5.15.\n" -msgstr " **FAIL** 필요한 DefaultPaperDimension\n REF: 103페이지, 섹션 5.15.\n" +msgstr " **FAIL** DefaultPaperDimension 필요\n REF: 103페이지, 섹션 5.15.\n" msgid " **FAIL** REQUIRED FileVersion\n REF: Page 56, section 5.3.\n" -msgstr " **FAIL** 필요한 FileVersion\n REF: 56페이지, section 5.3.\n" +msgstr " **FAIL** FileVersion 필요\n REF: 56페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED FormatVersion\n REF: Page 56, section 5.3.\n" -msgstr " **FAIL** 필요한 FormatVersion\n REF: 56페이지, 섹션 5.3.\n" +msgstr " **FAIL** FormatVersion 필요\n REF: 56페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED ImageableArea for PageSize %s\n REF: Page 41, section 5.\n REF: Page 102, section 5.15.\n" -msgstr " **FAIL** %s PageSize에 대한 필요한 ImageableArea\n REF: 41페이지, 섹션 5.\n REF: 102페이지, 섹션 5.15.\n" +msgstr " **FAIL** %s PageSize에 대한 ImageableArea 필요\n REF: 41페이지, 섹션 5.\n REF: 102페이지, 섹션 5.15.\n" msgid " **FAIL** REQUIRED LanguageEncoding\n REF: Pages 56-57, section 5.3.\n" -msgstr " **FAIL** 필요한 LanguageEncoding\n REF: 56-57페이지, 섹션 5.3.\n" +msgstr " **FAIL** LanguageEncoding 필요\n REF: 56-57페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED LanguageVersion\n REF: Pages 57-58, section 5.3.\n" -msgstr " **FAIL** 필요한 LanguageVersion\n REF: 57-58페이지, 섹션 5.3.\n" +msgstr " **FAIL** LanguageVersion 필요\n REF: 57-58페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED Manufacturer\n REF: Pages 58-59, section 5.3.\n" -msgstr " **FAIL** 필요한 Manufacturer\n REF: 58-59페이지, 섹션 5.3.\n" +msgstr " **FAIL** Manufacturer 필요\n REF: 58-59페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED ModelName\n REF: Pages 59-60, section 5.3.\n" -msgstr " **FAIL** 필요한 ModelName\n REF: 59-60페이지, 섹션 5.3.\n" +msgstr " **FAIL** ModelName 필요\n REF: 59-60페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED NickName\n REF: Page 60, section 5.3.\n" -msgstr " **FAIL** 필요한 NickName\n REF: 60페이지, 섹션 5.3.\n" +msgstr " **FAIL** NickName 필요\n REF: 60페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED PCFileName\n REF: Pages 61-62, section 5.3.\n" -msgstr " **FAIL** 필요한 PCFileName\n REF: 61-62페이지, 섹션 5.3.\n" +msgstr " **FAIL** PCFileName 필요\n REF: 61-62페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED PSVersion\n REF: Pages 62-64, section 5.3.\n" -msgstr " **FAIL** 필요한 PSVersion\n REF: 62-64페이지, 섹션 5.3.\n" +msgstr " **FAIL** PSVersion 필요\n REF: 62-64페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED PageRegion\n REF: Page 100, section 5.14.\n" -msgstr " **FAIL** 필요한 PageRegion\n REF: 100페이지, 섹션 5.14.\n" +msgstr " **FAIL** PageRegion 필요\n REF: 100페이지, 섹션 5.14.\n" msgid " **FAIL** REQUIRED PageSize\n REF: Page 41, section 5.\n REF: Page 99, section 5.14.\n" -msgstr " **FAIL** 필요한 PageSize\n REF: 41페이지, 섹션 5.\n REF: Page 99, section 5.14.\n" +msgstr " **FAIL** PageSize 필요\n REF: 41페이지, 섹션 5.\n REF: 99페이지, 섹션 5.14.\n" msgid " **FAIL** REQUIRED PageSize\n REF: Pages 99-100, section 5.14.\n" -msgstr " **FAIL** 필요한 PageSize\n REF: 99-100페이지, 섹션 5.14.\n" +msgstr " **FAIL** PageSize 필요\n REF: 99-100페이지, 섹션 5.14.\n" msgid " **FAIL** REQUIRED PaperDimension for PageSize %s\n REF: Page 41, section 5.\n REF: Page 103, section 5.15.\n" -msgstr " **FAIL** %s PageSize에 대한 필요한 PaperDimension\n REF: Page 41, 섹션 5.\n REF: 103페이지, 섹션 5.15.\n" +msgstr " **FAIL** %s PageSize에 대한 PaperDimension 필요\n REF: 41페이지, 섹션 5.\n REF: 103페이지, 섹션 5.15.\n" msgid " **FAIL** REQUIRED Product\n REF: Page 62, section 5.3.\n" -msgstr " **FAIL** 필요한 Product\n REF: 62페이지, 섹션 5.3.\n" +msgstr " **FAIL** Product 필요\n REF: 62페이지, 섹션 5.3.\n" msgid " **FAIL** REQUIRED ShortNickName\n REF: Page 64-65, section 5.3.\n" -msgstr " **FAIL** 필요한 ShortNickName\n REF: 64-65페이지, 섹션 5.3.\n" +msgstr " **FAIL** ShortNickName 필요\n REF: 64-65페이지, 섹션 5.3.\n" msgid " %d ERRORS FOUND\n" -msgstr " %d 오류 발견\n" +msgstr " %d개의 오류 발견\n" msgid " Bad %%%%BoundingBox: on line %d!\n REF: Page 39, %%%%BoundingBox:\n" msgstr " 잘못된 %%%%BoundingBox: %d번째 줄!\n REF: 39페이지, %%%%BoundingBox:\n" msgid " Bad %%%%Page: on line %d!\n REF: Page 53, %%%%Page:\n" @@ -304,7 +304,7 @@ msgstr " 잘못된 %%%%Page: %d번째 줄!\n REF: 53페이지, %%%%Pag msgid " Bad %%%%Pages: on line %d!\n REF: Page 43, %%%%Pages:\n" msgstr " 잘못된 %%%%Pages: %d번째 줄!\n REF: 43페이지, %%%%Pages:\n" msgid " Line %d is longer than 255 characters (%d)!\n REF: Page 25, Line Length\n" -msgstr " %d번째 줄이 255자 이상입니다(%d)!\n REF: 25페이지, 줄 길이\n" +msgstr " %d번째 줄이 255자보다 깁니다(%d)!\n REF: 25페이지, 줄 길이\n" msgid " Missing %!PS-Adobe-3.0 on first line!\n REF: Page 17, 3.1 Conforming Documents\n" msgstr " 첫번째 줄에 있는 %!PS-Adobe-3.0이 유실됨!\n REF: 17페이지, 3.1 도큐멘트 구성하기\n" msgid " Missing %%EndComments comment!\n REF: Page 41, %%EndComments\n" @@ -324,11 +324,11 @@ msgstr " 너무 많은 %%BeginDocument 설명!\n" msgid " Too many %%EndDocument comments!\n" msgstr " 너무 많은 %%EndDocument 설명!\n" msgid " Warning: file contains binary data!\n" -msgstr " WARN: 파일에 바이너리 데이터가 포함되어 있습니다!\n" +msgstr " 경고: 파일에 바이너리 데이터가 포함되어 있습니다!\n" msgid " Warning: no %%EndComments comment in file!\n" -msgstr " WARN: 파일에 %%EndComments 설명이 없습니다!\n" +msgstr " 경고: 파일에 %%EndComments 설명이 없습니다!\n" msgid " Warning: obsolete DSC version %.1f in file!\n" -msgstr " WARN: 파일에 이전 DSC 버전 %.1f가 있습니다!\n" +msgstr " 경고: 파일에 이전 DSC 버전 %.1f가 있습니다!\n" msgid " FAIL\n" msgstr " FAIL\n" msgid " FAIL\n **FAIL** Unable to open PPD file - %s\n" @@ -336,7 +336,7 @@ msgstr " FAIL\n **FAIL** PPD 파일을 열 수 없음 - %s\n" msgid " FAIL\n **FAIL** Unable to open PPD file - %s on line %d.\n" msgstr " FAIL\n **FAIL** PPD 파일을 열 수 없음 - %s, %d번째 줄.\n" msgid " PASS\n" -msgstr " 통과\n" +msgstr " PASS\n" msgid "#10 Envelope" msgstr "#10 봉투" msgid "#11 Envelope" @@ -354,13 +354,13 @@ msgstr "%-7s %-7.7s %-7d %-31.31s %.0f바이트\n" msgid "%.0f x %.0f millimeters" msgstr "%.0f x %.0fmm" msgid "%.0f x %.0f to %.0f x %.0f millimeters" -msgstr "%.0f x %.0f to %.0f x %.0fmm" +msgstr "%.0f x %.0f~%.0f x %.0fmm" msgid "%.2f x %.2f inches" msgstr "%.2f x %.2f인치" msgid "%.2f x %.2f to %.2f x %.2f inches" -msgstr "%.2f x %.2f to %.2f x %.2f인치" +msgstr "%.2f x %.2f~%.2f x %.2f인치" msgid "%s accepting requests since %s\n" -msgstr " %s 이후에 %s 승인 요청\n" +msgstr " %2$s 이후에 %1$s 승인 요청\n" msgid "%s cannot be changed." msgstr "%s을(를) 변경할 수 없습니다." msgid "%s is not implemented by the CUPS version of lpc.\n" @@ -372,13 +372,13 @@ msgstr "%s이(가) 준비됨\n" msgid "%s is ready and printing\n" msgstr "%s이(가) 준비되었고 프린트 중\n" msgid "%s not accepting requests since %s -\n\t%s\n" -msgstr "%s 이후에 %s 승인 요청 안 함 -\n\t%s\n" +msgstr "%2$s 이후에 %1$s 승인 요청 안 함 -\n\t%1$s\n" msgid "%s not supported!" msgstr "%s이(가) 지원되지 않음!" msgid "%s/%s accepting requests since %s\n" -msgstr "%s 이후에 %s/%s 승인 요청\n" +msgstr "%3$s 이후에 %1$s/%2$s 승인 요청\n" msgid "%s/%s not accepting requests since %s -\n\t%s\n" -msgstr "%s 이후에 %s/%s 승인 요청 안 함 -\n\t%s\n" +msgstr "%3$s 이후에 %1$s/%2$s 승인 요청 안 함 -\n\t%4$s\n" msgid "%s: %-33.33s [job %d localhost]\n" msgstr "%s: %-33.33s [작업 %d 로컬호스트]\n" msgid "%s: %s failed: %s\n" @@ -386,7 +386,7 @@ msgstr "%s: %s 실패: %s\n" msgid "%s: Don't know what to do!\n" msgstr "%s: 해야할 일을 모르겠음!\n" msgid "%s: Error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "%s: 오류 - \"%s\" 대상에 존재하지 않는 %s 환경 변수 이름!\n" +msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n" msgid "%s: Error - bad job ID!\n" msgstr "%s: 오류 - 잘못된 작업 ID!\n" msgid "%s: Error - cannot print files and alter jobs simultaneously!\n" @@ -396,9 +396,9 @@ msgstr "%s: 오류 - 파일 또는 작업 ID가 제공되었다면 stdin에서 msgid "%s: Error - expected character set after '-S' option!\n" msgstr "%s: 오류 - '-S' 옵션 뒤에 문자 세트가 예상됨!\n" msgid "%s: Error - expected content type after '-T' option!\n" -msgstr "%s: 오류 - '-T' 옵션 뒤에 콘텐츠 유형이 예상됨 !\n" +msgstr "%s: 오류 - '-T' 옵션 뒤에 콘텐츠 유형이 예상됨!\n" msgid "%s: Error - expected copies after '-n' option!\n" -msgstr "%s: 오류 - -n' 옵션 뒤에 장 수가 예상됨!\n" +msgstr "%s: 오류 - '-n' 옵션 뒤에 복사 매수가 예상됨!\n" msgid "%s: Error - expected copy count after '-#' option!\n" msgstr "%s: 오류 - '-#' 옵션 뒤에 복사본 수가 예상됨!\n" msgid "%s: Error - expected destination after '-P' option!\n" @@ -436,7 +436,7 @@ msgstr "%s: 오류 - '-u' 옵션 뒤에 사용자 이름이 예상됨!\n" msgid "%s: Error - expected value after '-%c' option!\n" msgstr "%s: 오류 - '-%c' 옵션 뒤에 값이 예상됨!\n" msgid "%s: Error - need \"completed\", \"not-completed\", or \"all\" after '-W' option!\n" -msgstr "%s: 오류 - '-W' 옵션 뒤에 \"완료됨\", \"완료되지 않음\" 또는 \"모두\"가 필요!\n" +msgstr "%s: 오류 - '-W' 옵션 뒤에 \"completed\", \"not-completed\" 또는 \"all\"이 필요!\n" msgid "%s: Error - no default destination available.\n" msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n" msgid "%s: Error - priority must be between 1 and 100.\n" @@ -480,11 +480,13 @@ msgstr "%s: 서버에 연결할 수 없음!\n" msgid "%s: Unable to determine MIME type of \"%s\"!\n" msgstr "%s: MIME 유형의 \"%s\"을(를) 결정할 수 없음!\n" msgid "%s: Unable to open %s - %s\n" -msgstr "%s: %s를 열 수 없음 - %s\n" +msgstr "%s: %s을(를) 열 수 없음 - %s\n" +msgid "%s: Unable to open %s - %s on line %d.\n" +msgstr "%s: %s을(를) 열 수 없음 - %s, %d번째 줄\n" msgid "%s: Unable to open %s: %s\n" msgstr "%s: %s을(를) 열 수 없음: %s\n" msgid "%s: Unable to open PPD file: %s on line %d\n" -msgstr "%1$s: %3$d번째 줄에 있는 %2$s PPD 파일을 열 수 없음\n" +msgstr "%s: PPD 파일을 열 수 없음: %s, %d번째 줄\n" msgid "%s: Unable to read MIME database from \"%s\" or \"%s\"!\n" msgstr "%s: \"%s\" 또는 \"%s\"에서 MIME 데이터베이스를 읽을 수 없음!\n" msgid "%s: Unknown destination \"%s\"!\n" @@ -506,9 +508,9 @@ msgstr "%s: 경고 - 구성 옵션이 무시됨!\n" msgid "%s: Warning - mode option ignored!\n" msgstr "%s: 경고 - 모드 옵션이 무시됨!\n" msgid "%s: error - %s environment variable names non-existent destination \"%s\"!\n" -msgstr "%s: 오류 - \"%s\" 대상에 존재하지 않는 %s 환경 변수 이름!\n" +msgstr "%1$s: 오류 - \"%3$s\" 대상에 존재하지 않는 %2$s 환경 변수 이름!\n" msgid "%s: error - expected option=value after '-o' option!\n" -msgstr "%s: 오류 - '-o' 옵션 뒤에 옵션=값이 예상됨!\n" +msgstr "%s: 오류 - '-o' 옵션 뒤에 option=value가 예상됨!\n" msgid "%s: error - no default destination available.\n" msgstr "%s: 오류 - 사용 가능한 기본 대상이 없습니다.\n" msgid "-1" @@ -912,9 +914,9 @@ msgstr "프린터 드라이버를 보내려면 Samba 암호가 필요함!" msgid "A Samba username is required to export printer drivers!" msgstr "프린터 드라이버를 보내려면 Samba 사용자 이름이 필요함!" msgid "A class named \"%s\" already exists!" -msgstr "\"%s\"라는 이름의 클래스가 이미 존재합니다!" +msgstr "\"%s\"(이)라는 이름의 클래스가 이미 존재합니다!" msgid "A printer named \"%s\" already exists!" -msgstr "\"%s\"라는 이름의 프린터가 이미 존재합니다!" +msgstr "\"%s\"(이)라는 이름의 프린터가 이미 존재합니다!" msgid "A0" msgstr "A0" msgid "A1" @@ -1028,7 +1030,7 @@ msgstr "잘못된 SNMP 버전 번호" msgid "Bad UIConstraints" msgstr "잘못된 UIConstraints" msgid "Bad copies value %d." -msgstr "잘못된 복사본 값 %d." +msgstr "잘못된 복사 매수 값 %d." msgid "Bad custom parameter" msgstr "잘못된 사용자 설정 매개변수" msgid "Bad device URI \"%s\"!\n" @@ -1060,7 +1062,7 @@ msgstr "잘못된 notify-recipient-uri URI \"%s\"!" msgid "Bad number-up value %d." msgstr "잘못된 number-up 값 %d." msgid "Bad option + choice on line %d!" -msgstr "%d번째 줄에 있는 잘못된 옵션 + 선택!" +msgstr "%d번째 줄에 있는 잘못된 옵션 + 선택사항!" msgid "Bad page-ranges values %d-%d." msgstr "잘못된 page-ranges 값 %d-%d." msgid "Bad port-monitor \"%s\"!" @@ -1104,13 +1106,13 @@ msgstr "C7 봉투" msgid "CMYK" msgstr "CMYK" msgid "CPCL Label Printer" -msgstr "CPCL 레이블 프린터" +msgstr "CPCL 레이블 프린터" msgid "Cancel RSS Subscription" msgstr "RSS 구독 취소" msgid "Change Settings" -msgstr "설정 값 변경" +msgstr "설정값 변경" msgid "Character set \"%s\" not supported!" -msgstr "\"%s\" 문자 설정이 지원되지 않음!" +msgstr "\"%s\" 문자 세트가 지원되지 않음!" msgid "Chou3 Envelope" msgstr "Chou3 봉투" msgid "Chou4 Envelope" @@ -1124,7 +1126,7 @@ msgstr "색상" msgid "Color Mode" msgstr "색상 모드" msgid "Commands may be abbreviated. Commands are:\n\nexit help quit status ?\n" -msgstr "명령이 생략될 수 있습니다. 명령은 다음과 같습니다:\n\n종료 도움말 종료 상태 ?\n" +msgstr "명령이 생략될 수 있습니다. 명령은 다음과 같습니다:\n\nexit help quit status ?\n" msgid "Community name uses indefinite length" msgstr "커뮤니티 이름 길이가 무제한입니다" msgid "Continue" @@ -1172,7 +1174,7 @@ msgstr "현상액이 거의 비었습니다." msgid "Developer empty!" msgstr "현상액이 비어 있음!" msgid "Device: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n" -msgstr "장비: uri = %s\n 클래스 = %s\n 정보 = %s\n 제작 및 모델 = %s\n 장비-id = %s\n 위치 = %s\n" +msgstr "장비: uri = %s\n class = %s\n info = %s\n make-and-model = %s\n device-id = %s\n location = %s\n" msgid "Direct Thermal Media" msgstr "직접 열 미디어" msgid "Disabled" @@ -1190,11 +1192,11 @@ msgstr "드라이버 버전: " msgid "Duplexer" msgstr "양면 프린터" msgid "Dymo" -msgstr "다이모" +msgstr "Dymo" msgid "EMERG: Unable to allocate memory for page info: %s\n" msgstr "EMERG: 페이지 정보에 메모리를 할당할 수 없습니다: %s\n" msgid "EMERG: Unable to allocate memory for pages array: %s\n" -msgstr "EMERG: 페이지 어레이에 메모리를 할당할 수 없습니다: %s\n" +msgstr "EMERG: 페이지 배열에 메모리를 할당할 수 없습니다: %s\n" msgid "EPL1 Label Printer" msgstr "EPL1 레이블 프린터" msgid "EPL2 Label Printer" @@ -1208,11 +1210,11 @@ msgstr "ERROR: 잘못된 %%Page: 파일에 있는 설명!\n" msgid "ERROR: Bad %%PageBoundingBox: comment in file!\n" msgstr "ERROR: 잘못된 %%PageBoundingBox: 파일에 있는 설명!\n" msgid "ERROR: Bad SCSI device file \"%s\"!\n" -msgstr "ERROR: 잘못된 \"%s\" SCSI 장비 파일!\n" +msgstr "ERROR: 잘못된 SCSI 장비 파일 \"%s\"!\n" msgid "ERROR: Bad charset file %s\n" -msgstr "ERROR: 잘못된 %s 문자 파일\n" +msgstr "ERROR: 잘못된 문자 세트 파일 %s\n" msgid "ERROR: Bad charset type %s\n" -msgstr "ERROR: 잘못된 %s 문자 유형\n" +msgstr "ERROR: 잘못된 문자 세트 유형 %s\n" msgid "ERROR: Bad columns value %d!\n" msgstr "ERROR: 잘못된 열 값 %d!\n" msgid "ERROR: Bad cpi value %f!\n" @@ -1240,7 +1242,7 @@ msgstr "ERROR: %d 오류가 다음 PAPSendData 요청을 보내는 중: %s\n" msgid "ERROR: Expected quoted string on line %d of %s!\n" msgstr "ERROR: %2$s의 %1$d번째 줄에 인용 스트링이 예상됨!\n" msgid "ERROR: Fatal USB error!\n" -msgstr "ERROR: 심각한USB 오류!\n" +msgstr "ERROR: 심각한 USB 오류!\n" msgid "ERROR: Invalid HP-GL/2 command seen, unable to print file!\n" msgstr "ERROR: 파일을 프린트할 수 없는, 유효하지 않은 HP-GL/2 명령이 보임!\n" msgid "ERROR: Missing %%EndProlog!\n" @@ -1248,17 +1250,17 @@ msgstr "ERROR: %%EndProlog가 유실됨!\n" msgid "ERROR: Missing %%EndSetup!\n" msgstr "ERROR: %%EndSetup이 유실됨!\n" msgid "ERROR: Missing device URI on command-line and no DEVICE_URI environment variable!\n" -msgstr "ERROR: 명령 라인의 장비 URI이 유실되었고 DEVICE_URI 환경 변수가 없음!\n" +msgstr "ERROR: 명령 라인의 장비 URI가 유실되었고 DEVICE_URI 환경 변수가 없음!\n" msgid "ERROR: Missing value on line %d of banner file!\n" msgstr "ERROR: 배너 파일의 %d번째 줄 값이 유실됨!\n" msgid "ERROR: Need a msgid line before any translation strings on line %d of %s!\n" -msgstr "ERROR: %2$s의 %1$d번째 줄에 있는 모든 번역 스트링 앞에 msgid 필요!\n" +msgstr "ERROR: %2$s의 %1$d번째 줄에 있는 모든 번역 스트링 앞에 msgid 줄 필요!\n" msgid "ERROR: No %%BoundingBox: comment in header!\n" msgstr "ERROR: %%BoundingBox가 없음: 머리말에 설명!\n" msgid "ERROR: No %%Pages: comment in header!\n" msgstr "ERROR: %%Pages가 없음: 머리말에 설명!\n" msgid "ERROR: No device URI found in argv[0] or in DEVICE_URI environment variable!\n" -msgstr "ERROR: argv[0] 또는 DEVICE_URI 환경에서 발견된 장비 URI가 없음!\n" +msgstr "ERROR: argv[0] 또는 DEVICE_URI 환경 변수에서 발견된 장비 URI가 없음!\n" msgid "ERROR: No fonts in charset file %s\n" msgstr "ERROR: %s 문자 세트 파일에 서체 없음\n" msgid "ERROR: No pages found!\n" @@ -1266,7 +1268,7 @@ msgstr "ERROR: 페이지 없음!\n" msgid "ERROR: Out of paper!\n" msgstr "ERROR: 종이 없음!\n" msgid "ERROR: PRINTER environment variable not defined!\n" -msgstr "ERROR: 프린터 환경 변수가 정의되지 않음!\n" +msgstr "ERROR: PRINTER 환경 변수가 정의되지 않음!\n" msgid "ERROR: Print file was not accepted (%s)!\n" msgstr "ERROR: 프린트 파일이 허용되지 않음(%s)!\n" msgid "ERROR: Printer not responding\n" @@ -1276,9 +1278,9 @@ msgstr "ERROR: 프린터가 응답하지 않음!\n" msgid "ERROR: Printer sent unexpected EOF\n" msgstr "ERROR: 프린터가 예기치 않은 EOF를 보냄\n" msgid "ERROR: Remote host did not accept control file (%d)\n" -msgstr "ERROR: 원격 호스트가 제어 파일(%d)을 허용하지 않음\n" +msgstr "ERROR: 원격 호스트가 제어 파일을 허용하지 않음(%d)\n" msgid "ERROR: Remote host did not accept data file (%d)\n" -msgstr "ERROR: 원격 호스트가 데이터 파일(%d)을 허용하지 않음\n" +msgstr "ERROR: 원격 호스트가 데이터 파일을 허용하지 않음(%d)\n" msgid "ERROR: There was a timeout error while sending data to the printer\n" msgstr "ERROR: 데이터를 프린터로 전송하는 동안 시간초과 오류가 발생했습니다\n" msgid "ERROR: Unable to add file %d to job: %s\n" @@ -1298,29 +1300,29 @@ msgstr "ERROR: 임시 파일을 생성할 수 없음 - %s.\n" msgid "ERROR: Unable to create temporary file: %s\n" msgstr "ERROR: 임시 파일을 생성할 수 없음: %s\n" msgid "ERROR: Unable to exec pictwpstops: %s\n" -msgstr "ERROR: pictwpstops를 생성할 수 없음: %s\n" +msgstr "ERROR: pictwpstops를 실행할 수 없음: %s\n" msgid "ERROR: Unable to execute gs program" msgstr "ERROR: gs 프로그램을 실행할 수 없음" msgid "ERROR: Unable to execute pdftops program" msgstr "ERROR: pdftops 프로그램을 실행할 수 없음" msgid "ERROR: Unable to fork pictwpstops: %s\n" -msgstr "ERROR: pictwpstops를 분리할 수 없음: %s\n" +msgstr "ERROR: pictwpstops를 분리(fork)할 수 없음: %s\n" msgid "ERROR: Unable to get PAP request" msgstr "ERROR: PAP 요청을 얻을 수 없음" msgid "ERROR: Unable to get PAP response" -msgstr "ERROR: PAP 반응을 얻을 수 없음" +msgstr "ERROR: PAP 응답을 얻을 수 없음" msgid "ERROR: Unable to get PPD file for printer \"%s\" - %s.\n" -msgstr "ERROR: \"%s\"프린터에 대한 PPD 파일을 얻을 수 없습니다. - %s.\n" +msgstr "ERROR: \"%s\"프린터에 대한 PPD 파일을 얻을 수 없음 - %s.\n" msgid "ERROR: Unable to get default AppleTalk zone" msgstr "ERROR: 기본 AppleTalk 영역을 얻을 수 없음" msgid "ERROR: Unable to get job %d attributes (%s)!\n" -msgstr "ERROR: %d 작업 속성을 얻을 수 없음(%s)!\n" +msgstr "ERROR: 작업 %d 속성을 얻을 수 없음(%s)!\n" msgid "ERROR: Unable to get printer status (%s)!\n" msgstr "ERROR: 프린터 상태를 알 수 없음(%s)!\n" msgid "ERROR: Unable to locate printer '%s'!\n" msgstr "ERROR: '%s' 프린터를 찾을 수 없음!\n" msgid "ERROR: Unable to look for PAP response" -msgstr "ERROR: PAP 반응을 찾을 수 없음" +msgstr "ERROR: PAP 응답을 찾을 수 없음" msgid "ERROR: Unable to lookup AppleTalk printers" msgstr "ERROR: AppleTalk 프린터를 찾을 수 없음" msgid "ERROR: Unable to make AppleTalk address" @@ -1350,7 +1352,7 @@ msgstr "ERROR: 임시로 압축한 프린트 파일을 열 수 없음: %s\n" msgid "ERROR: Unable to open temporary file" msgstr "ERROR: 임시 파일을 열 수 없음" msgid "ERROR: Unable to print %d text columns!\n" -msgstr "ERROR: %d 텍스트 열을 프린트할 수 없음!\n" +msgstr "ERROR: %d개의 텍스트 열을 프린트할 수 없음!\n" msgid "ERROR: Unable to print %dx%d text page!\n" msgstr "ERROR: %dx%d 텍스트 페이지를 프린트할 수 없음!\n" msgid "ERROR: Unable to read print data" @@ -1360,9 +1362,9 @@ msgstr "ERROR: 프린트 데이터를 읽을 수 없음!\n" msgid "ERROR: Unable to reserve port" msgstr "ERROR: 포트를 예약할 수 없음" msgid "ERROR: Unable to seek to offset %ld in file - %s\n" -msgstr "ERROR: 파일에 있는 %ld 오프셋을 찾을 수 없음 - %s\n" +msgstr "ERROR: 파일에서 %ld 오프셋을 찾을 수 없음 - %s\n" msgid "ERROR: Unable to seek to offset %lld in file - %s\n" -msgstr "ERROR: 파일에 있는 %lld 오프셋을 찾을 수 없음 - %s\n" +msgstr "ERROR: 파일에서 %lld 오프셋을 찾을 수 없음 - %s\n" msgid "ERROR: Unable to send LPD command" msgstr "ERROR: LPD 명령을 보낼 수 없음" msgid "ERROR: Unable to send PAP tickle request" @@ -1376,7 +1378,7 @@ msgstr "ERROR: 프린트 데이터를 보낼 수 없음!\n" msgid "ERROR: Unable to send print file to printer" msgstr "ERROR: 프린트 파일을 프린터로 보낼 수 없음" msgid "ERROR: Unable to send trailing nul to printer" -msgstr "ERROR: 추적 nul을 프린터로 보낼 수 없음" +msgstr "ERROR: 끝자리 nul을 프린터로 보낼 수 없음" msgid "ERROR: Unable to wait for pictwpstops: %s\n" msgstr "ERROR: pictwpstops를 기다릴 수 없음: %s\n" msgid "ERROR: Unable to write %d bytes to \"%s\": %s\n" @@ -1406,35 +1408,35 @@ msgstr "ERROR: 알 수 없는 포맷 문자 \"%c\"\n" msgid "ERROR: Unknown message catalog format for \"%s\"!\n" msgstr "ERROR: \"%s\"에 대한 알 수 없는 메시지 카탈로그 포맷!\n" msgid "ERROR: Unknown option \"%s\" with value \"%s\"!\n" -msgstr "ERROR: \"%s\" 값을 가진 알 수 없는 \"%s\" 옵션!\n" +msgstr "ERROR: \"%2$s\" 값이 있는 알 수 없는 \"%1$s\" 옵션!\n" msgid "ERROR: Unknown print mode \"%s\"\n" msgstr "ERROR: 알 수 없는 \"%s\" 프린트 모드\n" msgid "ERROR: Unknown version option value \"%s\"!\n" msgstr "ERROR: 알 수 없는 \"%s\" 버전 옵션 값!\n" msgid "ERROR: Unsupported brightness value %s, using brightness=100!\n" -msgstr "ERROR: 밝기=100을 사용하는, 지원되지 않는 %s 밝기 값!\n" +msgstr "ERROR: brightness=100을 사용하는, 지원되지 않는 밝기 값 %s!\n" msgid "ERROR: Unsupported gamma value %s, using gamma=1000!\n" -msgstr "ERROR: 감마=1000을 사용하는, 지원되지 않는 %s 감마 값ㅍ!\n" +msgstr "ERROR: gamma=1000을 사용하는, 지원되지 않는 감마 값 %s!\n" msgid "ERROR: Unsupported number-up value %d, using number-up=1!\n" -msgstr "ERROR: number-up=1을 사용하는, 지원되지 않는 %d number-up 값!\n" +msgstr "ERROR: number-up=1을 사용하는, 지원되지 않는 number-up 값 %d!\n" msgid "ERROR: Unsupported number-up-layout value %s, using number-up-layout=lrtb!\n" -msgstr "ERROR: number-up-layout=lrtb을 사용하는, 지원되지 않는 number-up-layout %s!\n" +msgstr "ERROR: number-up-layout=lrtb을 사용하는, 지원되지 않는 number-up-layout 값 %s!\n" msgid "ERROR: Unsupported page-border value %s, using page-border=none!\n" -msgstr "ERROR: page-border=없음을 사용하는, 지원되지 않는 page-border 값 %s!\n" +msgstr "ERROR: page-border=none을 사용하는, 지원되지 않는 page-border 값 %s!\n" msgid "ERROR: doc_printf overflow (%d bytes) detected, aborting!\n" msgstr "ERROR: doc_printf 오버플로우(%d바이트)가 발견됨, 중단 중!\n" msgid "ERROR: pdftops filter crashed on signal %d!\n" -msgstr "ERROR: pictwpstops가 %d 신호에서 종료됨!\n" +msgstr "ERROR: pdftops 필터가 신호 %d에서 충돌함!\n" msgid "ERROR: pdftops filter exited with status %d!\n" -msgstr "ERROR: pictwpstops가 %d 상태로 종료됨!\n" +msgstr "ERROR: pdftops 필터가 상태 %d(으)로 종료됨!\n" msgid "ERROR: pictwpstops exited on signal %d!\n" -msgstr "ERROR: pictwpstops가 %d 신호에서 종료됨!\n" +msgstr "ERROR: pictwpstops가 신호 %d에서 종료됨!\n" msgid "ERROR: pictwpstops exited with status %d!\n" -msgstr "ERROR: pictwpstops가 %d 상태로 종료됨!\n" +msgstr "ERROR: pictwpstops가 상태 %d(으)로 종료됨!\n" msgid "ERROR: recoverable: Unable to connect to printer; will retry in 30 seconds...\n" msgstr "ERROR: 복원 가능: 프린터에 연결할 수 없음; 30초 후에 다시 시도...\n" msgid "ERROR: select() failed" -msgstr "ERROR: 선택() 실패" +msgstr "ERROR: select() 실패" msgid "ERROR: unable to stat print file" msgstr "ERROR: 프린트 파일을 시작할 수 없음" msgid "Edit Configuration File" @@ -1450,7 +1452,7 @@ msgstr "암호 다시 입력:" msgid "Enter password:" msgstr "암호 입력:" msgid "Enter your username and password or the root username and password to access this page. If you are using Kerberos authentication, make sure you have a valid Kerberos ticket." -msgstr "이 페이지에 연결하려면 사용자 이름 및 암호 또는 루트 사용자 이름 및 암호를 입력하십시오. Kerberos 인증을 사용하고 있다면, 유효한 Kerberos 티켓을 가지고 있는지 확인하십시오." +msgstr "이 페이지에 연결하려면 사용자 이름 및 암호 또는 root 사용자 이름 및 암호를 입력하십시오. Kerberos 인증을 사용하고 있다면, 유효한 Kerberos 티켓을 가지고 있는지 확인하십시오." msgid "Envelope Feed" msgstr "봉투 공급" msgid "Epson" @@ -1458,25 +1460,25 @@ msgstr "Epson" msgid "Error Policy" msgstr "오류 정책" msgid "Error: need hostname after '-h' option!\n" -msgstr "오류: '-h' 옵션 뒤에 호스트 이름이 필요함!!\n" +msgstr "오류: '-h' 옵션 뒤에 호스트 이름이 필요!\n" msgid "Every 10 Labels" -msgstr "10레이블마다" +msgstr "10개 레이블마다" msgid "Every 2 Labels" -msgstr "2레이블마다" +msgstr "2개 레이블마다" msgid "Every 3 Labels" -msgstr "3레이블마다" +msgstr "3개 레이블마다" msgid "Every 4 Labels" -msgstr "4레이블마다" +msgstr "4개 레이블마다" msgid "Every 5 Labels" -msgstr "5레이블마다" +msgstr "5개 레이블마다" msgid "Every 6 Labels" -msgstr "6레이블마다" +msgstr "6개 레이블마다" msgid "Every 7 Labels" -msgstr "7레이블마다" +msgstr "7개 레이블마다" msgid "Every 8 Labels" -msgstr "8레이블마다" +msgstr "8개 레이블마다" msgid "Every 9 Labels" -msgstr "9레이블마다" +msgstr "9개 레이블마다" msgid "Every Label" msgstr "모든 레이블" msgid "Expectation Failed" @@ -1490,15 +1492,15 @@ msgstr "파일 폴더" msgid "File Folder - 9/16 x 3 7/16\"" msgstr "파일 폴더 - 9/16 x 3 7/16\"" msgid "File device URIs have been disabled! To enable, see the FileDevice directive in \"%s/cupsd.conf\"." -msgstr "파일 장비 URI가 비활성화되었습니다! 활성화하려면, \"%s/cupsd.conf\"에 있는 FileDevice를 보십시오." +msgstr "파일 장비 URI가 비활성화되었습니다! 활성화하려면, \"%s/cupsd.conf\"에 있는 FileDevice 지시문을 보십시오." msgid "Folio" -msgstr "폴리오" +msgstr "2절지" msgid "Forbidden" msgstr "금지됨" msgid "Fuser temperature high!" -msgstr "Fuser 온도가 높음!" +msgstr "퓨저 온도가 높음!" msgid "Fuser temperature low!" -msgstr "Fuser 온도가 낮음!" +msgstr "퓨저 온도가 낮음!" msgid "General" msgstr "일반" msgid "Generic" @@ -1506,7 +1508,7 @@ msgstr "일반" msgid "German FanFold" msgstr "독일 FanFold" msgid "German FanFold Legal" -msgstr "독일 FanFold Legal" +msgstr "독일 FanFold 공문서" msgid "Get-Response-PDU uses indefinite length" msgstr "Get-Response-PDU 길이가 무제한입니다" msgid "Glossy Paper" @@ -1544,7 +1546,7 @@ msgstr "INFO: 프린터 검색 중...\n" msgid "INFO: Opening connection\n" msgstr "INFO: 연결 열기\n" msgid "INFO: Print file sent, waiting for printer to finish...\n" -msgstr "INFO: 프린트 파일을 보냈고, 프린터 작업이 종료 대기 중...\n" +msgstr "INFO: 프린트 파일을 보냈고, 프린터 작업 종료 대기 중...\n" msgid "INFO: Printer busy; will retry in 10 seconds...\n" msgstr "INFO: 프린터 사용 중; 10초 후에 다시 시도...\n" msgid "INFO: Printer busy; will retry in 30 seconds...\n" @@ -1584,15 +1586,15 @@ msgstr "INFO: 데이터 파일 보내는 중(%lld바이트)\n" msgid "INFO: Sending print data...\n" msgstr "INFO: 프린트 데이터 보내는 중...\n" msgid "INFO: Sent print file, %ld bytes...\n" -msgstr "INFO: 프린트 파일 보내기, %ld바이트...\n" +msgstr "INFO: 프린트 파일 보냄, %ld바이트...\n" msgid "INFO: Sent print file, %lld bytes...\n" -msgstr "INFO: 프린트 파일 보내기, %lld바이트...\n" +msgstr "INFO: 프린트 파일 보냄, %lld바이트...\n" msgid "INFO: Spooling LPR job, %.0f%% complete...\n" msgstr "INFO: LPR 작업 스풀 중, %.0f%% 완료...\n" msgid "INFO: Unable to contact printer, queuing on next printer in class...\n" msgstr "INFO: 프린터에 연결할 수 없기 때문에, 클래스에 있는 다음 프린터 대기 중...\n" msgid "INFO: Using default AppleTalk zone \"%s\"\n" -msgstr "INFO: 기본 AppleTalk 영역 사용 중 \"%s\"\n" +msgstr "INFO: \"%s\" 기본 AppleTalk 영역 사용 중 \n" msgid "INFO: Waiting for job to complete...\n" msgstr "INFO: 작업 완료 대기 중...\n" msgid "INFO: Waiting for printer to become available...\n" @@ -1634,7 +1636,7 @@ msgstr "올바르지 않은 주 키워드 스트링" msgid "Illegal option keyword string" msgstr "올바르지 않은 옵션 키워드 스트링" msgid "Illegal translation string" -msgstr "올바르지 번역 스트링" +msgstr "올바르지 않은 번역 스트링" msgid "Illegal whitespace character" msgstr "올바르지 않은 여백 문자" msgid "Ink/toner almost empty." @@ -1688,13 +1690,13 @@ msgstr "#%d 작업이 종료되었고 대체할 수 없음!" msgid "Job #%d is not complete!" msgstr "#%d 작업이 왼료되지 않음!" msgid "Job #%d is not held for authentication!" -msgstr "#%d 작업이 인증되지 않음!" +msgstr "#%d 작업이 인증을 위해 유지되지 않음!" msgid "Job #%d is not held!" msgstr "#%d 작업이 유지되지 않음!" msgid "Job #%s does not exist!" msgstr "#%s 작업이 존재하지 않음!" msgid "Job %d not found!" -msgstr "#%d 작업이 발견되지 않음!" +msgstr "%d 작업이 발견되지 않음!" msgid "Job Completed" msgstr "작업이 완료됨" msgid "Job Created" @@ -1746,7 +1748,7 @@ msgstr "위치: " msgid "Long-Edge (Portrait)" msgstr "가장자리 길게(세로)" msgid "Make and Model: " -msgstr "생성 및 모델: " +msgstr "제조사 및 모델: " msgid "Manual Feed" msgstr "수동 공급" msgid "Media Dimensions: " @@ -1764,11 +1766,11 @@ msgstr "미디어 추적" msgid "Media Type" msgstr "미디어 유형" msgid "Media jam!" -msgstr "미디어 정체!" +msgstr "미디어가 걸림!" msgid "Media tray almost empty." msgstr "미디어 트레이가 거의 비었습니다." msgid "Media tray empty!" -msgstr "미디어 트레이가 비어있음!" +msgstr "미디어 트레이가 비어 있음!" msgid "Media tray missing!" msgstr "미디어 트레이가 유실됨!" msgid "Media tray needs to be filled." @@ -1782,7 +1784,7 @@ msgstr "PPD-Adobe-4.x 머리말이 유실됨" msgid "Missing asterisk in column 1" msgstr "1열에 있는 별표가 유실됨" msgid "Missing document-number attribute!" -msgstr "도큐멘트 번호 속성이 유실됨!" +msgstr "document-number 속성이 유실됨!" msgid "Missing double quote on line %d!" msgstr "%d번째 줄에 있는 큰 따옴표가 유실됨!" msgid "Missing form variable!" @@ -1798,7 +1800,7 @@ msgstr "%d번째 줄에 있는 값이 유실됨!" msgid "Missing value string" msgstr "값 스트링이 유실됨" msgid "Model: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n" -msgstr "모델: 이름 = %s\n 기본 언어 = %s\n 생성 및 모델 = %s\n 장비 id = %s\n" +msgstr "모델: name = %s\n natural_language = %s\n make-and-model = %s\n device-id = %s\n" msgid "Modify Class" msgstr "클래스 수정" msgid "Modify Printer" @@ -1820,15 +1822,15 @@ msgstr "NOTICE: 프린트 파일이 허용됨 - 알 수 없는 작업 ID.\n" msgid "NULL PPD file pointer" msgstr "NULL PPD 파일 포인터" msgid "Name OID uses indefinite length" -msgstr "OID 이름 길이가 무제한입니다" +msgstr "이름 OID 길이가 무제한입니다" msgid "Never" msgstr "안 함" msgid "New Stylus Color Series" -msgstr "새로운 Stylus 색상 시리즈" +msgstr "새로운 Stylus Color 시리즈" msgid "New Stylus Photo Series" -msgstr "새로운 Stylus 사진 시리즈" +msgstr "새로운 Stylus Photo 시리즈" msgid "No" -msgstr "아니오" +msgstr "아니요" msgid "No Content" msgstr "콘텐츠 없음" msgid "No PPD name!" @@ -1838,13 +1840,13 @@ msgstr "VarBind SEQUENCE 없음" msgid "No Windows printer drivers are installed!" msgstr "설치된 Windows 프린터 드라이버가 없음!" msgid "No active connection" -msgstr "활성 작업이 없음" +msgstr "활성 연결이 없음" msgid "No active jobs on %s!" msgstr "%s에 활성 작업이 없음!" msgid "No attributes in request!" msgstr "요청에 속성이 없음!" msgid "No authentication information provided!" -msgstr "제공된 정보에 인증이 없음!" +msgstr "제공된 인증 정보가 없음!" msgid "No community name" msgstr "커뮤니티 이름 없음" msgid "No default printer" @@ -1852,15 +1854,15 @@ msgstr "기본 프린터가 없음" msgid "No destinations added." msgstr "추가된 대상이 없습니다." msgid "No error-index" -msgstr "오류-인덱스 없음" +msgstr "error-index 없음" msgid "No error-status" -msgstr "오류-상태 없음" +msgstr "error-status 없음" msgid "No file!?!" msgstr "파일이 없음!?!" msgid "No modification time!" msgstr "수정 시간 없음!" msgid "No name OID" -msgstr "OID 이름 없음" +msgstr "이름 OID 없음" msgid "No printer name!" msgstr "프린터 이름 없음!" msgid "No printer-uri found for class!" @@ -1874,7 +1876,7 @@ msgstr "request-id 없음" msgid "No subscription attributes in request!" msgstr "요청에 구독 속성이 없음!" msgid "No subscriptions found." -msgstr "구독이 없습니다." +msgstr "발견된 구독이 없습니다." msgid "No variable-bindings SEQUENCE" msgstr "variable-bindings SEQUENCE 없음" msgid "No version number" @@ -1916,7 +1918,7 @@ msgstr "%s 열기 실패: %s" msgid "OpenGroup without a CloseGroup first" msgstr "우선 CloseGroup이 없는 OpenGroup" msgid "OpenUI/JCLOpenUI without a CloseUI/JCLCloseUI first" -msgstr "우선 CloseUI/JCLCloseUI이 없는 OpenUI/JCLOpenUI" +msgstr "우선 CloseUI/JCLCloseUI가 없는 OpenUI/JCLOpenUI" msgid "Operation Policy" msgstr "동작 정책" msgid "Options Installed" @@ -1928,21 +1930,21 @@ msgstr "토너가 없음!" msgid "Output Mode" msgstr "출력 모드" msgid "Output bin almost full." -msgstr "출력소 거의 찾습니다." +msgstr "출력소 거의 찼습니다." msgid "Output bin full!" -msgstr "출력소가 가득 참!" +msgstr "출력소가 찼습니다!" msgid "Output for printer %s is sent to %s\n" msgstr "%s 프린터 출력을 %s(으)로 보냄\n" msgid "Output for printer %s is sent to remote printer %s on %s\n" -msgstr "%s 프린터 출력을 %s에 있는 %s 원격 프린터로 보냄\n" +msgstr "%1$s 프린터 출력을 %3$s에 있는 %2$s 원격 프린터로 보냄\n" msgid "Output for printer %s/%s is sent to %s\n" msgstr "%s/%s 프린터 출력을 %s로 보냄\n" msgid "Output for printer %s/%s is sent to remote printer %s on %s\n" -msgstr "%s/%s 프린터 출력을 %s에 있는 %s 원격 프린터로 보냄\n" +msgstr "%1$s/%2$s 프린터 출력을 %4$s에 있는 %3$s 원격 프린터로 보냄\n" msgid "Output tray missing!" msgstr "출력 트레이가 유실됨!" msgid "PASS\n" -msgstr "통과\n" +msgstr "PASS\n" msgid "PCL Laser Printer" msgstr "PCL 레이저 프린터" msgid "PRC1 Envelope" @@ -1980,9 +1982,9 @@ msgstr "ParamCustominCutInterval" msgid "ParamCustominTearInterval" msgstr "ParamCustominTearInterval" msgid "Password for %s on %s? " -msgstr "%s 암호(%s에서 사용)? " +msgstr "%2$s의 %1$s 암호? " msgid "Password for %s required to access %s via SAMBA: " -msgstr "%s에 대한 암호는 SAMBA를 통해 %s에 연결해야 합니다: " +msgstr "SAMBA를 통해 %2$s에 연결하려면 필요한 %1$s의 암호: " msgid "Pause Class" msgstr "클래스 일시정지" msgid "Pause Printer" @@ -2058,7 +2060,7 @@ msgstr "용량이 한계에 도달했습니다." msgid "Rank Owner Job File(s) Total Size\n" msgstr "단계 소유자 작업 파일 총 크기\n" msgid "Rank Owner Pri Job Files Total Size\n" -msgstr "단계 소유자 미리 작업 파일 총 크기\n" +msgstr "단계 소유자 우선순위 작업 파일 총 크기\n" msgid "Reject Jobs" msgstr "작업 거부" msgid "Reprint After Error" @@ -2088,25 +2090,25 @@ msgstr "기타 보기" msgid "Serial Port #%d" msgstr "시리얼 포트 #%d" msgid "Server Restarted" -msgstr "시동된 서버" +msgstr "서버 재시동됨" msgid "Server Security Auditing" msgstr "서버 보안 감사" msgid "Server Started" -msgstr "시작한 서버" +msgstr "서버 시동됨" msgid "Server Stopped" -msgstr "중단된 서버" +msgstr "서버 중단됨" msgid "Service Unavailable" msgstr "사용할 수 없는 서비스" msgid "Set Allowed Users" msgstr "허용된 사용자 설정" msgid "Set As Server Default" -msgstr "기본으로 설정" +msgstr "서버 기본값으로 설정" msgid "Set Class Options" msgstr "클래스 옵션 설정" msgid "Set Printer Options" msgstr "프린터 옵션 설정" msgid "Set Publishing" -msgstr "발행하기 설정" +msgstr "발행 설정" msgid "Shipping Address" msgstr "발송 주소" msgid "Shipping Address - 2 5/16 x 4\"" @@ -2120,11 +2122,11 @@ msgstr "표준" msgid "Starting Banner" msgstr "배너 시작 중" msgid "Statement" -msgstr "상태" +msgstr "대차표" msgid "Stylus Color Series" -msgstr "Stylus 색상 시리즈" +msgstr "Stylus Color 시리즈" msgid "Stylus Photo Series" -msgstr "Stylus 사진 시리즈" +msgstr "Stylus Photo 시리즈" msgid "Super A" msgstr "수퍼 A" msgid "Super B" @@ -2146,15 +2148,15 @@ msgstr "절취선 조절 위치" msgid "The PPD file \"%s\" could not be found." msgstr "\"%s\" PPD 파일을 찾을 수 없습니다." msgid "The PPD file \"%s\" could not be opened: %s" -msgstr "\"%s\" PPD 파일을 열 수 없습니다. %s" +msgstr "\"%s\" PPD 파일을 열 수 없습니다: %s" msgid "The class name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." -msgstr "클래스 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않을 수 있습니다." +msgstr "클래스 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않습니다." msgid "The notify-lease-duration attribute cannot be used with job subscriptions." msgstr "notify-lease-duration 속성을 작업 구독과 함께 사용할 수 없습니다." msgid "The notify-user-data value is too large (%d > 63 octets)!" msgstr "notify-user-data 값이 너무 큼!(%d > 63행)!" msgid "The printer name may only contain up to 127 printable characters and may not contain spaces, slashes (/), or the pound sign (#)." -msgstr "프린터 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않을 수 있습니다." +msgstr "프린터 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않습니다." msgid "The printer or class is not shared!" msgstr "프린터 또는 클래스를 공유할 수 없음!" msgid "The printer or class was not found." @@ -2168,7 +2170,7 @@ msgstr "printer-uri는 \"ipp://HOSTNAME/classes/CLASSNAME\" 형태여야 합니 msgid "The printer-uri must be of the form \"ipp://HOSTNAME/printers/PRINTERNAME\"." msgstr "printer-uri는 \"ipp://HOSTNAME/printers/PRINTERNAME\" 형태여야 합니다." msgid "The subscription name may not contain spaces, slashes (/), question marks (?), or the pound sign (#)." -msgstr "구독 이름은 최대 127자의 프린트 가능한 문자만을 포함할 수 있고 빈 칸, 슬래시(/) 또는 파운드 기호(#)를 포함하지 않을 수 있습니다." +msgstr "구독 이름은 빈 칸, 슬래시(/), 물음표(?) 또는 파운드 기호(#)를 포함하지 않습니다." msgid "There are too many subscriptions." msgstr "구독이 너무 많습니다." msgid "Thermal Transfer Media" @@ -2178,7 +2180,7 @@ msgstr "제목: " msgid "Toner low." msgstr "토너가 부족합니다." msgid "Too many active jobs." -msgstr "너무 많은 작업이 활성되었습니다." +msgstr "활성 작업이 너무 많습니다." msgid "Too many job-sheets values (%d > 2)!" msgstr "job-sheets 값이 너무 많습니다(%d > 2)!" msgid "Too many printer-state-reasons values (%d > %d)!" @@ -2216,53 +2218,53 @@ msgstr "US 편지지(소)" msgid "USB Serial Port #%d" msgstr "USB 시리얼 포트 #%d" msgid "Unable to access cupsd.conf file:" -msgstr "cupsd.conf 파일에 연결할 수 없습니다:" +msgstr "cupsd.conf 파일에 연결할 수 없음:" msgid "Unable to add RSS subscription:" -msgstr "RSS 구독을 추가할 수 없습니다:" +msgstr "RSS 구독을 추가할 수 없음:" msgid "Unable to add class:" -msgstr "클래스를 추가할 수 없습니다:" +msgstr "클래스를 추가할 수 없음:" msgid "Unable to add job for destination \"%s\"!" -msgstr "\"%s\" 대상에 대한 작업을 추가할 수 없음!" +msgstr "\"%s\" 대상에 대한 작업을 추가할 수 없습니다!" msgid "Unable to add printer:" -msgstr "프린터를 추가할 수 없습니다:" +msgstr "프린터를 추가할 수 없음:" msgid "Unable to allocate memory for file types!" -msgstr "파일 유형에 대한 메모리를 할당할 수 없음!" +msgstr "파일 유형에 대한 메모리를 할당할 수 없습니다!" msgid "Unable to cancel RSS subscription:" -msgstr "RSS 구독을 취소없습니다:" +msgstr "RSS 구독을 취소할 수 없음:" msgid "Unable to change printer-is-shared attribute:" -msgstr "printer-is-shared 속성을 변경할 수 없습니다:" +msgstr "printer-is-shared 속성을 변경할 수 없음:" msgid "Unable to change printer:" -msgstr "프린터를 변경할 수 없습니다:" +msgstr "프린터를 변경할 수 없음:" msgid "Unable to change server settings:" -msgstr "서버 설정값을 변경할 수 없습니다:" +msgstr "서버 설정값을 변경할 수 없음:" msgid "Unable to connect to host." -msgstr "호스트에 연결할 수 없습니다." +msgstr "호스트에 연결할 수 없음." msgid "Unable to copy 64-bit CUPS printer driver files (%d)!" -msgstr "64비트 CUPS 프린터 드라이버 파일을 복사할 수 없음(%d)!" +msgstr "64비트 CUPS 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" msgid "Unable to copy 64-bit Windows printer driver files (%d)!" -msgstr "64비트 Windows 프린터 드라이버 파일을 복사할 수 없음(%d)!" +msgstr "64비트 Windows 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" msgid "Unable to copy CUPS printer driver files (%d)!" -msgstr "CUPS 프린터 드라이버 파일을 복사할 수 없음(%d)!" +msgstr "CUPS 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" msgid "Unable to copy PPD file - %s!" msgstr "PPD 파일을 복사할 수 없음 - %s!" msgid "Unable to copy PPD file!" -msgstr "PPD 파일을 복사할 수 없음!" +msgstr "PPD 파일을 복사할 수 없습니다!" msgid "Unable to copy Windows 2000 printer driver files (%d)!" -msgstr "Windows 2000 프린터 드라이버 파일을 복사할 수 없음(%d)!" +msgstr "Windows 2000 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" msgid "Unable to copy Windows 9x printer driver files (%d)!" -msgstr "Windows 9x 프린터 드라이버 파일을 복사할 수 없음(%d)!" +msgstr "Windows 9x 프린터 드라이버 파일을 복사할 수 없습니다(%d)!" msgid "Unable to copy interface script - %s!" msgstr "인터페이스 스크립트를 복사할 수 없음 - %s!" msgid "Unable to create printer-uri!" -msgstr "printer-uri를 생성할 수 없음!" +msgstr "printer-uri를 생성할 수 없습니다!" msgid "Unable to create temporary file:" -msgstr "임시 파일을 생성할 수 없습니다:" +msgstr "임시 파일을 생성할 수 없음:" msgid "Unable to delete class:" -msgstr "클래스를 삭제할 수 없습니다:" +msgstr "클래스를 삭제할 수 없음:" msgid "Unable to delete printer:" -msgstr "프린터를 삭제할 수 없습니다:" +msgstr "프린터를 삭제할 수 없음:" msgid "Unable to do maintenance command:" -msgstr "명령을 유지할 수 없습니다:" +msgstr "명령을 유지할 수 없음:" msgid "Unable to edit cupsd.conf files larger than 1MB!" msgstr "1MB보다 큰 cupsd.conf 파일은 편집할 수 없습니다!" msgid "Unable to find destination for job!" @@ -2270,15 +2272,15 @@ msgstr "작업에 대한 대상을 찾을 수 없습니다!" msgid "Unable to find printer!\n" msgstr "프린터를 찾을 수 없습니다!\n" msgid "Unable to get class list:" -msgstr "클래스 목록을 얻을 수 없습니다:" +msgstr "클래스 목록을 얻을 수 없음:" msgid "Unable to get class status:" -msgstr "클래스 상태를 알 수 없습니다:" +msgstr "클래스 상태를 알 수 없음:" msgid "Unable to get list of printer drivers:" -msgstr "프린터 드라이버 목록을 얻을 수 없습니다:" +msgstr "프린터 드라이버 목록을 얻을 수 없음:" msgid "Unable to get printer attributes:" -msgstr "프린터 속성을 얻을 수 없습니다:" +msgstr "프린터 속성을 얻을 수 없음:" msgid "Unable to get printer list:" -msgstr "프린터 목록을 얻을 수 없습니다:" +msgstr "프린터 목록을 얻을 수 없음:" msgid "Unable to get printer status:" msgstr "프린터 상태를 알 수 없습니다:" msgid "Unable to install Windows 2000 printer driver files (%d)!" @@ -2286,9 +2288,9 @@ msgstr "Windows 2000 프린터 드라이버 파일을 설치할 수 없습니다 msgid "Unable to install Windows 9x printer driver files (%d)!" msgstr "Windows 9x 프린터 드라이버 파일을 설치할 수 없습니다(%d)!" msgid "Unable to modify class:" -msgstr "클래스를 수정할 수 없습니다:" +msgstr "클래스를 수정할 수 없음:" msgid "Unable to modify printer:" -msgstr "프린터를 수정할 수 없습니다:" +msgstr "프린터를 수정할 수 없음:" msgid "Unable to move job" msgstr "작업을 이동할 수 없습니다" msgid "Unable to move jobs" @@ -2296,23 +2298,23 @@ msgstr "작업을 이동할 수 없습니다" msgid "Unable to open PPD file" msgstr "PPD 파일을 열 수 없습니다" msgid "Unable to open PPD file:" -msgstr "PPD 파일을 열 수 없습니다:" +msgstr "PPD 파일을 열 수 없음:" msgid "Unable to open cupsd.conf file:" -msgstr "cupsd.conf 파일을 열 수 없습니다:" +msgstr "cupsd.conf 파일을 열 수 없음:" msgid "Unable to open document %d in job %d!" -msgstr "%d개의 도큐멘트를 작업 %d에서 열 수 없습니다!" +msgstr "도큐멘트 %d을(를) 작업 %d에서 열 수 없습니다!" msgid "Unable to print test page:" -msgstr "테스트 페이지를 프린트할 수 없습니다:" +msgstr "테스트 페이지를 프린트할 수 없음:" msgid "Unable to run \"%s\": %s\n" -msgstr "\"%s\"을(를) 실행할 수 없습니다: %s\n" +msgstr "\"%s\"을(를) 실행할 수 없음: %s\n" msgid "Unable to send command to printer driver!" -msgstr "프린터 드라이버로 명령을 보낼 수 없음!" +msgstr "프린터 드라이버로 명령을 보낼 수 없습니다!" msgid "Unable to set Windows printer driver (%d)!" -msgstr "Windows 프린터 드라이버를 설정할 수 없음(%d)!" +msgstr "Windows 프린터 드라이버를 설정할 수 없습니다(%d)!" msgid "Unable to set options:" -msgstr "옵션을 설정할 수 없습니다:" +msgstr "옵션을 설정할 수 없음:" msgid "Unable to set server default:" -msgstr "기본 서버를 설정할 수 없습니다:" +msgstr "서버 기본값을 설정할 수 없음:" msgid "Unable to upload cupsd.conf file:" msgstr "cupsd.conf 파일을 업로드할 수 없습니다:" msgid "Unable to use legacy USB class driver!\n" @@ -2348,11 +2350,11 @@ msgstr "업그레이드 필요함" msgid "Usage:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n" msgstr "사용법:\n\n lpadmin [-h server] -d destination\n lpadmin [-h server] -x destination\n lpadmin [-h server] -p printer [-c add-class] [-i interface] [-m model]\n [-r remove-class] [-v device] [-D description]\n [-P ppd-file] [-o name=value]\n [-u allow:user,user] [-u deny:user,user]\n\n" msgid "Usage: %s job user title copies options [filename]\n" -msgstr "사용법: %s 작업 사용자 제목 복사 옵션 [파일 이름]\n" +msgstr "사용법: %s job user title copies options [filename]\n" msgid "Usage: %s job-id user title copies options [file]\n" -msgstr "사용법: %s job-id 사용자 제목 복사 옵션 [파일]\n" +msgstr "사용법: %s job-id user title copies options [file]\n" msgid "Usage: %s job-id user title copies options file\n" -msgstr "사용법: %s job-id 사용자 제목 복사 옵션 파일\n" +msgstr "사용법: %s job-id user title copies options file\n" msgid "Usage: convert [ options ]\n\nOptions:\n\n -f filename Set file to be converted (otherwise stdin)\n -o filename Set file to be generated (otherwise stdout)\n -i mime/type Set input MIME type (otherwise auto-typed)\n -j mime/type Set output MIME type (otherwise application/pdf)\n -P filename.ppd Set PPD file\n -a 'name=value ...' Set option(s)\n -U username Set username for job\n -J title Set title\n -c copies Set number of copies\n -u Remove the PPD file when finished\n -D Remove the input file when finished\n" msgstr "사용법: convert [ options ]\n\n옵션:\n\n -f filename 변환할 파일 설정(또는 stdin)\n -o filename 생성할 파일 설정(또는 stdout)\n -i mime/type 입력 MIME 유형 설정(또는 자동 유형 설정)\n -j mime/type 출력 MIME 유형 설정(또는 응용 프로그램/pdf)\n -P filename.ppd PPD 파일 설정\n -a 'name=value ...' 옵션 설정(s)\n -U username 작업에 대한 사용자 이름 설정\n -J title 제목 설정\n -c copies 복사 장 수 설정\n -u 종료 시 PPD 파일 제거\n -D 종료 시 입력 파일 제거\n" msgid "Usage: cupsaddsmb [options] printer1 ... printerN\n cupsaddsmb [options] -a\n\nOptions:\n -E Encrypt the connection to the server\n -H samba-server Use the named SAMBA server\n -U samba-user Authenticate using the named SAMBA user\n -a Export all printers\n -h cups-server Use the named CUPS server\n -v Be verbose (show commands)\n" @@ -2422,11 +2424,11 @@ msgstr "WARNING: \"%s:%s\"을(를) 열 수 없습니다: %s\n" msgid "WARNING: Unable to send PAP status request" msgstr "WARNING: PAP 상태 요청을 보낼 수 없습니다" msgid "WARNING: Unexpected PAP packet of type %d\n" -msgstr "WARNING: %d 유형의 예기치않은 PAP 패킷\n" +msgstr "WARNING: %d 유형의 예기치 않은 PAP 패킷\n" msgid "WARNING: Unknown PAP packet of type %d\n" msgstr "WARNING: %d 유형의 알 수 없는 PAP 패킷\n" msgid "WARNING: Unknown choice \"%s\" for option \"%s\"!\n" -msgstr "WARNING: \"%s\" 옵션에 대한 알 수 없는 선택 \"%s\"!\n" +msgstr "WARNING: \"%2$s\" 옵션에 대한 알 수 없는 \"%1$s\" 선택사항!\n" msgid "WARNING: Unknown option \"%s\"!\n" msgstr "WARNING: 알 수 없는 \"%s\" 옵션!\n" msgid "WARNING: Unsupported baud rate %s!\n" @@ -2496,9 +2498,9 @@ msgstr "%s/%s에 대한 장비: %s\n" msgid "device for %s: %s\n" msgstr "%s에 대한 장비: %s\n" msgid "error-index uses indefinite length" -msgstr "오류-인덱스 길이가 무제한입니다" +msgstr "error-index 길이가 무제한입니다" msgid "error-status uses indefinite length" -msgstr "오류-상태 길이가 무제한입니다" +msgstr "error-status 길이가 무제한입니다" msgid "held" msgstr "유지됨" msgid "help\t\tget help on commands\n" @@ -2510,37 +2512,37 @@ msgstr "job-printer-uri 속성이 유실됨!" msgid "lpadmin: Class name can only contain printable characters!\n" msgstr "lpadmin: 클래스 이름은 프린트 가능한 문자만 포함할 수 있음!\n" msgid "lpadmin: Expected PPD after '-P' option!\n" -msgstr "lpadmin: '-P'옵션 뒤에 PPD가 예상됨!\n" +msgstr "lpadmin: '-P' 옵션 뒤에 PPD가 예상됨!\n" msgid "lpadmin: Expected allow/deny:userlist after '-u' option!\n" -msgstr "lpadmin: '-u'옵션 뒤에 허용/거부:사용자목록이 예상됨!\n" +msgstr "lpadmin: '-u' 옵션 뒤에 allow/deny:userlist가 예상됨!\n" msgid "lpadmin: Expected class after '-r' option!\n" -msgstr "lpadmin: '-r'옵션 뒤에 클래스가 예상됨!\n" +msgstr "lpadmin: '-r' 옵션 뒤에 클래스가 예상됨!\n" msgid "lpadmin: Expected class name after '-c' option!\n" -msgstr "lpadmin: '-c'옵션 뒤에 클래스 이름이 예상됨!\n" +msgstr "lpadmin: '-c' 옵션 뒤에 클래스 이름이 예상됨!\n" msgid "lpadmin: Expected description after '-D' option!\n" -msgstr "lpadmin: '-D'옵션 뒤에 설명이 예상됨!\n" +msgstr "lpadmin: '-D' 옵션 뒤에 설명이 예상됨!\n" msgid "lpadmin: Expected device URI after '-v' option!\n" -msgstr "lpadmin: '-v'옵션 뒤에 장비 URI가 예상됨!\n" +msgstr "lpadmin: '-v' 옵션 뒤에 장비 URI가 예상됨!\n" msgid "lpadmin: Expected file type(s) after '-I' option!\n" -msgstr "lpadmin: '-I'옵션 뒤에 파일 유형이 예상됨!\n" +msgstr "lpadmin: '-I' 옵션 뒤에 파일 유형이 예상됨!\n" msgid "lpadmin: Expected hostname after '-h' option!\n" -msgstr "lpadmin: '-h'옵션 뒤에 호스트 이름이 예상됨!\n" +msgstr "lpadmin: '-h' 옵션 뒤에 호스트 이름이 예상됨!\n" msgid "lpadmin: Expected interface after '-i' option!\n" -msgstr "lpadmin: '-i'옵션 뒤에 인터페이스가 예상됨!\n" +msgstr "lpadmin: '-i' 옵션 뒤에 인터페이스가 예상됨!\n" msgid "lpadmin: Expected location after '-L' option!\n" -msgstr "lpadmin: '-L'옵션 뒤에 위치가 예상됨!\n" +msgstr "lpadmin: '-L' 옵션 뒤에 위치가 예상됨!\n" msgid "lpadmin: Expected model after '-m' option!\n" -msgstr "lpadmin: '-m'옵션 뒤에 모델이 예상됨!\n" +msgstr "lpadmin: '-m' 옵션 뒤에 모델이 예상됨!\n" msgid "lpadmin: Expected name=value after '-o' option!\n" -msgstr "lpadmin: '-o'옵션 뒤에 이름=값이 예상됨!\n" +msgstr "lpadmin: '-o' 옵션 뒤에 name=value가 예상됨!\n" msgid "lpadmin: Expected printer after '-p' option!\n" -msgstr "lpadmin: '-p'옵션 뒤에 프린터가 예상됨!\n" +msgstr "lpadmin: '-p' 옵션 뒤에 프린터가 예상됨!\n" msgid "lpadmin: Expected printer name after '-d' option!\n" -msgstr "lpadmin: '-d'옵션 뒤에 프린터가 예상됨!\n" +msgstr "lpadmin: '-d' 옵션 뒤에 프린터 이름이 예상됨!\n" msgid "lpadmin: Expected printer or class after '-x' option!\n" -msgstr "lpadmin: '-x'옵션 뒤에 프린터 또는 클래스가 예상됨!\n" +msgstr "lpadmin: '-x' 옵션 뒤에 프린터 또는 클래스가 예상됨!\n" msgid "lpadmin: No member names were seen!\n" -msgstr "lpadmin: 보이는 회원 이름이 없음!\n" +msgstr "lpadmin: 회원 이름이 보이지 않음!\n" msgid "lpadmin: Printer %s is already a member of class %s.\n" msgstr "lpadmin: %s 프린터에 이미 %s 클래스 회원이 있습니다.\n" msgid "lpadmin: Printer %s is not a member of class %s.\n" @@ -2576,7 +2578,7 @@ msgstr "lpadmin: 프린터 위치를 설정할 수 없음:\n 먼저 프 msgid "lpadmin: Unable to set the printer options:\n You must specify a printer name first!\n" msgstr "lpadmin: 프린터 옵션을 설정할 수 없음:\n 먼저 프린터 이름을 지정해야 합니다!\n" msgid "lpadmin: Unknown allow/deny option \"%s\"!\n" -msgstr "lpadmin: 알 수 없는 \"%s\" 허용/거부 옵션!\n" +msgstr "lpadmin: 알 수 없는 allow/deny 옵션 \"%s\"!\n" msgid "lpadmin: Unknown argument '%s'!\n" msgstr "lpadmin: 알 수 없는 '%s' 변수!\n" msgid "lpadmin: Unknown option '%c'!\n" @@ -2590,7 +2592,7 @@ msgstr "lpinfo: --device-id 뒤에 1284 장비 ID 스트링이 예상됨!\n" msgid "lpinfo: Expected language after --language!\n" msgstr "lpinfo: --language 뒤에 언어가 예상됨!\n" msgid "lpinfo: Expected make and model after --make-and-model!\n" -msgstr "lpinfo: --make-and-model 뒤에 생성 및 모델이 예상됨!\n" +msgstr "lpinfo: --make-and-model 뒤에 제조사 및 모델이 예상됨!\n" msgid "lpinfo: Expected product string after --product!\n" msgstr "lpinfo: --product 뒤에 제품 스트링이 예상됨!\n" msgid "lpinfo: Expected scheme list after --exclude-schemes!\n" @@ -2622,7 +2624,7 @@ msgstr "lpoptions: %s에 대한 PPD 파일을 열 수 없음!\n" msgid "lpoptions: Unknown printer or class!\n" msgstr "lpoptions: 알 수 없는 프린터 또는 클래스!\n" msgid "lppasswd: Only root can add or delete passwords!\n" -msgstr "lppasswd: 루트만 암호를 추가 또는 제거할 수 있음!\n" +msgstr "lppasswd: root만 암호를 추가 또는 제거할 수 있음!\n" msgid "lppasswd: Password file busy!\n" msgstr "lppasswd: 암호 파일 사용 중!\n" msgid "lppasswd: Password file not updated!\n" @@ -2630,7 +2632,7 @@ msgstr "lppasswd: 암호 파일이 업데이트되지 않음!\n" msgid "lppasswd: Sorry, password doesn't match!\n" msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n" msgid "lppasswd: Sorry, password rejected.\nYour password must be at least 6 characters long, cannot contain\nyour username, and must contain at least one letter and number.\n" -msgstr "lppasswd: 죄송합니다, 암호가 거부되었습니다.\n암호는 최소한 6자 이상이어야 하고, 사용자 이름을 포함해서는 안되며, 최소 하나 이상의 문자 및 숫자를 포함해야 합니다.\n" +msgstr "lppasswd: 죄송합니다, 암호가 거부되었습니다.\n암호는 최소한 6자 이상이어야 하고, 사용자 이름을 포함해서는 안되며, \n최소 하나 이상의 문자 및 숫자를 포함해야 합니다.\n" msgid "lppasswd: Sorry, passwords don't match!\n" msgstr "lppasswd: 죄송합니다, 암호가 일치하지 않습니다!\n" msgid "lppasswd: Unable to copy password string: %s\n" @@ -2648,7 +2650,7 @@ msgstr "lppasswd: \"%s\" 사용자 및 \"%s\" 그룹이 존재하지 않습니 msgid "lpstat: error - %s environment variable names non-existent destination \"%s\"!\n" msgstr "lpstat: 오류 - %s 환경 변수 이름이 존재하지 않는 대상 \"%s\" 이름임!\n" msgid "members of class %s:\n" -msgstr "클래스 회원 %s:\n" +msgstr "%s 클래스 회원:\n" msgid "no entries\n" msgstr "엔트리 없음\n" msgid "no system default destination\n" @@ -2668,7 +2670,7 @@ msgstr "ppdc: \"%s\" 포함 디렉토리 추가 중...\n" msgid "ppdc: Adding/updating UI text from %s...\n" msgstr "ppdc: %s에서 UI 텍스트 추가/업데이트 중...\n" msgid "ppdc: Bad boolean value (%s) on line %d of %s.\n" -msgstr "ppdc: 잘못된 불리언 값(%1$s)이(가) %3$s의 %2$d번째 줄에 있음.\n" +msgstr "ppdc: 잘못된 불리언 값(%1$s)이 %3$s의 %2$d번째 줄에 있음.\n" msgid "ppdc: Bad resolution name \"%s\" on line %d of %s!\n" msgstr "ppdc: 잘못된 \"%1$s\" 해상도 이름이 %3$s의 %2$d번째 줄에 있음!\n" msgid "ppdc: Bad status keyword %s on line %d of %s!\n" @@ -2686,7 +2688,7 @@ msgstr "ppdc: %2$s의 %1$d번째 줄에 프로그램 이름이 예상됨!\n" msgid "ppdc: Expected boolean value on line %d of %s.\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 불리언 값이 예상됨.\n" msgid "ppdc: Expected charset after Font on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄에 Font 뒤에 문자 세트가 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 문자 세트가 예상됨!\n" msgid "ppdc: Expected choice code on line %d of %s.\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 선택사항 코드가 예상됨.\n" msgid "ppdc: Expected choice name/text on line %d of %s.\n" @@ -2694,19 +2696,19 @@ msgstr "ppdc: %2$s의 %1$d번째 줄에 선택사항 이름/텍스트가 예상 msgid "ppdc: Expected color order for ColorModel on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 색상 순서가 예상됨!\n" msgid "ppdc: Expected colorspace for ColorModel on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대해 색상 공간이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 색상 공간이 예상됨!\n" msgid "ppdc: Expected compression for ColorModel on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대해 압축이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄에 ColorModel에 대한 압축이 예상됨!\n" msgid "ppdc: Expected constraints string for UIConstraints on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄에 UIConstraints에 대해 제한 스트링이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄에 UIConstraints에 대한 제한 스트링이 예상됨!\n" msgid "ppdc: Expected driver type keyword following DriverType on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 DriverType 뒤에 드라이버 유형 키워드가 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, DriverType 뒤에 드라이버 유형 키워드가 예상됨!\n" msgid "ppdc: Expected duplex type after Duplex on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Duplex 뒤에 양면 유형이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Duplex 뒤에 양면 유형이 예상됨!\n" msgid "ppdc: Expected encoding after Font on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 인코딩이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 인코딩이 예상됨!\n" msgid "ppdc: Expected filename after #po %s on line %d of %s!\n" -msgstr "ppdc: #po %1$s 뒤에 파일 이름이 예상됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄, #po %1$s 뒤에 파일 이름이 예상됨!\n" msgid "ppdc: Expected group name/text on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 그룹 이름/텍스트가 예상됨!\n" msgid "ppdc: Expected include filename on line %d of %s!\n" @@ -2714,29 +2716,29 @@ msgstr "ppdc: %2$s의 %1$d번째 줄에 포함 파일 이름이 예상됨!\n" msgid "ppdc: Expected integer on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 정수가 예상됨!\n" msgid "ppdc: Expected locale after #po on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 #po 뒤에 로컬 위치가 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, #po 뒤에 로컬 위치가 예상됨!\n" msgid "ppdc: Expected name after %s on line %d of %s!\n" -msgstr "ppdc: %1$s 뒤에 이름이 예상됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after FileName on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 FileName 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, FileName 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after Font on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after Manufacturer on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Manufacturer 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Manufacturer 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after MediaSize on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 MediaSize 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, MediaSize 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after ModelName on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 ModelName 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, ModelName 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name after PCFileName on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 PCFileName 뒤에 이름이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, PCFileName 뒤에 이름이 예상됨!\n" msgid "ppdc: Expected name/text after %s on line %d of %s!\n" -msgstr "ppdc: %1$s 뒤에 이름/텍스트가 예상됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 이름/텍스트가 예상됨!\n" msgid "ppdc: Expected name/text after Installable on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Installable 뒤에 이름/텍스트 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Installable 뒤에 이름/텍스트 예상됨!\n" msgid "ppdc: Expected name/text after Resolution on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Resolution 뒤에 이름/텍스트 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 이름/텍스트 예상됨!\n" msgid "ppdc: Expected name/text combination for ColorModel on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 ColorModel에 대해 이름/텍스트 조합이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, ColorModel에 대해 이름/텍스트 조합이 예상됨!\n" msgid "ppdc: Expected option name/text on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름/텍스트가 예상됨!\n" msgid "ppdc: Expected option section on line %d of %s!\n" @@ -2744,27 +2746,27 @@ msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 섹션이 예상됨!\n" msgid "ppdc: Expected option type on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄의 옵션 유형이 예상됨!\n" msgid "ppdc: Expected override field after Resolution on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Resolution 뒤에 오버라이드 필드가 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Resolution 뒤에 오버라이드 필드가 예상됨!\n" msgid "ppdc: Expected real number on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 실제 번호가 예상됨!\n" msgid "ppdc: Expected resolution/mediatype following ColorProfile on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 ColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, ColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n" msgid "ppdc: Expected resolution/mediatype following SimpleColorProfile on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 SimpleColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, SimpleColorProfile 뒤에 해상도/미디어 유형이 예상됨!\n" msgid "ppdc: Expected selector after %s on line %d of %s!\n" -msgstr "ppdc: %1$s 뒤에 선택자가 예상됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 선택자가 예상됨!\n" msgid "ppdc: Expected status after Font on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 상태가 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 상태가 예상됨!\n" msgid "ppdc: Expected string after Copyright on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Copyright 뒤에 스트링이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Copyright 뒤에 스트링이 예상됨!\n" msgid "ppdc: Expected string after Version on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Version 뒤에 스트링이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Version 뒤에 스트링이 예상됨!\n" msgid "ppdc: Expected two option names on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 옵션 이름 2개가 예상됨!\n" msgid "ppdc: Expected value after %s on line %d of %s!\n" -msgstr "ppdc: %1$s 뒤에 값이 예상됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄, %1$s 뒤에 값이 예상됨!\n" msgid "ppdc: Expected version after Font on line %d of %s!\n" -msgstr "ppdc: %2$s의 %1$d번째 줄의 Font 뒤에 버전이 예상됨!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄, Font 뒤에 버전이 예상됨!\n" msgid "ppdc: Invalid #include/#po filename \"%s\"!\n" msgstr "ppdc: 유효하지 않은 #include/#po 파일 이름 \"%s\"!\n" msgid "ppdc: Invalid cost for filter on line %d of %s!\n" @@ -2774,9 +2776,9 @@ msgstr "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 빈 msgid "ppdc: Invalid empty program name for filter on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄의 필터에 대해 유효하지 않은 빈 프로그램 이름!\n" msgid "ppdc: Invalid option section \"%s\" on line %d of %s!\n" -msgstr "ppdc: 유효하지 않은 \"%1$s\"옵션 섹션(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\" 옵션 섹션!\n" msgid "ppdc: Invalid option type \"%s\" on line %d of %s!\n" -msgstr "ppdc: 유효하지 않은 \"%1$s\ 옵션 유형(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 유효하지 않은 \"%1$s\ 옵션 유형!\n" msgid "ppdc: Loading driver information file \"%s\"...\n" msgstr "ppdc: \"%s\" 드라이버 정보 파일 로드 중...\n" msgid "ppdc: Loading messages for locale \"%s\"...\n" @@ -2790,9 +2792,9 @@ msgstr "ppdc: %2$s의 %1$d번째 줄에서 #if 유실됨!\n" msgid "ppdc: No message catalog provided for locale %s!\n" msgstr "ppdc: 로컬 %s에 대해 제공된 메시지 카탈로그 없음!\n" msgid "ppdc: Option %s redefined with a different type on line %d of %s!\n" -msgstr "ppdc: %1$s 옵션이 다른 유형으로 재정의됨(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 %1$s 옵션이 다른 유형으로 재정의됨!\n" msgid "ppdc: Option constraint must *name on line %d of %s!\n" -msgstr "ppdc: 옵션 제한은 *name이어야 함(%2$s의 %1$d번째 줄)!\n" +msgstr "ppdc: %2$s의 %1$d번째 줄에 있는 옵션 제한은 *name이어야 함!\n" msgid "ppdc: Too many nested #if's on line %d of %s!\n" msgstr "ppdc: %2$s의 %1$d번째 줄에 너무 많이 중첩된 #if가 있음!\n" msgid "ppdc: Unable to create PPD file \"%s\" - %s.\n" @@ -2804,41 +2806,41 @@ msgstr "ppdc: 출력 파이프를 생성할 수 없음: %s\n" msgid "ppdc: Unable to execute cupstestppd: %s\n" msgstr "ppdc: cupstestppd를 실행할 수 없음: %s\n" msgid "ppdc: Unable to find #po file %s on line %d of %s!\n" -msgstr "ppdc: #po 파일 %1$s을(를) 찾을 수 없음(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에서 #po 파일 %1$s을(를) 찾을 수 없음!\n" msgid "ppdc: Unable to find include file \"%s\" on line %d of %s!\n" -msgstr "ppdc: \"%1$s\" 포함 파일을 찾을 수 없음(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에서 포함 파일 \"%1$s\"을(를) 찾을 수 없음!\n" msgid "ppdc: Unable to find localization for \"%s\" - %s\n" msgstr "ppdc: \"%s\"에 대한 현지화를 찾을 수 없음 - %s\n" msgid "ppdc: Unable to load localization file \"%s\" - %s\n" msgstr "ppdc: \"%s\"에 대한 현지화 파일을 로드할 수 없음 - %s\n" msgid "ppdc: Undefined variable (%s) on line %d of %s.\n" -msgstr "ppdc: 변수(%1$s)가 정의되지 않음(%3$s의 %2$d번째 줄).\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 변수(%1$s)가 정의되지 않음.\n" msgid "ppdc: Unknown driver type %s on line %d of %s!\n" -msgstr "ppdc: 알 수 없는 %1$s 드라이브 유형(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 %1$s 드라이브 유형!\n" msgid "ppdc: Unknown duplex type \"%s\" on line %d of %s!\n" -msgstr "ppdc: 알 수 없는 \"%1$s\" 양면 유형(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 양면 유형!\n" msgid "ppdc: Unknown media size \"%s\" on line %d of %s!\n" -msgstr "ppdc: 알 수 없는 \"%1$s\" 미디어 크기(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 알 수 없는 \"%1$s\" 미디어 크기!\n" msgid "ppdc: Unknown token \"%s\" seen on line %d of %s!\n" -msgstr "ppdc: 알 수 없는 \"%1$s\" 토큰(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 보이는 알 수 없는 \"%1$s\" 토큰!\n" msgid "ppdc: Unknown trailing characters in real number \"%s\" on line %d of %s!\n" -msgstr "ppdc: 실수에 \"%1$s\" 알 수 없는 마지막 문자(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 있는 \"%1$s\" 실수에 알 수 없는 마지막 문자!\n" msgid "ppdc: Unterminated string starting with %c on line %d of %s!\n" -msgstr "ppdc: %1$c(으)로 시작하는 끝나지 않는 스트링(%3$s의 %2$d번째 줄)!\n" +msgstr "ppdc: %3$s의 %2$d번째 줄에 %1$c(으)로 시작하는 끝나지 않는 스트링!\n" msgid "ppdc: Writing %s...\n" msgstr "ppdc: %s 쓰는 중...\n" msgid "ppdc: Writing PPD files to directory \"%s\"...\n" msgstr "ppdc: \"%s\" 디렉토리에 PPD 파일 쓰는 중...\n" msgid "ppdmerge: Bad LanguageVersion \"%s\" in %s!\n" -msgstr "ppdmerge: 잘못된 \"%s\" LanguageVersion(%s에 있음)!\n" +msgstr "ppdmerge: %2$s에 잘못된 \"%1$s\" LanguageVersion!\n" msgid "ppdmerge: Ignoring PPD file %s...\n" msgstr "ppdmerge: %s PPD 파일 무시 중...\n" msgid "ppdmerge: Unable to backup %s to %s- %s\n" msgstr "ppdmerge: %s을(를) %s(으)로 백업할 수 없음- %s\n" msgid "printer %s disabled since %s -\n" -msgstr "%s 프린터가 비활성화됨(%s 이후) -\n" +msgstr "%2$s 이후로 %1$s 프린터가 비활성화됨 -\n" msgid "printer %s is idle. enabled since %s\n" -msgstr "%s 프린터가 대기 중. %s 이후에 활성화됨\n" +msgstr "%s 프린터가 대기 중. %s 이후에 활성화됨\n" msgid "printer %s now printing %s-%d. enabled since %s\n" msgstr "%s 프린터가 현재 %s-%d을(를) 프린트 중입니다. %s 이후에 활성화됨\n" msgid "printer %s/%s disabled since %s -\n" @@ -2850,15 +2852,15 @@ msgstr "%s/%s 프린터가 현재 %s-%d을(를) 프린트 중입니다. %s 이 msgid "processing" msgstr "처리 중" msgid "request id is %s-%d (%d file(s))\n" -msgstr "id 요청은 %s-%d(%d개의 파일)\n" +msgstr "요청 id는 %s-%d(%d개의 파일)\n" msgid "request-id uses indefinite length" -msgstr "id 요청은 길이가 무제한입니다" +msgstr "request-id 길이가 무제한입니다" msgid "scheduler is not running\n" msgstr "일정이 실행되지 않음\n" msgid "scheduler is running\n" msgstr "일정이 실행 중\n" msgid "stat of %s failed: %s" -msgstr "%s 시작에 실패함: %s" +msgstr "%s 통계에 실패함: %s" msgid "status\t\tshow status of daemon and queue\n" msgstr "상태\t\t데몬 및 대기열 상태 보기\n" msgid "stopped" @@ -2872,4 +2874,4 @@ msgstr "알 수 없음" msgid "untitled" msgstr "무제" msgid "variable-bindings uses indefinite length" -msgstr "variable-bindings는 길이가 무제한입니다" +msgstr "variable-bindings의 길이가 무제한입니다" diff --git a/packaging/cups.list.in b/packaging/cups.list.in index 2116b1930..26b051a84 100644 --- a/packaging/cups.list.in +++ b/packaging/cups.list.in @@ -551,11 +551,14 @@ f 0644 root sys $DATADIR/templates/es templates/es/*.tmpl #d 0755 root sys $DATADIR/templates/it #f 0644 root sys $DATADIR/templates/it templates/it/*.tmpl -#d 0755 root sys $DATADIR/templates/ja -#f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl +d 0755 root sys $DATADIR/templates/ja +f 0644 root sys $DATADIR/templates/ja templates/ja/*.tmpl -#d 0755 root sys $DATADIR/templates/pl -#f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl +d 0755 root sys $DATADIR/templates/pl +f 0644 root sys $DATADIR/templates/pl templates/pl/*.tmpl + +d 0755 root sys $DATADIR/templates/ru +f 0644 root sys $DATADIR/templates/ru templates/ru/*.tmpl #d 0755 root sys $DATADIR/templates/sv #f 0644 root sys $DATADIR/templates/sv templates/sv/*.tmpl @@ -660,11 +663,14 @@ f 0644 root sys $DOCDIR/es doc/es/*.html #d 0755 root sys $DOCDIR/it #f 0644 root sys $DOCDIR/it doc/it/*.html -#d 0755 root sys $DOCDIR/ja -#f 0644 root sys $DOCDIR/ja doc/ja/*.html +d 0755 root sys $DOCDIR/ja +f 0644 root sys $DOCDIR/ja doc/ja/*.html + +d 0755 root sys $DOCDIR/pl +f 0644 root sys $DOCDIR/pl doc/pl/*.html -#d 0755 root sys $DOCDIR/pl -#f 0644 root sys $DOCDIR/pl doc/pl/*.html +d 0755 root sys $DOCDIR/ru +f 0644 root sys $DOCDIR/ru doc/ru/*.html #d 0755 root sys $DOCDIR/sv #f 0644 root sys $DOCDIR/sv doc/sv/*.html diff --git a/packaging/cups.spec.in b/packaging/cups.spec.in index c76655c67..e431b8c5e 100644 --- a/packaging/cups.spec.in +++ b/packaging/cups.spec.in @@ -244,6 +244,12 @@ rm -rf $RPM_BUILD_ROOT /usr/share/doc/cups/*.* %dir /usr/share/doc/cups/es /usr/share/doc/cups/es/* +%dir /usr/share/doc/cups/ja +/usr/share/doc/cups/ja/* +%dir /usr/share/doc/cups/pl +/usr/share/doc/cups/pl/* +%dir /usr/share/doc/cups/ru +/usr/share/doc/cups/ru/* %dir /usr/share/doc/cups/help /usr/share/doc/cups/help/accounting.html /usr/share/doc/cups/help/cgi.html diff --git a/scheduler/Dependencies b/scheduler/Dependencies index 279262d32..8a2a20cc7 100644 --- a/scheduler/Dependencies +++ b/scheduler/Dependencies @@ -206,10 +206,12 @@ cupsfilter.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h cupsfilter.o: ../cups/file.h ../cups/language.h ../cups/i18n.h cupsfilter.o: ../cups/transcode.h ../cups/string.h ../config.h mime.h cupsfilter.o: ../cups/array.h ../cups/ipp.h ../cups/file.h -cups-deviced.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h -cups-deviced.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h -cups-deviced.o: ../cups/file.h ../cups/language.h ../cups/file.h -cups-deviced.o: ../cups/string.h ../config.h ../cups/array.h ../cups/dir.h +cups-deviced.o: util.h ../cups/file-private.h ../cups/http-private.h +cups-deviced.o: ../config.h ../cups/http.h ../cups/versioning.h ../cups/md5.h +cups-deviced.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h +cups-deviced.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h +cups-deviced.o: ../cups/transcode.h ../cups/language.h ../cups/array.h +cups-deviced.o: ../cups/debug.h ../cups/array.h ../cups/dir.h cups-lpd.o: ../cups/http-private.h ../config.h ../cups/http.h cups-lpd.o: ../cups/versioning.h ../cups/md5.h ../cups/ipp-private.h cups-lpd.o: ../cups/ipp.h ../cups/cups.h ../cups/ppd.h ../cups/array.h @@ -235,12 +237,16 @@ testspeed.o: ../cups/language.h ../cups/debug.h testsub.o: ../cups/cups.h ../cups/ipp.h ../cups/http.h ../cups/versioning.h testsub.o: ../cups/ppd.h ../cups/array.h ../cups/file.h ../cups/language.h testsub.o: ../cups/debug.h ../cups/string.h ../config.h -util.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h -util.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h ../cups/file.h -util.o: ../cups/language.h ../cups/file.h ../cups/string.h ../config.h -cups-driverd.o: util.h ../cups/cups.h ../cups/ipp.h ../cups/http.h -cups-driverd.o: ../cups/versioning.h ../cups/ppd.h ../cups/array.h -cups-driverd.o: ../cups/file.h ../cups/language.h ../cups/file.h -cups-driverd.o: ../cups/string.h ../config.h ../cups/dir.h -cups-driverd.o: ../cups/transcode.h ../cups/ppd-private.h ../cups/cups.h -cups-driverd.o: ../ppdc/ppdc.h +util.o: util.h ../cups/file-private.h ../cups/http-private.h ../config.h +util.o: ../cups/http.h ../cups/versioning.h ../cups/md5.h +util.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h +util.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h ../cups/transcode.h +util.o: ../cups/language.h ../cups/array.h ../cups/debug.h +cups-driverd.o: util.h ../cups/file-private.h ../cups/http-private.h +cups-driverd.o: ../config.h ../cups/http.h ../cups/versioning.h ../cups/md5.h +cups-driverd.o: ../cups/ipp-private.h ../cups/ipp.h ../cups/globals.h +cups-driverd.o: ../cups/string.h ../cups/cups.h ../cups/i18n.h +cups-driverd.o: ../cups/transcode.h ../cups/language.h ../cups/array.h +cups-driverd.o: ../cups/debug.h ../cups/dir.h ../cups/transcode.h +cups-driverd.o: ../cups/ppd-private.h ../ppdc/ppdc.h ../cups/string.h +cups-driverd.o: ../cups/file.h diff --git a/scheduler/cert.c b/scheduler/cert.c index 650363401..d7ece80fa 100644 --- a/scheduler/cert.c +++ b/scheduler/cert.c @@ -4,7 +4,7 @@ * Authentication certificate routines for the Common UNIX * Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -54,7 +54,7 @@ cupsdAddCert(int pid, /* I - Process ID */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddCert: adding certificate for pid %d", pid); + "cupsdAddCert: Adding certificate for PID %d", pid); /* * Allocate memory for the certificate... @@ -84,7 +84,7 @@ cupsdAddCert(int pid, /* I - Process ID */ if ((fd = open(filename, O_WRONLY | O_CREAT | O_EXCL, 0400)) < 0) { cupsdLogMessage(CUPSD_LOG_ERROR, - "cupsdAddCert: Unable to create certificate file %s - %s", + "Unable to create certificate file %s - %s", filename, strerror(errno)); free(cert); return; @@ -283,7 +283,7 @@ cupsdDeleteCert(int pid) /* I - Process ID */ */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDeleteCert: removing certificate for pid %d", pid); + "cupsdDeleteCert: Removing certificate for PID %d", pid); DEBUG_printf(("DELETE pid=%d, username=%s, cert=%s\n", cert->pid, cert->username, cert->certificate)); @@ -310,8 +310,7 @@ cupsdDeleteCert(int pid) /* I - Process ID */ snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, pid); if (unlink(filename)) - cupsdLogMessage(CUPSD_LOG_ERROR, - "cupsdDeleteCert: Unable to remove %s!", filename); + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename); return; } @@ -342,8 +341,7 @@ cupsdDeleteAllCerts(void) snprintf(filename, sizeof(filename), "%s/certs/%d", StateDir, cert->pid); if (unlink(filename)) - cupsdLogMessage(CUPSD_LOG_ERROR, - "cupsdDeleteAllCerts: Unable to remove %s!", filename); + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to remove %s!", filename); /* * Free memory... @@ -368,15 +366,17 @@ cupsdFindCert(const char *certificate) /* I - Certificate */ cupsd_cert_t *cert; /* Current certificate */ - DEBUG_printf(("cupsdFindCert(certificate=%s)\n", certificate)); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert(certificate=%s)", + certificate); for (cert = Certs; cert != NULL; cert = cert->next) if (!strcasecmp(certificate, cert->certificate)) { - DEBUG_printf((" returning %s...\n", cert->username)); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Returning %s...", + cert->username); return (cert); } - DEBUG_puts(" certificate not found!"); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdFindCert: Certificate not found!"); return (NULL); } diff --git a/scheduler/client.c b/scheduler/client.c index 758c47196..853a9db55 100644 --- a/scheduler/client.c +++ b/scheduler/client.c @@ -137,7 +137,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAcceptClient(lis=%p) %d Clients = %d", + "cupsdAcceptClient(lis=%p(%d)) Clients=%d", lis, lis->fd, cupsArrayCount(Clients)); /* @@ -300,10 +300,6 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ * Can't have an unresolved IP address with double-lookups enabled... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAcceptClient: Closing connection %d...", - con->http.fd); - #ifdef WIN32 closesocket(con->http.fd); #else @@ -347,10 +343,6 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ * with double-lookups enabled... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAcceptClient: Closing connection %d...", - con->http.fd); - #ifdef WIN32 closesocket(con->http.fd); #else @@ -375,10 +367,6 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ if (!hosts_access(&wrap_req)) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAcceptClient: Closing connection %d...", - con->http.fd); - #ifdef WIN32 closesocket(con->http.fd); #else @@ -459,15 +447,10 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ cupsArrayAdd(Clients, con); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAcceptClient: %d connected to server on %s:%d", - con->http.fd, con->servername, con->serverport); - /* - * Using TCP_NODELAY improves responsiveness, especially on systems - * with a slow loopback interface... Since we write large buffers - * when sending print files and requests, there shouldn't be any - * performance penalty for this... + * Using TCP_NODELAY improves responsiveness, especially on systems with a slow + * loopback interface. Since we write large buffers when sending print files + * and requests there shouldn't be any performance penalty for this... */ val = 1; @@ -480,7 +463,7 @@ cupsdAcceptClient(cupsd_listener_t *lis)/* I - Listener socket */ fcntl(con->http.fd, F_SETFD, fcntl(con->http.fd, F_GETFD) | FD_CLOEXEC); /* - * Add the socket to the select() input mask. + * Add the socket to the server select. */ cupsdAddSelect(con->http.fd, (cupsd_selfunc_t)cupsdReadClient, NULL, con); @@ -524,6 +507,9 @@ cupsdCloseAllClients(void) cupsd_client_t *con; /* Current client */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseAllClients() Clients=%d", + cupsArrayCount(Clients)); + for (con = (cupsd_client_t *)cupsArrayFirst(Clients); con; con = (cupsd_client_t *)cupsArrayNext(Clients)) @@ -554,7 +540,8 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ #endif /* HAVE_LIBSSL */ - cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdCloseClient: %d", con->http.fd); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCloseClient(con=%p(%d))", con, + con->http.fd); /* * Flush pending writes before closing... @@ -642,9 +629,6 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ * Stop any CGI process... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdCloseClient: %d Killing process ID %d...", - con->http.fd, con->pipe_pid); cupsdEndProcess(con->pipe_pid, 1); con->pipe_pid = 0; } @@ -653,10 +637,6 @@ cupsdCloseClient(cupsd_client_t *con) /* I - Client to close */ { cupsdRemoveSelect(con->file); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdCloseClient: %d Closing data file %d.", - con->http.fd, con->file); - close(con->file); con->file = -1; } @@ -797,12 +777,21 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ status = HTTP_CONTINUE; cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d, used=%d, file=%d state=%d", - con->http.fd, con->http.used, con->file, con->http.state); + "cupsdReadClient(con=%p(%d)) " + "con->http.error=%d " + "con->http.used=%d, " + "con->http.state=%d " + "con->data_encoding=HTTP_ENCODE_%s, " + "con->data_remaining=" CUPS_LLFMT ", " + "con->file=%d", + con, con->http.fd, con->http.error, con->http.used, + con->http.state, + con->http.data_encoding == HTTP_ENCODE_CHUNKED ? + "CHUNKED" : "LENGTH", + CUPS_LLCAST con->http.data_remaining, con->file); if (con->http.error) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: http error seen..."); cupsdCloseClient(con); return; } @@ -824,8 +813,8 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: Saw first byte %02X, auto-negotiating SSL/TLS session...", - buf[0] & 255); + "cupsdReadClient: Saw first byte %02X, auto-negotiating " + "SSL/TLS session...", buf[0] & 255); if (!encrypt_client(con)) cupsdCloseClient(con); @@ -844,8 +833,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ if (httpGets(line, sizeof(line) - 1, HTTP(con)) == NULL) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: httpGets returned EOF..."); cupsdCloseClient(con); return; } @@ -1116,10 +1103,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ snprintf(locale, sizeof(locale), "%s.%s", con->http.fields[HTTP_FIELD_ACCEPT_LANGUAGE], DefaultCharset); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Browser asked for language \"%s\"...", - con->http.fd, locale); - con->language = cupsLangGet(locale); } else @@ -1297,9 +1280,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ if ((status = cupsdIsAuthorized(con, NULL)) != HTTP_OK) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: Unauthorized request for %s...", - con->uri); cupsdSendError(con, status, CUPSD_AUTH_NONE); cupsdCloseClient(con); return; @@ -1540,10 +1520,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ * so check the length against any limits that are set... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "POST %s", con->uri); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "CONTENT_TYPE = %s", - con->http.fields[HTTP_FIELD_CONTENT_TYPE]); - if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] && MaxRequestSize > 0 && con->http.data_remaining > MaxRequestSize) @@ -1645,12 +1621,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ cupsdSetString(&con->options, NULL); } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d command=\"%s\", " - "options = \"%s\"", - con->http.fd, con->command, - con->options ? con->options : "(null)"); - if (con->http.version <= HTTP_1_0) con->http.keep_alive = HTTP_KEEPALIVE_OFF; } @@ -1720,10 +1690,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ * so check the length against any limits that are set... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "PUT %s", con->uri); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "CONTENT_TYPE = %s", - con->http.fields[HTTP_FIELD_CONTENT_TYPE]); - if (con->http.fields[HTTP_FIELD_CONTENT_LENGTH][0] && MaxRequestSize > 0 && con->http.data_remaining > MaxRequestSize) @@ -1776,10 +1742,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ } } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d REQUEST %s=%d", con->http.fd, - con->filename, con->file); - fchmod(con->file, 0640); fchown(con->file, RunUser, Group); fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); @@ -1955,14 +1917,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ switch (con->http.state) { case HTTP_PUT_RECV : - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d con->data_encoding=HTTP_ENCODE_%s, " - "con->data_remaining=" CUPS_LLFMT ", con->file=%d", - con->http.fd, - con->http.data_encoding == HTTP_ENCODE_CHUNKED ? - "CHUNKED" : "LENGTH", - CUPS_LLCAST con->http.data_remaining, con->file); - do { if ((bytes = httpRead2(HTTP(con), line, sizeof(line))) < 0) @@ -1974,20 +1928,12 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ { con->bytes += bytes; - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d writing %d bytes to %d", - con->http.fd, bytes, con->file); - if (write(con->file, line, bytes) < bytes) { cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdReadClient: Unable to write %d bytes to %s: %s", bytes, con->filename, strerror(errno)); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: Closing data file %d...", - con->file); - close(con->file); con->file = -1; unlink(con->filename); @@ -2011,12 +1957,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ fstat(con->file, &filestats); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Closing data file %d, size=" - CUPS_LLFMT ".", - con->http.fd, con->file, - CUPS_LLCAST filestats.st_size); - close(con->file); con->file = -1; @@ -2027,9 +1967,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ * Request is too big; remove it and send an error... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Removing temp file %s", - con->http.fd, con->filename); unlink(con->filename); cupsdClearString(&con->filename); @@ -2059,14 +1996,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ break; case HTTP_POST_RECV : - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d con->data_encoding=HTTP_ENCODE_" - "%s, con->data_remaining=" CUPS_LLFMT ", con->file=%d", - con->http.fd, - con->http.data_encoding == HTTP_ENCODE_CHUNKED ? - "CHUNKED" : "LENGTH", - CUPS_LLCAST con->http.data_remaining, con->file); - do { if (con->request) @@ -2122,9 +2051,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ } } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReadClient: %d REQUEST %s=%d", con->http.fd, - con->filename, con->file); - fchmod(con->file, 0640); fchown(con->file, RunUser, Group); fcntl(con->file, F_SETFD, fcntl(con->file, F_GETFD) | FD_CLOEXEC); @@ -2141,20 +2067,12 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ { con->bytes += bytes; - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d writing %d bytes to %d", - con->http.fd, bytes, con->file); - if (write(con->file, line, bytes) < bytes) { cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdReadClient: Unable to write %d bytes to %s: %s", bytes, con->filename, strerror(errno)); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: Closing file %d...", - con->file); - close(con->file); con->file = -1; unlink(con->filename); @@ -2184,12 +2102,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ { fstat(con->file, &filestats); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Closing data file %d, " - "size=" CUPS_LLFMT ".", - con->http.fd, con->file, - CUPS_LLCAST filestats.st_size); - close(con->file); con->file = -1; @@ -2200,9 +2112,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ * Request is too big; remove it and send an error... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Removing temp file %s", - con->http.fd, con->filename); unlink(con->filename); cupsdClearString(&con->filename); @@ -2244,9 +2153,6 @@ cupsdReadClient(cupsd_client_t *con) /* I - Client to read from */ if (con->filename) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdReadClient: %d Removing temp file %s", - con->http.fd, con->filename); unlink(con->filename); cupsdClearString(&con->filename); } @@ -2341,6 +2247,10 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */ http_status_t code, /* I - Error code */ int auth_type)/* I - Authentication type */ { + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSendError(con=%p(%d), code=%d, auth_type=%d", con, + con->http.fd, code, auth_type); + #ifdef HAVE_SSL /* * Force client to upgrade for authentication if that is how the @@ -2352,8 +2262,6 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */ strcasecmp(con->http.hostname, "localhost") && !con->http.tls) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSendError: Encryption before authentication!"); code = HTTP_UPGRADE_REQUIRED; } #endif /* HAVE_SSL */ @@ -2364,9 +2272,6 @@ cupsdSendError(cupsd_client_t *con, /* I - Connection */ cupsdLogRequest(con, code); - cupsdLogMessage(CUPSD_LOG_DEBUG, "cupsdSendError: %d code=%d (%s)", - con->http.fd, code, httpStatus(code)); - /* * To work around bugs in some proxies, don't use Keep-Alive for some * error messages... @@ -2731,14 +2636,12 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ ipp_state_t ipp_state; /* IPP state value */ -#ifdef DEBUG cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient(con=%p) %d response=%p(%d), file=%d " + "cupsdWriteClient(con=%p(%d)) response=%p(%d), file=%d " "pipe_pid=%d state=%d", con, con->http.fd, con->response, con->response ? con->response->state : -1, con->file, con->pipe_pid, con->http.state); -#endif /* DEBUG */ if (con->http.state != HTTP_GET_SEND && con->http.state != HTTP_POST_SEND) @@ -2773,10 +2676,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ } else if ((bytes = read(con->file, buf, sizeof(buf) - 1)) > 0) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: Read %d bytes from file %d...", - bytes, con->file); - if (con->pipe_pid && !con->got_fields) { /* @@ -2834,9 +2733,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ if (strncasecmp(buf, "Status:", 7)) httpPrintf(HTTP(con), "%s\r\n", buf); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdWriteClient: %d %s", - con->http.fd, buf); - /* * Update buffer... */ @@ -2874,10 +2770,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ con->field_col ++; } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: %d bytes=%d, got_fields=%d", - con->http.fd, bytes, con->got_fields); - if (bytes > 0 && !con->got_fields) { /* @@ -2900,10 +2792,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ { if (httpWrite2(HTTP(con), buf, bytes) < 0) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: %d Write of %d bytes failed!", - con->http.fd, bytes); - cupsdCloseClient(con); return; } @@ -2920,9 +2808,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ if (bytes <= 0) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdWriteClient: %d bytes < 0", - con->http.fd); - cupsdLogRequest(con, HTTP_OK); httpFlushWrite(HTTP(con)); @@ -2947,10 +2832,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ if (con->pipe_pid) cupsdEndProcess(con->pipe_pid, 0); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: %d Closing data file %d.", - con->http.fd, con->file); - close(con->file); con->file = -1; con->pipe_pid = 0; @@ -2958,9 +2839,6 @@ cupsdWriteClient(cupsd_client_t *con) /* I - Client connection */ if (con->filename) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdWriteClient: %d Removing temp file %s", - con->http.fd, con->filename); unlink(con->filename); cupsdClearString(&con->filename); } @@ -3014,8 +2892,10 @@ check_if_modified( return (1); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "check_if_modified: %d If-Modified-Since=\"%s\"", - con->http.fd, ptr); + "check_if_modified(con=%p(%d), " + "filestats=%p(" CUPS_LLFMT ", %d)) If-Modified-Since=\"%s\"", + con, con->http.fd, filestats, CUPS_LLCAST filestats->st_size, + (int)filestats->st_mtime, ptr); while (*ptr != '\0') { @@ -3040,13 +2920,6 @@ check_if_modified( ptr ++; } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "check_if_modified: %d sizes=" CUPS_LLFMT "," - CUPS_LLFMT " dates=%d,%d", - con->http.fd, CUPS_LLCAST size, - CUPS_LLCAST filestats->st_size, (int)date, - (int)filestats->st_mtime); - return ((size != filestats->st_size && size != 0) || (date < filestats->st_mtime && date != 0) || (size == 0 && date == 0)); @@ -3120,6 +2993,9 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ unsigned long error; /* Error code */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + /* * Verify that we have a certificate... */ @@ -3154,22 +3030,19 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (SSL_accept(conn) != 1) { - cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: Unable to encrypt connection from %s!", + cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to encrypt connection from %s!", con->http.hostname); while ((error = ERR_get_error()) != 0) - cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s", - ERR_error_string(error, NULL)); + cupsdLogMessage(CUPSD_LOG_ERROR, "%s", ERR_error_string(error, NULL)); SSL_CTX_free(context); SSL_free(conn); return (0); } - cupsdLogMessage(CUPSD_LOG_DEBUG, - "encrypt_client: %d Connection from %s now encrypted.", - con->http.fd, con->http.hostname); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); con->http.tls = conn; return (1); @@ -3181,6 +3054,9 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ /* TLS credentials */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + /* * Verify that we have a certificate... */ @@ -3209,9 +3085,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (credentials == NULL) { cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: Unable to encrypt connection from %s!", - con->http.hostname); - cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s", strerror(errno)); + "Unable to encrypt connection from %s - %s", + con->http.hostname, strerror(errno)); free(conn); return (0); @@ -3233,10 +3108,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (error != GNUTLS_E_SUCCESS) { cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: Unable to encrypt connection from %s!", - con->http.hostname); - cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s", - gnutls_strerror(error)); + "Unable to encrypt connection from %s - %s", + con->http.hostname, gnutls_strerror(error)); gnutls_deinit(conn->session); gnutls_certificate_free_credentials(*credentials); @@ -3245,9 +3118,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ return (0); } - cupsdLogMessage(CUPSD_LOG_DEBUG, - "encrypt_client: %d Connection from %s now encrypted.", - con->http.fd, con->http.hostname); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); conn->credentials = credentials; con->http.tls = conn; @@ -3258,6 +3130,9 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ http_tls_t *conn; /* CDSA connection information */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "encrypt_client(con=%p(%d))", con, + con->http.fd); + if ((conn = (http_tls_t *)malloc(sizeof(http_tls_t))) == NULL) return (0); @@ -3278,8 +3153,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (!conn->certsArray) { cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: Could not find signing key in keychain " - "\"%s\"", ServerCertificate); + "Could not find signing key in keychain \"%s\"", + ServerCertificate); error = errSSLBadCert; /* errSSLBadConfiguration is a better choice, but not available on 10.2.x */ } @@ -3317,11 +3192,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ if (error) { cupsdLogMessage(CUPSD_LOG_ERROR, - "encrypt_client: Unable to encrypt connection from %s!", - con->http.hostname); - - cupsdLogMessage(CUPSD_LOG_ERROR, "encrypt_client: %s (%d)", - cssmErrorString(error), (int)error); + "Unable to encrypt connection from %s - %s (%d)", + con->http.hostname, cssmErrorString(error), (int)error); con->http.error = error; con->http.status = HTTP_ERROR; @@ -3337,9 +3209,8 @@ encrypt_client(cupsd_client_t *con) /* I - Client to encrypt */ return (0); } - cupsdLogMessage(CUPSD_LOG_DEBUG, - "encrypt_client: %d Connection from %s now encrypted.", - con->http.fd, con->http.hostname); + cupsdLogMessage(CUPSD_LOG_DEBUG, "Connection from %s now encrypted.", + con->http.hostname); con->http.tls = conn; return (1); @@ -3367,8 +3238,8 @@ get_cdsa_certificate(cupsd_client_t *con) /* I - Client connection */ if ((err = SecKeychainOpen(ServerCertificate, &keychain))) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\", %s", - ServerCertificate, cssmErrorString(err)); + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot open keychain \"%s\" - %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); return (NULL); } @@ -3395,7 +3266,7 @@ get_cdsa_certificate(cupsd_client_t *con) /* I - Client connection */ if (SecPolicySearchCopyNext(policy_search, &policy)) { - cupsdLogMessage(CUPSD_LOG_ERROR, + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot find a policy to use for searching"); CFRelease(keychain); CFRelease(policy_search); @@ -3412,7 +3283,7 @@ get_cdsa_certificate(cupsd_client_t *con) /* I - Client connection */ if (SecPolicySetValue(policy, &options)) { - cupsdLogMessage(CUPSD_LOG_ERROR, + cupsdLogMessage(CUPSD_LOG_ERROR, "Cannot set policy value to use for searching"); CFRelease(keychain); CFRelease(policy_search); @@ -3431,15 +3302,15 @@ get_cdsa_certificate(cupsd_client_t *con) /* I - Client connection */ if (err) cupsdLogMessage(CUPSD_LOG_DEBUG, - "Cannot create keychain search reference: %s", - cssmErrorString(err)); + "Cannot create keychain search reference: %s (%d)", + cssmErrorString(err), (int)err); else { if ((err = SecIdentitySearchCopyNext(search, &identity))) { cupsdLogMessage(CUPSD_LOG_DEBUG, - "Cannot find signing key in keychain \"%s\", error %d", - ServerCertificate, (int)err); + "Cannot find signing key in keychain \"%s\": %s (%d)", + ServerCertificate, cssmErrorString(err), (int)err); } else { @@ -3643,9 +3514,10 @@ get_file(cupsd_client_t *con, /* I - Client connection */ while (status && language[0]); } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "get_file: %d filename=%s size=%d", - con->http.fd, filename, - status ? -1 : (int)filestats->st_size); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "get_file(con=%p(%d), filestats=%p, filename=%p, len=%d) = " + "%s", con, con->http.fd, filestats, filename, len, + status ? "(null)" : filename); if (!status) con->http.data_remaining = (int)filestats->st_size; @@ -3833,11 +3705,6 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ const char *options; /* Options on URL */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi(con=%p, filename=\"%s\", filestats=%p, type=%s/%s)", - con, filename, filestats, type ? type->super : "unknown", - type ? type->type : "unknown"); - /* * Get the options, if any... */ @@ -3854,7 +3721,11 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ if (!type || strcasecmp(type->super, "application")) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "is_cgi: Returning 0..."); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 0", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (0); } @@ -3871,9 +3742,10 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ cupsdSetStringf(&con->options, " %s", options); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"", - con->command, con->options); - + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (1); } #ifdef HAVE_JAVA @@ -3891,9 +3763,10 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ cupsdSetStringf(&con->options, " %s", filename); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"", - con->command, con->options); - + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (1); } #endif /* HAVE_JAVA */ @@ -3912,9 +3785,10 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ cupsdSetStringf(&con->options, " %s", filename); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"", - con->command, con->options); - + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (1); } #endif /* HAVE_PERL */ @@ -3933,9 +3807,10 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ cupsdSetStringf(&con->options, " %s", filename); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"", - con->command, con->options); - + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (1); } #endif /* HAVE_PHP */ @@ -3954,15 +3829,19 @@ is_cgi(cupsd_client_t *con, /* I - Client connection */ cupsdSetStringf(&con->options, " %s", filename); cupsdLogMessage(CUPSD_LOG_DEBUG2, - "is_cgi: Returning 1 with command=\"%s\" and options=\"%s\"", - con->command, con->options); - + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 1", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (1); } #endif /* HAVE_PYTHON */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "is_cgi: Returning 0..."); - + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "is_cgi(con=%p(%d), filename=\"%s\", filestats=%p, " + "type=%s/%s) = 0", con, con->http.fd, filename, filestats, + type ? type->super : "unknown", + type ? type->type : "unknown"); return (0); } @@ -4090,7 +3969,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ envp[envc++] = home; envp[envc] = NULL; - if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL, + if (!cupsdStartProcess(command, argv, envp, -1, -1, -1, -1, -1, 1, NULL, 0, &pid)) { unlink(seedfile); @@ -4104,7 +3983,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ break; } - cupsdFinishProcess(pid, command, sizeof(command)); + cupsdFinishProcess(pid, command, sizeof(command), NULL); /* * Remove the seed file, as it is no longer needed... @@ -4169,7 +4048,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ infofd = open(infofile, O_RDONLY); if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL, - &pid)) + 0, &pid)) { close(infofd); unlink(infofile); @@ -4186,7 +4065,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ break; } - cupsdFinishProcess(pid, command, sizeof(command)); + cupsdFinishProcess(pid, command, sizeof(command), NULL); if (status) { @@ -4403,7 +4282,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ infofd = open(infofile, O_RDONLY); if (!cupsdStartProcess(command, argv, envp, infofd, -1, -1, -1, -1, 1, NULL, - &pid)) + 0, &pid)) { close(infofd); unlink(infofile); @@ -4420,7 +4299,7 @@ make_certificate(cupsd_client_t *con) /* I - Client connection */ break; } - cupsdFinishProcess(pid, command, sizeof(command)); + cupsdFinishProcess(pid, command, sizeof(command), NULL); if (status) { @@ -4517,8 +4396,10 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "pipe_command: command=\"%s\", options=\"%s\"", - command, options ? options : "(null)"); + "pipe_command(con=%p(%d), infile=%d, outfile=%p, " + "command=\"%s\", options=\"%s\", root=%d)", + con, con->http.fd, infile, outfile, command, + options ? options : "(null)", root); argv[0] = command; @@ -4757,7 +4638,8 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ { KerberosContext = NULL; - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to initialize Kerberos context"); + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to initialize Kerberos context"); } } @@ -4801,8 +4683,8 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ principal))) { cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to initialize credentials cache (%d/%s)", error, - strerror(errno)); + "Unable to initialize credentials cache (%d/%s)", + error, strerror(errno)); krb5_cc_destroy(KerberosContext, ccache); krb5_free_principal(KerberosContext, principal); ccache = NULL; @@ -4943,7 +4825,7 @@ pipe_command(cupsd_client_t *con, /* I - Client connection */ */ if (cupsdStartProcess(command, argv, envp, infile, fds[1], CGIPipes[1], - -1, -1, root, DefaultProfile, &pid) < 0) + -1, -1, root, DefaultProfile, 0, &pid) < 0) { /* * Error - can't fork! @@ -4992,8 +4874,10 @@ write_file(cupsd_client_t *con, /* I - Client connection */ { con->file = open(filename, O_RDONLY); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "write_file: %d file=%d", con->http.fd, - con->file); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "write_file(con=%p(%d), code=%d, filename=\"%s\" (%d), " + "type=\"%s\", filestats=%p)", con, con->http.fd, + code, filename, con->file, type ? type : "(null)", filestats); if (con->file < 0) return (0); @@ -5039,8 +4923,9 @@ write_file(cupsd_client_t *con, /* I - Client connection */ static void write_pipe(cupsd_client_t *con) /* I - Client connection */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "write_pipe: CGI output on fd %d...", - con->file); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "write_pipe(con=%p(%d)) CGI output on fd %d", + con, con->http.fd, con->file); con->file_ready = 1; diff --git a/scheduler/cups-deviced.c b/scheduler/cups-deviced.c index 912109f1b..547a032d0 100644 --- a/scheduler/cups-deviced.c +++ b/scheduler/cups-deviced.c @@ -3,7 +3,7 @@ * * Device scanning mini-daemon for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2006 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -313,11 +313,22 @@ main(int argc, /* I - Number of command-line args */ { for (i = 0; i < num_backends; i ++) if (backend_fds[i].revents && backends[i].pipe) - if (get_device(backends + i)) + { + cups_file_t *bpipe = backends[i].pipe; + /* Copy of pipe for backend... */ + + do { - backend_fds[i].fd = 0; - backend_fds[i].events = 0; + if (get_device(backends + i)) + { + backend_fds[i].fd = 0; + backend_fds[i].events = 0; + break; + } } + while (bpipe->ptr && + memchr(bpipe->ptr, '\n', bpipe->end - bpipe->ptr)); + } } /* diff --git a/scheduler/cupsd.h b/scheduler/cupsd.h index 6bab44e0f..e9d8df1f0 100644 --- a/scheduler/cupsd.h +++ b/scheduler/cupsd.h @@ -3,7 +3,7 @@ * * Main header file for the Common UNIX Printing System (CUPS) scheduler. * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -217,11 +217,13 @@ __attribute__ ((__format__ (__printf__, 2, 3))) extern void *cupsdCreateProfile(int job_id); extern void cupsdDestroyProfile(void *profile); extern int cupsdEndProcess(int pid, int force); -extern const char *cupsdFinishProcess(int pid, char *name, int namelen); +extern const char *cupsdFinishProcess(int pid, char *name, int namelen, + int *job_id); extern int cupsdStartProcess(const char *command, char *argv[], char *envp[], int infd, int outfd, int errfd, int backfd, int sidefd, - int root, void *profile, int *pid); + int root, void *profile, int job_id, + int *pid); extern int cupsdAddSelect(int fd, cupsd_selfunc_t read_cb, cupsd_selfunc_t write_cb, void *data); diff --git a/scheduler/dirsvc.c b/scheduler/dirsvc.c index f41fb451b..dfa996a86 100644 --- a/scheduler/dirsvc.c +++ b/scheduler/dirsvc.c @@ -1748,7 +1748,7 @@ cupsdStartPolling(void) argv[1] = pollp->hostname; if (cupsdStartProcess(polld, argv, envp, -1, -1, statusfds[1], -1, -1, - 0, DefaultProfile, &(pollp->pid)) < 0) + 0, DefaultProfile, 0, &(pollp->pid)) < 0) { cupsdLogMessage(CUPSD_LOG_ERROR, "cupsdStartPolling: Unable to fork polling daemon - %s", @@ -5273,7 +5273,7 @@ update_lpd(int onoff) /* - 1 = turn on, 0 = turn off */ argv[4] = NULL; cupsdStartProcess("/bin/launchctl", argv, envp, -1, -1, -1, -1, -1, 1, - NULL, &pid); + NULL, 0, &pid); } #endif /* __APPLE__ */ else diff --git a/scheduler/ipp.c b/scheduler/ipp.c index 82e7a7eca..3fc1f33b0 100644 --- a/scheduler/ipp.c +++ b/scheduler/ipp.c @@ -1216,23 +1216,14 @@ add_class(cupsd_client_t *con, /* I - Client connection */ if (need_restart_job && pclass->job) { - cupsd_job_t *job; - /* - * Stop the current job and then restart it below... + * Reset the current job to a "pending" status... */ - job = (cupsd_job_t *)pclass->job; - - cupsdStopJob(job, 1); - - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + cupsdSetJobState(pclass->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + "Job restarted because the class was modified."); } - if (need_restart_job) - cupsdCheckJobs(); - cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); if (modify) @@ -1299,7 +1290,8 @@ add_file(cupsd_client_t *con, /* I - Connection to client */ if (!compressions || !filetypes) { - cupsdCancelJob(job, 1, IPP_JOB_ABORTED); + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Job aborted because the scheduler ran out of memory."); if (con) send_ipp_status(con, IPP_INTERNAL_ERROR, @@ -1738,7 +1730,7 @@ add_job(cupsd_client_t *con, /* I - Client connection */ * Hold job until specified time... */ - cupsdSetJobHoldUntil(job, attr->values[0].string.text); + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); job->state->values[0].integer = IPP_JOB_HELD; job->state_value = IPP_JOB_HELD; @@ -1896,7 +1888,9 @@ add_job(cupsd_client_t *con, /* I - Client connection */ if ((kbytes = copy_banner(con, job, attr->values[0].string.text)) < 0) { - cupsdDeleteJob(job); + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Aborting job because the start banner could not be " + "copied."); return (NULL); } @@ -2926,23 +2920,14 @@ add_printer(cupsd_client_t *con, /* I - Client connection */ if (need_restart_job && printer->job) { - cupsd_job_t *job; - /* - * Stop the current job and then restart it below... + * Restart the current job... */ - job = (cupsd_job_t *)printer->job; - - cupsdStopJob(job, 1); - - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + cupsdSetJobState(printer->job, IPP_JOB_PENDING, CUPSD_JOB_FORCE, + "Job restarted because the printer was modified."); } - if (need_restart_job) - cupsdCheckJobs(); - cupsdMarkDirty(CUPSD_DIRTY_PRINTCAP); if (modify) @@ -3974,21 +3959,28 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ } /* - * See if the printer is currently printing a job... + * See if there are any pending jobs... */ - if (printer->job) - jobid = ((cupsd_job_t *)printer->job)->id; + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (job->state_value <= IPP_JOB_PROCESSING && + !strcasecmp(job->dest, printer->name)) + break; + + if (job) + jobid = job->id; else { /* - * No, see if there are any pending jobs... + * No, try stopped jobs... */ - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); job; job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value <= IPP_JOB_PROCESSING && + if (job->state_value == IPP_JOB_STOPPED && !strcasecmp(job->dest, printer->name)) break; @@ -3996,21 +3988,9 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ jobid = job->id; else { - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); - job; - job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value == IPP_JOB_STOPPED && - !strcasecmp(job->dest, printer->name)) - break; - - if (job) - jobid = job->id; - else - { - send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s!"), - printer->name); - return; - } + send_ipp_status(con, IPP_NOT_POSSIBLE, _("No active jobs on %s!"), + printer->name); + return; } } } @@ -4109,7 +4089,9 @@ cancel_job(cupsd_client_t *con, /* I - Client connection */ * Cancel the job and return... */ - cupsdCancelJob(job, purge, IPP_JOB_CANCELED); + cupsdSetJobState(job, IPP_JOB_CANCELED, purge, + purge ? "Job purged by \"%s\"" : "Job canceled by \"%s\"", + username); cupsdCheckJobs(); if (purge) @@ -5131,7 +5113,7 @@ copy_model(cupsd_client_t *con, /* I - Client connection */ "copy_model: Running \"cups-driverd cat %s\"...", from); if (!cupsdStartProcess(buffer, argv, envp, -1, temppipe[1], CGIPipes[1], - -1, -1, 0, DefaultProfile, &temppid)) + -1, -1, 0, DefaultProfile, 0, &temppid)) { close(tempfd); unlink(tempfile); @@ -6870,7 +6852,7 @@ get_jobs(cupsd_client_t *con, /* I - Client connection */ sizeof(scheme), username, sizeof(username), host, sizeof(host), &port, resource, sizeof(resource)); - if (!strcmp(resource, "/")) + if (!strcmp(resource, "/") || !strcmp(resource, "/jobs")) { dest = NULL; dtype = (cups_ptype_t)0; @@ -7998,8 +7980,8 @@ static void hold_job(cupsd_client_t *con, /* I - Client connection */ ipp_attribute_t *uri) /* I - Job or Printer URI */ { - ipp_attribute_t *attr, /* Current job-hold-until */ - *newattr; /* New job-hold-until */ + ipp_attribute_t *attr; /* Current job-hold-until */ + const char *when; /* New value */ int jobid; /* Job ID */ char scheme[HTTP_MAX_URI], /* Method portion of URI */ username[HTTP_MAX_URI], /* Username portion of URI */ @@ -8085,50 +8067,23 @@ hold_job(cupsd_client_t *con, /* I - Client connection */ * Hold the job and return... */ - cupsdHoldJob(job); - - cupsdAddEvent(CUPSD_EVENT_JOB_STATE, cupsdFindDest(job->dest), job, - "Job held by user."); - - if ((newattr = ippFindAttribute(con->request, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - newattr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME); - - if ((attr = ippFindAttribute(job->attrs, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + if ((attr = ippFindAttribute(con->request, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(con->request, "job-hold-until", IPP_TAG_NAME); if (attr) { - /* - * Free the old hold value and copy the new one over... - */ - - _cupsStrFree(attr->values[0].string.text); - - if (newattr) - { - attr->value_tag = newattr->value_tag; - attr->values[0].string.text = - _cupsStrRetain(newattr->values[0].string.text); - } - else - { - attr->value_tag = IPP_TAG_KEYWORD; - attr->values[0].string.text = _cupsStrAlloc("indefinite"); - } - - /* - * Hold job until specified time... - */ - - cupsdSetJobHoldUntil(job, attr->values[0].string.text); + when = attr->values[0].string.text; cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, cupsdFindDest(job->dest), job, - "Job job-hold-until value changed by user."); + "Job job-hold-until value changed by user."); } + else + when = "indefinite"; - cupsdLogJob(job, CUPSD_LOG_INFO, "Held by \"%s\".", username); + cupsdSetJobHoldUntil(job, when, 1); + cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, "Job held by \"%s\".", + username); con->response->request.status.status_code = IPP_OK; } @@ -10548,11 +10503,9 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", attr->values[0].integer); - - job->state->values[0].integer = attr->values[0].integer; - job->state_value = (ipp_jstate_t)attr->values[0].integer; - - event |= CUPSD_EVENT_JOB_STATE; + cupsdSetJobState(job, attr->values[0].integer, + CUPSD_JOB_DEFAULT, + "Job state changed by \"%s\"", username); check_jobs = 1; } break; @@ -10580,8 +10533,9 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-state to %d", attr->values[0].integer); - cupsdCancelJob(job, 0, (ipp_jstate_t)attr->values[0].integer); - + cupsdSetJobState(job, (ipp_jstate_t)attr->values[0].integer, + CUPSD_JOB_DEFAULT, + "Job state changed by \"%s\"", username); check_jobs = 1; } break; @@ -10621,15 +10575,18 @@ set_job_attrs(cupsd_client_t *con, /* I - Client connection */ { cupsdLogJob(job, CUPSD_LOG_DEBUG, "Setting job-hold-until to %s", attr->values[0].string.text); - cupsdSetJobHoldUntil(job, attr->values[0].string.text); + cupsdSetJobHoldUntil(job, attr->values[0].string.text, 0); if (!strcmp(attr->values[0].string.text, "no-hold")) + { cupsdReleaseJob(job); + check_jobs = 1; + } else - cupsdHoldJob(job); + cupsdSetJobState(job, IPP_JOB_HELD, CUPSD_JOB_DEFAULT, + "Job held by \"%s\".", username); - check_jobs = 1; - event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE; + event |= CUPSD_EVENT_JOB_CONFIG_CHANGED | CUPSD_EVENT_JOB_STATE; } } else if (attr->value_tag == IPP_TAG_DELETEATTR) diff --git a/scheduler/job.c b/scheduler/job.c index ee83e4c74..25ddffd9f 100644 --- a/scheduler/job.c +++ b/scheduler/job.c @@ -14,13 +14,13 @@ * * Contents: * - * cupsdAddJob() - Add a new job to the job queue... - * cupsdCancelJob() - Cancel the specified print job. + * cupsdAddJob() - Add a new job to the job queue. * cupsdCancelJobs() - Cancel all jobs for the given - * destination/user... + * destination/user. * cupsdCheckJobs() - Check the pending jobs and start any if the * destination is available. * cupsdCleanJobs() - Clean out old jobs. + * cupsdContinueJob() - Continue printing with the next file in a job. * cupsdDeleteJob() - Free all memory used by a job. * cupsdFinishJob() - Finish a job. * cupsdFreeAllJobs() - Free all jobs from memory. @@ -29,34 +29,37 @@ * jobs in a printer or class. * cupsdGetUserJobCount() - Get the number of pending, processing, or held * jobs for a user. - * cupsdHoldJob() - Hold the specified job. * cupsdLoadAllJobs() - Load all jobs from disk. - * cupsdLoadJob() - Load a single job... + * cupsdLoadJob() - Load a single job. * cupsdMoveJob() - Move the specified job to a different * destination. * cupsdReleaseJob() - Release the specified job. * cupsdRestartJob() - Restart the specified job. * cupsdSaveAllJobs() - Save a summary of all jobs to disk. * cupsdSaveJob() - Save a job to disk. - * cupsdSetJobHoldUntil() - Set the hold time for a job... + * cupsdSetJobHoldUntil() - Set the hold time for a job. * cupsdSetJobPriority() - Set the priority of a job, moving it up/down * in the list as needed. + * cupsdSetJobState() - Set the state of the specified print job. * cupsdStopAllJobs() - Stop all print jobs. - * cupsdStopJob() - Stop a print job. * cupsdUnloadCompletedJobs() - Flush completed job history from memory. * compare_active_jobs() - Compare the job IDs and priorities of two * jobs. * compare_jobs() - Compare the job IDs of two jobs. + * finalize_job() - Cleanup after job filter processes and support + * data. + * get_options() - Get a string containing the job options. * ipp_length() - Compute the size of the buffer needed to hold * the textual IPP attributes. * load_job_cache() - Load jobs from the job.cache file. * load_next_job_id() - Load the NextJobId value from the job.cache * file. * load_request_root() - Load jobs from the RequestRoot directory. - * set_time() - Set one of the "time-at-xyz" attributes... * set_hold_until() - Set the hold time and update job-hold-until - * attribute... + * attribute. + * set_time() - Set one of the "time-at-xyz" attributes. * start_job() - Start a print job. + * stop_job() - Stop a print job. * unload_job() - Unload a job from memory. * update_job() - Read a status update from a job's filters. * update_job_attrs() - Update the job-printer-* attributes. @@ -72,6 +75,78 @@ #include +/* + * Design Notes for Job Management + * ------------------------------- + * + * STATE CHANGES + * + * pending Do nothing/check jobs + * pending-held Send SIGTERM to filters and backend + * processing Do nothing/start job + * stopped Send SIGKILL to filters and backend + * canceled Send SIGTERM to filters and backend + * aborted Finalize + * completed Finalize + * + * Finalize clears the printer <-> job association, deletes the status + * buffer, closes all of the pipes, etc. and doesn't get run until all of + * the print processes are finished. + * + * UNLOADING OF JOBS (cupsdUnloadCompletedJobs) + * + * We unload the job attributes when they are not needed to reduce overall + * memory consumption. We don't unload jobs where job->state_value < + * IPP_JOB_STOPPED, job->printer != NULL, or job->access_time is recent. + * + * STARTING OF JOBS (start_job) + * + * When a job is started, a status buffer, several pipes, a security + * profile, and a backend process are created for the life of that job. + * These are shared for every file in a job. For remote print jobs, the + * IPP backend is provided with every file in the job and no filters are + * run. + * + * The job->printer member tracks which printer is printing a job, which + * can be different than the destination in job->dest for classes. The + * printer object also has a job pointer to track which job is being + * printed. + * + * PRINTING OF JOB FILES (cupsdContinueJob) + * + * Each file in a job is filtered by 0 or more programs. After getting the + * list of filters needed and the total cost, the job is either passed or + * put back to the processing state until the current FilterLevel comes down + * enough to allow printing. + * + * If we can print, we build a string for the print options and run each of + * the filters, piping the output from one into the next. + * + * JOB STATUS UPDATES (update_job) + * + * The update_job function gets called whenever there are pending messages + * on the status pipe. These generally are updates to the marker-*, + * printer-state-message, or printer-state-reasons attributes. On EOF, + * finalize_job is called to clean up. + * + * FINALIZING JOBS (finalize_job) + * + * When all filters and the backend are done, we set the job state to + * completed (no errors), aborted (filter errors or abort-job policy), + * pending-held (auth required or retry-job policy), or pending + * (retry-current-job or stop-printer policies) as appropriate. + * + * Then we close the pipes and free the status buffers and profiles. + * + * JOB FILE COMPLETION (process_children in main.c) + * + * For multiple-file jobs, process_children (in main.c) sees that all + * filters have exited and calls in to print the next file if there are + * more files in the job, otherwise it waits for the backend to exit and + * update_job to do the cleanup. + */ + + /* * Local globals... */ @@ -91,20 +166,25 @@ static mime_filter_t gziptoany_filter = static int compare_active_jobs(void *first, void *second, void *data); static int compare_jobs(void *first, void *second, void *data); +static void finalize_job(cupsd_job_t *job); +static char *get_options(cupsd_job_t *job, int banner_page, char *copies, + size_t copies_size, char *title, + size_t title_size); static int ipp_length(ipp_t *ipp); static void load_job_cache(const char *filename); static void load_next_job_id(const char *filename); static void load_request_root(void); -static void set_time(cupsd_job_t *job, const char *name); static void set_hold_until(cupsd_job_t *job, time_t holdtime); +static void set_time(cupsd_job_t *job, const char *name); static void start_job(cupsd_job_t *job, cupsd_printer_t *printer); +static void stop_job(cupsd_job_t *job, cupsd_jobaction_t action); static void unload_job(cupsd_job_t *job); static void update_job(cupsd_job_t *job); static void update_job_attrs(cupsd_job_t *job, int do_message); /* - * 'cupsdAddJob()' - Add a new job to the job queue... + * 'cupsdAddJob()' - Add a new job to the job queue. */ cupsd_job_t * /* O - New job record */ @@ -142,186 +222,7 @@ cupsdAddJob(int priority, /* I - Job priority */ /* - * 'cupsdCancelJob()' - Cancel the specified print job. - */ - -void -cupsdCancelJob(cupsd_job_t *job, /* I - Job to cancel */ - int purge, /* I - Purge jobs? */ - ipp_jstate_t newstate) /* I - New job state */ -{ - int i; /* Looping var */ - char filename[1024]; /* Job filename */ - cupsd_printer_t *printer; /* Printer used by job */ - - - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCancelJob: id = %d", job->id); - - /* - * Stop any processes that are working on the current job... - */ - - if ((printer = job->printer) == NULL) - printer = cupsdFindDest(job->dest); - - if (job->state_value == IPP_JOB_PROCESSING) - cupsdStopJob(job, 0); - - cupsdLoadJob(job); - - if (job->attrs) - job->state->values[0].integer = newstate; - - job->state_value = newstate; - - set_time(job, "time-at-completed"); - - /* - * Send any pending notifications and then expire them... - */ - - switch (newstate) - { - default : - break; - - case IPP_JOB_CANCELED : - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job, - purge ? "Job purged." : "Job canceled."); - break; - - case IPP_JOB_ABORTED : - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job, - "Job aborted; please consult the error_log file " - "for details."); - break; - - case IPP_JOB_COMPLETED : - /* - * Clear the printer's printer-state-message and move on... - */ - - printer->state_message[0] = '\0'; - - cupsdSetPrinterState(printer, IPP_PRINTER_IDLE, 0); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, printer, job, - "Job completed."); - break; - } - - cupsdExpireSubscriptions(NULL, job); - - /* - * Remove the job from the active and printing lists... - */ - - cupsArrayRemove(ActiveJobs, job); - cupsArrayRemove(PrintingJobs, job); - -#ifdef __APPLE__ - /* - * If we are going to sleep and the PrintingJobs count is now 0, allow the - * sleep to happen immediately... - */ - - if (Sleeping && cupsArrayCount(PrintingJobs) == 0) - cupsdAllowSleep(); -#endif /* __APPLE__ */ - - /* - * Remove any authentication data... - */ - - snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); - if (cupsdRemoveFile(filename) && errno != ENOENT) - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to remove authentication cache: %s", - strerror(errno)); - - cupsdClearString(&job->auth_username); - cupsdClearString(&job->auth_domain); - cupsdClearString(&job->auth_password); - -#ifdef HAVE_GSSAPI - /* - * Destroy the credential cache and clear the KRB5CCNAME env var string. - */ - - if (job->ccache) - { - krb5_cc_destroy(KerberosContext, job->ccache); - job->ccache = NULL; - } - - cupsdClearString(&job->ccname); -#endif /* HAVE_GSSAPI */ - - /* - * Remove the print file for good if we aren't preserving jobs or - * files... - */ - - job->current_file = 0; - - if (!JobHistory || !JobFiles || purge) - { - for (i = 1; i <= job->num_files; i ++) - { - snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, - job->id, i); - unlink(filename); - } - - if (job->num_files > 0) - { - free(job->filetypes); - free(job->compressions); - - job->num_files = 0; - job->filetypes = NULL; - job->compressions = NULL; - } - } - - if (JobHistory && !purge) - { - /* - * Save job state info... - */ - - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - } - else - { - /* - * Remove the job info file... - */ - - snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, - job->id); - unlink(filename); - - /* - * Remove the job from the "all jobs" list... - */ - - cupsArrayRemove(Jobs, job); - - /* - * Free all memory used... - */ - - cupsdDeleteJob(job); - } - - cupsdSetBusyState(); -} - - -/* - * 'cupsdCancelJobs()' - Cancel all jobs for the given destination/user... + * 'cupsdCancelJobs()' - Cancel all jobs for the given destination/user. */ void @@ -336,20 +237,22 @@ cupsdCancelJobs(const char *dest, /* I - Destination to cancel */ job; job = (cupsd_job_t *)cupsArrayNext(Jobs)) { - if (!job->dest || !job->username) - cupsdLoadJob(job); - - if (!job->dest || !job->username) + if ((!job->dest || !job->username) && !cupsdLoadJob(job)) continue; - if ((dest == NULL || !strcmp(job->dest, dest)) && - (username == NULL || !strcmp(job->username, username))) + if ((!dest || !strcmp(job->dest, dest)) && + (!username || !strcmp(job->username, username))) { /* * Cancel all jobs matching this destination/user... */ - cupsdCancelJob(job, purge, IPP_JOB_CANCELED); + if (purge) + cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_PURGE, + "Job purged by user."); + else + cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, + "Job canceled by user."); } } @@ -371,8 +274,6 @@ cupsdCheckJobs(void) ipp_attribute_t *attr; /* Job attribute */ - DEBUG_puts("cupsdCheckJobs()"); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCheckJobs: %d active jobs, sleeping=%d, reload=%d", cupsArrayCount(ActiveJobs), Sleeping, NeedReload); @@ -385,11 +286,6 @@ cupsdCheckJobs(void) * Start held jobs if they are ready... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdCheckJobs: Job %d: dest=%s, dtype=%x, " - "state_value=%d, loaded=%s", job->id, job->dest, job->dtype, - job->state_value, job->attrs ? "yes" : "no"); - if (job->state_value == IPP_JOB_HELD && job->hold_until && job->hold_until < time(NULL)) @@ -419,27 +315,16 @@ cupsdCheckJobs(void) continue; } - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - - if ((attr = ippFindAttribute(job->attrs, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); - - if (attr) - { - attr->value_tag = IPP_TAG_KEYWORD; - cupsdSetString(&(attr->values[0].string.text), "no-hold"); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - } + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job submission timed out."); } /* * Start pending jobs if the destination is available... */ - if (job->state_value == IPP_JOB_PENDING && !NeedReload && !Sleeping) + if (job->state_value == IPP_JOB_PENDING && !NeedReload && !Sleeping && + !job->printer) { printer = cupsdFindDest(job->dest); pclass = NULL; @@ -468,15 +353,9 @@ cupsdCheckJobs(void) * cancel the job... */ - cupsdLogMessage(CUPSD_LOG_WARN, - "[Job %d] Printer/class %s has gone away; canceling " - "job!", job->id, job->dest); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the destination printer/class has " - "gone away."); - - cupsdCancelJob(job, 1, IPP_JOB_ABORTED); + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_PURGE, + "Job aborted because the destination printer/class " + "has gone away."); } else if (printer && !printer->holding_new_jobs) { @@ -508,12 +387,6 @@ cupsdCheckJobs(void) ((printer->type & CUPS_PRINTER_DISCOVERED) && /* Printer is remote */ !printer->job)) /* and not printing */ { - /* - * Clear any message for the queue... - */ - - printer->state_message[0] = '\0'; - /* * Start the job... */ @@ -542,1224 +415,1328 @@ cupsdCleanJobs(void) for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); job && cupsArrayCount(Jobs) >= MaxJobs; job = (cupsd_job_t *)cupsArrayNext(Jobs)) - if (job->state_value >= IPP_JOB_CANCELED) - cupsdCancelJob(job, 1, IPP_JOB_CANCELED); + if (job->state_value >= IPP_JOB_CANCELED && !job->printer) + cupsdDeleteJob(job, CUPSD_JOB_PURGE); } /* - * 'cupsdDeleteJob()' - Free all memory used by a job. + * 'cupsdContinueJob()' - Continue printing with the next file in a job. */ void -cupsdDeleteJob(cupsd_job_t *job) /* I - Job */ +cupsdContinueJob(cupsd_job_t *job) /* I - Job */ { - cupsdClearString(&job->username); - cupsdClearString(&job->dest); - cupsdClearString(&job->auth_username); - cupsdClearString(&job->auth_domain); - cupsdClearString(&job->auth_password); + int i; /* Looping var */ + int slot; /* Pipe slot */ + cups_array_t *filters, /* Filters for job */ + *prefilters; /* Filters with prefilters */ + mime_filter_t *filter, /* Current filter */ + *prefilter, /* Prefilter */ + port_monitor; /* Port monitor filter */ + char scheme[255]; /* Device URI scheme */ + ipp_attribute_t *attr; /* Current attribute */ + const char *ptr, /* Pointer into value */ + *abort_message; /* Abort message */ + struct stat backinfo; /* Backend file information */ + int backroot; /* Run backend as root? */ + int pid; /* Process ID of new filter process */ + int banner_page; /* 1 if banner page, 0 otherwise */ + int filterfds[2][2];/* Pipes used between filters */ + int envc; /* Number of environment variables */ + char **argv, /* Filter command-line arguments */ + filename[1024], /* Job filename */ + command[1024], /* Full path to command */ + jobid[255], /* Job ID string */ + title[IPP_MAX_NAME], + /* Job title string */ + copies[255], /* # copies string */ + *options, /* Options string */ + *envp[MAX_ENV + 19], + /* Environment variables */ + charset[255], /* CHARSET env variable */ + class_name[255],/* CLASS env variable */ + classification[1024], + /* CLASSIFICATION env variable */ + content_type[1024], + /* CONTENT_TYPE env variable */ + device_uri[1024], + /* DEVICE_URI env variable */ + final_content_type[1024], + /* FINAL_CONTENT_TYPE env variable */ + lang[255], /* LANG env variable */ +#ifdef __APPLE__ + apple_language[255], + /* APPLE_LANGUAGE env variable */ +#endif /* __APPLE__ */ + ppd[1024], /* PPD env variable */ + printer_info[255], + /* PRINTER_INFO env variable */ + printer_location[255], + /* PRINTER_LOCATION env variable */ + printer_name[255], + /* PRINTER env variable */ + rip_max_cache[255]; + /* RIP_MAX_CACHE env variable */ + + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdContinueJob(job=%p(%d)): current_file=%d, num_files=%d", + job, job->id, job->current_file, job->num_files); -#ifdef HAVE_GSSAPI /* - * Destroy the credential cache and clear the KRB5CCNAME env var string. + * Figure out what filters are required to convert from + * the source to the destination type... */ - if (job->ccache) - { - krb5_cc_destroy(KerberosContext, job->ccache); - job->ccache = NULL; - } + FilterLevel -= job->cost; - cupsdClearString(&job->ccname); -#endif /* HAVE_GSSAPI */ + filters = NULL; - if (job->num_files > 0) + if (job->printer->raw) { - free(job->compressions); - free(job->filetypes); - } - - ippDelete(job->attrs); + /* + * Remote jobs and raw queues go directly to the printer without + * filtering... + */ - free(job); -} + cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw..."); + filters = NULL; + } + else + { + /* + * Local jobs get filtered... + */ -/* - * 'cupsdFinishJob()' - Finish a job. - */ + filters = mimeFilter(MimeDatabase, job->filetypes[job->current_file], + job->printer->filetype, &(job->cost)); -void -cupsdFinishJob(cupsd_job_t *job) /* I - Job */ -{ - cupsd_printer_t *printer; /* Current printer */ - ipp_attribute_t *attr; /* job-hold-until attribute */ + if (!filters) + { + cupsdLogJob(job, CUPSD_LOG_ERROR, + "Unable to convert file %d to printable format!", + job->current_file); + job->current_file ++; - cupsdLogJob(job, CUPSD_LOG_DEBUG, "File %d is complete.", - job->current_file - 1); + if (job->current_file == job->num_files) + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT, + "Aborting job because it cannot be printed."); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "cupsdFinishJob: job->status is %d", - job->status); + return; + } - if (job->status_buffer && - (job->status < 0 || job->current_file >= job->num_files)) - { /* - * Close the pipe and clear the input bit. + * Remove NULL ("-") filters... */ - cupsdRemoveSelect(job->status_buffer->fd); + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + if (!strcmp(filter->filter, "-")) + cupsArrayRemove(filters, filter); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "cupsdFinishJob: Closing status pipes [ %d %d ]...", - job->status_pipes[0], job->status_pipes[1]); + if (cupsArrayCount(filters) == 0) + { + cupsArrayDelete(filters); + filters = NULL; + } - cupsdClosePipe(job->status_pipes); - cupsdStatBufDelete(job->status_buffer); + /* + * If this printer has any pre-filters, insert the required pre-filter + * in the filters array... + */ - job->status_buffer = NULL; - } + if (job->printer->prefiltertype && filters) + { + prefilters = cupsArrayNew(NULL, NULL); + + for (filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if ((prefilter = mimeFilterLookup(MimeDatabase, filter->src, + job->printer->prefiltertype))) + { + cupsArrayAdd(prefilters, prefilter); + job->cost += prefilter->cost; + } - if ((printer = job->printer) == NULL) - printer = cupsdFindDest(job->dest); + cupsArrayAdd(prefilters, filter); + } - update_job_attrs(job, 0); + cupsArrayDelete(filters); + filters = prefilters; + } + } /* - * Clear the "connecting-to-device" reason, which is only valid when a - * printer is processing... + * Set a minimum cost of 100 for all jobs so that FilterLimit + * works with raw queues and other low-cost paths. */ - cupsdSetPrinterReasons(printer, "-connecting-to-device"); + if (job->cost < 100) + job->cost = 100; /* - * Similarly, clear the "offline-report" reason for non-USB devices since we - * rarely have current information for network devices... + * See if the filter cost is too high... */ - if (strncmp(printer->device_uri, "usb:", 4)) - cupsdSetPrinterReasons(printer, "-offline-report"); - - if (job->status < 0) + if ((FilterLevel + job->cost) > FilterLimit && FilterLevel > 0 && + FilterLimit > 0) { /* - * Backend had errors; stop it... + * Don't print this job quite yet... */ - int exit_code; /* Exit code from backend */ - + cupsArrayDelete(filters); - /* - * Convert the status to an exit code. Due to the way the W* macros are - * implemented on MacOS X (bug?), we have to store the exit status in a - * variable first and then convert... - */ + cupsdLogJob(job, CUPSD_LOG_INFO, + "Holding because filter limit has been reached."); + cupsdLogJob(job, CUPSD_LOG_DEBUG2, + "cupsdContinueJob: file=%d, cost=%d, level=%d, limit=%d", + job->current_file, job->cost, FilterLevel, + FilterLimit); + return; + } - exit_code = -job->status; - if (WIFEXITED(exit_code)) - exit_code = WEXITSTATUS(exit_code); - else - exit_code = job->status; + FilterLevel += job->cost; - cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)", - exit_code, - exit_code == CUPS_BACKEND_FAILED ? "failed" : - exit_code == CUPS_BACKEND_AUTH_REQUIRED ? - "authentication required" : - exit_code == CUPS_BACKEND_HOLD ? "hold job" : - exit_code == CUPS_BACKEND_STOP ? "stop printer" : - exit_code == CUPS_BACKEND_CANCEL ? "cancel job" : - exit_code < 0 ? "crashed" : "unknown"); + /* + * Add decompression/raw filter as needed... + */ + if ((!job->printer->raw && job->compressions[job->current_file]) || + (!filters && !job->printer->remote && + (job->num_files > 1 || !strncmp(job->printer->device_uri, "file:", 5)))) + { /* - * Do what needs to be done... + * Add gziptoany filter to the front of the list... */ - switch (exit_code) - { - default : - case CUPS_BACKEND_FAILED : - /* - * Backend failure, use the error-policy to determine how to - * act... - */ + if (!filters) + filters = cupsArrayNew(NULL, NULL); - cupsdStopJob(job, 0); + if (!cupsArrayInsert(filters, &gziptoany_filter)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to add decompression filter - %s", strerror(errno)); - if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) - { - /* - * Mark the job as pending again - we'll retry on another - * printer... - */ + cupsArrayDelete(filters); - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - } + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Stopping job because the scheduler ran out of " + "memory."); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + FilterLevel -= job->cost; + return; + } + } - /* - * If the job was queued to a class or the error policy is - * "retry-current-job", try requeuing it... For faxes and retry-job - * queues, hold the current job for 5 minutes. - */ + /* + * Add port monitor, if any... + */ - if ((job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) || - !strcmp(printer->error_policy, "retry-current-job")) - cupsdCheckJobs(); - else if ((printer->type & CUPS_PRINTER_FAX) || - !strcmp(printer->error_policy, "retry-job")) - { - /* - * See how many times we've tried to send the job; if more than - * the limit, cancel the job. - */ + if (job->printer->port_monitor) + { + /* + * Add port monitor to the end of the list... + */ - job->tries ++; + if (!filters) + filters = cupsArrayNew(NULL, NULL); - if (job->tries >= JobRetryLimit) - { - /* - * Too many tries... - */ + port_monitor.src = NULL; + port_monitor.dst = NULL; + port_monitor.cost = 0; - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Canceling job since it could not be " - "sent after %d tries.", - JobRetryLimit); + snprintf(port_monitor.filter, sizeof(port_monitor.filter), + "%s/monitor/%s", ServerBin, job->printer->port_monitor); - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); - } - else - { - /* - * Try again in N seconds... - */ + if (!cupsArrayAdd(filters, &port_monitor)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to add port monitor - %s", strerror(errno)); - set_hold_until(job, time(NULL) + JobRetryInterval); + cupsArrayDelete(filters); - cupsdAddEvent(CUPSD_EVENT_JOB_STATE, printer, job, - "Job held due to fax errors; please consult " - "the error_log file for details."); - cupsdSetPrinterState(printer, IPP_PRINTER_IDLE, 0); - } - } - else if (!strcmp(printer->error_policy, "abort-job")) - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); - else - { - cupsdSetPrinterState(printer, IPP_PRINTER_STOPPED, 1); + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Stopping job because the scheduler ran out of " + "memory."); - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job, - "Job stopped due to backend errors; please consult " - "the error_log file for details."); - } - break; + FilterLevel -= job->cost; + return; + } + } - case CUPS_BACKEND_CANCEL : - /* - * Cancel the job... - */ + /* + * Make sure we don't go over the "MAX_FILTERS" limit... + */ - cupsdCancelJob(job, 0, IPP_JOB_CANCELED); - break; + if (cupsArrayCount(filters) > MAX_FILTERS) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Too many filters (%d > %d), unable to print!", + cupsArrayCount(filters), MAX_FILTERS); - case CUPS_BACKEND_HOLD : - /* - * Hold the job... - */ + cupsArrayDelete(filters); + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Stopping job because it needs too many filters to " + "print."); - cupsdStopJob(job, 0); + FilterLevel -= job->cost; + return; + } - cupsdSetJobHoldUntil(job, "indefinite"); + /* + * Determine if we are printing a banner page or not... + */ - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + if (job->job_sheets == NULL) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute."); + if ((job->job_sheets = + ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL) + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "... but someone added one without setting job_sheets!"); + } + else if (job->job_sheets->num_values == 1) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s", + job->job_sheets->values[0].string.text); + else + cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s", + job->job_sheets->values[0].string.text, + job->job_sheets->values[1].string.text); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + if (job->printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) + banner_page = 0; + else if (job->job_sheets == NULL) + banner_page = 0; + else if (strcasecmp(job->job_sheets->values[0].string.text, "none") != 0 && + job->current_file == 0) + banner_page = 1; + else if (job->job_sheets->num_values > 1 && + strcasecmp(job->job_sheets->values[1].string.text, "none") != 0 && + job->current_file == (job->num_files - 1)) + banner_page = 1; + else + banner_page = 0; - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job, - "Job held due to backend errors; please consult " - "the error_log file for details."); - break; + if ((options = get_options(job, banner_page, copies, sizeof(copies), title, + sizeof(title))) == NULL) + { + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Stopping job because the scheduler ran out of memory."); + cupsArrayDelete(filters); - case CUPS_BACKEND_STOP : - /* - * Stop the printer... - */ + FilterLevel -= job->cost; + return; + } - cupsdStopJob(job, 0); + /* + * Build the command-line arguments for the filters. Each filter + * has 6 or 7 arguments: + * + * argv[0] = printer + * argv[1] = job ID + * argv[2] = username + * argv[3] = title + * argv[4] = # copies + * argv[5] = options + * argv[6] = filename (optional; normally stdin) + * + * This allows legacy printer drivers that use the old System V + * printing interface to be used by CUPS. + * + * For remote jobs, we send all of the files in the argument list. + */ - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; + if (job->printer->remote) + argv = calloc(7 + job->num_files, sizeof(char *)); + else + argv = calloc(8, sizeof(char *)); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - - cupsdSetPrinterState(printer, IPP_PRINTER_STOPPED, 1); - - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job, - "Job stopped due to backend errors; please consult " - "the error_log file for details."); - break; - - case CUPS_BACKEND_AUTH_REQUIRED : - cupsdStopJob(job, 0); - - cupsdSetJobHoldUntil(job, "auth-info-required"); - - if ((attr = ippFindAttribute(job->attrs, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); - - if (attr) - { - attr->value_tag = IPP_TAG_KEYWORD; - cupsdSetString(&(attr->values[0].string.text), - "auth-info-required"); - } - - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; + if (!argv) + { + cupsdLogMessage(CUPSD_LOG_DEBUG, "Unable to allocate argument array - %s", + strerror(errno)); + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Stopping job because the scheduler ran out of memory."); + cupsArrayDelete(filters); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + FilterLevel -= job->cost; + return; + } - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job, - "Authentication is required for job %d.", job->id); - break; - } + sprintf(jobid, "%d", job->id); - /* - * Try printing another job... - */ + argv[0] = job->printer->name; + argv[1] = jobid; + argv[2] = job->username; + argv[3] = title; + argv[4] = copies; + argv[5] = options; - cupsdCheckJobs(); - } - else if (job->status > 0) + if (job->printer->remote && job->num_files > 1) { - /* - * Filter had errors; stop job... - */ - - cupsdLogJob(job, CUPSD_LOG_ERROR, "Job stopped due to filter errors."); - cupsdStopJob(job, 1); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, printer, job, - "Job stopped due to filter errors; please consult the " - "error_log file for details."); - cupsdCheckJobs(); + for (i = 0; i < job->num_files; i ++) + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, i + 1); + argv[6 + i] = strdup(filename); + } } else { - /* - * Job printed successfully; cancel it... - */ - - if (job->current_file < job->num_files) - { - /* - * Start the next file in the job... - */ - - FilterLevel -= job->cost; - start_job(job, printer); - } - else - { - /* - * Close out this job... - */ - - cupsdLogJob(job, CUPSD_LOG_INFO, "Completed successfully."); - cupsdCancelJob(job, 0, IPP_JOB_COMPLETED); - cupsdCheckJobs(); - } + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, job->current_file + 1); + argv[6] = filename; } -} - - -/* - * 'cupsdFreeAllJobs()' - Free all jobs from memory. - */ - -void -cupsdFreeAllJobs(void) -{ - cupsd_job_t *job; /* Current job */ + for (i = 0; argv[i]; i ++) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "argv[%d]=\"%s\"", i, argv[i]); - if (!Jobs) - return; + /* + * Create environment variable strings for the filters... + */ - cupsdHoldSignals(); + attr = ippFindAttribute(job->attrs, "attributes-natural-language", + IPP_TAG_LANGUAGE); - cupsdStopAllJobs(1); - cupsdSaveAllJobs(); +#ifdef __APPLE__ + strcpy(apple_language, "APPLE_LANGUAGE="); + _cupsAppleLanguage(attr->values[0].string.text, + apple_language + 15, sizeof(apple_language) - 15); +#endif /* __APPLE__ */ - for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); - job; - job = (cupsd_job_t *)cupsArrayNext(Jobs)) + switch (strlen(attr->values[0].string.text)) { - cupsArrayRemove(Jobs, job); - cupsArrayRemove(ActiveJobs, job); - cupsArrayRemove(PrintingJobs, job); - - cupsdDeleteJob(job); - } - - cupsdReleaseSignals(); -} + default : + /* + * This is an unknown or badly formatted language code; use + * the POSIX locale... + */ + strcpy(lang, "LANG=C"); + break; -/* - * 'cupsdFindJob()' - Find the specified job. - */ + case 2 : + /* + * Just the language code (ll)... + */ -cupsd_job_t * /* O - Job data */ -cupsdFindJob(int id) /* I - Job ID */ -{ - cupsd_job_t key; /* Search key */ + snprintf(lang, sizeof(lang), "LANG=%s.UTF8", + attr->values[0].string.text); + break; + case 5 : + /* + * Language and country code (ll-cc)... + */ - key.id = id; + snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF8", + attr->values[0].string.text[0], + attr->values[0].string.text[1], + toupper(attr->values[0].string.text[3] & 255), + toupper(attr->values[0].string.text[4] & 255)); + break; + } - return ((cupsd_job_t *)cupsArrayFind(Jobs, &key)); -} + if ((attr = ippFindAttribute(job->attrs, "document-format", + IPP_TAG_MIMETYPE)) != NULL && + (ptr = strstr(attr->values[0].string.text, "charset=")) != NULL) + snprintf(charset, sizeof(charset), "CHARSET=%s", ptr + 8); + else + strlcpy(charset, "CHARSET=utf-8", sizeof(charset)); + snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", + job->filetypes[job->current_file]->super, + job->filetypes[job->current_file]->type); + snprintf(device_uri, sizeof(device_uri), "DEVICE_URI=%s", + job->printer->device_uri); + snprintf(ppd, sizeof(ppd), "PPD=%s/ppd/%s.ppd", ServerRoot, + job->printer->name); + snprintf(printer_info, sizeof(printer_name), "PRINTER_INFO=%s", + job->printer->info ? job->printer->info : ""); + snprintf(printer_location, sizeof(printer_name), "PRINTER_LOCATION=%s", + job->printer->location ? job->printer->location : ""); + snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", job->printer->name); + snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); -/* - * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing, - * or held jobs in a printer or class. - */ + envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); -int /* O - Job count */ -cupsdGetPrinterJobCount( - const char *dest) /* I - Printer or class name */ -{ - int count; /* Job count */ - cupsd_job_t *job; /* Current job */ + envp[envc ++] = charset; + envp[envc ++] = lang; +#ifdef __APPLE__ + envp[envc ++] = apple_language; +#endif /* __APPLE__ */ + envp[envc ++] = ppd; + envp[envc ++] = rip_max_cache; + envp[envc ++] = content_type; + envp[envc ++] = device_uri; + envp[envc ++] = printer_info; + envp[envc ++] = printer_location; + envp[envc ++] = printer_name; + envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" : + "CUPS_FILETYPE=document"; + if (!job->printer->remote && !job->printer->raw) + { + filter = (mime_filter_t *)cupsArrayLast(filters); - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; - job; - job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->dest && !strcasecmp(job->dest, dest)) - count ++; + if (job->printer->port_monitor) + filter = (mime_filter_t *)cupsArrayPrev(filters); - return (count); -} + if (filter && filter->dst) + { + snprintf(final_content_type, sizeof(final_content_type), + "FINAL_CONTENT_TYPE=%s/%s", + filter->dst->super, filter->dst->type); + envp[envc ++] = final_content_type; + } + } + if (Classification && !banner_page) + { + if ((attr = ippFindAttribute(job->attrs, "job-sheets", + IPP_TAG_NAME)) == NULL) + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + Classification); + else if (attr->num_values > 1 && + strcmp(attr->values[1].string.text, "none") != 0) + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + attr->values[1].string.text); + else + snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", + attr->values[0].string.text); -/* - * 'cupsdGetUserJobCount()' - Get the number of pending, processing, - * or held jobs for a user. - */ + envp[envc ++] = classification; + } -int /* O - Job count */ -cupsdGetUserJobCount( - const char *username) /* I - Username */ -{ - int count; /* Job count */ - cupsd_job_t *job; /* Current job */ + if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + snprintf(class_name, sizeof(class_name), "CLASS=%s", job->dest); + envp[envc ++] = class_name; + } + if (job->auth_username) + envp[envc ++] = job->auth_username; + if (job->auth_domain) + envp[envc ++] = job->auth_domain; + if (job->auth_password) + envp[envc ++] = job->auth_password; - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; - job; - job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (!strcasecmp(job->username, username)) - count ++; +#ifdef HAVE_GSSAPI + if (job->ccname) + envp[envc ++] = job->ccname; +#endif /* HAVE_GSSAPI */ - return (count); -} + envp[envc] = NULL; + for (i = 0; i < envc; i ++) + if (!strncmp(envp[i], "AUTH_", 5)) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i, + envp[i][5]); + else if (strncmp(envp[i], "DEVICE_URI=", 11)) + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]); + else + cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i, + job->printer->sanitized_device_uri); -/* - * 'cupsdHoldJob()' - Hold the specified job. - */ + if (job->printer->remote) + job->current_file = job->num_files; + else + job->current_file ++; -void -cupsdHoldJob(cupsd_job_t *job) /* I - Job data */ -{ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdHoldJob: id = %d", job->id); + /* + * Now create processes for all of the filters... + */ - if (job->state_value == IPP_JOB_PROCESSING) - cupsdStopJob(job, 0); - else - cupsdLoadJob(job); + filterfds[0][0] = -1; + filterfds[0][1] = -1; + filterfds[1][0] = -1; + filterfds[1][1] = -1; - DEBUG_puts("cupsdHoldJob: setting state to held..."); + memset(job->filters, 0, sizeof(job->filters)); - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; - job->current_file = 0; + for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters); + filter; + i ++, filter = (mime_filter_t *)cupsArrayNext(filters)) + { + if (filter->filter[0] != '/') + snprintf(command, sizeof(command), "%s/filter/%s", ServerBin, + filter->filter); + else + strlcpy(command, filter->filter, sizeof(command)); - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); -} + if (i < (cupsArrayCount(filters) - 1)) + { + if (cupsdOpenPipe(filterfds[slot])) + { + abort_message = "Stopping job because the scheduler could not create " + "the filter pipes."; + goto abort_job; + } + } + else + { + if (job->current_file == 1) + { + if (strncmp(job->printer->device_uri, "file:", 5) != 0) + { + if (cupsdOpenPipe(job->print_pipes)) + { + abort_message = "Stopping job because the scheduler could not " + "create the backend pipes."; -/* - * 'cupsdLoadAllJobs()' - Load all jobs from disk. - */ + goto abort_job; + } + } + else + { + job->print_pipes[0] = -1; + if (!strcmp(job->printer->device_uri, "file:/dev/null") || + !strcmp(job->printer->device_uri, "file:///dev/null")) + job->print_pipes[1] = -1; + else + { + if (!strncmp(job->printer->device_uri, "file:/dev/", 10)) + job->print_pipes[1] = open(job->printer->device_uri + 5, + O_WRONLY | O_EXCL); + else if (!strncmp(job->printer->device_uri, "file:///dev/", 12)) + job->print_pipes[1] = open(job->printer->device_uri + 7, + O_WRONLY | O_EXCL); + else if (!strncmp(job->printer->device_uri, "file:///", 8)) + job->print_pipes[1] = open(job->printer->device_uri + 7, + O_WRONLY | O_CREAT | O_TRUNC, 0600); + else + job->print_pipes[1] = open(job->printer->device_uri + 5, + O_WRONLY | O_CREAT | O_TRUNC, 0600); -void -cupsdLoadAllJobs(void) -{ - char filename[1024]; /* Full filename of job.cache file */ - struct stat fileinfo, /* Information on job.cache file */ - dirinfo; /* Information on RequestRoot dir */ + if (job->print_pipes[1] < 0) + { + abort_message = "Stopping job because the scheduler could not " + "open the output file."; + goto abort_job; + } + fcntl(job->print_pipes[1], F_SETFD, + fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC); + } + } + } - /* - * Create the job arrays as needed... - */ + filterfds[slot][0] = job->print_pipes[0]; + filterfds[slot][1] = job->print_pipes[1]; + } - if (!Jobs) - Jobs = cupsArrayNew(compare_jobs, NULL); + pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], + filterfds[slot][1], job->status_pipes[1], + job->back_pipes[0], job->side_pipes[0], 0, + job->profile, job->id, job->filters + i); - if (!ActiveJobs) - ActiveJobs = cupsArrayNew(compare_active_jobs, NULL); + cupsdClosePipe(filterfds[!slot]); - if (!PrintingJobs) - PrintingJobs = cupsArrayNew(compare_jobs, NULL); + if (pid == 0) + { + cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.", + filter->filter, strerror(errno)); - /* - * See whether the job.cache file is older than the RequestRoot directory... - */ + abort_message = "Stopped job because the scheduler could not execute a " + "filter."; - snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir); + goto abort_job; + } - if (stat(filename, &fileinfo)) - { - fileinfo.st_mtime = 0; + cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command, + pid); - if (errno != ENOENT) - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to get file information for \"%s\" - %s", - filename, strerror(errno)); + argv[6] = NULL; + slot = !slot; } - if (stat(RequestRoot, &dirinfo)) - { - dirinfo.st_mtime = 0; - - if (errno != ENOENT) - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to get directory information for \"%s\" - %s", - RequestRoot, strerror(errno)); - } + cupsArrayDelete(filters); + filters = NULL; /* - * Load the most recent source for job data... + * Finally, pipe the final output into a backend process if needed... */ - if (dirinfo.st_mtime > fileinfo.st_mtime) + if (strncmp(job->printer->device_uri, "file:", 5) != 0) { - load_request_root(); + if (job->current_file == 1 || job->printer->remote) + { + sscanf(job->printer->device_uri, "%254[^:]", scheme); + snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, scheme); - load_next_job_id(filename); - } - else - load_job_cache(filename); + /* + * See if the backend needs to run as root... + */ - /* - * Clean out old jobs as needed... - */ + if (RunUser) + backroot = 0; + else if (stat(command, &backinfo)) + backroot = 0; + else + backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO)); - if (MaxJobs > 0 && cupsArrayCount(Jobs) >= MaxJobs) - cupsdCleanJobs(); -} + argv[0] = job->printer->sanitized_device_uri; + filterfds[slot][0] = -1; + filterfds[slot][1] = -1; -/* - * 'cupsdLoadJob()' - Load a single job... - */ + pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], + filterfds[slot][1], job->status_pipes[1], + job->back_pipes[1], job->side_pipes[1], + backroot, job->profile, job->id, &(job->backend)); -int /* O - 1 on success, 0 on failure */ -cupsdLoadJob(cupsd_job_t *job) /* I - Job */ -{ - char jobfile[1024]; /* Job filename */ - cups_file_t *fp; /* Job file */ - int fileid; /* Current file ID */ - ipp_attribute_t *attr; /* Job attribute */ - const char *dest; /* Destination name */ - cupsd_printer_t *destptr; /* Pointer to destination */ - mime_type_t **filetypes; /* New filetypes array */ - int *compressions; /* New compressions array */ + if (pid == 0) + { + abort_message = "Stopping job because the sheduler could not execute " + "the backend."; + + goto abort_job; + } + else + { + cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)", + command, pid); + } + } + if (job->current_file == job->num_files) + { + cupsdClosePipe(job->print_pipes); + cupsdClosePipe(job->back_pipes); + cupsdClosePipe(job->side_pipes); - if (job->attrs) + close(job->status_pipes[1]); + job->status_pipes[1] = -1; + } + } + else { - if (job->state_value > IPP_JOB_STOPPED) - job->access_time = time(NULL); + filterfds[slot][0] = -1; + filterfds[slot][1] = -1; - return (1); + if (job->current_file == job->num_files) + { + cupsdClosePipe(job->print_pipes); + + close(job->status_pipes[1]); + job->status_pipes[1] = -1; + } } - if ((job->attrs = ippNew()) == NULL) + cupsdClosePipe(filterfds[slot]); + + if (job->printer->remote && job->num_files > 1) { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Ran out of memory for job attributes!", job->id); - return (0); + for (i = 0; i < job->num_files; i ++) + free(argv[i + 6]); } - /* - * Load job attributes... - */ + free(argv); - cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id); + cupsdAddSelect(job->status_buffer->fd, (cupsd_selfunc_t)update_job, NULL, + job); - snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id); - if ((fp = cupsFileOpen(jobfile, "r")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to open job control file \"%s\" - %s!", - job->id, jobfile, strerror(errno)); - goto error; - } + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.", + job->id); - if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to read job control file \"%s\"!", job->id, - jobfile); - cupsFileClose(fp); - goto error; - } + return; - cupsFileClose(fp); /* - * Copy attribute data to the job object... + * If we get here, we need to abort the current job and close out all + * files and pipes... */ - if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Missing or bad time-at-creation attribute in " - "control file!", job->id); - goto error; - } + abort_job: - if ((job->state = ippFindAttribute(job->attrs, "job-state", - IPP_TAG_ENUM)) == NULL) + for (slot = 0; slot < 2; slot ++) + cupsdClosePipe(filterfds[slot]); + + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + cupsArrayDelete(filters); + + if (job->printer->remote && job->num_files > 1) { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Missing or bad job-state attribute in control " - "file!", job->id); - goto error; + for (i = 0; i < job->num_files; i ++) + free(argv[i + 6]); } - job->state_value = (ipp_jstate_t)job->state->values[0].integer; + free(argv); - if (!job->dest) - { - if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", - IPP_TAG_URI)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] No job-printer-uri attribute in control file!", - job->id); - goto error; - } - - if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype), - &destptr)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to queue job for destination \"%s\"!", - job->id, attr->values[0].string.text); - goto error; - } - - cupsdSetString(&job->dest, dest); - } - else if ((destptr = cupsdFindDest(job->dest)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to queue job for destination \"%s\"!", - job->id, job->dest); - goto error; - } - - job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", - IPP_TAG_INTEGER); - job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); - - if (!job->priority) - { - if ((attr = ippFindAttribute(job->attrs, "job-priority", - IPP_TAG_INTEGER)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Missing or bad job-priority attribute in " - "control file!", job->id); - goto error; - } - - job->priority = attr->values[0].integer; - } - - if (!job->username) - { - if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name", - IPP_TAG_NAME)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Missing or bad job-originating-user-name " - "attribute in control file!", job->id); - goto error; - } - - cupsdSetString(&job->username, attr->values[0].string.text); - } + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, "%s", + abort_message); +} - /* - * Set the job hold-until time and state... - */ - if (job->state_value == IPP_JOB_HELD) - { - if ((attr = ippFindAttribute(job->attrs, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); +/* + * 'cupsdDeleteJob()' - Free all memory used by a job. + */ - if (attr) - cupsdSetJobHoldUntil(job, attr->values[0].string.text); - else - { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - } - } - else if (job->state_value == IPP_JOB_PROCESSING) - { - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - } +void +cupsdDeleteJob(cupsd_job_t *job, /* I - Job */ + cupsd_jobaction_t action)/* I - Action */ +{ + if (job->printer) + finalize_job(job); - if (!job->num_files) + if (action == CUPSD_JOB_PURGE) { /* - * Find all the d##### files... + * Remove the job info file... */ - for (fileid = 1; fileid < 10000; fileid ++) - { - snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, - job->id, fileid); - - if (access(jobfile, 0)) - break; - - cupsdLogMessage(CUPSD_LOG_DEBUG, - "[Job %d] Auto-typing document file \"%s\"...", job->id, - jobfile); - - if (fileid > job->num_files) - { - if (job->num_files == 0) - { - compressions = (int *)calloc(fileid, sizeof(int)); - filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *)); - } - else - { - compressions = (int *)realloc(job->compressions, - sizeof(int) * fileid); - filetypes = (mime_type_t **)realloc(job->filetypes, - sizeof(mime_type_t *) * - fileid); - } - - if (!compressions || !filetypes) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Ran out of memory for job file types!", - job->id); - return (1); - } - - job->compressions = compressions; - job->filetypes = filetypes; - job->num_files = fileid; - } - - job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL, - job->compressions + fileid - 1); + char filename[1024]; /* Job filename */ - if (!job->filetypes[fileid - 1]) - job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application", - "vnd.cups-raw"); - } + snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, + job->id); + unlink(filename); } + cupsdClearString(&job->username); + cupsdClearString(&job->dest); + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); + +#ifdef HAVE_GSSAPI /* - * Load authentication information as needed... + * Destroy the credential cache and clear the KRB5CCNAME env var string. */ - if (job->state_value < IPP_JOB_STOPPED) + if (job->ccache) { - snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id); - - cupsdClearString(&job->auth_username); - cupsdClearString(&job->auth_domain); - cupsdClearString(&job->auth_password); - - if ((fp = cupsFileOpen(jobfile, "r")) != NULL) - { - int i, /* Looping var */ - bytes; /* Size of auth data */ - char line[255], /* Line from file */ - data[255]; /* Decoded data */ - + krb5_cc_destroy(KerberosContext, job->ccache); + job->ccache = NULL; + } - for (i = 0; - i < destptr->num_auth_info_required && - cupsFileGets(fp, line, sizeof(line)); - i ++) - { - bytes = sizeof(data); - httpDecode64_2(data, &bytes, line); + cupsdClearString(&job->ccname); +#endif /* HAVE_GSSAPI */ - if (!strcmp(destptr->auth_info_required[i], "username")) - cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", data); - else if (!strcmp(destptr->auth_info_required[i], "domain")) - cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", data); - else if (!strcmp(destptr->auth_info_required[i], "password")) - cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", data); - } + if (job->num_files > 0) + { + free(job->compressions); + free(job->filetypes); - cupsFileClose(fp); - } + job->num_files = 0; } - job->access_time = time(NULL); - return (1); - - /* - * If we get here then something bad happened... - */ + unload_job(job); - error: + cupsArrayRemove(Jobs, job); + cupsArrayRemove(ActiveJobs, job); + cupsArrayRemove(PrintingJobs, job); - ippDelete(job->attrs); - job->attrs = NULL; - unlink(jobfile); - return (0); + free(job); } /* - * 'cupsdMoveJob()' - Move the specified job to a different destination. + * 'cupsdFreeAllJobs()' - Free all jobs from memory. */ void -cupsdMoveJob(cupsd_job_t *job, /* I - Job */ - cupsd_printer_t *p) /* I - Destination printer or class */ +cupsdFreeAllJobs(void) { - ipp_attribute_t *attr; /* job-printer-uri attribute */ - const char *olddest; /* Old destination */ - cupsd_printer_t *oldp; /* Old pointer */ - + cupsd_job_t *job; /* Current job */ - /* - * Don't move completed jobs... - */ - if (job->state_value > IPP_JOB_STOPPED) + if (!Jobs) return; - /* - * Get the old destination... - */ + cupsdHoldSignals(); - olddest = job->dest; + cupsdStopAllJobs(1); + cupsdSaveAllJobs(); - if (job->printer) - oldp = job->printer; - else - oldp = cupsdFindDest(olddest); + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + cupsdDeleteJob(job, CUPSD_JOB_DEFAULT); - /* - * Change the destination information... - */ + cupsdReleaseSignals(); +} - if (job->state_value == IPP_JOB_PROCESSING) - cupsdStopJob(job, 0); - else - cupsdLoadJob(job); - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, oldp, job, - "Job #%d moved from %s to %s.", job->id, olddest, - p->name); +/* + * 'cupsdFindJob()' - Find the specified job. + */ - cupsdSetString(&job->dest, p->name); - job->dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | - CUPS_PRINTER_IMPLICIT); +cupsd_job_t * /* O - Job data */ +cupsdFindJob(int id) /* I - Job ID */ +{ + cupsd_job_t key; /* Search key */ - if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", - IPP_TAG_URI)) != NULL) - cupsdSetString(&(attr->values[0].string.text), p->uri); - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job, - "Job #%d moved from %s to %s.", job->id, olddest, - p->name); + key.id = id; - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + return ((cupsd_job_t *)cupsArrayFind(Jobs, &key)); } /* - * 'cupsdReleaseJob()' - Release the specified job. + * 'cupsdGetPrinterJobCount()' - Get the number of pending, processing, + * or held jobs in a printer or class. */ -void -cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ +int /* O - Job count */ +cupsdGetPrinterJobCount( + const char *dest) /* I - Printer or class name */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob: id = %d", job->id); - - if (job->state_value == IPP_JOB_HELD) - { - /* - * Add trailing banner as needed... - */ + int count; /* Job count */ + cupsd_job_t *job; /* Current job */ - if (job->pending_timeout) - cupsdTimeoutJob(job); - DEBUG_puts("cupsdReleaseJob: setting state to pending..."); + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (job->dest && !strcasecmp(job->dest, dest)) + count ++; - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - } + return (count); } /* - * 'cupsdRestartJob()' - Restart the specified job. + * 'cupsdGetUserJobCount()' - Get the number of pending, processing, + * or held jobs for a user. */ -void -cupsdRestartJob(cupsd_job_t *job) /* I - Job */ +int /* O - Job count */ +cupsdGetUserJobCount( + const char *username) /* I - Username */ { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob: id = %d", job->id); - - if (job->state_value == IPP_JOB_STOPPED || job->num_files) - { - ipp_jstate_t old_state; /* Old job state */ - - - cupsdLoadJob(job); - - old_state = job->state_value; + int count; /* Job count */ + cupsd_job_t *job; /* Current job */ - job->tries = 0; - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); + for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs), count = 0; + job; + job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) + if (!strcasecmp(job->username, username)) + count ++; - if (old_state > IPP_JOB_STOPPED) - cupsArrayAdd(ActiveJobs, job); - } + return (count); } /* - * 'cupsdSaveAllJobs()' - Save a summary of all jobs to disk. + * 'cupsdLoadAllJobs()' - Load all jobs from disk. */ void -cupsdSaveAllJobs(void) +cupsdLoadAllJobs(void) { - int i; /* Looping var */ - cups_file_t *fp; /* Job cache file */ - char temp[1024]; /* Temporary string */ - cupsd_job_t *job; /* Current job */ - time_t curtime; /* Current time */ - struct tm *curdate; /* Current date */ - + char filename[1024]; /* Full filename of job.cache file */ + struct stat fileinfo, /* Information on job.cache file */ + dirinfo; /* Information on RequestRoot dir */ - snprintf(temp, sizeof(temp), "%s/job.cache", CacheDir); - if ((fp = cupsFileOpen(temp, "w")) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to create job cache file \"%s\" - %s", - temp, strerror(errno)); - return; - } - cupsdLogMessage(CUPSD_LOG_INFO, "Saving job cache file \"%s\"...", temp); /* - * Restrict access to the file... + * Create the job arrays as needed... */ - fchown(cupsFileNumber(fp), getuid(), Group); - fchmod(cupsFileNumber(fp), ConfigFilePerm); + if (!Jobs) + Jobs = cupsArrayNew(compare_jobs, NULL); + + if (!ActiveJobs) + ActiveJobs = cupsArrayNew(compare_active_jobs, NULL); + + if (!PrintingJobs) + PrintingJobs = cupsArrayNew(compare_jobs, NULL); /* - * Write a small header to the file... + * See whether the job.cache file is older than the RequestRoot directory... */ - curtime = time(NULL); - curdate = localtime(&curtime); - strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); + snprintf(filename, sizeof(filename), "%s/job.cache", CacheDir); - cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); - cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); - cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); + if (stat(filename, &fileinfo)) + { + fileinfo.st_mtime = 0; + + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to get file information for \"%s\" - %s", + filename, strerror(errno)); + } + + if (stat(RequestRoot, &dirinfo)) + { + dirinfo.st_mtime = 0; + + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to get directory information for \"%s\" - %s", + RequestRoot, strerror(errno)); + } /* - * Write each job known to the system... + * Load the most recent source for job data... */ - for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); - job; - job = (cupsd_job_t *)cupsArrayNext(Jobs)) + if (dirinfo.st_mtime > fileinfo.st_mtime) { - cupsFilePrintf(fp, "\n", job->id); - cupsFilePrintf(fp, "State %d\n", job->state_value); - cupsFilePrintf(fp, "Priority %d\n", job->priority); - cupsFilePrintf(fp, "Username %s\n", job->username); - cupsFilePrintf(fp, "Destination %s\n", job->dest); - cupsFilePrintf(fp, "DestType %d\n", job->dtype); - cupsFilePrintf(fp, "NumFiles %d\n", job->num_files); - for (i = 0; i < job->num_files; i ++) - cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super, - job->filetypes[i]->type, job->compressions[i]); - cupsFilePuts(fp, "\n"); + load_request_root(); + + load_next_job_id(filename); } + else + load_job_cache(filename); - cupsFileClose(fp); + /* + * Clean out old jobs as needed... + */ + + if (MaxJobs > 0 && cupsArrayCount(Jobs) >= MaxJobs) + cupsdCleanJobs(); } /* - * 'cupsdSaveJob()' - Save a job to disk. + * 'cupsdLoadJob()' - Load a single job. */ -void -cupsdSaveJob(cupsd_job_t *job) /* I - Job */ +int /* O - 1 on success, 0 on failure */ +cupsdLoadJob(cupsd_job_t *job) /* I - Job */ { - char filename[1024]; /* Job control filename */ - cups_file_t *fp; /* Job file */ + char jobfile[1024]; /* Job filename */ + cups_file_t *fp; /* Job file */ + int fileid; /* Current file ID */ + ipp_attribute_t *attr; /* Job attribute */ + const char *dest; /* Destination name */ + cupsd_printer_t *destptr; /* Pointer to destination */ + mime_type_t **filetypes; /* New filetypes array */ + int *compressions; /* New compressions array */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", - job, job->id, job->attrs); + if (job->attrs) + { + if (job->state_value > IPP_JOB_STOPPED) + job->access_time = time(NULL); - snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, job->id); + return (1); + } - if ((fp = cupsFileOpen(filename, "w")) == NULL) + if ((job->attrs = ippNew()) == NULL) { - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to create job control file \"%s\" - %s.", - job->id, filename, strerror(errno)); - return; + cupsdLogJob(job, CUPSD_LOG_ERROR, "Ran out of memory for job attributes!"); + return (0); } - fchmod(cupsFileNumber(fp), 0600); - fchown(cupsFileNumber(fp), RunUser, Group); + /* + * Load job attributes... + */ - job->attrs->state = IPP_IDLE; + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading attributes...", job->id); - if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, - job->attrs) != IPP_DATA) + snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, job->id); + if ((fp = cupsFileOpen(jobfile, "r")) == NULL) + { cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unable to write job control file!", job->id); - - cupsFileClose(fp); - - job->dirty = 0; -} - - -/* - * 'cupsdSetJobHoldUntil()' - Set the hold time for a job... - */ - -void -cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ - const char *when) /* I - When to resume */ -{ - time_t curtime; /* Current time */ - struct tm *curdate; /* Current date */ - int hour; /* Hold hour */ - int minute; /* Hold minute */ - int second; /* Hold second */ + "[Job %d] Unable to open job control file \"%s\" - %s!", + job->id, jobfile, strerror(errno)); + goto error; + } + if (ippReadIO(fp, (ipp_iocb_t)cupsFileRead, 1, NULL, job->attrs) != IPP_DATA) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to read job control file \"%s\"!", job->id, + jobfile); + cupsFileClose(fp); + goto error; + } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil(%d, \"%s\")", - job->id, when); + cupsFileClose(fp); - second = 0; + /* + * Copy attribute data to the job object... + */ - if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required")) + if (!ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER)) { - /* - * Hold indefinitely... - */ - - job->hold_until = 0; + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad time-at-creation attribute in " + "control file!", job->id); + goto error; } - else if (!strcmp(when, "day-time")) + + if ((job->state = ippFindAttribute(job->attrs, "job-state", + IPP_TAG_ENUM)) == NULL) { - /* - * Hold to 6am the next morning unless local time is < 6pm. - */ + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-state attribute in control " + "file!", job->id); + goto error; + } - curtime = time(NULL); - curdate = localtime(&curtime); + job->state_value = (ipp_jstate_t)job->state->values[0].integer; - if (curdate->tm_hour < 18) - job->hold_until = curtime; - else - job->hold_until = curtime + - ((29 - curdate->tm_hour) * 60 + 59 - - curdate->tm_min) * 60 + 60 - curdate->tm_sec; - } - else if (!strcmp(when, "evening") || !strcmp(when, "night")) + if (!job->dest) { - /* - * Hold to 6pm unless local time is > 6pm or < 6am. - */ + if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", + IPP_TAG_URI)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] No job-printer-uri attribute in control file!", + job->id); + goto error; + } - curtime = time(NULL); - curdate = localtime(&curtime); + if ((dest = cupsdValidateDest(attr->values[0].string.text, &(job->dtype), + &destptr)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to queue job for destination \"%s\"!", + job->id, attr->values[0].string.text); + goto error; + } - if (curdate->tm_hour < 6 || curdate->tm_hour >= 18) - job->hold_until = curtime; - else - job->hold_until = curtime + - ((17 - curdate->tm_hour) * 60 + 59 - - curdate->tm_min) * 60 + 60 - curdate->tm_sec; + cupsdSetString(&job->dest, dest); } - else if (!strcmp(when, "second-shift")) + else if ((destptr = cupsdFindDest(job->dest)) == NULL) { - /* - * Hold to 4pm unless local time is > 4pm. - */ + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to queue job for destination \"%s\"!", + job->id, job->dest); + goto error; + } - curtime = time(NULL); - curdate = localtime(&curtime); + job->sheets = ippFindAttribute(job->attrs, "job-media-sheets-completed", + IPP_TAG_INTEGER); + job->job_sheets = ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_NAME); - if (curdate->tm_hour >= 16) - job->hold_until = curtime; - else - job->hold_until = curtime + - ((15 - curdate->tm_hour) * 60 + 59 - - curdate->tm_min) * 60 + 60 - curdate->tm_sec; + if (!job->priority) + { + if ((attr = ippFindAttribute(job->attrs, "job-priority", + IPP_TAG_INTEGER)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-priority attribute in " + "control file!", job->id); + goto error; + } + + job->priority = attr->values[0].integer; } - else if (!strcmp(when, "third-shift")) + + if (!job->username) { - /* - * Hold to 12am unless local time is < 8am. - */ + if ((attr = ippFindAttribute(job->attrs, "job-originating-user-name", + IPP_TAG_NAME)) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Missing or bad job-originating-user-name " + "attribute in control file!", job->id); + goto error; + } - curtime = time(NULL); - curdate = localtime(&curtime); + cupsdSetString(&job->username, attr->values[0].string.text); + } - if (curdate->tm_hour < 8) - job->hold_until = curtime; + /* + * Set the job hold-until time and state... + */ + + if (job->state_value == IPP_JOB_HELD) + { + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) + cupsdSetJobHoldUntil(job, attr->values[0].string.text, CUPSD_JOB_DEFAULT); else - job->hold_until = curtime + - ((23 - curdate->tm_hour) * 60 + 59 - - curdate->tm_min) * 60 + 60 - curdate->tm_sec; + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } } - else if (!strcmp(when, "weekend")) + else if (job->state_value == IPP_JOB_PROCESSING) + { + job->state->values[0].integer = IPP_JOB_PENDING; + job->state_value = IPP_JOB_PENDING; + } + + if (!job->num_files) { /* - * Hold to weekend unless we are in the weekend. + * Find all the d##### files... */ - curtime = time(NULL); - curdate = localtime(&curtime); + for (fileid = 1; fileid < 10000; fileid ++) + { + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, + job->id, fileid); - if (curdate->tm_wday == 0 || curdate->tm_wday == 6) - job->hold_until = curtime; - else - job->hold_until = curtime + - (((5 - curdate->tm_wday) * 24 + - (17 - curdate->tm_hour)) * 60 + 59 - - curdate->tm_min) * 60 + 60 - curdate->tm_sec; + if (access(jobfile, 0)) + break; + + cupsdLogMessage(CUPSD_LOG_DEBUG, + "[Job %d] Auto-typing document file \"%s\"...", job->id, + jobfile); + + if (fileid > job->num_files) + { + if (job->num_files == 0) + { + compressions = (int *)calloc(fileid, sizeof(int)); + filetypes = (mime_type_t **)calloc(fileid, sizeof(mime_type_t *)); + } + else + { + compressions = (int *)realloc(job->compressions, + sizeof(int) * fileid); + filetypes = (mime_type_t **)realloc(job->filetypes, + sizeof(mime_type_t *) * + fileid); + } + + if (!compressions || !filetypes) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Ran out of memory for job file types!", + job->id); + return (1); + } + + job->compressions = compressions; + job->filetypes = filetypes; + job->num_files = fileid; + } + + job->filetypes[fileid - 1] = mimeFileType(MimeDatabase, jobfile, NULL, + job->compressions + fileid - 1); + + if (!job->filetypes[fileid - 1]) + job->filetypes[fileid - 1] = mimeType(MimeDatabase, "application", + "vnd.cups-raw"); + } } - else if (sscanf(when, "%d:%d:%d", &hour, &minute, &second) >= 2) + + /* + * Load authentication information as needed... + */ + + if (job->state_value < IPP_JOB_STOPPED) { - /* - * Hold to specified GMT time (HH:MM or HH:MM:SS)... - */ + snprintf(jobfile, sizeof(jobfile), "%s/a%05d", RequestRoot, job->id); - curtime = time(NULL); - curdate = gmtime(&curtime); + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); - job->hold_until = curtime + - ((hour - curdate->tm_hour) * 60 + minute - - curdate->tm_min) * 60 + second - curdate->tm_sec; + if ((fp = cupsFileOpen(jobfile, "r")) != NULL) + { + int i, /* Looping var */ + bytes; /* Size of auth data */ + char line[255], /* Line from file */ + data[255]; /* Decoded data */ - /* - * Hold until next day as needed... - */ - if (job->hold_until < curtime) - job->hold_until += 24 * 60 * 60; + for (i = 0; + i < destptr->num_auth_info_required && + cupsFileGets(fp, line, sizeof(line)); + i ++) + { + bytes = sizeof(data); + httpDecode64_2(data, &bytes, line); + + if (!strcmp(destptr->auth_info_required[i], "username")) + cupsdSetStringf(&job->auth_username, "AUTH_USERNAME=%s", data); + else if (!strcmp(destptr->auth_info_required[i], "domain")) + cupsdSetStringf(&job->auth_domain, "AUTH_DOMAIN=%s", data); + else if (!strcmp(destptr->auth_info_required[i], "password")) + cupsdSetStringf(&job->auth_password, "AUTH_PASSWORD=%s", data); + } + + cupsFileClose(fp); + } } - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until = %d", - (int)job->hold_until); + job->access_time = time(NULL); + return (1); + + /* + * If we get here then something bad happened... + */ + + error: + + ippDelete(job->attrs); + job->attrs = NULL; + unlink(jobfile); + + return (0); } /* - * 'cupsdSetJobPriority()' - Set the priority of a job, moving it up/down in - * the list as needed. + * 'cupsdMoveJob()' - Move the specified job to a different destination. */ void -cupsdSetJobPriority( - cupsd_job_t *job, /* I - Job ID */ - int priority) /* I - New priority (0 to 100) */ +cupsdMoveJob(cupsd_job_t *job, /* I - Job */ + cupsd_printer_t *p) /* I - Destination printer or class */ { - ipp_attribute_t *attr; /* Job attribute */ + ipp_attribute_t *attr; /* job-printer-uri attribute */ + const char *olddest; /* Old destination */ + cupsd_printer_t *oldp; /* Old pointer */ /* - * Don't change completed jobs... + * Don't move completed jobs... */ - if (job->state_value >= IPP_JOB_PROCESSING) + if (job->state_value > IPP_JOB_STOPPED) return; /* - * Set the new priority and re-add the job into the active list... + * Get the old destination... */ - cupsArrayRemove(ActiveJobs, job); - - job->priority = priority; + olddest = job->dest; - if ((attr = ippFindAttribute(job->attrs, "job-priority", - IPP_TAG_INTEGER)) != NULL) - attr->values[0].integer = priority; + if (job->printer) + oldp = job->printer; else - ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority", - priority); + oldp = cupsdFindDest(olddest); - cupsArrayAdd(ActiveJobs, job); + /* + * Change the destination information... + */ + + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Stopping job prior to move."); + + cupsdAddEvent(CUPSD_EVENT_JOB_CONFIG_CHANGED, oldp, job, + "Job #%d moved from %s to %s.", job->id, olddest, + p->name); + + cupsdSetString(&job->dest, p->name); + job->dtype = p->type & (CUPS_PRINTER_CLASS | CUPS_PRINTER_REMOTE | + CUPS_PRINTER_IMPLICIT); + + if ((attr = ippFindAttribute(job->attrs, "job-printer-uri", + IPP_TAG_URI)) != NULL) + cupsdSetString(&(attr->values[0].string.text), p->uri); + + cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job, + "Job #%d moved from %s to %s.", job->id, olddest, + p->name); job->dirty = 1; cupsdMarkDirty(CUPSD_DIRTY_JOBS); @@ -1767,1117 +1744,966 @@ cupsdSetJobPriority( /* - * 'cupsdStopAllJobs()' - Stop all print jobs. + * 'cupsdReleaseJob()' - Release the specified job. */ void -cupsdStopAllJobs(int force) /* I - 1 = Force all filters to stop */ +cupsdReleaseJob(cupsd_job_t *job) /* I - Job */ { - cupsd_job_t *job; /* Current job */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdReleaseJob(job=%p(%d))", job, + job->id); + if (job->state_value == IPP_JOB_HELD) + { + /* + * Add trailing banner as needed... + */ - DEBUG_puts("cupsdStopAllJobs()"); + if (job->pending_timeout) + cupsdTimeoutJob(job); - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); - job; - job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value == IPP_JOB_PROCESSING) - { - cupsdStopJob(job, force); - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - } + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job released by user."); + } } /* - * 'cupsdStopJob()' - Stop a print job. + * 'cupsdRestartJob()' - Restart the specified job. */ void -cupsdStopJob(cupsd_job_t *job, /* I - Job */ - int force) /* I - 1 = Force all filters to stop */ +cupsdRestartJob(cupsd_job_t *job) /* I - Job */ { - int i; /* Looping var */ - - - cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] cupsdStopJob: force = %d", - job->id, force); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRestartJob(job=%p(%d))", job, + job->id); - if (job->state_value != IPP_JOB_PROCESSING) - return; - - FilterLevel -= job->cost; + if (job->state_value == IPP_JOB_STOPPED || job->num_files) + cupsdSetJobState(job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job restarted by user."); +} - if (job->printer->state == IPP_PRINTER_PROCESSING) - cupsdSetPrinterState(job->printer, IPP_PRINTER_IDLE, 0); - job->state->values[0].integer = IPP_JOB_STOPPED; - job->state_value = IPP_JOB_STOPPED; - job->printer->job = NULL; - job->printer = NULL; +/* + * 'cupsdSaveAllJobs()' - Save a summary of all jobs to disk. + */ - job->current_file --; +void +cupsdSaveAllJobs(void) +{ + int i; /* Looping var */ + cups_file_t *fp; /* Job cache file */ + char temp[1024]; /* Temporary string */ + cupsd_job_t *job; /* Current job */ + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ - for (i = 0; job->filters[i]; i ++) - if (job->filters[i] > 0) - { - cupsdEndProcess(job->filters[i], force); - if (force) - job->filters[i] = 0; - } - if (job->backend > 0) + snprintf(temp, sizeof(temp), "%s/job.cache", CacheDir); + if ((fp = cupsFileOpen(temp, "w")) == NULL) { - cupsdEndProcess(job->backend, force); - if (force) - job->backend = 0; - } - - if (!force) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to create job cache file \"%s\" - %s", + temp, strerror(errno)); return; + } - cupsdDestroyProfile(job->profile); - job->profile = NULL; + cupsdLogMessage(CUPSD_LOG_INFO, "Saving job cache file \"%s\"...", temp); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing print pipes [ %d %d ]...", - job->id, job->print_pipes[0], job->print_pipes[1]); + /* + * Restrict access to the file... + */ - cupsdClosePipe(job->print_pipes); + fchown(cupsFileNumber(fp), getuid(), Group); + fchmod(cupsFileNumber(fp), ConfigFilePerm); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing back pipes [ %d %d ]...", - job->id, job->back_pipes[0], job->back_pipes[1]); + /* + * Write a small header to the file... + */ - cupsdClosePipe(job->back_pipes); + curtime = time(NULL); + curdate = localtime(&curtime); + strftime(temp, sizeof(temp) - 1, "%Y-%m-%d %H:%M", curdate); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "[Job %d] Closing side pipes [ %d %d ]...", - job->id, job->side_pipes[0], job->side_pipes[1]); + cupsFilePuts(fp, "# Job cache file for " CUPS_SVERSION "\n"); + cupsFilePrintf(fp, "# Written by cupsd on %s\n", temp); + cupsFilePrintf(fp, "NextJobId %d\n", NextJobId); - cupsdClosePipe(job->side_pipes); + /* + * Write each job known to the system... + */ - if (job->status_buffer) + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) { - /* - * Close the pipe and clear the input bit. - */ - - cupsdRemoveSelect(job->status_buffer->fd); - - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "[Job %d] Closing status pipes [ %d %d ]...", - job->id, job->status_pipes[0], job->status_pipes[1]); - - cupsdClosePipe(job->status_pipes); - cupsdStatBufDelete(job->status_buffer); - - job->status_buffer = NULL; + cupsFilePrintf(fp, "\n", job->id); + cupsFilePrintf(fp, "State %d\n", job->state_value); + cupsFilePrintf(fp, "Priority %d\n", job->priority); + cupsFilePrintf(fp, "Username %s\n", job->username); + cupsFilePrintf(fp, "Destination %s\n", job->dest); + cupsFilePrintf(fp, "DestType %d\n", job->dtype); + cupsFilePrintf(fp, "NumFiles %d\n", job->num_files); + for (i = 0; i < job->num_files; i ++) + cupsFilePrintf(fp, "File %d %s/%s %d\n", i + 1, job->filetypes[i]->super, + job->filetypes[i]->type, job->compressions[i]); + cupsFilePuts(fp, "\n"); } + + cupsFileClose(fp); } /* - * 'cupsdUnloadCompletedJobs()' - Flush completed job history from memory. + * 'cupsdSaveJob()' - Save a job to disk. */ void -cupsdUnloadCompletedJobs(void) +cupsdSaveJob(cupsd_job_t *job) /* I - Job */ { - cupsd_job_t *job; /* Current job */ - time_t expire; /* Expiration time */ - - - expire = time(NULL) - 60; - - for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); - job; - job = (cupsd_job_t *)cupsArrayNext(Jobs)) - if (job->attrs && job->state_value >= IPP_JOB_STOPPED && - job->access_time < expire) - { - if (job->dirty) - cupsdSaveJob(job); + char filename[1024]; /* Job control filename */ + cups_file_t *fp; /* Job file */ - unload_job(job); - } -} + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSaveJob(job=%p(%d)): job->attrs=%p", + job, job->id, job->attrs); -/* - * 'compare_active_jobs()' - Compare the job IDs and priorities of two jobs. - */ + snprintf(filename, sizeof(filename), "%s/c%05d", RequestRoot, job->id); -static int /* O - Difference */ -compare_active_jobs(void *first, /* I - First job */ - void *second, /* I - Second job */ - void *data) /* I - App data (not used) */ -{ - int diff; /* Difference */ + if ((fp = cupsFileOpen(filename, "w")) == NULL) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to create job control file \"%s\" - %s.", + job->id, filename, strerror(errno)); + return; + } + fchmod(cupsFileNumber(fp), 0600); + fchown(cupsFileNumber(fp), RunUser, Group); - if ((diff = ((cupsd_job_t *)second)->priority - - ((cupsd_job_t *)first)->priority) != 0) - return (diff); - else - return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); -} + job->attrs->state = IPP_IDLE; + if (ippWriteIO(fp, (ipp_iocb_t)cupsFileWrite, 1, NULL, + job->attrs) != IPP_DATA) + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unable to write job control file!", job->id); -/* - * 'compare_jobs()' - Compare the job IDs of two jobs. - */ + cupsFileClose(fp); -static int /* O - Difference */ -compare_jobs(void *first, /* I - First job */ - void *second, /* I - Second job */ - void *data) /* I - App data (not used) */ -{ - return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); + job->dirty = 0; } /* - * 'ipp_length()' - Compute the size of the buffer needed to hold - * the textual IPP attributes. + * 'cupsdSetJobHoldUntil()' - Set the hold time for a job. */ -static int /* O - Size of attribute buffer */ -ipp_length(ipp_t *ipp) /* I - IPP request */ +void +cupsdSetJobHoldUntil(cupsd_job_t *job, /* I - Job */ + const char *when, /* I - When to resume */ + int update)/* I - Update job-hold-until attr? */ { - int bytes; /* Number of bytes */ - int i; /* Looping var */ - ipp_attribute_t *attr; /* Current attribute */ - + time_t curtime; /* Current time */ + struct tm *curdate; /* Current date */ + int hour; /* Hold hour */ + int minute; /* Hold minute */ + int second = 0; /* Hold second */ - /* - * Loop through all attributes... - */ - bytes = 0; + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetJobHoldUntil(job=%p(%d), when=\"%s\", update=%d)", + job, job->id, when, update); - for (attr = ipp->attrs; attr != NULL; attr = attr->next) + if (update) { /* - * Skip attributes that won't be sent to filters... + * Update the job-hold-until attribute... */ - if (attr->value_tag == IPP_TAG_MIMETYPE || - attr->value_tag == IPP_TAG_NAMELANG || - attr->value_tag == IPP_TAG_TEXTLANG || - attr->value_tag == IPP_TAG_URI || - attr->value_tag == IPP_TAG_URISCHEME) - continue; + ipp_attribute_t *attr; /* job-hold-until attribute */ - if (strncmp(attr->name, "time-", 5) == 0) - continue; + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); - /* - * Add space for a leading space and commas between each value. - * For the first attribute, the leading space isn't used, so the - * extra byte can be used as the nul terminator... - */ + if (attr) + cupsdSetString(&(attr->values[0].string.text), when); + else + attr = ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, + "job-hold-until", NULL, when); - bytes ++; /* " " separator */ - bytes += attr->num_values; /* "," separators */ + if (attr) + { + if (isdigit(when[0] & 255)) + attr->value_tag = IPP_TAG_NAME; + else + attr->value_tag = IPP_TAG_KEYWORD; + + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + } + /* + * Update the hold time... + */ + + if (!strcmp(when, "indefinite") || !strcmp(when, "auth-info-required")) + { /* - * Boolean attributes appear as "foo,nofoo,foo,nofoo", while - * other attributes appear as "foo=value1,value2,...,valueN". + * Hold indefinitely... */ - if (attr->value_tag != IPP_TAG_BOOLEAN) - bytes += strlen(attr->name); - else - bytes += attr->num_values * strlen(attr->name); - + job->hold_until = 0; + } + else if (!strcmp(when, "day-time")) + { /* - * Now add the size required for each value in the attribute... + * Hold to 6am the next morning unless local time is < 6pm. */ - switch (attr->value_tag) - { - case IPP_TAG_INTEGER : - case IPP_TAG_ENUM : - /* - * Minimum value of a signed integer is -2147483647, or 11 digits. - */ + curtime = time(NULL); + curdate = localtime(&curtime); - bytes += attr->num_values * 11; - break; + if (curdate->tm_hour < 18) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((29 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "evening") || !strcmp(when, "night")) + { + /* + * Hold to 6pm unless local time is > 6pm or < 6am. + */ - case IPP_TAG_BOOLEAN : - /* - * Add two bytes for each false ("no") value... - */ + curtime = time(NULL); + curdate = localtime(&curtime); - for (i = 0; i < attr->num_values; i ++) - if (!attr->values[i].boolean) - bytes += 2; - break; + if (curdate->tm_hour < 6 || curdate->tm_hour >= 18) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((17 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "second-shift")) + { + /* + * Hold to 4pm unless local time is > 4pm. + */ - case IPP_TAG_RANGE : - /* - * A range is two signed integers separated by a hyphen, or - * 23 characters max. - */ + curtime = time(NULL); + curdate = localtime(&curtime); - bytes += attr->num_values * 23; - break; + if (curdate->tm_hour >= 16) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((15 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "third-shift")) + { + /* + * Hold to 12am unless local time is < 8am. + */ - case IPP_TAG_RESOLUTION : - /* - * A resolution is two signed integers separated by an "x" and - * suffixed by the units, or 26 characters max. - */ + curtime = time(NULL); + curdate = localtime(&curtime); - bytes += attr->num_values * 26; - break; + if (curdate->tm_hour < 8) + job->hold_until = curtime; + else + job->hold_until = curtime + + ((23 - curdate->tm_hour) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (!strcmp(when, "weekend")) + { + /* + * Hold to weekend unless we are in the weekend. + */ - case IPP_TAG_STRING : - case IPP_TAG_TEXT : - case IPP_TAG_NAME : - case IPP_TAG_KEYWORD : - case IPP_TAG_CHARSET : - case IPP_TAG_LANGUAGE : - case IPP_TAG_URI : - /* - * Strings can contain characters that need quoting. We need - * at least 2 * len + 2 characters to cover the quotes and - * any backslashes in the string. - */ + curtime = time(NULL); + curdate = localtime(&curtime); - for (i = 0; i < attr->num_values; i ++) - bytes += 2 * strlen(attr->values[i].string.text) + 2; - break; + if (curdate->tm_wday == 0 || curdate->tm_wday == 6) + job->hold_until = curtime; + else + job->hold_until = curtime + + (((5 - curdate->tm_wday) * 24 + + (17 - curdate->tm_hour)) * 60 + 59 - + curdate->tm_min) * 60 + 60 - curdate->tm_sec; + } + else if (sscanf(when, "%d:%d:%d", &hour, &minute, &second) >= 2) + { + /* + * Hold to specified GMT time (HH:MM or HH:MM:SS)... + */ - default : - break; /* anti-compiler-warning-code */ - } + curtime = time(NULL); + curdate = gmtime(&curtime); + + job->hold_until = curtime + + ((hour - curdate->tm_hour) * 60 + minute - + curdate->tm_min) * 60 + second - curdate->tm_sec; + + /* + * Hold until next day as needed... + */ + + if (job->hold_until < curtime) + job->hold_until += 24 * 60 * 60; } - return (bytes); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetJobHoldUntil: hold_until=%d", + (int)job->hold_until); } /* - * 'load_job_cache()' - Load jobs from the job.cache file. + * 'cupsdSetJobPriority()' - Set the priority of a job, moving it up/down in + * the list as needed. */ -static void -load_job_cache(const char *filename) /* I - job.cache filename */ +void +cupsdSetJobPriority( + cupsd_job_t *job, /* I - Job ID */ + int priority) /* I - New priority (0 to 100) */ { - cups_file_t *fp; /* job.cache file */ - char line[1024], /* Line buffer */ - *value; /* Value on line */ - int linenum; /* Line number in file */ - cupsd_job_t *job; /* Current job */ - int jobid; /* Job ID */ - char jobfile[1024]; /* Job filename */ + ipp_attribute_t *attr; /* Job attribute */ /* - * Open the job.cache file... + * Don't change completed jobs... */ - if ((fp = cupsFileOpen(filename, "r")) == NULL) - { - if (errno != ENOENT) - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open job cache file \"%s\": %s", - filename, strerror(errno)); - - load_request_root(); - + if (job->state_value >= IPP_JOB_PROCESSING) return; - } /* - * Read entries from the job cache file and create jobs as needed. + * Set the new priority and re-add the job into the active list... */ - cupsdLogMessage(CUPSD_LOG_INFO, "Loading job cache file \"%s\"...", - filename); + cupsArrayRemove(ActiveJobs, job); - linenum = 0; - job = NULL; + job->priority = priority; - while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) - { - if (!strcasecmp(line, "NextJobId")) - { - if (value) - NextJobId = atoi(value); - } - else if (!strcasecmp(line, " directive on line %d!", - linenum); - continue; - } + if ((attr = ippFindAttribute(job->attrs, "job-priority", + IPP_TAG_INTEGER)) != NULL) + attr->values[0].integer = priority; + else + ippAddInteger(job->attrs, IPP_TAG_JOB, IPP_TAG_INTEGER, "job-priority", + priority); - if (!value) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d!", linenum); - continue; - } + cupsArrayAdd(ActiveJobs, job); - jobid = atoi(value); + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); +} - if (jobid < 1) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d!", jobid, - linenum); - continue; - } - snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid); - if (access(jobfile, 0)) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!", - jobid); - continue; - } +/* + * 'cupsdSetJobState()' - Set the state of the specified print job. + */ - job = calloc(1, sizeof(cupsd_job_t)); - if (!job) - { - cupsdLogMessage(CUPSD_LOG_EMERG, - "[Job %d] Unable to allocate memory for job!", jobid); - break; - } +void +cupsdSetJobState( + cupsd_job_t *job, /* I - Job to cancel */ + ipp_jstate_t newstate, /* I - New job state */ + cupsd_jobaction_t action, /* I - Action to take */ + const char *message, /* I - Message to log */ + ...) /* I - Additional arguments as needed */ +{ + int i; /* Looping var */ + ipp_jstate_t oldstate; /* Old state */ + char filename[1024]; /* Job filename */ + ipp_attribute_t *attr; /* Job attribute */ - job->id = jobid; - job->back_pipes[0] = -1; - job->back_pipes[1] = -1; - job->print_pipes[0] = -1; - job->print_pipes[1] = -1; - job->side_pipes[0] = -1; - job->side_pipes[1] = -1; - job->status_pipes[0] = -1; - job->status_pipes[1] = -1; - cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...", - job->id); - } - else if (!job) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "Missing directive on line %d!", linenum); - continue; - } - else if (!strcasecmp(line, "")) - { - cupsArrayAdd(Jobs, job); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetJobState(job=%p(%d), state=%d, newstate=%d, " + "action=%d, message=\"%s\")", job, job->id, job->state_value, + newstate, action, message ? message : "(null)"); - if (job->state_value <= IPP_JOB_STOPPED) - { - cupsArrayAdd(ActiveJobs, job); - cupsdLoadJob(job); - } - job = NULL; - } - else if (!value) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d!", linenum); - continue; - } - else if (!strcasecmp(line, "State")) - { - job->state_value = (ipp_jstate_t)atoi(value); + /* + * Make sure we have the job attributes... + */ - if (job->state_value < IPP_JOB_PENDING) - job->state_value = IPP_JOB_PENDING; - else if (job->state_value > IPP_JOB_COMPLETED) - job->state_value = IPP_JOB_COMPLETED; - } - else if (!strcasecmp(line, "Priority")) - { - job->priority = atoi(value); - } - else if (!strcasecmp(line, "Username")) - { - cupsdSetString(&job->username, value); - } - else if (!strcasecmp(line, "Destination")) - { - cupsdSetString(&job->dest, value); - } - else if (!strcasecmp(line, "DestType")) - { - job->dtype = (cups_ptype_t)atoi(value); - } - else if (!strcasecmp(line, "NumFiles")) - { - job->num_files = atoi(value); + if (!cupsdLoadJob(job)) + return; - if (job->num_files < 0) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d!", - job->num_files, linenum); - job->num_files = 0; - continue; - } + /* + * Don't do anything if the state is unchanged... + */ - if (job->num_files > 0) - { - snprintf(jobfile, sizeof(jobfile), "%s/d%05d-001", RequestRoot, - job->id); - if (access(jobfile, 0)) - { - cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away!", - job->id); - job->num_files = 0; - continue; - } + if (newstate == (oldstate = job->state_value)) + return; - job->filetypes = calloc(job->num_files, sizeof(mime_type_t *)); - job->compressions = calloc(job->num_files, sizeof(int)); + /* + * Stop any processes that are working on the current job... + */ - if (!job->filetypes || !job->compressions) + if (oldstate == IPP_JOB_PROCESSING) + stop_job(job, action != CUPSD_JOB_DEFAULT); + + /* + * Set the new job state... + */ + + job->state->values[0].integer = newstate; + job->state_value = newstate; + + switch (newstate) + { + case IPP_JOB_PENDING : + /* + * Update job-hold-until as needed... + */ + + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + + if (attr) { - cupsdLogMessage(CUPSD_LOG_EMERG, - "[Job %d] Unable to allocate memory for %d files!", - job->id, job->num_files); - break; + attr->value_tag = IPP_TAG_KEYWORD; + cupsdSetString(&(attr->values[0].string.text), "no-hold"); } - } - } - else if (!strcasecmp(line, "File")) - { - int number, /* File number */ - compression; /* Compression value */ - char super[MIME_MAX_SUPER], /* MIME super type */ - type[MIME_MAX_TYPE]; /* MIME type */ + default : + break; - if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type, - &compression) != 4) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d!", linenum); - continue; - } + case IPP_JOB_ABORTED : + case IPP_JOB_CANCELED : + case IPP_JOB_COMPLETED : + set_time(job, "time-at-completed"); + break; + } - if (number < 1 || number > job->num_files) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d!", - number, linenum); - continue; - } + /* + * Log message as needed... + */ - number --; + if (message) + { + char buffer[2048]; /* Message buffer */ + va_list ap; /* Pointer to additional arguments */ - job->compressions[number] = compression; - job->filetypes[number] = mimeType(MimeDatabase, super, type); + va_start(ap, message); + vsnprintf(buffer, sizeof(buffer), message, ap); + va_end(ap); - if (!job->filetypes[number]) - { + if (newstate > IPP_JOB_STOPPED) + cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, "%s", buffer); + else + cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "%s", buffer); + + if (newstate == IPP_JOB_STOPPED || newstate == IPP_JOB_ABORTED) + cupsdLogJob(job, CUPSD_LOG_ERROR, "%s", buffer); + else + cupsdLogJob(job, CUPSD_LOG_INFO, "%s", buffer); + } + + /* + * Handle post-state-change actions... + */ + + switch (newstate) + { + case IPP_JOB_PROCESSING : /* - * If the original MIME type is unknown, auto-type it! + * Add the job to the "printing" list... */ - cupsdLogMessage(CUPSD_LOG_ERROR, - "[Job %d] Unknown MIME type %s/%s for file %d!", - job->id, super, type, number + 1); + if (!cupsArrayFind(PrintingJobs, job)) + cupsArrayAdd(PrintingJobs, job); - snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, - job->id, number + 1); - job->filetypes[number] = mimeFileType(MimeDatabase, jobfile, NULL, - job->compressions + number); + /* + * Set the processing time... + */ + set_time(job, "time-at-processing"); + + case IPP_JOB_PENDING : + case IPP_JOB_HELD : + case IPP_JOB_STOPPED : /* - * If that didn't work, assume it is raw... + * Make sure the job is in the active list... */ - if (!job->filetypes[number]) - job->filetypes[number] = mimeType(MimeDatabase, "application", - "vnd.cups-raw"); - } - } - else - cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d!", - line, linenum); - } + if (!cupsArrayFind(ActiveJobs, job)) + cupsArrayAdd(ActiveJobs, job); - cupsFileClose(fp); -} + /* + * Save the job state to disk... + */ + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + break; -/* - * 'load_next_job_id()' - Load the NextJobId value from the job.cache file. - */ + case IPP_JOB_ABORTED : + case IPP_JOB_CANCELED : + case IPP_JOB_COMPLETED : + /* + * Expire job subscriptions since the job is now "completed"... + */ -static void -load_next_job_id(const char *filename) /* I - job.cache filename */ -{ - cups_file_t *fp; /* job.cache file */ - char line[1024], /* Line buffer */ - *value; /* Value on line */ - int linenum; /* Line number in file */ - int next_job_id; /* NextJobId value from line */ + cupsdExpireSubscriptions(NULL, job); + /* + * Remove the job from the active list... + */ - /* - * Read the NextJobId directive from the job.cache file and use - * the value (if any). - */ + cupsArrayRemove(ActiveJobs, job); - if ((fp = cupsFileOpen(filename, "r")) == NULL) - { - if (errno != ENOENT) - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open job cache file \"%s\": %s", - filename, strerror(errno)); +#ifdef __APPLE__ + /* + * If we are going to sleep and the PrintingJobs count is now 0, allow the + * sleep to happen immediately... + */ - return; - } + if (Sleeping && cupsArrayCount(PrintingJobs) == 0) + cupsdAllowSleep(); +#endif /* __APPLE__ */ - cupsdLogMessage(CUPSD_LOG_INFO, - "Loading NextJobId from job cache file \"%s\"...", filename); + /* + * Remove any authentication data... + */ - linenum = 0; + snprintf(filename, sizeof(filename), "%s/a%05d", RequestRoot, job->id); + if (cupsdRemoveFile(filename) && errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to remove authentication cache: %s", + strerror(errno)); - while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) - { - if (!strcasecmp(line, "NextJobId")) - { - if (value) - { - next_job_id = atoi(value); + cupsdClearString(&job->auth_username); + cupsdClearString(&job->auth_domain); + cupsdClearString(&job->auth_password); - if (next_job_id > NextJobId) - NextJobId = next_job_id; - } - break; - } - } +#ifdef HAVE_GSSAPI + /* + * Destroy the credential cache and clear the KRB5CCNAME env var string. + */ - cupsFileClose(fp); -} + if (job->ccache) + { + krb5_cc_destroy(KerberosContext, job->ccache); + job->ccache = NULL; + } + cupsdClearString(&job->ccname); +#endif /* HAVE_GSSAPI */ -/* - * 'load_request_root()' - Load jobs from the RequestRoot directory. - */ + /* + * Remove the print file for good if we aren't preserving jobs or + * files... + */ -static void -load_request_root(void) -{ - cups_dir_t *dir; /* Directory */ - cups_dentry_t *dent; /* Directory entry */ - cupsd_job_t *job; /* New job */ + if (!JobHistory || !JobFiles || action == CUPSD_JOB_PURGE) + { + for (i = 1; i <= job->num_files; i ++) + { + snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, + job->id, i); + unlink(filename); + } + if (job->num_files > 0) + { + free(job->filetypes); + free(job->compressions); - /* - * Open the requests directory... - */ + job->num_files = 0; + job->filetypes = NULL; + job->compressions = NULL; + } + } - cupsdLogMessage(CUPSD_LOG_DEBUG, "Scanning %s for jobs...", RequestRoot); + if (JobHistory && action != CUPSD_JOB_PURGE) + { + /* + * Save job state info... + */ - if ((dir = cupsDirOpen(RequestRoot)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, - "Unable to open spool directory \"%s\": %s", - RequestRoot, strerror(errno)); - return; + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); + } + else if (!job->printer) + cupsdDeleteJob(job, CUPSD_JOB_PURGE); + break; } /* - * Read all the c##### files... + * Update the server "busy" state... */ - while ((dent = cupsDirRead(dir)) != NULL) - if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c') - { - /* - * Allocate memory for the job... - */ + cupsdSetBusyState(); +} - if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL) - { - cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for jobs!"); - cupsDirClose(dir); - return; - } - /* - * Assign the job ID... - */ +/* + * 'cupsdStopAllJobs()' - Stop all print jobs. + */ - job->id = atoi(dent->filename + 1); - job->back_pipes[0] = -1; - job->back_pipes[1] = -1; - job->print_pipes[0] = -1; - job->print_pipes[1] = -1; - job->side_pipes[0] = -1; - job->side_pipes[1] = -1; - job->status_pipes[0] = -1; - job->status_pipes[1] = -1; +void +cupsdStopAllJobs( + cupsd_jobaction_t action) /* I - Action */ +{ + cupsd_job_t *job; /* Current job */ - if (job->id >= NextJobId) - NextJobId = job->id + 1; - /* - * Load the job... - */ + DEBUG_puts("cupsdStopAllJobs()"); - cupsdLoadJob(job); + for (job = (cupsd_job_t *)cupsArrayFirst(PrintingJobs); + job; + job = (cupsd_job_t *)cupsArrayNext(PrintingJobs)) + cupsdSetJobState(job, IPP_JOB_PENDING, action, NULL); +} - /* - * Insert the job into the array, sorting by job priority and ID... - */ - cupsArrayAdd(Jobs, job); +/* + * 'cupsdUnloadCompletedJobs()' - Flush completed job history from memory. + */ - if (job->state_value <= IPP_JOB_STOPPED) - cupsArrayAdd(ActiveJobs, job); - else - unload_job(job); - } +void +cupsdUnloadCompletedJobs(void) +{ + cupsd_job_t *job; /* Current job */ + time_t expire; /* Expiration time */ - cupsDirClose(dir); + + expire = time(NULL) - 60; + + for (job = (cupsd_job_t *)cupsArrayFirst(Jobs); + job; + job = (cupsd_job_t *)cupsArrayNext(Jobs)) + if (job->attrs && job->state_value >= IPP_JOB_STOPPED && !job->printer && + job->access_time < expire) + { + if (job->dirty) + cupsdSaveJob(job); + + unload_job(job); + } } /* - * 'set_time()' - Set one of the "time-at-xyz" attributes... + * 'compare_active_jobs()' - Compare the job IDs and priorities of two jobs. */ -static void -set_time(cupsd_job_t *job, /* I - Job to update */ - const char *name) /* I - Name of attribute */ +static int /* O - Difference */ +compare_active_jobs(void *first, /* I - First job */ + void *second, /* I - Second job */ + void *data) /* I - App data (not used) */ { - ipp_attribute_t *attr; /* Time attribute */ + int diff; /* Difference */ - if ((attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO)) != NULL) - { - attr->value_tag = IPP_TAG_INTEGER; - attr->values[0].integer = time(NULL); - } + if ((diff = ((cupsd_job_t *)second)->priority - + ((cupsd_job_t *)first)->priority) != 0) + return (diff); + else + return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); } /* - * 'set_hold_until()' - Set the hold time and update job-hold-until attribute... + * 'compare_jobs()' - Compare the job IDs of two jobs. */ -static void -set_hold_until(cupsd_job_t *job, /* I - Job to update */ - time_t holdtime) /* I - Hold until time */ +static int /* O - Difference */ +compare_jobs(void *first, /* I - First job */ + void *second, /* I - Second job */ + void *data) /* I - App data (not used) */ { - ipp_attribute_t *attr; /* job-hold-until attribute */ - struct tm *holddate; /* Hold date */ - char holdstr[64]; /* Hold time */ + return (((cupsd_job_t *)first)->id - ((cupsd_job_t *)second)->id); +} - /* - * Set the hold_until value and hold the job... - */ +/* + * 'finalize_job()' - Cleanup after job filter processes and support data. + */ - cupsdLogMessage(CUPSD_LOG_DEBUG, "set_hold_until: hold_until = %d", - (int)holdtime); +static void +finalize_job(cupsd_job_t *job) /* I - Job */ +{ + ipp_pstate_t printer_state; /* New printer state value */ + ipp_jstate_t job_state; /* New job state value */ + const char *message; /* Message for job state */ + char buffer[1024]; /* Buffer for formatted messages */ - job->state->values[0].integer = IPP_JOB_HELD; - job->state_value = IPP_JOB_HELD; - job->hold_until = holdtime; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "finalize_job(job=%p(%d))", job, job->id); /* - * Update the job-hold-until attribute with a string representing GMT - * time (HH:MM:SS)... + * Clear the "connecting-to-device" reason, which is only valid when a + * printer is processing... */ - holddate = gmtime(&holdtime); - snprintf(holdstr, sizeof(holdstr), "%d:%d:%d", holddate->tm_hour, - holddate->tm_min, holddate->tm_sec); - - if ((attr = ippFindAttribute(job->attrs, "job-hold-until", - IPP_TAG_KEYWORD)) == NULL) - attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); + cupsdSetPrinterReasons(job->printer, "-connecting-to-device"); /* - * Either add the attribute or update the value of the existing one + * Similarly, clear the "offline-report" reason for non-USB devices since we + * rarely have current information for network devices... */ - if (attr == NULL) - ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-hold-until", - NULL, holdstr); - else - cupsdSetString(&attr->values[0].string.text, holdstr); - - job->dirty = 1; - cupsdMarkDirty(CUPSD_DIRTY_JOBS); -} + if (strncmp(job->printer->device_uri, "usb:", 4)) + cupsdSetPrinterReasons(job->printer, "-offline-report"); + /* + * Free the security profile... + */ -/* - * 'start_job()' - Start a print job. - */ + cupsdDestroyProfile(job->profile); + job->profile = NULL; -static void -start_job(cupsd_job_t *job, /* I - Job ID */ - cupsd_printer_t *printer) /* I - Printer to print job */ -{ - int i; /* Looping var */ - int slot; /* Pipe slot */ - cups_array_t *filters, /* Filters for job */ - *prefilters; /* Filters with prefilters */ - mime_filter_t *filter, /* Current filter */ - *prefilter, /* Prefilter */ - port_monitor; /* Port monitor filter */ - char method[255], /* Method for output */ - *optptr, /* Pointer to options */ - *valptr; /* Pointer in value string */ - ipp_attribute_t *attr; /* Current attribute */ - struct stat backinfo; /* Backend file information */ - int backroot; /* Run backend as root? */ - int pid; /* Process ID of new filter process */ - int banner_page; /* 1 if banner page, 0 otherwise */ - int filterfds[2][2];/* Pipes used between filters */ - int envc; /* Number of environment variables */ - char **argv, /* Filter command-line arguments */ - filename[1024], /* Job filename */ - command[1024], /* Full path to command */ - jobid[255], /* Job ID string */ - title[IPP_MAX_NAME], - /* Job title string */ - copies[255], /* # copies string */ - *envp[MAX_ENV + 19], - /* Environment variables */ - charset[255], /* CHARSET env variable */ - class_name[255],/* CLASS env variable */ - classification[1024], - /* CLASSIFICATION env variable */ - content_type[1024], - /* CONTENT_TYPE env variable */ - device_uri[1024], - /* DEVICE_URI env variable */ - final_content_type[1024], - /* FINAL_CONTENT_TYPE env variable */ - lang[255], /* LANG env variable */ -#ifdef __APPLE__ - apple_language[255], - /* APPLE_LANGUAGE env variable */ -#endif /* __APPLE__ */ - ppd[1024], /* PPD env variable */ - printer_info[255], - /* PRINTER_INFO env variable */ - printer_location[255], - /* PRINTER_LOCATION env variable */ - printer_name[255], - /* PRINTER env variable */ - rip_max_cache[255]; - /* RIP_MAX_CACHE env variable */ - static char *options = NULL;/* Full list of options */ - static int optlength = 0; /* Length of option buffer */ + /* + * Close pipes and status buffer... + */ + cupsdRemoveSelect(job->status_buffer->fd); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: file = %d/%d", - job->current_file, job->num_files); + cupsdClosePipe(job->print_pipes); + cupsdClosePipe(job->back_pipes); + cupsdClosePipe(job->side_pipes); + cupsdClosePipe(job->status_pipes); - if (job->num_files == 0) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, "No files, canceling job!"); - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); - return; - } + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; /* - * Figure out what filters are required to convert from - * the source to the destination type... + * Process the exit status... */ - filters = NULL; - job->cost = 0; + printer_state = IPP_PRINTER_IDLE; + job_state = IPP_JOB_COMPLETED; + message = "Job completed."; - if (printer->raw) + if (job->status < 0) { /* - * Remote jobs and raw queues go directly to the printer without - * filtering... + * Backend had errors... */ - cupsdLogJob(job, CUPSD_LOG_DEBUG, "Sending job to queue tagged as raw..."); + int exit_code; /* Exit code from backend */ + - filters = NULL; - } - else - { /* - * Local jobs get filtered... + * Convert the status to an exit code. Due to the way the W* macros are + * implemented on MacOS X (bug?), we have to store the exit status in a + * variable first and then convert... */ - filters = mimeFilter(MimeDatabase, job->filetypes[job->current_file], - printer->filetype, &(job->cost)); - - if (!filters) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to convert file %d to printable format!", - job->current_file); - cupsdLogMessage(CUPSD_LOG_INFO, - "Hint: Do you have Ghostscript installed?"); - - if (LogLevel < CUPSD_LOG_DEBUG) - cupsdLogMessage(CUPSD_LOG_INFO, - "Hint: Try setting the LogLevel to \"debug\"."); - - job->current_file ++; - - if (job->current_file == job->num_files) - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); + exit_code = -job->status; + if (WIFEXITED(exit_code)) + exit_code = WEXITSTATUS(exit_code); + else + exit_code = job->status; - return; - } + cupsdLogJob(job, CUPSD_LOG_INFO, "Backend returned status %d (%s)", + exit_code, + exit_code == CUPS_BACKEND_FAILED ? "failed" : + exit_code == CUPS_BACKEND_AUTH_REQUIRED ? + "authentication required" : + exit_code == CUPS_BACKEND_HOLD ? "hold job" : + exit_code == CUPS_BACKEND_STOP ? "stop printer" : + exit_code == CUPS_BACKEND_CANCEL ? "cancel job" : + exit_code < 0 ? "crashed" : "unknown"); /* - * Remove NULL ("-") filters... + * Do what needs to be done... */ - for (filter = (mime_filter_t *)cupsArrayFirst(filters); - filter; - filter = (mime_filter_t *)cupsArrayNext(filters)) - if (!strcmp(filter->filter, "-")) - cupsArrayRemove(filters, filter); - - if (cupsArrayCount(filters) == 0) - { - cupsArrayDelete(filters); - filters = NULL; - } - - /* - * If this printer has any pre-filters, insert the required pre-filter - * in the filters array... - */ - - if (printer->prefiltertype && filters) + switch (exit_code) { - prefilters = cupsArrayNew(NULL, NULL); + default : + case CUPS_BACKEND_FAILED : + /* + * Backend failure, use the error-policy to determine how to + * act... + */ - for (filter = (mime_filter_t *)cupsArrayFirst(filters); - filter; - filter = (mime_filter_t *)cupsArrayNext(filters)) - { - if ((prefilter = mimeFilterLookup(MimeDatabase, filter->src, - printer->prefiltertype))) - { - cupsArrayAdd(prefilters, prefilter); - job->cost += prefilter->cost; - } + if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + { + /* + * Queued on a class - mark the job as pending and we'll retry on + * another printer... + */ - cupsArrayAdd(prefilters, filter); - } + job_state = IPP_JOB_PENDING; + message = "Retrying job on another printer."; + } + else if (!strcmp(job->printer->error_policy, "retry-current-job")) + { + /* + * The error policy is "retry-current-job" - mark the job as pending + * and we'll retry on the same printer... + */ - cupsArrayDelete(filters); - filters = prefilters; - } - } + job_state = IPP_JOB_PENDING; + message = "Retrying job on same printer."; + } + else if ((job->printer->type & CUPS_PRINTER_FAX) || + !strcmp(job->printer->error_policy, "retry-job")) + { + /* + * The job was queued on a fax or the error policy is "retry-job" - + * hold the job if the number of retries is less than the + * JobRetryLimit, otherwise abort the job. + */ - /* - * Set a minimum cost of 100 for all jobs so that FilterLimit - * works with raw queues and other low-cost paths. - */ + job->tries ++; - if (job->cost < 100) - job->cost = 100; + if (job->tries >= JobRetryLimit) + { + /* + * Too many tries... + */ - /* - * See if the filter cost is too high... - */ + snprintf(buffer, sizeof(buffer), + "Job aborted after %d unsuccessful attempts.", + JobRetryLimit); + job_state = IPP_JOB_ABORTED; + message = buffer; + } + else + { + /* + * Try again in N seconds... + */ - if ((FilterLevel + job->cost) > FilterLimit && FilterLevel > 0 && - FilterLimit > 0) - { - /* - * Don't print this job quite yet... - */ + set_hold_until(job, time(NULL) + JobRetryInterval); - cupsArrayDelete(filters); + snprintf(buffer, sizeof(buffer), + "Job held for %d seconds since it could not be sent.", + JobRetryInterval); + job_state = IPP_JOB_HELD; + message = buffer; + } + } + else if (!strcmp(job->printer->error_policy, "abort-job")) + { + job_state = IPP_JOB_ABORTED; + message = "Job aborted due to backend errors; please consult " + "the error_log file for details."; + } + else + { + printer_state = IPP_PRINTER_STOPPED; + job_state = IPP_JOB_PENDING; + message = "Printer stopped due to backend errors; please " + "consult the error_log file for details."; + } + break; - cupsdLogJob(job, CUPSD_LOG_INFO, - "Holding because filter limit has been reached."); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: file=%d, cost=%d, level=%d, limit=%d", - job->current_file, job->cost, FilterLevel, - FilterLimit); - return; - } + case CUPS_BACKEND_CANCEL : + /* + * Abort the job... + */ - FilterLevel += job->cost; + job_state = IPP_JOB_ABORTED; + message = "Job aborted due to backend errors; please consult " + "the error_log file for details."; + break; - /* - * Add decompression/raw filter as needed... - */ + case CUPS_BACKEND_HOLD : + /* + * Hold the job... + */ - if ((!printer->raw && job->compressions[job->current_file]) || - (!filters && !printer->remote && - (job->num_files > 1 || !strncmp(printer->device_uri, "file:", 5)))) - { - /* - * Add gziptoany filter to the front of the list... - */ + cupsdSetJobHoldUntil(job, "indefinite", 1); - if (!filters) - filters = cupsArrayNew(NULL, NULL); + job_state = IPP_JOB_HELD; + message = "Job held indefinitely due to backend errors; please " + "consult the error_log file for details."; + break; - if (!cupsArrayInsert(filters, &gziptoany_filter)) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to add decompression filter - %s", strerror(errno)); + case CUPS_BACKEND_STOP : + /* + * Stop the printer... + */ - cupsArrayDelete(filters); + printer_state = IPP_PRINTER_STOPPED; + job_state = IPP_JOB_PENDING; + message = "Printer stopped due to backend errors; please " + "consult the error_log file for details."; + break; - job->current_file ++; + case CUPS_BACKEND_AUTH_REQUIRED : + /* + * Hold the job for authentication... + */ - if (job->current_file == job->num_files) - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); + cupsdSetJobHoldUntil(job, "auth-info-required", 1); - return; + job_state = IPP_JOB_HELD; + message = "Job held for authentication."; + break; } } - - /* - * Add port monitor, if any... - */ - - if (printer->port_monitor) + else if (job->status > 0) { /* - * Add port monitor to the end of the list... + * Filter had errors; stop job... */ - if (!filters) - filters = cupsArrayNew(NULL, NULL); - - port_monitor.src = NULL; - port_monitor.dst = NULL; - port_monitor.cost = 0; - - snprintf(port_monitor.filter, sizeof(port_monitor.filter), - "%s/monitor/%s", ServerBin, printer->port_monitor); - - if (!cupsArrayAdd(filters, &port_monitor)) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to add port monitor - %s", strerror(errno)); - - cupsArrayDelete(filters); - - job->current_file ++; - - if (job->current_file == job->num_files) - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); - - return; - } + job_state = IPP_JOB_STOPPED; + message = "Job stopped due to filter errors; please consult the " + "error_log file for details."; } /* - * Make sure we don't go over the "MAX_FILTERS" limit... + * Update the printer and job state. */ - if (cupsArrayCount(filters) > MAX_FILTERS) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Too many filters (%d > %d), unable to print!", - cupsArrayCount(filters), MAX_FILTERS); - - cupsArrayDelete(filters); - cupsdCancelJob(job, 0, IPP_JOB_STOPPED); + cupsdSetJobState(job, job_state, CUPSD_JOB_DEFAULT, "%s", message); + cupsdSetPrinterState(job->printer, printer_state, + printer_state == IPP_PRINTER_STOPPED); + update_job_attrs(job, 0); - return; - } + cupsArrayRemove(PrintingJobs, job); /* - * Update the printer and job state to "processing"... + * Clear the printer <-> job association... */ - job->state->values[0].integer = IPP_JOB_PROCESSING; - job->state_value = IPP_JOB_PROCESSING; - job->progress = 0; - job->status = 0; - job->printer = printer; - printer->job = job; - - cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0); - - if (job->current_file == 0) - { - /* - * Add to the printing list... - */ - - cupsArrayAdd(PrintingJobs, job); - cupsdSetBusyState(); - - /* - * Set the processing time... - */ - - set_time(job, "time-at-processing"); - - /* - * Create the backchannel pipes and make them non-blocking... - */ - - cupsdOpenPipe(job->back_pipes); - - fcntl(job->back_pipes[0], F_SETFL, - fcntl(job->back_pipes[0], F_GETFL) | O_NONBLOCK); - - fcntl(job->back_pipes[1], F_SETFL, - fcntl(job->back_pipes[1], F_GETFL) | O_NONBLOCK); - - /* - * Create the side-channel pipes and make them non-blocking... - */ - - socketpair(AF_LOCAL, SOCK_STREAM, 0, job->side_pipes); - - fcntl(job->side_pipes[0], F_SETFL, - fcntl(job->side_pipes[0], F_GETFL) | O_NONBLOCK); - - fcntl(job->side_pipes[1], F_SETFL, - fcntl(job->side_pipes[1], F_GETFL) | O_NONBLOCK); - } + job->printer->job = NULL; + job->printer = NULL; /* - * Determine if we are printing a banner page or not... + * Try printing another job... */ - if (job->job_sheets == NULL) - { - cupsdLogJob(job, CUPSD_LOG_DEBUG, "No job-sheets attribute."); - if ((job->job_sheets = - ippFindAttribute(job->attrs, "job-sheets", IPP_TAG_ZERO)) != NULL) - cupsdLogJob(job, CUPSD_LOG_DEBUG, - "... but someone added one without setting job_sheets!"); - } - else if (job->job_sheets->num_values == 1) - cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s", - job->job_sheets->values[0].string.text); - else - cupsdLogJob(job, CUPSD_LOG_DEBUG, "job-sheets=%s,%s", - job->job_sheets->values[0].string.text, - job->job_sheets->values[1].string.text); + if (printer_state != IPP_PRINTER_STOPPED) + cupsdCheckJobs(); +} - if (printer->type & (CUPS_PRINTER_REMOTE | CUPS_PRINTER_IMPLICIT)) - banner_page = 0; - else if (job->job_sheets == NULL) - banner_page = 0; - else if (strcasecmp(job->job_sheets->values[0].string.text, "none") != 0 && - job->current_file == 0) - banner_page = 1; - else if (job->job_sheets->num_values > 1 && - strcasecmp(job->job_sheets->values[1].string.text, "none") != 0 && - job->current_file == (job->num_files - 1)) - banner_page = 1; - else - banner_page = 0; - cupsdLogJob(job, CUPSD_LOG_DEBUG, "banner_page = %d", banner_page); +/* + * 'get_options()' - Get a string containing the job options. + */ + +static char * /* O - Options string */ +get_options(cupsd_job_t *job, /* I - Job */ + int banner_page, /* I - Printing a banner page? */ + char *copies, /* I - Copies buffer */ + size_t copies_size, /* I - Size of copies buffer */ + char *title, /* I - Title buffer */ + size_t title_size) /* I - Size of title buffer */ +{ + int i; /* Looping var */ + char *optptr, /* Pointer to options */ + *valptr; /* Pointer in value string */ + ipp_attribute_t *attr; /* Current attribute */ + static char *options = NULL;/* Full list of options */ + static int optlength = 0; /* Length of option buffer */ + /* * Building the options string is harder than it needs to be, but @@ -2891,22 +2717,16 @@ start_job(cupsd_job_t *job, /* I - Job ID */ if (i > optlength || !options) { - if (optlength == 0) + if (!options) optptr = malloc(i); else optptr = realloc(options, i); - if (optptr == NULL) + if (!optptr) { cupsdLogJob(job, CUPSD_LOG_CRIT, "Unable to allocate %d bytes for option buffer!", i); - - cupsArrayDelete(filters); - - FilterLevel -= job->cost; - - cupsdCancelJob(job, 0, IPP_JOB_ABORTED); - return; + return (NULL); } options = optptr; @@ -2921,7 +2741,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ optptr = options; *optptr = '\0'; - snprintf(title, sizeof(title), "%s-%d", printer->name, job->id); + snprintf(title, sizeof(title), "%s-%d", job->printer->name, job->id); strcpy(copies, "1"); for (attr = job->attrs->attrs; attr != NULL; attr = attr->next) @@ -2962,7 +2782,7 @@ start_job(cupsd_job_t *job, /* I - Job ID */ strcmp(attr->name, "job-impressions") && strcmp(attr->name, "job-originating-host-name") && strcmp(attr->name, "job-uuid") && - !(printer->type & CUPS_PRINTER_REMOTE)) + !(job->printer->type & CUPS_PRINTER_REMOTE)) continue; if ((!strcmp(attr->name, "job-impressions") || @@ -3061,572 +2881,739 @@ start_job(cupsd_job_t *job, /* I - Job ID */ } } - /* - * Build the command-line arguments for the filters. Each filter - * has 6 or 7 arguments: - * - * argv[0] = printer - * argv[1] = job ID - * argv[2] = username - * argv[3] = title - * argv[4] = # copies - * argv[5] = options - * argv[6] = filename (optional; normally stdin) - * - * This allows legacy printer drivers that use the old System V - * printing interface to be used by CUPS. - * - * For remote jobs, we send all of the files in the argument list. + + return (options); +} + + +/* + * 'ipp_length()' - Compute the size of the buffer needed to hold + * the textual IPP attributes. + */ + +static int /* O - Size of attribute buffer */ +ipp_length(ipp_t *ipp) /* I - IPP request */ +{ + int bytes; /* Number of bytes */ + int i; /* Looping var */ + ipp_attribute_t *attr; /* Current attribute */ + + + /* + * Loop through all attributes... */ - if (printer->remote && job->num_files > 1) - argv = calloc(7 + job->num_files, sizeof(char *)); - else - argv = calloc(8, sizeof(char *)); + bytes = 0; - if (!argv) + for (attr = ipp->attrs; attr != NULL; attr = attr->next) { - cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to allocate argument array!"); - cupsArrayDelete(filters); + /* + * Skip attributes that won't be sent to filters... + */ - FilterLevel -= job->cost; + if (attr->value_tag == IPP_TAG_MIMETYPE || + attr->value_tag == IPP_TAG_NAMELANG || + attr->value_tag == IPP_TAG_TEXTLANG || + attr->value_tag == IPP_TAG_URI || + attr->value_tag == IPP_TAG_URISCHEME) + continue; - cupsdStopPrinter(printer, 0); - return; - } + if (strncmp(attr->name, "time-", 5) == 0) + continue; - sprintf(jobid, "%d", job->id); + /* + * Add space for a leading space and commas between each value. + * For the first attribute, the leading space isn't used, so the + * extra byte can be used as the nul terminator... + */ - argv[0] = printer->name; - argv[1] = jobid; - argv[2] = job->username; - argv[3] = title; - argv[4] = copies; - argv[5] = options; + bytes ++; /* " " separator */ + bytes += attr->num_values; /* "," separators */ - if (printer->remote && job->num_files > 1) - { - for (i = 0; i < job->num_files; i ++) + /* + * Boolean attributes appear as "foo,nofoo,foo,nofoo", while + * other attributes appear as "foo=value1,value2,...,valueN". + */ + + if (attr->value_tag != IPP_TAG_BOOLEAN) + bytes += strlen(attr->name); + else + bytes += attr->num_values * strlen(attr->name); + + /* + * Now add the size required for each value in the attribute... + */ + + switch (attr->value_tag) { - snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, - job->id, i + 1); - argv[6 + i] = strdup(filename); + case IPP_TAG_INTEGER : + case IPP_TAG_ENUM : + /* + * Minimum value of a signed integer is -2147483647, or 11 digits. + */ + + bytes += attr->num_values * 11; + break; + + case IPP_TAG_BOOLEAN : + /* + * Add two bytes for each false ("no") value... + */ + + for (i = 0; i < attr->num_values; i ++) + if (!attr->values[i].boolean) + bytes += 2; + break; + + case IPP_TAG_RANGE : + /* + * A range is two signed integers separated by a hyphen, or + * 23 characters max. + */ + + bytes += attr->num_values * 23; + break; + + case IPP_TAG_RESOLUTION : + /* + * A resolution is two signed integers separated by an "x" and + * suffixed by the units, or 26 characters max. + */ + + bytes += attr->num_values * 26; + break; + + case IPP_TAG_STRING : + case IPP_TAG_TEXT : + case IPP_TAG_NAME : + case IPP_TAG_KEYWORD : + case IPP_TAG_CHARSET : + case IPP_TAG_LANGUAGE : + case IPP_TAG_URI : + /* + * Strings can contain characters that need quoting. We need + * at least 2 * len + 2 characters to cover the quotes and + * any backslashes in the string. + */ + + for (i = 0; i < attr->num_values; i ++) + bytes += 2 * strlen(attr->values[i].string.text) + 2; + break; + + default : + break; /* anti-compiler-warning-code */ } } - else + + return (bytes); +} + + +/* + * 'load_job_cache()' - Load jobs from the job.cache file. + */ + +static void +load_job_cache(const char *filename) /* I - job.cache filename */ +{ + cups_file_t *fp; /* job.cache file */ + char line[1024], /* Line buffer */ + *value; /* Value on line */ + int linenum; /* Line number in file */ + cupsd_job_t *job; /* Current job */ + int jobid; /* Job ID */ + char jobfile[1024]; /* Job filename */ + + + /* + * Open the job.cache file... + */ + + if ((fp = cupsFileOpen(filename, "r")) == NULL) { - snprintf(filename, sizeof(filename), "%s/d%05d-%03d", RequestRoot, - job->id, job->current_file + 1); - argv[6] = filename; - } + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open job cache file \"%s\": %s", + filename, strerror(errno)); - for (i = 0; argv[i]; i ++) - cupsdLogJob(job, CUPSD_LOG_DEBUG, - "argv[%d]=\"%s\"", i, argv[i]); + load_request_root(); + + return; + } /* - * Create environment variable strings for the filters... + * Read entries from the job cache file and create jobs as needed. */ - attr = ippFindAttribute(job->attrs, "attributes-natural-language", - IPP_TAG_LANGUAGE); + cupsdLogMessage(CUPSD_LOG_INFO, "Loading job cache file \"%s\"...", + filename); -#ifdef __APPLE__ - strcpy(apple_language, "APPLE_LANGUAGE="); - _cupsAppleLanguage(attr->values[0].string.text, - apple_language + 15, sizeof(apple_language) - 15); -#endif /* __APPLE__ */ + linenum = 0; + job = NULL; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) + { + if (!strcasecmp(line, "NextJobId")) + { + if (value) + NextJobId = atoi(value); + } + else if (!strcasecmp(line, " directive on line %d!", + linenum); + continue; + } + + if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing job ID on line %d!", linenum); + continue; + } + + jobid = atoi(value); + + if (jobid < 1) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad job ID %d on line %d!", jobid, + linenum); + continue; + } + + snprintf(jobfile, sizeof(jobfile), "%s/c%05d", RequestRoot, jobid); + if (access(jobfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "[Job %d] Files have gone away!", + jobid); + continue; + } + + job = calloc(1, sizeof(cupsd_job_t)); + if (!job) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "[Job %d] Unable to allocate memory for job!", jobid); + break; + } + + job->id = jobid; + job->back_pipes[0] = -1; + job->back_pipes[1] = -1; + job->print_pipes[0] = -1; + job->print_pipes[1] = -1; + job->side_pipes[0] = -1; + job->side_pipes[1] = -1; + job->status_pipes[0] = -1; + job->status_pipes[1] = -1; + + cupsdLogMessage(CUPSD_LOG_DEBUG, "[Job %d] Loading from cache...", + job->id); + } + else if (!job) + { + cupsdLogMessage(CUPSD_LOG_ERROR, + "Missing directive on line %d!", linenum); + continue; + } + else if (!strcasecmp(line, "")) + { + cupsArrayAdd(Jobs, job); + + if (job->state_value <= IPP_JOB_STOPPED) + { + cupsArrayAdd(ActiveJobs, job); + cupsdLoadJob(job); + } + + job = NULL; + } + else if (!value) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Missing value on line %d!", linenum); + continue; + } + else if (!strcasecmp(line, "State")) + { + job->state_value = (ipp_jstate_t)atoi(value); + + if (job->state_value < IPP_JOB_PENDING) + job->state_value = IPP_JOB_PENDING; + else if (job->state_value > IPP_JOB_COMPLETED) + job->state_value = IPP_JOB_COMPLETED; + } + else if (!strcasecmp(line, "Priority")) + { + job->priority = atoi(value); + } + else if (!strcasecmp(line, "Username")) + { + cupsdSetString(&job->username, value); + } + else if (!strcasecmp(line, "Destination")) + { + cupsdSetString(&job->dest, value); + } + else if (!strcasecmp(line, "DestType")) + { + job->dtype = (cups_ptype_t)atoi(value); + } + else if (!strcasecmp(line, "NumFiles")) + { + job->num_files = atoi(value); + + if (job->num_files < 0) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad NumFiles value %d on line %d!", + job->num_files, linenum); + job->num_files = 0; + continue; + } + + if (job->num_files > 0) + { + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-001", RequestRoot, + job->id); + if (access(jobfile, 0)) + { + cupsdLogMessage(CUPSD_LOG_INFO, "[Job %d] Data files have gone away!", + job->id); + job->num_files = 0; + continue; + } + + job->filetypes = calloc(job->num_files, sizeof(mime_type_t *)); + job->compressions = calloc(job->num_files, sizeof(int)); + + if (!job->filetypes || !job->compressions) + { + cupsdLogMessage(CUPSD_LOG_EMERG, + "[Job %d] Unable to allocate memory for %d files!", + job->id, job->num_files); + break; + } + } + } + else if (!strcasecmp(line, "File")) + { + int number, /* File number */ + compression; /* Compression value */ + char super[MIME_MAX_SUPER], /* MIME super type */ + type[MIME_MAX_TYPE]; /* MIME type */ + + + if (sscanf(value, "%d%*[ \t]%15[^/]/%255s%d", &number, super, type, + &compression) != 4) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File on line %d!", linenum); + continue; + } + + if (number < 1 || number > job->num_files) + { + cupsdLogMessage(CUPSD_LOG_ERROR, "Bad File number %d on line %d!", + number, linenum); + continue; + } - switch (strlen(attr->values[0].string.text)) - { - default : - /* - * This is an unknown or badly formatted language code; use - * the POSIX locale... - */ + number --; - strcpy(lang, "LANG=C"); - break; + job->compressions[number] = compression; + job->filetypes[number] = mimeType(MimeDatabase, super, type); - case 2 : + if (!job->filetypes[number]) + { /* - * Just the language code (ll)... + * If the original MIME type is unknown, auto-type it! */ - snprintf(lang, sizeof(lang), "LANG=%s.UTF8", - attr->values[0].string.text); - break; + cupsdLogMessage(CUPSD_LOG_ERROR, + "[Job %d] Unknown MIME type %s/%s for file %d!", + job->id, super, type, number + 1); + + snprintf(jobfile, sizeof(jobfile), "%s/d%05d-%03d", RequestRoot, + job->id, number + 1); + job->filetypes[number] = mimeFileType(MimeDatabase, jobfile, NULL, + job->compressions + number); - case 5 : /* - * Language and country code (ll-cc)... + * If that didn't work, assume it is raw... */ - snprintf(lang, sizeof(lang), "LANG=%c%c_%c%c.UTF8", - attr->values[0].string.text[0], - attr->values[0].string.text[1], - toupper(attr->values[0].string.text[3] & 255), - toupper(attr->values[0].string.text[4] & 255)); - break; - } - - attr = ippFindAttribute(job->attrs, "document-format", - IPP_TAG_MIMETYPE); - if (attr != NULL && - (optptr = strstr(attr->values[0].string.text, "charset=")) != NULL) - snprintf(charset, sizeof(charset), "CHARSET=%s", optptr + 8); - else - { - attr = ippFindAttribute(job->attrs, "attributes-charset", - IPP_TAG_CHARSET); - snprintf(charset, sizeof(charset), "CHARSET=%s", - attr->values[0].string.text); + if (!job->filetypes[number]) + job->filetypes[number] = mimeType(MimeDatabase, "application", + "vnd.cups-raw"); + } + } + else + cupsdLogMessage(CUPSD_LOG_ERROR, "Unknown %s directive on line %d!", + line, linenum); } - snprintf(content_type, sizeof(content_type), "CONTENT_TYPE=%s/%s", - job->filetypes[job->current_file]->super, - job->filetypes[job->current_file]->type); - snprintf(device_uri, sizeof(device_uri), "DEVICE_URI=%s", - printer->device_uri); - snprintf(ppd, sizeof(ppd), "PPD=%s/ppd/%s.ppd", ServerRoot, printer->name); - snprintf(printer_info, sizeof(printer_name), "PRINTER_INFO=%s", - printer->info ? printer->info : ""); - snprintf(printer_location, sizeof(printer_name), "PRINTER_LOCATION=%s", - printer->location ? printer->location : ""); - snprintf(printer_name, sizeof(printer_name), "PRINTER=%s", printer->name); - snprintf(rip_max_cache, sizeof(rip_max_cache), "RIP_MAX_CACHE=%s", RIPCache); + cupsFileClose(fp); +} - envc = cupsdLoadEnv(envp, (int)(sizeof(envp) / sizeof(envp[0]))); - envp[envc ++] = charset; - envp[envc ++] = lang; -#ifdef __APPLE__ - envp[envc ++] = apple_language; -#endif /* __APPLE__ */ - envp[envc ++] = ppd; - envp[envc ++] = rip_max_cache; - envp[envc ++] = content_type; - envp[envc ++] = device_uri; - envp[envc ++] = printer_info; - envp[envc ++] = printer_location; - envp[envc ++] = printer_name; - envp[envc ++] = banner_page ? "CUPS_FILETYPE=job-sheet" : - "CUPS_FILETYPE=document"; +/* + * 'load_next_job_id()' - Load the NextJobId value from the job.cache file. + */ - if (!printer->remote && !printer->raw) - { - filter = (mime_filter_t *)cupsArrayLast(filters); +static void +load_next_job_id(const char *filename) /* I - job.cache filename */ +{ + cups_file_t *fp; /* job.cache file */ + char line[1024], /* Line buffer */ + *value; /* Value on line */ + int linenum; /* Line number in file */ + int next_job_id; /* NextJobId value from line */ - if (printer->port_monitor) - filter = (mime_filter_t *)cupsArrayPrev(filters); - if (filter && filter->dst) - { - snprintf(final_content_type, sizeof(final_content_type), - "FINAL_CONTENT_TYPE=%s/%s", - filter->dst->super, filter->dst->type); - envp[envc ++] = final_content_type; - } - } + /* + * Read the NextJobId directive from the job.cache file and use + * the value (if any). + */ - if (Classification && !banner_page) + if ((fp = cupsFileOpen(filename, "r")) == NULL) { - if ((attr = ippFindAttribute(job->attrs, "job-sheets", - IPP_TAG_NAME)) == NULL) - snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", - Classification); - else if (attr->num_values > 1 && - strcmp(attr->values[1].string.text, "none") != 0) - snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", - attr->values[1].string.text); - else - snprintf(classification, sizeof(classification), "CLASSIFICATION=%s", - attr->values[0].string.text); + if (errno != ENOENT) + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open job cache file \"%s\": %s", + filename, strerror(errno)); - envp[envc ++] = classification; + return; } - if (job->dtype & (CUPS_PRINTER_CLASS | CUPS_PRINTER_IMPLICIT)) + cupsdLogMessage(CUPSD_LOG_INFO, + "Loading NextJobId from job cache file \"%s\"...", filename); + + linenum = 0; + + while (cupsFileGetConf(fp, line, sizeof(line), &value, &linenum)) { - snprintf(class_name, sizeof(class_name), "CLASS=%s", job->dest); - envp[envc ++] = class_name; + if (!strcasecmp(line, "NextJobId")) + { + if (value) + { + next_job_id = atoi(value); + + if (next_job_id > NextJobId) + NextJobId = next_job_id; + } + break; + } } - if (job->auth_username) - envp[envc ++] = job->auth_username; - if (job->auth_domain) - envp[envc ++] = job->auth_domain; - if (job->auth_password) - envp[envc ++] = job->auth_password; + cupsFileClose(fp); +} -#ifdef HAVE_GSSAPI - if (job->ccname) - envp[envc ++] = job->ccname; -#endif /* HAVE_GSSAPI */ - envp[envc] = NULL; +/* + * 'load_request_root()' - Load jobs from the RequestRoot directory. + */ - for (i = 0; i < envc; i ++) - if (!strncmp(envp[i], "AUTH_", 5)) - cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"AUTH_%c****\"", i, - envp[i][5]); - else if (strncmp(envp[i], "DEVICE_URI=", 11)) - cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"%s\"", i, envp[i]); - else - cupsdLogJob(job, CUPSD_LOG_DEBUG, "envp[%d]=\"DEVICE_URI=%s\"", i, - printer->sanitized_device_uri); +static void +load_request_root(void) +{ + cups_dir_t *dir; /* Directory */ + cups_dentry_t *dent; /* Directory entry */ + cupsd_job_t *job; /* New job */ - if (printer->remote) - job->current_file = job->num_files; - else - job->current_file ++; /* - * Now create processes for all of the filters... + * Open the requests directory... */ - filterfds[0][0] = -1; - filterfds[0][1] = -1; - filterfds[1][0] = -1; - filterfds[1][1] = -1; + cupsdLogMessage(CUPSD_LOG_DEBUG, "Scanning %s for jobs...", RequestRoot); - if (!job->status_buffer) + if ((dir = cupsDirOpen(RequestRoot)) == NULL) { - if (cupsdOpenPipe(job->status_pipes)) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to create job status pipes - %s.", strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to create status pipes - %s.", strerror(errno)); - - cupsdAddPrinterHistory(printer); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not create the job " - "status pipes."); - - goto abort_job; - } - - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: status_pipes = [ %d %d ]", - job->status_pipes[0], job->status_pipes[1]); - - job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL); - job->status_level = CUPSD_LOG_INFO; + cupsdLogMessage(CUPSD_LOG_ERROR, + "Unable to open spool directory \"%s\": %s", + RequestRoot, strerror(errno)); + return; } - job->status = 0; - memset(job->filters, 0, sizeof(job->filters)); - - if (!job->profile) - job->profile = cupsdCreateProfile(job->id); - - for (i = 0, slot = 0, filter = (mime_filter_t *)cupsArrayFirst(filters); - filter; - i ++, filter = (mime_filter_t *)cupsArrayNext(filters)) - { - if (filter->filter[0] != '/') - snprintf(command, sizeof(command), "%s/filter/%s", ServerBin, - filter->filter); - else - strlcpy(command, filter->filter, sizeof(command)); + /* + * Read all the c##### files... + */ - if (i < (cupsArrayCount(filters) - 1)) + while ((dent = cupsDirRead(dir)) != NULL) + if (strlen(dent->filename) >= 6 && dent->filename[0] == 'c') { - if (cupsdOpenPipe(filterfds[slot])) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to create job filter pipes - %s.", strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to create filter pipes - %s.", strerror(errno)); - cupsdAddPrinterHistory(printer); - - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not create the " - "filter pipes."); + /* + * Allocate memory for the job... + */ - goto abort_job; - } - } - else - { - if (job->current_file == 1) + if ((job = calloc(sizeof(cupsd_job_t), 1)) == NULL) { - if (strncmp(printer->device_uri, "file:", 5) != 0) - { - if (cupsdOpenPipe(job->print_pipes)) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to create job backend pipes - %s.", - strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to create backend pipes - %s.", strerror(errno)); - cupsdAddPrinterHistory(printer); + cupsdLogMessage(CUPSD_LOG_ERROR, "Ran out of memory for jobs!"); + cupsDirClose(dir); + return; + } - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not create " - "the backend pipes."); + /* + * Assign the job ID... + */ - goto abort_job; - } - } - else - { - job->print_pipes[0] = -1; - if (!strcmp(printer->device_uri, "file:/dev/null") || - !strcmp(printer->device_uri, "file:///dev/null")) - job->print_pipes[1] = -1; - else - { - if (!strncmp(printer->device_uri, "file:/dev/", 10)) - job->print_pipes[1] = open(printer->device_uri + 5, - O_WRONLY | O_EXCL); - else if (!strncmp(printer->device_uri, "file:///dev/", 12)) - job->print_pipes[1] = open(printer->device_uri + 7, - O_WRONLY | O_EXCL); - else if (!strncmp(printer->device_uri, "file:///", 8)) - job->print_pipes[1] = open(printer->device_uri + 7, - O_WRONLY | O_CREAT | O_TRUNC, 0600); - else - job->print_pipes[1] = open(printer->device_uri + 5, - O_WRONLY | O_CREAT | O_TRUNC, 0600); + job->id = atoi(dent->filename + 1); + job->back_pipes[0] = -1; + job->back_pipes[1] = -1; + job->print_pipes[0] = -1; + job->print_pipes[1] = -1; + job->side_pipes[0] = -1; + job->side_pipes[1] = -1; + job->status_pipes[0] = -1; + job->status_pipes[1] = -1; - if (job->print_pipes[1] < 0) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, - "Unable to open output file \"%s\" - %s.", - printer->device_uri, strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to open output file \"%s\" - %s.", - printer->device_uri, strerror(errno)); + if (job->id >= NextJobId) + NextJobId = job->id + 1; - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not open the " - "output file."); + /* + * Load the job... + */ - goto abort_job; - } + cupsdLoadJob(job); - fcntl(job->print_pipes[1], F_SETFD, - fcntl(job->print_pipes[1], F_GETFD) | FD_CLOEXEC); - } - } + /* + * Insert the job into the array, sorting by job priority and ID... + */ - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: print_pipes = [ %d %d ]", - job->print_pipes[0], job->print_pipes[1]); - } + cupsArrayAdd(Jobs, job); - filterfds[slot][0] = job->print_pipes[0]; - filterfds[slot][1] = job->print_pipes[1]; + if (job->state_value <= IPP_JOB_STOPPED) + cupsArrayAdd(ActiveJobs, job); + else + unload_job(job); } - cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filter=\"%s\"", command); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d]=[ %d %d ]", - slot, filterfds[slot][0], filterfds[slot][1]); + cupsDirClose(dir); +} - pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], - filterfds[slot][1], job->status_pipes[1], - job->back_pipes[0], job->side_pipes[0], 0, - job->profile, job->filters + i); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d [ %d %d ]...", - !slot, filterfds[!slot][0], filterfds[!slot][1]); +/* + * 'set_hold_until()' - Set the hold time and update job-hold-until attribute. + */ - cupsdClosePipe(filterfds[!slot]); +static void +set_hold_until(cupsd_job_t *job, /* I - Job to update */ + time_t holdtime) /* I - Hold until time */ +{ + ipp_attribute_t *attr; /* job-hold-until attribute */ + struct tm *holddate; /* Hold date */ + char holdstr[64]; /* Hold time */ - if (pid == 0) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start filter \"%s\" - %s.", - filter->filter, strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to start filter \"%s\" - %s.", - filter->filter, strerror(errno)); - cupsdAddPrinterHistory(printer); + /* + * Set the hold_until value and hold the job... + */ - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not execute a " - "filter."); + cupsdLogMessage(CUPSD_LOG_DEBUG, "set_hold_until: hold_until = %d", + (int)holdtime); - goto abort_job; - } + job->state->values[0].integer = IPP_JOB_HELD; + job->state_value = IPP_JOB_HELD; + job->hold_until = holdtime; - cupsdLogJob(job, CUPSD_LOG_INFO, "Started filter %s (PID %d)", command, - pid); + /* + * Update the job-hold-until attribute with a string representing GMT + * time (HH:MM:SS)... + */ - argv[6] = NULL; - slot = !slot; - } + holddate = gmtime(&holdtime); + snprintf(holdstr, sizeof(holdstr), "%d:%d:%d", holddate->tm_hour, + holddate->tm_min, holddate->tm_sec); - cupsArrayDelete(filters); - filters = NULL; + if ((attr = ippFindAttribute(job->attrs, "job-hold-until", + IPP_TAG_KEYWORD)) == NULL) + attr = ippFindAttribute(job->attrs, "job-hold-until", IPP_TAG_NAME); /* - * Finally, pipe the final output into a backend process if needed... + * Either add the attribute or update the value of the existing one */ - if (strncmp(printer->device_uri, "file:", 5) != 0) - { - if (job->current_file == 1 || printer->remote) - { - sscanf(printer->device_uri, "%254[^:]", method); - snprintf(command, sizeof(command), "%s/backend/%s", ServerBin, method); + if (attr == NULL) + ippAddString(job->attrs, IPP_TAG_JOB, IPP_TAG_KEYWORD, "job-hold-until", + NULL, holdstr); + else + cupsdSetString(&attr->values[0].string.text, holdstr); - /* - * See if the backend needs to run as root... - */ + job->dirty = 1; + cupsdMarkDirty(CUPSD_DIRTY_JOBS); +} - if (RunUser) - backroot = 0; - else if (stat(command, &backinfo)) - backroot = 0; - else - backroot = !(backinfo.st_mode & (S_IRWXG | S_IRWXO)); - argv[0] = printer->sanitized_device_uri; +/* + * 'set_time()' - Set one of the "time-at-xyz" attributes. + */ - filterfds[slot][0] = -1; - filterfds[slot][1] = -1; +static void +set_time(cupsd_job_t *job, /* I - Job to update */ + const char *name) /* I - Name of attribute */ +{ + ipp_attribute_t *attr; /* Time attribute */ - cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: backend=\"%s\"", command); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, "start_job: filterfds[%d] = [ %d %d ]", - slot, filterfds[slot][0], filterfds[slot][1]); - pid = cupsdStartProcess(command, argv, envp, filterfds[!slot][0], - filterfds[slot][1], job->status_pipes[1], - job->back_pipes[1], job->side_pipes[1], - backroot, job->profile, &(job->backend)); + if ((attr = ippFindAttribute(job->attrs, name, IPP_TAG_ZERO)) != NULL) + { + attr->value_tag = IPP_TAG_INTEGER; + attr->values[0].integer = time(NULL); + } +} - if (pid == 0) - { - cupsdLogJob(job, CUPSD_LOG_ERROR, "Unable to start backend \"%s\" - %s.", - method, strerror(errno)); - snprintf(printer->state_message, sizeof(printer->state_message), - "Unable to start backend \"%s\" - %s.", method, - strerror(errno)); - cupsdAddEvent(CUPSD_EVENT_JOB_COMPLETED, job->printer, job, - "Job canceled because the server could not execute " - "the backend."); +/* + * 'start_job()' - Start a print job. + */ - goto abort_job; - } - else - { - cupsdLogJob(job, CUPSD_LOG_INFO, "Started backend %s (PID %d)", - command, pid); - } - } +static void +start_job(cupsd_job_t *job, /* I - Job ID */ + cupsd_printer_t *printer) /* I - Printer to print job */ +{ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "start_job(job=%p(%d), printer=%p(%s))", + job, job->id, printer, printer->name); - if (job->current_file == job->num_files) - { - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing print pipes [ %d %d ]...", - job->print_pipes[0], job->print_pipes[1]); + /* + * Make sure we have some files around before we try to print... + */ - cupsdClosePipe(job->print_pipes); + if (job->num_files == 0) + { + cupsdSetJobState(job, IPP_JOB_ABORTED, CUPSD_JOB_DEFAULT, + "Aborting job because it has no files."); + return; + } - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing back pipes [ %d %d ]...", - job->back_pipes[0], job->back_pipes[1]); + /* + * Update the printer and job state to "processing"... + */ - cupsdClosePipe(job->back_pipes); + if (!cupsdLoadJob(job)) + return; - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing side pipes [ %d %d ]...", - job->side_pipes[0], job->side_pipes[1]); + cupsdSetJobState(job, IPP_JOB_PROCESSING, CUPSD_JOB_DEFAULT, NULL); + cupsdSetPrinterState(printer, IPP_PRINTER_PROCESSING, 0); - cupsdClosePipe(job->side_pipes); + job->cost = 0; + job->progress = 0; + job->printer = printer; + printer->job = job; - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing status output pipe %d...", - job->status_pipes[1]); + /* + * Setup the last exit status and security profiles... + */ - close(job->status_pipes[1]); - job->status_pipes[1] = -1; - } - } - else - { - filterfds[slot][0] = -1; - filterfds[slot][1] = -1; + job->status = 0; + job->profile = cupsdCreateProfile(job->id); - if (job->current_file == job->num_files) - { - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing print pipes [ %d %d ]...", - job->print_pipes[0], job->print_pipes[1]); + /* + * Create the status pipes and buffer... + */ - cupsdClosePipe(job->print_pipes); + if (cupsdOpenPipe(job->status_pipes)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create job status pipes - %s.", strerror(errno)); - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing status output pipe %d...", - job->status_pipes[1]); + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "job status pipes."); - close(job->status_pipes[1]); - job->status_pipes[1] = -1; - } + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; } - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d [ %d %d ]...", - slot, filterfds[slot][0], filterfds[slot][1]); - cupsdClosePipe(filterfds[slot]); + job->status_buffer = cupsdStatBufNew(job->status_pipes[0], NULL); + job->status_level = CUPSD_LOG_INFO; + + /* + * Create the backchannel pipes and make them non-blocking... + */ - if (printer->remote && job->num_files > 1) + if (cupsdOpenPipe(job->back_pipes)) { - for (i = 0; i < job->num_files; i ++) - free(argv[i + 6]); + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create back-channel pipes - %s.", strerror(errno)); + + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "back-channel pipes."); + + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; } - free(argv); + fcntl(job->back_pipes[0], F_SETFL, + fcntl(job->back_pipes[0], F_GETFL) | O_NONBLOCK); + fcntl(job->back_pipes[1], F_SETFL, + fcntl(job->back_pipes[1], F_GETFL) | O_NONBLOCK); - cupsdAddSelect(job->status_buffer->fd, (cupsd_selfunc_t)update_job, NULL, - job); + /* + * Create the side-channel pipes and make them non-blocking... + */ - cupsdAddEvent(CUPSD_EVENT_JOB_STATE, job->printer, job, "Job #%d started.", - job->id); + if (socketpair(AF_LOCAL, SOCK_STREAM, 0, job->side_pipes)) + { + cupsdLogJob(job, CUPSD_LOG_DEBUG, + "Unable to create side-channel pipes - %s.", strerror(errno)); - return; + cupsdSetJobState(job, IPP_JOB_STOPPED, CUPSD_JOB_DEFAULT, + "Job stopped because the scheduler could not create the " + "side-channel pipes."); + cupsdClosePipe(job->back_pipes); + + cupsdClosePipe(job->status_pipes); + cupsdStatBufDelete(job->status_buffer); + job->status_buffer = NULL; + + cupsdDestroyProfile(job->profile); + job->profile = NULL; + return; + } + + fcntl(job->side_pipes[0], F_SETFL, + fcntl(job->side_pipes[0], F_GETFL) | O_NONBLOCK); + fcntl(job->side_pipes[1], F_SETFL, + fcntl(job->side_pipes[1], F_GETFL) | O_NONBLOCK); /* - * If we get here, we need to abort the current job and close out all - * files and pipes... + * Now start the first file in the job... */ - abort_job: + cupsdContinueJob(job); +} - for (slot = 0; slot < 2; slot ++) - { - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing filter pipes for slot %d [ %d %d ]...", - slot, filterfds[slot][0], filterfds[slot][1]); - cupsdClosePipe(filterfds[slot]); - } - cupsdLogJob(job, CUPSD_LOG_DEBUG2, - "start_job: Closing status pipes [ %d %d ]...", - job->status_pipes[0], job->status_pipes[1]); - cupsdClosePipe(job->status_pipes); - cupsdStatBufDelete(job->status_buffer); +/* + * 'stop_job()' - Stop a print job. + */ - job->status_buffer = NULL; +static void +stop_job(cupsd_job_t *job, /* I - Job */ + cupsd_jobaction_t action) /* I - Action */ +{ + int i; /* Looping var */ - cupsArrayDelete(filters); - if (printer->remote && job->num_files > 1) - { - for (i = 0; i < job->num_files; i ++) - free(argv[i + 6]); - } + cupsdLogMessage(CUPSD_LOG_DEBUG2, "stop_job(job=%p(%d), action=%d)", job, + job->id, action); - free(argv); + FilterLevel -= job->cost; + job->cost = 0; - cupsdStopJob(job, 0); + for (i = 0; job->filters[i]; i ++) + if (job->filters[i] > 0) + cupsdEndProcess(job->filters[i], action == CUPSD_JOB_FORCE); + + if (job->backend > 0) + cupsdEndProcess(job->backend, action == CUPSD_JOB_FORCE); } @@ -3666,7 +3653,6 @@ update_job(cupsd_job_t *job) /* I - Job to check */ *ptr; /* Pointer update... */ int loglevel, /* Log level for message */ event = 0; /* Events? */ - cupsd_printer_t *printer; /* Printer for job */ static const char * const levels[] = /* Log levels */ { "NONE", @@ -3688,9 +3674,6 @@ update_job(cupsd_job_t *job) /* I - Job to check */ * a valid pointer... */ - if ((printer = job->printer) == NULL) - printer = cupsdFindDest(job->dest); - while ((ptr = cupsdStatBufUpdate(job->status_buffer, &loglevel, message, sizeof(message))) != NULL) { @@ -3723,9 +3706,9 @@ update_job(cupsd_job_t *job) /* I - Job to check */ job->sheets->values[0].integer += copies; - if (printer->page_limit) + if (job->printer->page_limit) { - cupsd_quota_t *q = cupsdUpdateQuota(printer, job->username, + cupsd_quota_t *q = cupsdUpdateQuota(job->printer, job->username, copies, 0); #ifdef __APPLE__ @@ -3735,13 +3718,11 @@ update_job(cupsd_job_t *job) /* I - Job to check */ * Quota limit exceeded, cancel job in progress immediately... */ - cupsdLogJob(job, CUPSD_LOG_INFO, - "Canceled because pages exceed user %s " - "quota limit on printer %s (%s).", - job->username, printer->name, - printer->info); - - cupsdCancelJob(job, 1, IPP_JOB_CANCELED); + cupsdSetJobState(job, IPP_JOB_CANCELED, CUPSD_JOB_DEFAULT, + "Canceled job because pages exceed user %s " + "quota limit on printer %s (%s).", + job->username, job->printer->name, + job->printer->info); return; } #else @@ -3753,7 +3734,7 @@ update_job(cupsd_job_t *job) /* I - Job to check */ cupsdLogPage(job, message); if (job->sheets) - cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, printer, job, + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printed %d page(s).", job->sheets->values[0].integer); } else if (loglevel == CUPSD_LOG_STATE) @@ -3762,13 +3743,13 @@ update_job(cupsd_job_t *job) /* I - Job to check */ if (!strcmp(message, "paused")) { - cupsdStopPrinter(printer, 1); + cupsdStopPrinter(job->printer, 1); return; } else { - cupsdSetPrinterReasons(printer, message); - cupsdAddPrinterHistory(printer); + cupsdSetPrinterReasons(job->printer, message); + cupsdAddPrinterHistory(job->printer); event |= CUPSD_EVENT_PRINTER_STATE; } @@ -3792,10 +3773,10 @@ update_job(cupsd_job_t *job) /* I - Job to check */ if ((attr = cupsGetOption("auth-info-required", num_attrs, attrs)) != NULL) { - cupsdSetAuthInfoRequired(printer, attr, NULL); - cupsdSetPrinterAttrs(printer); + cupsdSetAuthInfoRequired(job->printer, attr, NULL); + cupsdSetPrinterAttrs(job->printer); - if (printer->type & CUPS_PRINTER_DISCOVERED) + if (job->printer->type & CUPS_PRINTER_DISCOVERED) cupsdMarkDirty(CUPSD_DIRTY_REMOTE); else cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); @@ -3812,7 +3793,7 @@ update_job(cupsd_job_t *job) /* I - Job to check */ job->progress = progress; if (job->sheets) - cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, printer, job, + cupsdAddEvent(CUPSD_EVENT_JOB_PROGRESS, job->printer, job, "Printing page %d, %d%%", job->sheets->values[0].integer, job->progress); } @@ -3820,69 +3801,69 @@ update_job(cupsd_job_t *job) /* I - Job to check */ if ((attr = cupsGetOption("printer-alert", num_attrs, attrs)) != NULL) { - cupsdSetString(&printer->alert, attr); + cupsdSetString(&job->printer->alert, attr); event |= CUPSD_EVENT_PRINTER_STATE; } if ((attr = cupsGetOption("printer-alert-description", num_attrs, attrs)) != NULL) { - cupsdSetString(&printer->alert_description, attr); + cupsdSetString(&job->printer->alert_description, attr); event |= CUPSD_EVENT_PRINTER_STATE; } if ((attr = cupsGetOption("marker-colors", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-colors", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-colors", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-levels", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-levels", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-levels", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-low-levels", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-low-levels", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-low-levels", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-high-levels", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-high-levels", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-high-levels", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-message", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-message", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-message", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-names", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-names", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-names", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } if ((attr = cupsGetOption("marker-types", num_attrs, attrs)) != NULL) { - cupsdSetPrinterAttr(printer, "marker-types", (char *)attr); - printer->marker_time = time(NULL); + cupsdSetPrinterAttr(job->printer, "marker-types", (char *)attr); + job->printer->marker_time = time(NULL); event |= CUPSD_EVENT_PRINTER_STATE; cupsdMarkDirty(CUPSD_DIRTY_PRINTERS); } @@ -3903,8 +3884,8 @@ update_job(cupsd_job_t *job) /* I - Job to check */ num_keywords = cupsParseOptions(message, 0, &keywords); - if (cupsdUpdatePrinterPPD(printer, num_keywords, keywords)) - cupsdSetPrinterAttrs(printer); + if (cupsdUpdatePrinterPPD(job->printer, num_keywords, keywords)) + cupsdSetPrinterAttrs(job->printer); cupsFreeOptions(num_keywords, keywords); } @@ -3917,41 +3898,44 @@ update_job(cupsd_job_t *job) /* I - Job to check */ if (*ptr) { - cupsdSetPrinterReasons(printer, "+com.apple.print.recoverable-warning"); - cupsdSetString(&(printer->recoverable), ptr); - cupsdAddPrinterHistory(printer); + cupsdSetPrinterReasons(job->printer, + "+com.apple.print.recoverable-warning"); + cupsdSetString(&(job->printer->recoverable), ptr); + cupsdAddPrinterHistory(job->printer); event |= CUPSD_EVENT_PRINTER_STATE; } } else if (!strncmp(message, "recovered:", 10)) { - cupsdSetPrinterReasons(printer, "-com.apple.print.recoverable-warning"); + cupsdSetPrinterReasons(job->printer, + "-com.apple.print.recoverable-warning"); ptr = message + 10; while (isspace(*ptr & 255)) ptr ++; - cupsdSetString(&(printer->recoverable), ptr); - cupsdAddPrinterHistory(printer); + cupsdSetString(&(job->printer->recoverable), ptr); + cupsdAddPrinterHistory(job->printer); event |= CUPSD_EVENT_PRINTER_STATE; } #endif /* __APPLE__ */ else { - cupsdLogJob(job, loglevel, "%s", message); + if (loglevel != CUPSD_LOG_INFO && loglevel > LogLevel) + cupsdLogJob(job, loglevel, "%d %s", loglevel, message); if (loglevel < CUPSD_LOG_DEBUG) { - strlcpy(printer->state_message, message, - sizeof(printer->state_message)); - cupsdAddPrinterHistory(printer); + strlcpy(job->printer->state_message, message, + sizeof(job->printer->state_message)); + cupsdAddPrinterHistory(job->printer); event |= CUPSD_EVENT_PRINTER_STATE; if (loglevel <= job->status_level) { /* - * Some messages show in the printer-state-message attribute... + * Some messages show in the job-printer-state-message attribute... */ if (loglevel != CUPSD_LOG_NOTICE) @@ -3973,11 +3957,11 @@ update_job(cupsd_job_t *job) /* I - Job to check */ } if (event & CUPSD_EVENT_PRINTER_STATE) - cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, printer, NULL, - (printer->type & CUPS_PRINTER_CLASS) ? + cupsdAddEvent(CUPSD_EVENT_PRINTER_STATE, job->printer, NULL, + (job->printer->type & CUPS_PRINTER_CLASS) ? "Class \"%s\" state changed." : "Printer \"%s\" state changed.", - printer->name); + job->printer->name); if (ptr == NULL && !job->status_buffer->bufused) { @@ -3998,7 +3982,13 @@ update_job(cupsd_job_t *job) /* I - Job to check */ * Handle the end of job stuff... */ - cupsdFinishJob(job); + finalize_job(job); + + /* + * Check for new jobs... + */ + + cupsdCheckJobs(); } } @@ -4009,10 +3999,9 @@ update_job(cupsd_job_t *job) /* I - Job to check */ void update_job_attrs(cupsd_job_t *job, /* I - Job to update */ - int do_message)/* I - 1 = update job-printer-state message */ + int do_message)/* I - 1 = copy job-printer-state message */ { int i; /* Looping var */ - cupsd_printer_t *printer; /* Printer for job */ int num_reasons; /* Actual number of reasons */ const char * const *reasons; /* Reasons */ static const char *none = "none"; /* "none" reason */ @@ -4037,38 +4026,38 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */ "job-printer-state-reasons", IPP_TAG_KEYWORD); - if ((printer = job->printer) == NULL) - printer = cupsdFindDest(job->dest); - - if (!printer) - return; - /* - * Otherwise copy the printer-state-message value... + * Copy or clear the printer-state-message value as needed... */ - if (printer->state_message[0] && - (do_message || !job->printer_message->values[0].string.text[0])) + if (job->state_value != IPP_JOB_PROCESSING && + job->status_level == CUPSD_LOG_INFO) + cupsdSetString(&(job->printer_message->values[0].string.text), ""); + else if (job->printer->state_message[0] && do_message) cupsdSetString(&(job->printer_message->values[0].string.text), - printer->state_message); - + job->printer->state_message); + /* * ... and the printer-state-reasons value... */ - if (printer->num_reasons == 0) + if (job->printer->num_reasons == 0) { num_reasons = 1; reasons = &none; } else { - num_reasons = printer->num_reasons; - reasons = (const char * const *)printer->reasons; + num_reasons = job->printer->num_reasons; + reasons = (const char * const *)job->printer->reasons; } if (!job->printer_reasons || job->printer_reasons->num_values != num_reasons) { + /* + * Replace/create a job-printer-state-reasons attribute... + */ + ippDeleteAttribute(job->attrs, job->printer_reasons); job->printer_reasons = ippAddStrings(job->attrs, @@ -4076,12 +4065,31 @@ update_job_attrs(cupsd_job_t *job, /* I - Job to update */ "job-printer-state-reasons", num_reasons, NULL, NULL); } - else if (job->printer_reasons) + else { - for (i = 0; i < job->printer_reasons->num_values; i ++) + /* + * Don't bother clearing the reason strings if they are the same... + */ + + for (i = 0; i < num_reasons; i ++) + if (strcmp(job->printer_reasons->values[i].string.text, reasons[i])) + break; + + if (i >= num_reasons) + return; + + /* + * Not the same, so free the current strings... + */ + + for (i = 0; i < num_reasons; i ++) _cupsStrFree(job->printer_reasons->values[i].string.text); } + /* + * Copy the reasons... + */ + for (i = 0; i < num_reasons; i ++) job->printer_reasons->values[i].string.text = _cupsStrAlloc(reasons[i]); } diff --git a/scheduler/job.h b/scheduler/job.h index e3f2faa3b..2056e4ab7 100644 --- a/scheduler/job.h +++ b/scheduler/job.h @@ -13,6 +13,18 @@ * file is missing or damaged, see the license at "http://www.cups.org/". */ +/* + * Constants... + */ + +typedef enum cupsd_jobaction_e /**** Actions for state changes ****/ +{ + CUPSD_JOB_DEFAULT, /* Use default action */ + CUPSD_JOB_FORCE, /* Force the change */ + CUPSD_JOB_PURGE /* Force the change and purge */ +} cupsd_jobaction_t; + + /* * Job request structure... */ @@ -23,10 +35,11 @@ typedef struct cupsd_job_s priority, /* Job priority */ dirty; /* Do we need to write the "c" file? */ ipp_jstate_t state_value; /* Cached job-state */ - int pending_timeout;/* Non-zero if the job was created and waiting on files */ + int pending_timeout;/* Non-zero if the job was created and + * waiting on files */ char *username; /* Printing user */ char *dest; /* Destination printer or class */ - cups_ptype_t dtype; /* Destination type (class/remote bits) */ + cups_ptype_t dtype; /* Destination type */ int num_files; /* Number of files in job */ mime_type_t **filetypes; /* File types */ int *compressions; /* Compression status of each file */ @@ -46,7 +59,8 @@ typedef struct cupsd_job_s side_pipes[2], /* Sidechannel pipes */ status_pipes[2];/* Status pipes */ cupsd_statbuf_t *status_buffer; /* Status buffer for this job */ - int status_level; /* Highest log level in a status message */ + int status_level; /* Highest log level in a status + * message */ int cost; /* Filtering cost */ int filters[MAX_FILTERS + 1]; /* Filter process IDs, 0 terminated */ @@ -54,9 +68,12 @@ typedef struct cupsd_job_s int status; /* Status code from filters */ cupsd_printer_t *printer; /* Printer this job is assigned to */ int tries; /* Number of tries for this job */ - char *auth_username, /* AUTH_USERNAME environment variable, if any */ - *auth_domain, /* AUTH_DOMAIN environment variable, if any */ - *auth_password; /* AUTH_PASSWORD environment variable, if any */ + char *auth_username, /* AUTH_USERNAME environment variable, + * if any */ + *auth_domain, /* AUTH_DOMAIN environment variable, + * if any */ + *auth_password; /* AUTH_PASSWORD environment variable, + * if any */ void *profile; /* Security profile */ int progress; /* Printing progress */ #ifdef HAVE_GSSAPI @@ -103,19 +120,17 @@ VAR int JobRetryLimit VALUE(5), */ extern cupsd_job_t *cupsdAddJob(int priority, const char *dest); -extern void cupsdCancelJob(cupsd_job_t *job, int purge, - ipp_jstate_t newstate); extern void cupsdCancelJobs(const char *dest, const char *username, int purge); extern void cupsdCheckJobs(void); extern void cupsdCleanJobs(void); -extern void cupsdDeleteJob(cupsd_job_t *job); +extern void cupsdContinueJob(cupsd_job_t *job); +extern void cupsdDeleteJob(cupsd_job_t *job, + cupsd_jobaction_t action); extern cupsd_job_t *cupsdFindJob(int id); -extern void cupsdFinishJob(cupsd_job_t *job); extern void cupsdFreeAllJobs(void); extern int cupsdGetPrinterJobCount(const char *dest); extern int cupsdGetUserJobCount(const char *username); -extern void cupsdHoldJob(cupsd_job_t *job); extern void cupsdLoadAllJobs(void); extern int cupsdLoadJob(cupsd_job_t *job); extern void cupsdMoveJob(cupsd_job_t *job, cupsd_printer_t *p); @@ -123,10 +138,18 @@ extern void cupsdReleaseJob(cupsd_job_t *job); extern void cupsdRestartJob(cupsd_job_t *job); extern void cupsdSaveAllJobs(void); extern void cupsdSaveJob(cupsd_job_t *job); -extern void cupsdSetJobHoldUntil(cupsd_job_t *job, const char *when); +extern void cupsdSetJobHoldUntil(cupsd_job_t *job, + const char *when, int update); extern void cupsdSetJobPriority(cupsd_job_t *job, int priority); -extern void cupsdStopAllJobs(int force); -extern void cupsdStopJob(cupsd_job_t *job, int force); +extern void cupsdSetJobState(cupsd_job_t *job, + ipp_jstate_t newstate, + cupsd_jobaction_t action, + const char *message, ...) +#ifdef __GNUC__ +__attribute__ ((__format__ (__printf__, 4, 5))) +#endif /* __GNUC__ */ +; +extern void cupsdStopAllJobs(cupsd_jobaction_t action); extern int cupsdTimeoutJob(cupsd_job_t *job); extern void cupsdUnloadCompletedJobs(void); diff --git a/scheduler/main.c b/scheduler/main.c index b7e61a17f..437f0f5ba 100644 --- a/scheduler/main.c +++ b/scheduler/main.c @@ -670,12 +670,6 @@ main(int argc, /* I - Number of command-line args */ while (!stop_scheduler) { -#ifdef DEBUG - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "main: Top of loop, dead_children=%d, NeedReload=%d", - dead_children, NeedReload); -#endif /* DEBUG */ - /* * Check if there are dead children to handle... */ @@ -1628,7 +1622,8 @@ static void process_children(void) { int status; /* Exit status of child */ - int pid; /* Process ID of child */ + int pid, /* Process ID of child */ + job_id; /* Job ID of child */ cupsd_job_t *job; /* Current job */ int i; /* Looping var */ char name[1024]; /* Process name */ @@ -1658,7 +1653,7 @@ process_children(void) * Collect the name of the process that finished... */ - cupsdFinishProcess(pid, name, sizeof(name)); + cupsdFinishProcess(pid, name, sizeof(name), &job_id); /* * Delete certificates for CGI processes... @@ -1668,76 +1663,87 @@ process_children(void) cupsdDeleteCert(pid); /* - * Lookup the PID in the jobs list... + * Handle completed job filters... */ - for (job = (cupsd_job_t *)cupsArrayFirst(ActiveJobs); - job; - job = (cupsd_job_t *)cupsArrayNext(ActiveJobs)) - if (job->state_value >= IPP_JOB_HELD && (job->filters[0] || job->backend)) + if (job_id > 0 && (job = cupsdFindJob(job_id)) != NULL) + { + for (i = 0; job->filters[i]; i ++) + if (job->filters[i] == pid) + break; + + if (job->filters[i] || job->backend == pid) { - for (i = 0; job->filters[i]; i ++) - if (job->filters[i] == pid) - break; + /* + * OK, this process has gone away; what's left? + */ + + if (job->filters[i]) + job->filters[i] = -pid; + else + job->backend = -pid; - if (job->filters[i] || job->backend == pid) + if (status && status != SIGTERM && status != SIGKILL && + job->status >= 0) { /* - * OK, this process has gone away; what's left? + * An error occurred; save the exit status so we know to stop + * the printer or cancel the job when all of the filters finish... + * + * A negative status indicates that the backend failed and the + * printer needs to be stopped. */ - if (job->filters[i]) - job->filters[i] = -pid; + if (job->filters[i]) + job->status = status; /* Filter failed */ else - job->backend = -pid; + job->status = -status; /* Backend failed */ - if (status && job->status >= 0) + if (!(job->printer->type & CUPS_PRINTER_FAX) && + job->status_level >= CUPSD_LOG_ERROR) { - /* - * An error occurred; save the exit status so we know to stop - * the printer or cancel the job when all of the filters finish... - * - * A negative status indicates that the backend failed and the - * printer needs to be stopped. - */ + job->status_level = CUPSD_LOG_ERROR; - if (job->filters[i]) - job->status = status; /* Filter failed */ - else - job->status = -status; /* Backend failed */ + snprintf(job->printer->state_message, + sizeof(job->printer->state_message), "%s failed", name); + cupsdAddPrinterHistory(job->printer); - if (job->printer && !(job->printer->type & CUPS_PRINTER_FAX) && - job->status_level > CUPSD_LOG_ERROR) + if (!job->printer_message) { - job->status_level = CUPSD_LOG_ERROR; - - snprintf(job->printer->state_message, - sizeof(job->printer->state_message), "%s failed", name); - cupsdAddPrinterHistory(job->printer); + if ((job->printer_message = + ippFindAttribute(job->attrs, "job-printer-state-message", + IPP_TAG_TEXT)) == NULL) + job->printer_message = ippAddString(job->attrs, IPP_TAG_JOB, + IPP_TAG_TEXT, + "job-printer-state-message", + NULL, ""); } + + cupsdSetString(&(job->printer_message->values[0].string.text), + job->printer->state_message); } + } - /* - * If this is not the last file in a job, see if all of the - * filters are done, and if so move to the next file. - */ + /* + * If this is not the last file in a job, see if all of the + * filters are done, and if so move to the next file. + */ - if (job->current_file < job->num_files) - { - for (i = 0; job->filters[i] < 0; i ++); + if (job->current_file < job->num_files) + { + for (i = 0; job->filters[i] < 0; i ++); - if (!job->filters[i]) - { - /* - * Process the next file... - */ + if (!job->filters[i]) + { + /* + * Process the next file... + */ - cupsdFinishJob(job); - } + cupsdContinueJob(job); } - break; } } + } /* * Show the exit status as needed, ignoring SIGTERM and SIGKILL errors diff --git a/scheduler/printers.c b/scheduler/printers.c index 003210aa4..c826120f1 100644 --- a/scheduler/printers.c +++ b/scheduler/printers.c @@ -803,14 +803,14 @@ cupsdDeletePrinter( free(p->history); } + delete_printer_filters(p); + for (i = 0; i < p->num_reasons; i ++) _cupsStrFree(p->reasons[i]); ippDelete(p->attrs); ippDelete(p->ppd_attrs); - delete_printer_filters(p); - mimeDeleteType(MimeDatabase, p->filetype); mimeDeleteType(MimeDatabase, p->prefiltertype); @@ -1099,7 +1099,11 @@ cupsdLoadAllPrinters(void) } else if (!strcasecmp(line, "Reason")) { - if (value) + if (value && + strcmp(value, "com.apple.print.recoverable-warning") && + strcmp(value, "connecting-to-device") && + strcmp(value, "cups-insecure-filter-error") && + strcmp(value, "cups-missing-filter-error")) { for (i = 0 ; i < p->num_reasons; i ++) if (!strcmp(value, p->reasons[i])) @@ -1590,7 +1594,9 @@ cupsdSaveAllPrinters(void) cupsFilePrintf(fp, "StateTime %d\n", (int)printer->state_time); for (i = 0; i < printer->num_reasons; i ++) - if (strcmp(printer->reasons[i], "connecting-to-device") && + if (strcmp(printer->reasons[i], "com.apple.print.recoverable-warning") && + strcmp(printer->reasons[i], "connecting-to-device") && + strcmp(printer->reasons[i], "cups-insecure-filter-error") && strcmp(printer->reasons[i], "cups-missing-filter-error")) cupsFilePutConf(fp, "Reason", printer->reasons[i]); @@ -2442,6 +2448,30 @@ cupsdSetPrinterAttrs(cupsd_printer_t *p)/* I - Printer to setup */ } } + if ((oldattr = ippFindAttribute(oldattrs, "marker-low-levels", + IPP_TAG_INTEGER)) != NULL) + { + if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-low-levels", oldattr->num_values, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].integer = oldattr->values[i].integer; + } + } + + if ((oldattr = ippFindAttribute(oldattrs, "marker-high-levels", + IPP_TAG_INTEGER)) != NULL) + { + if ((attr = ippAddIntegers(p->attrs, IPP_TAG_PRINTER, IPP_TAG_INTEGER, + "marker-high-levels", oldattr->num_values, + NULL)) != NULL) + { + for (i = 0; i < oldattr->num_values; i ++) + attr->values[i].integer = oldattr->values[i].integer; + } + } + if ((oldattr = ippFindAttribute(oldattrs, "marker-names", IPP_TAG_NAME)) != NULL) { @@ -2638,24 +2668,8 @@ cupsdSetPrinterReasons( *rptr; /* Pointer into reason */ - if (!p || !s) - { - cupsdLogMessage(CUPSD_LOG_EMERG, - "cupsdSetPrinterReasons called with p=%p and s=%p!", p, s); - return; - } - - if (LogLevel == CUPSD_LOG_DEBUG2) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdSetPrinterReasons: num_reasons=%d", - p->num_reasons); - for (i = 0; i < p->num_reasons; i ++) - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSetPrinterReasons: reasons[%d]=%p(\"%s\")", i, - p->reasons[i], p->reasons[i]); - } + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdSetPrinterReasons(p=%p(%s),s=\"%s\"", p, p->name, s); if (s[0] == '-' || s[0] == '+') { @@ -2783,17 +2797,6 @@ cupsdSetPrinterReasons( } } } - - if (LogLevel == CUPSD_LOG_DEBUG2) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSetPrinterReasons: NEW num_reasons=%d", - p->num_reasons); - for (i = 0; i < p->num_reasons; i ++) - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdSetPrinterReasons: NEW reasons[%d]=%p(\"%s\")", i, - p->reasons[i], p->reasons[i]); - } } @@ -2848,11 +2851,26 @@ cupsdSetPrinterState( #endif /* __sgi */ } + /* + * Set/clear the paused reason as needed... + */ + if (s == IPP_PRINTER_STOPPED) cupsdSetPrinterReasons(p, "+paused"); else cupsdSetPrinterReasons(p, "-paused"); + /* + * Clear the message for the queue when going to processing... + */ + + if (s == IPP_PRINTER_PROCESSING) + p->state_message[0] = '\0'; + + /* + * Update the printer history... + */ + cupsdAddPrinterHistory(p); /* @@ -2867,8 +2885,8 @@ cupsdSetPrinterState( * to stopped (or visa-versa)... */ - if ((old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED) && - update) + if (update && + (old_state == IPP_PRINTER_STOPPED) != (s == IPP_PRINTER_STOPPED)) { if (p->type & CUPS_PRINTER_CLASS) cupsdMarkDirty(CUPSD_DIRTY_CLASSES); @@ -2886,9 +2904,6 @@ void cupsdStopPrinter(cupsd_printer_t *p, /* I - Printer to stop */ int update)/* I - Update printers.conf? */ { - cupsd_job_t *job; /* Active print job */ - - /* * Set the printer state... */ @@ -2900,32 +2915,8 @@ cupsdStopPrinter(cupsd_printer_t *p, /* I - Printer to stop */ */ if (p->job) - { - /* - * Get pointer to job... - */ - - job = (cupsd_job_t *)p->job; - - /* - * Stop it... - */ - - cupsdStopJob(job, 0); - - /* - * Reset the state to pending... - */ - - job->state->values[0].integer = IPP_JOB_PENDING; - job->state_value = IPP_JOB_PENDING; - job->dirty = 1; - - cupsdMarkDirty(CUPSD_DIRTY_JOBS); - - cupsdAddEvent(CUPSD_EVENT_JOB_STOPPED, p, job, - "Job stopped due to printer being paused"); - } + cupsdSetJobState(p->job, IPP_JOB_PENDING, CUPSD_JOB_DEFAULT, + "Job stopped due to printer being paused."); } @@ -3889,6 +3880,9 @@ delete_printer_filters( mimeDeleteFilter(MimeDatabase, filter); } + + cupsdSetPrinterReasons(p, "-cups-insecure-filter-error" + ",cups-missing-filter-error"); } @@ -4060,9 +4054,13 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */ if (ppd->num_sizes == 0) { - cupsdLogMessage(CUPSD_LOG_CRIT, - "The PPD file for printer %s contains no media " - "options and is therefore invalid!", p->name); + if (!ppdFindAttr(ppd, "APScannerOnly", NULL)) + cupsdLogMessage(CUPSD_LOG_CRIT, + "The PPD file for printer %s contains no media " + "options and is therefore invalid!", p->name); + + ippAddString(p->ppd_attrs, IPP_TAG_PRINTER, IPP_TAG_KEYWORD, + "media-supported", NULL, "unknown"); } else { @@ -4237,6 +4235,16 @@ load_ppd(cupsd_printer_t *p) /* I - Printer */ else p->type |= CUPS_PRINTER_SMALL; + if ((ppd_attr = ppdFindAttr(ppd, "APICADriver", NULL)) != NULL && + ppd_attr->value && !strcasecmp(ppd_attr->value, "true")) + { + if ((ppd_attr = ppdFindAttr(ppd, "APScannerOnly", NULL)) != NULL && + ppd_attr->value && !strcasecmp(ppd_attr->value, "true")) + p->type |= CUPS_PRINTER_SCANNER; + else + p->type |= CUPS_PRINTER_MFP; + } + /* * Add a filter from application/vnd.cups-raw to printer/name to * handle "raw" printing by users. diff --git a/scheduler/process.c b/scheduler/process.c index d4cedbe31..bd548ff06 100644 --- a/scheduler/process.c +++ b/scheduler/process.c @@ -44,7 +44,8 @@ typedef struct { - int pid; /* Process ID */ + int pid, /* Process ID */ + job_id; /* Job associated with process */ char name[1]; /* Name of process */ } cupsd_proc_t; @@ -82,8 +83,22 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */ temp[1024]; /* Quoted TempDir */ + if (RunUser) + { + /* + * Only use sandbox profiles as root... + */ + + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); + + return (NULL); + } + if ((fp = cupsTempFile2(profile, sizeof(profile))) == NULL) { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to create security profile: %s", strerror(errno)); return (NULL); @@ -129,7 +144,10 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */ cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = \"%s\"", job_id, profile); return ((void *)strdup(profile)); + #else + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdCreateProfile(job_id=%d) = NULL", + job_id); return (NULL); #endif /* HAVE_SANDBOX_H */ @@ -143,11 +161,12 @@ cupsdCreateProfile(int job_id) /* I - Job ID or 0 for none */ void cupsdDestroyProfile(void *profile) /* I - Profile */ { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteProfile(profile=\"%s\")", + profile ? (char *)profile : "(null)"); + #ifdef HAVE_SANDBOX_H if (profile) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDeleteProfile(profile=\"%s\")", - (char *)profile); unlink((char *)profile); free(profile); } @@ -163,6 +182,9 @@ int /* O - 0 on success, -1 on failure */ cupsdEndProcess(int pid, /* I - Process ID */ int force) /* I - Force child to die */ { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdEndProcess(pid=%d, force=%d)", pid, + force); + if (force) return (kill(pid, SIGKILL)); else @@ -177,7 +199,8 @@ cupsdEndProcess(int pid, /* I - Process ID */ const char * /* O - Process name */ cupsdFinishProcess(int pid, /* I - Process ID */ char *name, /* I - Name buffer */ - int namelen) /* I - Size of name buffer */ + int namelen, /* I - Size of name buffer */ + int *job_id) /* O - Job ID pointer or NULL */ { cupsd_proc_t key, /* Search key */ *proc; /* Matching process */ @@ -187,14 +210,27 @@ cupsdFinishProcess(int pid, /* I - Process ID */ if ((proc = (cupsd_proc_t *)cupsArrayFind(process_array, &key)) != NULL) { + if (job_id) + *job_id = proc->job_id; + strlcpy(name, proc->name, namelen); cupsArrayRemove(process_array, proc); free(proc); - - return (name); } else - return ("unknown"); + { + if (job_id) + *job_id = 0; + + strlcpy(name, "unknown", namelen); + } + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdFinishProcess(pid=%d, name=%p, namelen=%d, " + "job_id=%p(%d)) = \"%s\"", pid, name, namelen, job_id, + job_id ? *job_id : 0, name); + + return (name); } @@ -204,17 +240,18 @@ cupsdFinishProcess(int pid, /* I - Process ID */ int /* O - Process ID or 0 */ cupsdStartProcess( - const char *command, /* I - Full path to command */ - char *argv[], /* I - Command-line arguments */ - char *envp[], /* I - Environment */ - int infd, /* I - Standard input file descriptor */ - int outfd, /* I - Standard output file descriptor */ - int errfd, /* I - Standard error file descriptor */ - int backfd, /* I - Backchannel file descriptor */ - int sidefd, /* I - Sidechannel file descriptor */ - int root, /* I - Run as root? */ - void *profile, /* I - Security profile to use */ - int *pid) /* O - Process ID */ + const char *command, /* I - Full path to command */ + char *argv[], /* I - Command-line arguments */ + char *envp[], /* I - Environment */ + int infd, /* I - Standard input file descriptor */ + int outfd, /* I - Standard output file descriptor */ + int errfd, /* I - Standard error file descriptor */ + int backfd, /* I - Backchannel file descriptor */ + int sidefd, /* I - Sidechannel file descriptor */ + int root, /* I - Run as root? */ + void *profile, /* I - Security profile to use */ + int job_id, /* I - Job associated with process */ + int *pid) /* O - Process ID */ { int user; /* Command UID */ struct stat commandinfo; /* Command file information */ @@ -229,10 +266,6 @@ cupsdStartProcess( #endif /* __APPLE__ */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdStartProcess(\"%s\", %p, %p, %d, %d, %d)", - command, argv, envp, infd, outfd, errfd); - if (RunUser) user = RunUser; else if (root) @@ -242,17 +275,32 @@ cupsdStartProcess( if (stat(command, &commandinfo)) { + *pid = 0; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " + "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " + "profile=%p, job_id=%d, pid=%p) = %d", + command, argv, envp, infd, outfd, errfd, backfd, sidefd, + root, profile, job_id, pid, *pid); cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to execute %s: %s", command, strerror(errno)); - *pid = 0; return (0); } else if (commandinfo.st_mode & S_IWOTH) { + *pid = 0; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " + "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " + "profile=%p, job_id=%d, pid=%p) = %d", + command, argv, envp, infd, outfd, errfd, backfd, sidefd, + root, profile, job_id, pid, *pid); cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to execute %s: insecure file permissions (0%o)", command, commandinfo.st_mode); - *pid = 0; + errno = EPERM; return (0); } @@ -260,10 +308,18 @@ cupsdStartProcess( (commandinfo.st_gid != Group || !(commandinfo.st_mode & S_IXGRP)) && !(commandinfo.st_mode & S_IXOTH)) { + *pid = 0; + + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " + "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " + "profile=%p, job_id=%d, pid=%p) = %d", + command, argv, envp, infd, outfd, errfd, backfd, sidefd, + root, profile, job_id, pid, *pid); cupsdLogMessage(CUPSD_LOG_ERROR, "Unable to execute %s: no execute permissions (0%o)", command, commandinfo.st_mode); - *pid = 0; + errno = EPERM; return (0); } @@ -470,7 +526,8 @@ cupsdStartProcess( { if ((proc = calloc(1, sizeof(cupsd_proc_t) + strlen(command))) != NULL) { - proc->pid = *pid; + proc->pid = *pid; + proc->job_id = job_id; strcpy(proc->name, command); cupsArrayAdd(process_array, proc); @@ -480,6 +537,13 @@ cupsdStartProcess( cupsdReleaseSignals(); + cupsdLogMessage(CUPSD_LOG_DEBUG2, + "cupsdStartProcess(command=\"%s\", argv=%p, envp=%p, " + "infd=%d, outfd=%d, errfd=%d, backfd=%d, sidefd=%d, root=%d, " + "profile=%p, job_id=%d, pid=%p) = %d", + command, argv, envp, infd, outfd, errfd, backfd, sidefd, + root, profile, job_id, pid, *pid); + return (*pid); } diff --git a/scheduler/quotas.c b/scheduler/quotas.c index 6d45b300d..3288c4d11 100644 --- a/scheduler/quotas.c +++ b/scheduler/quotas.c @@ -178,24 +178,14 @@ cupsdUpdateQuota( attr = ippFindAttribute(job->attrs, "time-at-creation", IPP_TAG_INTEGER); - if (!attr) - { - /* - * This should never happen since cupsdLoadJob() checks for - * time-at-creation, but if it does just ignore this job... - */ - - continue; - } - if (attr->values[0].integer < curtime) { /* * This job is too old to count towards the quota, ignore it... */ - if (JobAutoPurge) - cupsdCancelJob(job, 1, IPP_JOB_CANCELED); + if (JobAutoPurge && !job->printer && job->state_value > IPP_JOB_STOPPED) + cupsdDeleteJob(job, CUPSD_JOB_PURGE); continue; } diff --git a/scheduler/select.c b/scheduler/select.c index 4e81c4a9e..0ac6ce063 100644 --- a/scheduler/select.c +++ b/scheduler/select.c @@ -3,7 +3,7 @@ * * Select abstraction functions for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 2006-2007 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -269,7 +269,7 @@ cupsdAddSelect(int fd, /* I - File descriptor */ */ cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: fd=%d, read_cb=%p, write_cb=%p, data=%p", + "cupsdAddSelect(fd=%d, read_cb=%p, write_cb=%p, data=%p)", fd, read_cb, write_cb, data); if (fd < 0) @@ -325,8 +325,7 @@ cupsdAddSelect(int fd, /* I - File descriptor */ if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: kevent() returned %s", + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", strerror(errno)); return (0); } @@ -341,8 +340,7 @@ cupsdAddSelect(int fd, /* I - File descriptor */ if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: kevent() returned %s", + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", strerror(errno)); return (0); } @@ -386,29 +384,17 @@ cupsdAddSelect(int fd, /* I - File descriptor */ */ if (read_cb) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: Adding fd %d to input set...", fd); FD_SET(fd, &cupsd_global_input); - } else { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: Removing fd %d from input set...", fd); FD_CLR(fd, &cupsd_global_input); FD_CLR(fd, &cupsd_current_input); } if (write_cb) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: Adding fd %d to output set...", fd); FD_SET(fd, &cupsd_global_output); - } else { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdAddSelect: Removing fd %d from output set...", fd); FD_CLR(fd, &cupsd_global_output); FD_CLR(fd, &cupsd_current_output); } @@ -441,10 +427,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ struct timespec ktimeout; /* kevent() timeout */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: polling %d fds for %ld seconds...", - cupsArrayCount(cupsd_fds), timeout); - cupsd_in_select = 1; if (timeout >= 0 && timeout < 86400) @@ -458,10 +440,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ else nfds = kevent(cupsd_kqueue_fd, NULL, 0, cupsd_kqueue_events, MaxFDs, NULL); - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: kevent(%d, ..., %d, ...) returned %d...", - cupsd_kqueue_fd, MaxFDs, nfds); - cupsd_kqueue_changes = 0; for (i = nfds, event = cupsd_kqueue_events; i > 0; i --, event ++) @@ -471,24 +449,13 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ if (cupsArrayFind(cupsd_inactive_fds, fdptr)) continue; - cupsdLogMessage(CUPSD_LOG_DEBUG2, "event->filter=%d, event->ident=%d", - event->filter, (int)event->ident); - retain_fd(fdptr); if (fdptr->read_cb && event->filter == EVFILT_READ) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...", - fdptr->fd); (*(fdptr->read_cb))(fdptr->data); - } if (fdptr->write_cb && event->filter == EVFILT_WRITE) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...", - fdptr->fd); (*(fdptr->write_cb))(fdptr->data); - } release_fd(fdptr); } @@ -498,10 +465,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ int count; /* Number of file descriptors */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: polling %d fds for %ld seconds...", - cupsArrayCount(cupsd_fds), timeout); - # ifdef HAVE_EPOLL cupsd_in_select = 1; @@ -517,9 +480,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ else nfds = epoll_wait(cupsd_epoll_fd, cupsd_epoll_events, MaxFDs, -1); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: epoll() returned %d...", - nfds); - if (nfds < 0 && errno != EINTR) { close(cupsd_epoll_fd); @@ -537,18 +497,10 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ retain_fd(fdptr); if (fdptr->read_cb && (event->events & (EPOLLIN | EPOLLERR | EPOLLHUP))) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...", - fdptr->fd); (*(fdptr->read_cb))(fdptr->data); - } if (fdptr->write_cb && (event->events & (EPOLLOUT | EPOLLERR | EPOLLHUP))) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...", - fdptr->fd); (*(fdptr->write_cb))(fdptr->data); - } release_fd(fdptr); } @@ -568,8 +520,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ cupsd_update_pollfds = 0; - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Updating pollfd array..."); - /* * (Re)allocate memory as needed... */ @@ -616,18 +566,11 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ } } - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: polling %d fds for %ld seconds...", - count, timeout); - if (timeout >= 0 && timeout < 86400) nfds = poll(cupsd_pollfds, count, timeout * 1000); else nfds = poll(cupsd_pollfds, count, -1); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: poll() returned %d...", - nfds); - if (nfds > 0) { /* @@ -636,10 +579,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ for (pfd = cupsd_pollfds; count > 0; pfd ++, count --) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: pollfds[%d]={fd=%d, revents=%x}", - (int)(pfd - cupsd_pollfds), pfd->fd, pfd->revents); - if (!pfd->revents) continue; @@ -649,18 +588,10 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ retain_fd(fdptr); if (fdptr->read_cb && (pfd->revents & (POLLIN | POLLERR | POLLHUP))) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...", - fdptr->fd); (*(fdptr->read_cb))(fdptr->data); - } if (fdptr->write_cb && (pfd->revents & (POLLOUT | POLLERR | POLLHUP))) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...", - fdptr->fd); (*(fdptr->write_cb))(fdptr->data); - } release_fd(fdptr); } @@ -687,10 +618,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ cupsd_current_input = cupsd_global_input; cupsd_current_output = cupsd_global_output; - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdDoSelect: selecting %d fds for %ld seconds...", - maxfd, timeout); - if (timeout >= 0 && timeout < 86400) { stimeout.tv_sec = timeout; @@ -703,9 +630,6 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ nfds = select(maxfd, &cupsd_current_input, &cupsd_current_output, NULL, NULL); - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: select() returned %d...", - nfds); - if (nfds > 0) { /* @@ -719,18 +643,10 @@ cupsdDoSelect(long timeout) /* I - Timeout in seconds */ retain_fd(fdptr); if (fdptr->read_cb && FD_ISSET(fdptr->fd, &cupsd_current_input)) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Read on fd %d...", - fdptr->fd); (*(fdptr->read_cb))(fdptr->data); - } if (fdptr->write_cb && FD_ISSET(fdptr->fd, &cupsd_current_output)) - { - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdDoSelect: Write on fd %d...", - fdptr->fd); (*(fdptr->write_cb))(fdptr->data); - } release_fd(fdptr); } @@ -802,7 +718,7 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */ * Range check input... */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRemoveSelect: fd=%d", fd); + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdRemoveSelect(fd=%d)", fd); if (fd < 0) return; @@ -832,8 +748,7 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */ if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdRemoveSelect: kevent() returned %s", + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", strerror(errno)); return; } @@ -845,8 +760,7 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */ if (kevent(cupsd_kqueue_fd, &event, 1, NULL, 0, &timeout)) { - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdRemoveSelect: kevent() returned %s", + cupsdLogMessage(CUPSD_LOG_EMERG, "kevent() returned %s", strerror(errno)); return; } @@ -861,9 +775,6 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */ cupsd_update_pollfds = 1; #else /* select() */ - cupsdLogMessage(CUPSD_LOG_DEBUG2, - "cupsdRemoveSelect: Removing fd %d from input and output " - "sets...", fd); FD_CLR(fd, &cupsd_global_input); FD_CLR(fd, &cupsd_global_output); FD_CLR(fd, &cupsd_current_input); @@ -894,6 +805,8 @@ cupsdRemoveSelect(int fd) /* I - File descriptor */ void cupsdStartSelect(void) { + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStartSelect()"); + cupsd_fds = cupsArrayNew((cups_array_func_t)compare_fds, NULL); #if defined(HAVE_EPOLL) || defined(HAVE_KQUEUE) @@ -930,6 +843,8 @@ cupsdStopSelect(void) _cupsd_fd_t *fdptr; /* Current file descriptor */ + cupsdLogMessage(CUPSD_LOG_DEBUG2, "cupsdStopSelect()"); + for (fdptr = (_cupsd_fd_t *)cupsArrayFirst(cupsd_fds); fdptr; fdptr = (_cupsd_fd_t *)cupsArrayNext(cupsd_fds)) diff --git a/scheduler/statbuf.c b/scheduler/statbuf.c index 925b60169..9e422418e 100644 --- a/scheduler/statbuf.c +++ b/scheduler/statbuf.c @@ -57,7 +57,7 @@ cupsdStatBufDelete(cupsd_statbuf_t *sb) /* I - Status buffer */ */ cupsd_statbuf_t * /* O - New status buffer */ -cupsdStatBufNew(int fd, /* I - File descriptor of pipe */ +cupsdStatBufNew(int fd, /* I - File descriptor of pipe */ const char *prefix, /* I - Printf-style prefix string */ ...) /* I - Additional args as needed */ { diff --git a/scheduler/subscriptions.c b/scheduler/subscriptions.c index 4412c33d7..ba866ca10 100644 --- a/scheduler/subscriptions.c +++ b/scheduler/subscriptions.c @@ -3,7 +3,7 @@ * * Subscription routines for the Common UNIX Printing System (CUPS) scheduler. * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -1622,7 +1622,7 @@ cupsd_start_notifier( */ if (cupsdStartProcess(command, argv, envp, fds[0], -1, NotifierPipes[1], - -1, -1, 0, DefaultProfile, &pid) < 0) + -1, -1, 0, DefaultProfile, 0, &pid) < 0) { /* * Error - can't fork! diff --git a/scheduler/util.h b/scheduler/util.h index 31e729730..fab50eee5 100644 --- a/scheduler/util.h +++ b/scheduler/util.h @@ -3,7 +3,7 @@ * * Mini-daemon utility definitions for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2005 by Easy Software Products. * * These coded instructions, statements, and computer programs are the @@ -20,13 +20,8 @@ * Include necessary headers... */ -# include -# include -# include -# include -# include +# include # include -# include /* diff --git a/templates/pl/add-class.tmpl b/templates/pl/add-class.tmpl new file mode 100644 index 000000000..af5c69ff1 --- /dev/null +++ b/templates/pl/add-class.tmpl @@ -0,0 +1,39 @@ +
+ +

Dodawanie klasy

+ +
+ + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Członkowie: + +
+ +
+
diff --git a/templates/pl/add-printer.tmpl b/templates/pl/add-printer.tmpl new file mode 100644 index 000000000..2010a0b0a --- /dev/null +++ b/templates/pl/add-printer.tmpl @@ -0,0 +1,42 @@ +
+ +

Dodawanie drukarki

+ +
+ +{?current_make!?:} +{?current_make_and_model!?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz "/", "#" i spacji)
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Połączenie:{device_uri}
Współdzielenie: +Współdzielenie tej drukarki
+ +
+
diff --git a/templates/pl/add-rss-subscription.tmpl b/templates/pl/add-rss-subscription.tmpl new file mode 100644 index 000000000..0523454b6 --- /dev/null +++ b/templates/pl/add-rss-subscription.tmpl @@ -0,0 +1,43 @@ +
+ + +

Dodawanie subskrypcji RSS

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:
+(Może zawierać wszystkie drukowalne znaki, oprócz spacji, "/", "?" i "#")
Kolejka:
Zdarzenia:Utworzono zadanie
+Ukończono zadanie
+Zatrzymano zadanie
+Zmieniono opcje zadania
    Zatrzymano kolejkę
+Dodano kolejkę
+Zmodyfikowano kolejkę
+Usunięto kolejkę
    Uruchomiono serwer
+Zatrzymano serwer
+Ponownie uruchomiono serwer
+Audytowanie bezpieczeństwa serwera
Maksymalna liczba zdarzeń w kanale:
+ +
diff --git a/templates/pl/admin.tmpl b/templates/pl/admin.tmpl new file mode 100644 index 000000000..5a5e828d2 --- /dev/null +++ b/templates/pl/admin.tmpl @@ -0,0 +1,109 @@ + + +
+ +

Drukarki

+ +

+

+
+
+{have_samba?
:} +

+ +

Klasy

+ +

+

+
+

+ +

Zadania

+ +

+

+

+ +
          + +

Serwery

+ +

+

+
+
+
+

+ +{SETTINGS_ERROR?

{SETTINGS_MESSAGE}

+
{SETTINGS_ERROR}
: + +
+ +{ADVANCEDSETTINGS?

Ustawienia serwera\:

+ +

Zaawansowane
+ + + Wyświetlanie drukarek współdzielonych przez inne systemy
+        Protokoły\: + CUPS +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+ Współdzielenie drukarek podłączonych do tego systemu
+        Maksymalna liczba klientów\: +
+        Protokoły\: + CUPS +{HAVE_DNSSD? DNS-SD:} +{HAVE_LDAP? LDAP:} +{HAVE_LIBSLP? SLP:}
+         Zezwolenie na drukowanie z Internetu"
+         Rozgłaszanie interfejsu WWW
+ Zezwolenie na zdalną administrację
+{have_gssapi? Używanie uwierzytelniania Kerberosa (FAQ)
:} + Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)
+ Przechowywanie plików zadań
+        Liczba zadań\: +
+         Przechowywanie plików wydruków zadań
+ Zapisywanie informacji debugowania do naprawiania problemów
+        Maksymalny rozmiar pliku dziennika\: +

+ +:

Ustawienia serwera:

+ +

Zaawansowane
+ + Wyświetlanie drukarek współdzielonych przez inne systemy
+ Współdzielenie drukarek połączonych do tego systemu
+         Zezwolenie na drukowanie z Internetu
+ Zezwolenie na zdalną administrację
+{have_gssapi? Używanie uwierzytelniania Kerberosa (FAQ)
:} + Zezwolenie użytkownikom na anulowanie każdego zadania (nie tylko ich własnego)
+ Zapisywanie informacji debugowania do naprawiania problemów

+ +} +

+ +
} + +
+ +
+ +

Subskrypcje RSS

+ +

+

+

+ +
+ +{notify_subscription_id? + +{[notify_subscription_id] +} + +
NameZdarzeniaNazwa kolejki
{notify_recipient_name}
+
 
{notify_events} {notify_printer_name?{notify_printer_name}:Wszystkie kolejki}
:} diff --git a/templates/pl/choose-device.tmpl b/templates/pl/choose-device.tmpl new file mode 100644 index 000000000..7fc06ded4 --- /dev/null +++ b/templates/pl/choose-device.tmpl @@ -0,0 +1,53 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +{CUPS_GET_DEVICES_DONE?:

Wyszukiwanie drukarek...

} + +
+ +{printer_name?:} + + +{op=add-printer?: + + +} + + + + + + + + + + + + + + + + + +
Bieżące połączenie: +{current_device_uri}
Lokalne drukarki: +{[device_uri]{device_class!network? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}} +
Wykryte drukarki sieciowe: +{[device_uri]{device_class=network?{device_uri~[a-z]+://? +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+:}:}} +
Inne drukarki sieciowe: +{[device_uri]{device_class=network?{device_uri~[a-z]+://?: +{device_info} {?device_make_and_model!Unknown?({device_make_and_model}):}
+}:}} +
+ +
+
diff --git a/templates/pl/choose-make.tmpl b/templates/pl/choose-make.tmpl new file mode 100644 index 000000000..d632619d0 --- /dev/null +++ b/templates/pl/choose-make.tmpl @@ -0,0 +1,63 @@ +
+ +

{op=modify-printer?Modify {printer_name}:Dodawanie drukarki}

+ +
+ +{printer_name?:} + + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:{printer_name}
Opis:{printer_info}
Położenie:{printer_location}
Połączenie:{device_uri}
Współdzielenie: +{?printer_is_shared=?Do Not:{?printer_is_shared=0?Do Not:}} Współdzielenie tej drukarki
Producent: + +
 
Lub podaj plik PPD:
+ +
+
diff --git a/templates/pl/choose-model.tmpl b/templates/pl/choose-model.tmpl new file mode 100644 index 000000000..6a7cbb672 --- /dev/null +++ b/templates/pl/choose-model.tmpl @@ -0,0 +1,59 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ +{printer_name?:} + + + + + +{op=modify-printer?: + + +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Nazwa:{printer_name}
Opis:{printer_info}
Położenie:{printer_location}
Połączenie:{device_uri}
Współdzielenie: +{?printer_is_shared=?Nie:{?printer_is_shared=0?Nie:}} współdziel tej drukarki
Producent:{PPD_MAKE}
Model: + +
Lub podaj plik PPD:
+ +
+
diff --git a/templates/pl/choose-serial.tmpl b/templates/pl/choose-serial.tmpl new file mode 100644 index 000000000..5c42b2434 --- /dev/null +++ b/templates/pl/choose-serial.tmpl @@ -0,0 +1,51 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ +{printer_name?:} + + + + + + + + + + + + + + + + + + + + + + + + + + +
Połączenie:{device_uri}
Prędkość w baudach:
Równorzędność:
Bity danych:
Kontrola przepływu:
+ +
+
diff --git a/templates/pl/choose-uri.tmpl b/templates/pl/choose-uri.tmpl new file mode 100644 index 000000000..5c87dbbb2 --- /dev/null +++ b/templates/pl/choose-uri.tmpl @@ -0,0 +1,43 @@ +
+ +

{op=modify-printer?Modyfikowanie {printer_name}:Dodawanie drukarki}

+ +
+ +{printer_name?:} + + + + + + + + + + + + + + + +
Połączenie:
Przykłady: +
+    http://nazwakomputera:631/ipp/
+    http://nazwakomputera:631/ipp/port1
+
+    ipp://nazwakomputera/ipp/
+    ipp://nazwakomputera/ipp/port1
+
+    lpd://nazwakomputera/kolejka
+
+    socket://nazwakomputera
+    socket://nazwakomputera:9100
+
+ +

Proszę zobaczyć "Drukarki +sieciowe", aby uzyskać poprawne URI dla drukarki.

+ +
+ +
+
diff --git a/templates/pl/class-added.tmpl b/templates/pl/class-added.tmpl new file mode 100644 index 000000000..2bee7d8ca --- /dev/null +++ b/templates/pl/class-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Dodawanie klasy

+ +

Klasa {printer_name} została pomyślnie +dodana. + +

diff --git a/templates/pl/class-confirm.tmpl b/templates/pl/class-confirm.tmpl new file mode 100644 index 000000000..7c38b894b --- /dev/null +++ b/templates/pl/class-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Usuwanie klasy {printer_name}

+ +

Ostrzeżenie: Usunąć klasę +{printer_name}?

+ +

+ +
diff --git a/templates/pl/class-deleted.tmpl b/templates/pl/class-deleted.tmpl new file mode 100644 index 000000000..1a78c903e --- /dev/null +++ b/templates/pl/class-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Usuwanie klasy {printer_name}

+ +

Klasa {printer_name} została pomyślnie usunięta. + +

diff --git a/templates/pl/class-jobs-header.tmpl b/templates/pl/class-jobs-header.tmpl new file mode 100644 index 000000000..83dcfbcd5 --- /dev/null +++ b/templates/pl/class-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Zadania

+
diff --git a/templates/pl/class-modified.tmpl b/templates/pl/class-modified.tmpl new file mode 100644 index 000000000..be91caaed --- /dev/null +++ b/templates/pl/class-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modyfikowanie klasy {printer_name}

+ +

Klasa {printer_name} została +pomyślnie zmodyfikowana. + +

diff --git a/templates/pl/class.tmpl b/templates/pl/class.tmpl new file mode 100644 index 000000000..9ba9ff431 --- /dev/null +++ b/templates/pl/class.tmpl @@ -0,0 +1,41 @@ +
+

{printer_name} +({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymane}}, +{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań}, +{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})

+ +
+ + +
+ +
+ + + +
+ + + + + + +
Opis:{printer_info}
Położenie:{printer_location}
Członkowie:{?member_uris=?None:{member_uris}}
Domyślne:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/pl/classes-header.tmpl b/templates/pl/classes-header.tmpl new file mode 100644 index 000000000..8482fd19c --- /dev/null +++ b/templates/pl/classes-header.tmpl @@ -0,0 +1 @@ +

{total=0?Brak klas:Wyświetlanie {#printer_name} z {total} klas{total=1?:es}}.

diff --git a/templates/pl/classes.tmpl b/templates/pl/classes.tmpl new file mode 100644 index 000000000..1d8c766da --- /dev/null +++ b/templates/pl/classes.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nazwa kolejki : Nazwa kolejki }OpisPołożenieMembersStan
{printer_name}{printer_info}{printer_location}{?member_uris=?Brak:{member_uris}}{printer_state=3?Idle:{printer_state=4?Przetwarzanie:Wstrzymane}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/pl/command.tmpl b/templates/pl/command.tmpl new file mode 100644 index 000000000..9a87439ca --- /dev/null +++ b/templates/pl/command.tmpl @@ -0,0 +1,12 @@ +
+ +

{title} On {printer_name}

+ +

{job_state>5?:Busy Indicator }Printer command job +{job_state=3?pending:{job_state=4?held: +{job_state=5?processing:{job_state=6?stopped: +{job_state=7?canceled:{job_state=8?aborted:completed}}}}}}{job_state=9?:{job_printer_state_message?, +"{job_printer_state_message}":}}

+ +
diff --git a/templates/pl/edit-config.tmpl b/templates/pl/edit-config.tmpl new file mode 100644 index 000000000..84c4359bd --- /dev/null +++ b/templates/pl/edit-config.tmpl @@ -0,0 +1,24 @@ + + +
+ +

Modyfikowanie pliku konfiguracji

+ +
+ + + + + +

+

+ +
+ +
diff --git a/templates/pl/error-op.tmpl b/templates/pl/error-op.tmpl new file mode 100644 index 000000000..b9e5f7194 --- /dev/null +++ b/templates/pl/error-op.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Błąd

+ +

Błąd:

+ +
Nieznana operacja "{op}"!
+ +
diff --git a/templates/pl/error.tmpl b/templates/pl/error.tmpl new file mode 100644 index 000000000..f9992930b --- /dev/null +++ b/templates/pl/error.tmpl @@ -0,0 +1,9 @@ +
+ +

{?title} {?printer_name} Błąd

+ +

{?message?{message}:Błąd:}

+ +
{error}
+ +
diff --git a/templates/pl/header.tmpl.in b/templates/pl/header.tmpl.in new file mode 100644 index 000000000..1ee544fbf --- /dev/null +++ b/templates/pl/header.tmpl.in @@ -0,0 +1,29 @@ + + + + + {title} - CUPS @CUPS_VERSION@@CUPS_REVISION@ + + + {refresh_page?:} + + + + + + + diff --git a/templates/pl/option-conflict.tmpl b/templates/pl/option-conflict.tmpl new file mode 100644 index 000000000..42aa5759d --- /dev/null +++ b/templates/pl/option-conflict.tmpl @@ -0,0 +1,7 @@ +

Błąd: następujące opcje są w konflikcie ze sobą:

+ + + +

Proszę zmienić jedną lub więcej opcji, aby rozwiązać konflikt.

diff --git a/templates/pl/option-header.tmpl b/templates/pl/option-header.tmpl new file mode 100644 index 000000000..464726a50 --- /dev/null +++ b/templates/pl/option-header.tmpl @@ -0,0 +1,5 @@ +
+ +

{group}

+ +
+ + + + + + + + + + + + + +
  Strona domowa    Administracja    Klasy    Pomoc online    Zadania    Drukarki  
 
diff --git a/templates/pl/help-header.tmpl b/templates/pl/help-header.tmpl new file mode 100644 index 000000000..88f552421 --- /dev/null +++ b/templates/pl/help-header.tmpl @@ -0,0 +1,51 @@ +
+
+{TOPIC?:} + +

Wyszukaj w +{HELPTITLE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}: + +

+ +
+ + + + +{QUERY?

Wyniki wyszukiwania w {HELPFILE?{HELPTITLE}:{TOPIC?{TOPIC}:Wszystkie dokumenty}}\:

+{QTEXT?:} +:

Nie znaleziono.

} +
:} +{HELPTITLE?

{HELPTITLE}

+
: + +

Pomoc online

+ +

To jest interfejs pomocy online CUPS. Należy podać wyszukiwane słowa +powyżej lub nacisnąć na jeden z odnośników do dokumentacji, aby wyświetlić +informacje o pomocy online.

+ +

Nowi użytkownicy CUPS powinni przeczytać stronę "Przegląd CUPS". Zaawansowani użytkownicy +powinni przeczytać stronę "Co nowego w CUPS +1.4".

+ +

Strona domowa CUPS także +dostarcza wiele zasobów, w tym fora dyskusyjne użytkowników, odpowiedzi +na najczęściej zadawane pytania oraz formularz do wysyłania raportów +błędów i próśb o nowe funkcje.

} diff --git a/templates/pl/help-printable.tmpl b/templates/pl/help-printable.tmpl new file mode 100644 index 000000000..a326d9762 --- /dev/null +++ b/templates/pl/help-printable.tmpl @@ -0,0 +1,11 @@ + + + + + {HELPTITLE} + + + + + +

{HELPTITLE}

diff --git a/templates/pl/help-trailer.tmpl b/templates/pl/help-trailer.tmpl new file mode 100644 index 000000000..4c1ebed85 --- /dev/null +++ b/templates/pl/help-trailer.tmpl @@ -0,0 +1 @@ +
diff --git a/templates/pl/job-cancel.tmpl b/templates/pl/job-cancel.tmpl new file mode 100644 index 000000000..bcfffcf0d --- /dev/null +++ b/templates/pl/job-cancel.tmpl @@ -0,0 +1,7 @@ +
+ +

Anulowanie zadania {job_id}

+ +

Zadanie {job_id} zostało anulowane. + +

diff --git a/templates/pl/job-hold.tmpl b/templates/pl/job-hold.tmpl new file mode 100644 index 000000000..8827d9e28 --- /dev/null +++ b/templates/pl/job-hold.tmpl @@ -0,0 +1,7 @@ +
+ +

Wstrzymywanie zadania {job_id}

+ +

Drukowanie zadania {job_id} zostało wstrzymane. + +

diff --git a/templates/pl/job-move.tmpl b/templates/pl/job-move.tmpl new file mode 100644 index 000000000..666a1509a --- /dev/null +++ b/templates/pl/job-move.tmpl @@ -0,0 +1,26 @@ +
+ +
+ +{job_id?:} + +

{job_id?Przenoszenie zadanie {job_id}:Przenoszenie wszystkich zadań}

+ + + + + + + + + + +
Nowe miejsce docelowe: + +
+ +
+ +
diff --git a/templates/pl/job-moved.tmpl b/templates/pl/job-moved.tmpl new file mode 100644 index 000000000..bd3db7686 --- /dev/null +++ b/templates/pl/job-moved.tmpl @@ -0,0 +1,8 @@ +
+ +

{job_id?Przenoszenie zadania {job_id}:Przenoszenie wszystkich zadań}

+ +

{job_id?Zadanie {job_id}:Wszystkie zadania} zostało przeniesione do +{job_printer_name}.

+ +
diff --git a/templates/pl/job-release.tmpl b/templates/pl/job-release.tmpl new file mode 100644 index 000000000..09bffda03 --- /dev/null +++ b/templates/pl/job-release.tmpl @@ -0,0 +1,7 @@ +
+ +

Zwalnianie zadania {job_id}

+ +

Drukowanie zadania {job_id} zostało zwolnione. + +

diff --git a/templates/pl/job-restart.tmpl b/templates/pl/job-restart.tmpl new file mode 100644 index 000000000..6edf8b247 --- /dev/null +++ b/templates/pl/job-restart.tmpl @@ -0,0 +1,7 @@ +
+ +

Ponowne drukowanie zadania {job_id}

+ +

Zadanie {job_id} zostało ponownie uruchomione. + +

diff --git a/templates/pl/jobs-header.tmpl b/templates/pl/jobs-header.tmpl new file mode 100644 index 000000000..c91943f6b --- /dev/null +++ b/templates/pl/jobs-header.tmpl @@ -0,0 +1,5 @@ +
{?which_jobs=?:
} +{?which_jobs=completed?:
} +{?which_jobs=all?:
}
+ +

{total=0?Brak zadań:Wyświetlanie {#job_id} z {total} {?which_jobs=?aktywnych:{which_jobs=wszystkich?:zakończonych}} zadań{total=1?:s}}.

diff --git a/templates/pl/jobs.tmpl b/templates/pl/jobs.tmpl new file mode 100644 index 000000000..dbb7fd9bb --- /dev/null +++ b/templates/pl/jobs.tmpl @@ -0,0 +1,37 @@ +{#job_id=0?: + + + + + +{[job_id] + + + + + + + + + +} + +
{ORDER=dec? Identyfikator : Identyfikator }NazwaUżytkownikRozmiarStronyStanKontrola
{job_printer_name}-{job_id} {?job_name=?Unknown:{job_name}} {job_originating_user_name} {job_k_octets}k {job_media_sheets_completed=0?Unknown:{?job_media_sheets_completed}} {job_state=3?oczekiwanie od
{time_at_creation}:{job_state=4?wstrzymane od
{time_at_creation}: +{job_state=5?przetwarzanie od
{time_at_processing}:{job_state=6?zatrzymano: +{job_state=7?anulowano o
{time_at_completed}:{job_state=8?przerwano:zakończono o
{time_at_completed}}}}}}} {job_printer_state_message?
+"{job_printer_state_message}":}
+{job_preserved>0?{job_state>5? +
+
:}:} +{job_state=4? +
+
:} +{job_state=3? +
+
:} +{job_state<7? +
+
+
:} + 
+} diff --git a/templates/pl/list-available-printers.tmpl b/templates/pl/list-available-printers.tmpl new file mode 100644 index 000000000..d5ba1aa13 --- /dev/null +++ b/templates/pl/list-available-printers.tmpl @@ -0,0 +1,11 @@ +
+ +

Dostępne drukarki

+ +{#device_uri=0?

Nie znaleziono drukarek.

+:
    {[device_uri] +
  • +{device_make_and_model} ({device_info})
  • +}
} + +
diff --git a/templates/pl/modify-class.tmpl b/templates/pl/modify-class.tmpl new file mode 100644 index 000000000..c66cfda81 --- /dev/null +++ b/templates/pl/modify-class.tmpl @@ -0,0 +1,32 @@ +
+ +

Modyfikowanie klasy {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + +
Opis:
Położenie:
Członkowie: + +
+ +
+
diff --git a/templates/pl/modify-printer.tmpl b/templates/pl/modify-printer.tmpl new file mode 100644 index 000000000..08df3c694 --- /dev/null +++ b/templates/pl/modify-printer.tmpl @@ -0,0 +1,37 @@ +
+ +

Modyfikowanie {printer_name}

+ +
+ + + + + + + + + + + + + + + + + + + + + + + + + +
Opis:
+(Opis czytelny dla człowieka, taki jak "HP LaserJet z dupleksem")
Położenie:
+(Położenie czytelne dla człowieka, takie jak "Laboratorium 1")
Połączenie:{device_uri}
Współdzielenie: +Share This Printer
+ +
+
diff --git a/templates/pl/norestart.tmpl b/templates/pl/norestart.tmpl new file mode 100644 index 000000000..d29b0f4c7 --- /dev/null +++ b/templates/pl/norestart.tmpl @@ -0,0 +1,8 @@ +
+ +

Zmienianie ustawień

+ +

Serwer nie został ponownie uruchomiony, ponieważ nie wprowadzono żadnych zmian do +konfiguracji...

+ +
diff --git a/templates/pl/option-boolean.tmpl b/templates/pl/option-boolean.tmpl new file mode 100644 index 000000000..2d0dd551a --- /dev/null +++ b/templates/pl/option-boolean.tmpl @@ -0,0 +1,6 @@ +
{keytext}: +{[choices]{text}} +
diff --git a/templates/pl/option-pickmany.tmpl b/templates/pl/option-pickmany.tmpl new file mode 100644 index 000000000..067075aec --- /dev/null +++ b/templates/pl/option-pickmany.tmpl @@ -0,0 +1,6 @@ + + + + diff --git a/templates/pl/option-pickone.tmpl b/templates/pl/option-pickone.tmpl new file mode 100644 index 000000000..93100729c --- /dev/null +++ b/templates/pl/option-pickone.tmpl @@ -0,0 +1,18 @@ + + +:} + diff --git a/templates/pl/option-trailer.tmpl b/templates/pl/option-trailer.tmpl new file mode 100644 index 000000000..21eec5678 --- /dev/null +++ b/templates/pl/option-trailer.tmpl @@ -0,0 +1,5 @@ +
{keytext}:
{keytext}: +{iscustom=1?{[params] + + +}
{paramtext}:{params=Units?:}
+
+ +

+ + diff --git a/templates/pl/pager.tmpl b/templates/pl/pager.tmpl new file mode 100644 index 000000000..ce3515e57 --- /dev/null +++ b/templates/pl/pager.tmpl @@ -0,0 +1,6 @@ + + + + + +
{PREV?
: }
{NEXT?
: }
diff --git a/templates/pl/printer-accept.tmpl b/templates/pl/printer-accept.tmpl new file mode 100644 index 000000000..6589b60f3 --- /dev/null +++ b/templates/pl/printer-accept.tmpl @@ -0,0 +1,9 @@ +
+ +

Akceptowanie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +akceptują zadania.

+ +
diff --git a/templates/pl/printer-added.tmpl b/templates/pl/printer-added.tmpl new file mode 100644 index 000000000..e217ee4f0 --- /dev/null +++ b/templates/pl/printer-added.tmpl @@ -0,0 +1,8 @@ +
+ +

Dodawanie drukarki

+ +

Drukarka {printer_name} została +pomyślnie dodana. + +

diff --git a/templates/pl/printer-configured.tmpl b/templates/pl/printer-configured.tmpl new file mode 100644 index 000000000..994ed3461 --- /dev/null +++ b/templates/pl/printer-configured.tmpl @@ -0,0 +1,8 @@ +
+ +

Ustawianie domyślnych opcji dla {printer_name}

+ +

Domyślne opcje {OP=set-class-options?klasy :drukarki }{printer_name} +zostały pomyślnie ustawione. + +

diff --git a/templates/pl/printer-confirm.tmpl b/templates/pl/printer-confirm.tmpl new file mode 100644 index 000000000..2e9ab7e41 --- /dev/null +++ b/templates/pl/printer-confirm.tmpl @@ -0,0 +1,10 @@ +
+ +

Usuwanie drukarki {printer_name}

+ +

Ostrzeżenie: usunąć drukarkę +{printer_name}?

+ +

+ +
diff --git a/templates/pl/printer-default.tmpl b/templates/pl/printer-default.tmpl new file mode 100644 index 000000000..541de9d99 --- /dev/null +++ b/templates/pl/printer-default.tmpl @@ -0,0 +1,13 @@ +
+ +

Ustawianie {is_class?klasy:drukarki} {printer_name} jako domyślnej

+ +

{is_class?Klasa:Drukarka} {printer_name} +została ustawiona jako domyślna drukarka serwera.

+ +
Uwaga: każda domyśla opcja użytkownika ustawiona przez +polecenie lpoptions zostanie zastąpiona tym domyślnym +ustawieniem.
+ +
diff --git a/templates/pl/printer-deleted.tmpl b/templates/pl/printer-deleted.tmpl new file mode 100644 index 000000000..26e170b13 --- /dev/null +++ b/templates/pl/printer-deleted.tmpl @@ -0,0 +1,7 @@ +
+ +

Usuwanie drukarki {printer_name}

+ +

Drukarka {printer_name} została pomyślnie usunięta. + +

diff --git a/templates/pl/printer-jobs-header.tmpl b/templates/pl/printer-jobs-header.tmpl new file mode 100644 index 000000000..83dcfbcd5 --- /dev/null +++ b/templates/pl/printer-jobs-header.tmpl @@ -0,0 +1,3 @@ +
+

Zadania

+
diff --git a/templates/pl/printer-modified.tmpl b/templates/pl/printer-modified.tmpl new file mode 100644 index 000000000..9bf074dbc --- /dev/null +++ b/templates/pl/printer-modified.tmpl @@ -0,0 +1,8 @@ +
+ +

Modyfikowanie drukarki {printer_name}

+ +

Drukarka {printer_name} została +pomyślnie zmodyfikowana. + +

diff --git a/templates/pl/printer-purge.tmpl b/templates/pl/printer-purge.tmpl new file mode 100644 index 000000000..065217511 --- /dev/null +++ b/templates/pl/printer-purge.tmpl @@ -0,0 +1,9 @@ +
+ +

Czyszczenie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wyczyszczona ze wszystkich zadań.

+ +
diff --git a/templates/pl/printer-reject.tmpl b/templates/pl/printer-reject.tmpl new file mode 100644 index 000000000..038f8bab2 --- /dev/null +++ b/templates/pl/printer-reject.tmpl @@ -0,0 +1,9 @@ +
+ +

Odrzucanie zadań na {is_class?klasie:drukarce} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +nie akceptuje zadań.

+ +
diff --git a/templates/pl/printer-start.tmpl b/templates/pl/printer-start.tmpl new file mode 100644 index 000000000..e291f49d9 --- /dev/null +++ b/templates/pl/printer-start.tmpl @@ -0,0 +1,9 @@ +
+ +

Wznawianie {is_class?klasy:drukarki} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wznowiona.

+ +
diff --git a/templates/pl/printer-stop.tmpl b/templates/pl/printer-stop.tmpl new file mode 100644 index 000000000..06f94f699 --- /dev/null +++ b/templates/pl/printer-stop.tmpl @@ -0,0 +1,9 @@ +
+ +

Wstrzymywanie {is_class?klasy:drukarki} {printer_name}

+ +

{is_class?Klasa:Drukarka} {printer_name} +została wstrzymana.

+ +
diff --git a/templates/pl/printer.tmpl b/templates/pl/printer.tmpl new file mode 100644 index 000000000..43d18ef2d --- /dev/null +++ b/templates/pl/printer.tmpl @@ -0,0 +1,45 @@ +
+ +

{printer_name} +({printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}}, +{printer_is_accepting_jobs=0?Odrzucanie zadań:Akceptowanie zadań}, +{server_is_sharing_printers=0?Nie:{printer_is_shared=0?Nie:}} Współdzielona{default_name={printer_name}?, Domyślne serwera:})

+ +
+ + +
+ +
+ + + +
+ + + + + + +
Opis:{printer_info}
Położenie:{printer_location}
Sterownik:{printer_make_and_model} ({color_supported=1?color:grayscale}{sides_supported?, 2-sided printing:})
+
Połączenie:{device_uri}
Domyślne:job-sheets={job_sheets_default} +media={media_default?{media_default}:unknown} +{sides_default?sides={sides_default}:}
+ +
diff --git a/templates/pl/printers-header.tmpl b/templates/pl/printers-header.tmpl new file mode 100644 index 000000000..6a06c7f59 --- /dev/null +++ b/templates/pl/printers-header.tmpl @@ -0,0 +1 @@ +

{total=0?Brak drukarek:Wyświetlanie {#printer_name} z {total} drukarek{total=1?:s}}.

diff --git a/templates/pl/printers.tmpl b/templates/pl/printers.tmpl new file mode 100644 index 000000000..810ecb4a5 --- /dev/null +++ b/templates/pl/printers.tmpl @@ -0,0 +1,11 @@ +{#printer_name=0?: + + + + + +{[printer_name] + +} + +
{ORDER=dec? Nazwa kolejki : Nazwa kolejki }OpisPołożenieProducent i modelStan
{printer_name}{printer_info}{printer_location}{printer_make_and_model}{printer_state=3?Bezczynna:{printer_state=4?Przetwarzanie:Wstrzymana}}{printer_state_message? - "{printer_state_message}":}
} diff --git a/templates/pl/restart.tmpl b/templates/pl/restart.tmpl new file mode 100644 index 000000000..6965e6b50 --- /dev/null +++ b/templates/pl/restart.tmpl @@ -0,0 +1,8 @@ +
+ +

Zmienianie ustawień

+ +

Proszę czekać, trwa ponowne uruchamianie serwera...

+ +
diff --git a/templates/pl/samba-export.tmpl b/templates/pl/samba-export.tmpl new file mode 100644 index 000000000..c927c3bb5 --- /dev/null +++ b/templates/pl/samba-export.tmpl @@ -0,0 +1,54 @@ + + +
+ + +

Eksportowanie drukarek do Samby

+ +{error?

Nie można wyeksportować drukarek do Samby\:

+
{error}
+

Proszę zobaczyć plik error_log, aby uzyskać więcej informacji.

: +

Ta strona umożliwia wyeksportowanie drukarek do Samby, aby +klienci Windows mogli mieć do nich dostęp przez ikonę Otoczenie +sieciowe lub Miejsca sieciowe na pulpitach. +Należy wcześniej zainstalować sterowniki drukarki Windows PostScript, +tak jak opisano na stronie podręcznika cupsaddsmb(8).

} + + + + + + + + + + + + + + + + + + +
Drukarki: +
+ Wyeksportuj wszystkie drukarki +
Nazwa użytkownika Samby: (wymagana)
Hasło Samby: (wymagane)
+ +
diff --git a/templates/pl/samba-exported.tmpl b/templates/pl/samba-exported.tmpl new file mode 100644 index 000000000..55ba02866 --- /dev/null +++ b/templates/pl/samba-exported.tmpl @@ -0,0 +1 @@ +

Pomyślnie wyeksportowano drukarki do Samby.

diff --git a/templates/pl/search.tmpl b/templates/pl/search.tmpl new file mode 100644 index 000000000..593071a79 --- /dev/null +++ b/templates/pl/search.tmpl @@ -0,0 +1,10 @@ +
+{WHICH_JOBS?:} +{ORDER?:} + +

Znajdź w +{SEARCH_DEST?{SEARCH_DEST}:{SECTION=classes?klasach:{SECTION=jobs?zadaniach:drukarkach}}}: +

+ +
diff --git a/templates/pl/set-printer-options-header.tmpl b/templates/pl/set-printer-options-header.tmpl new file mode 100644 index 000000000..206a5bbe7 --- /dev/null +++ b/templates/pl/set-printer-options-header.tmpl @@ -0,0 +1,25 @@ +
+ +

Ustawianie domyślnych opcji dla {printer_name}

+ +
+ + +{HAVE_AUTOCONFIGURE?:} + + + +

{[group_id] +{group}     }

+ +
diff --git a/templates/pl/set-printer-options-trailer.tmpl b/templates/pl/set-printer-options-trailer.tmpl new file mode 100644 index 000000000..c1183e18e --- /dev/null +++ b/templates/pl/set-printer-options-trailer.tmpl @@ -0,0 +1,16 @@ +
+ + +
+ +
diff --git a/templates/pl/subscription-added.tmpl b/templates/pl/subscription-added.tmpl new file mode 100644 index 000000000..af87082b1 --- /dev/null +++ b/templates/pl/subscription-added.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskrypcja {subscription_name} została pomyślnie dodana.

+ +
diff --git a/templates/pl/subscription-canceled.tmpl b/templates/pl/subscription-canceled.tmpl new file mode 100644 index 000000000..58ce44c7a --- /dev/null +++ b/templates/pl/subscription-canceled.tmpl @@ -0,0 +1,5 @@ +
+ +

Subskrypcja #{notify_subscription_id} została usunięta.

+ +
diff --git a/templates/pl/test-page.tmpl b/templates/pl/test-page.tmpl new file mode 100644 index 000000000..346a6d2fc --- /dev/null +++ b/templates/pl/test-page.tmpl @@ -0,0 +1,8 @@ +
+ +

Drukowanie strony próbnej na {printer_name}

+ +

Wysłano stronę próbną; identyfikator zadania to +{printer_name}-{job_id}.

+ +
diff --git a/templates/pl/trailer.tmpl b/templates/pl/trailer.tmpl new file mode 100644 index 000000000..4d59f7ee4 --- /dev/null +++ b/templates/pl/trailer.tmpl @@ -0,0 +1,8 @@ + +  +Wspólny uniksowy system drukowania, CUPS i logo CUPS +są znakami handlowymi Apple Inc. CUPS +copyright 2007-2009 Apple Inc. Wszystkie prawa zastrzeżone. + + + diff --git a/templates/pl/users.tmpl b/templates/pl/users.tmpl new file mode 100644 index 000000000..7907c7abb --- /dev/null +++ b/templates/pl/users.tmpl @@ -0,0 +1,29 @@ +
+ +
+ + +{IS_CLASS?:} + +

Zezwoleni użytkownicy dla {printer_name}

+ + + + + + + + + + +
Użytkownicy: + +
+Pozwól tym użytkownikom drukować +Nie pozwalaj tym użytkownikom drukować +
+ +
+ +
+
diff --git a/test/5.5-lp.sh b/test/5.5-lp.sh index c048d7867..9dd1dd001 100644 --- a/test/5.5-lp.sh +++ b/test/5.5-lp.sh @@ -4,7 +4,7 @@ # # Test the lp command. # -# Copyright 2007-2008 by Apple Inc. +# Copyright 2007-2009 by Apple Inc. # Copyright 1997-2005 by Easy Software Products, all rights reserved. # # These coded instructions, statements, and computer programs are the @@ -57,9 +57,17 @@ echo " lp -d Test2 testfile.jpg" i=0 while test $i -lt $1; do echo " flood copy $i..." 1>&2 + + j=1 + while test $j -le $2; do + ../systemv/lp -d test-$j testfile.jpg 2>&1 + j=`expr $j + 1` + done + ../systemv/lp -d Test1 testfile.jpg 2>&1 & ../systemv/lp -d Test2 testfile.jpg 2>&1 & lppid=$! + i=`expr $i + 1` done wait $lppid diff --git a/test/5.6-lpr.sh b/test/5.6-lpr.sh index 7dabf84c6..72c757106 100644 --- a/test/5.6-lpr.sh +++ b/test/5.6-lpr.sh @@ -4,7 +4,7 @@ # # Test the lpr command. # -# Copyright 2007-2008 by Apple Inc. +# Copyright 2007-2009 by Apple Inc. # Copyright 1997-2005 by Easy Software Products, all rights reserved. # # These coded instructions, statements, and computer programs are the @@ -57,9 +57,17 @@ echo " lpr -P Test2 testfile.jpg" i=0 while test $i -lt $1; do echo " flood copy $i..." 1>&2 + + j=1 + while test $j -le $2; do + ../berkeley/lpr -P test-$j testfile.jpg 2>&1 + j=`expr $j + 1` + done + ../berkeley/lpr -P Test1 testfile.jpg 2>&1 & ../berkeley/lpr -P Test2 testfile.jpg 2>&1 & lprpid=$! + i=`expr $i + 1` done wait $lppid diff --git a/test/run-stp-tests.sh b/test/run-stp-tests.sh index 8b116f534..64e1b792f 100755 --- a/test/run-stp-tests.sh +++ b/test/run-stp-tests.sh @@ -74,30 +74,35 @@ case "$testtype" in nprinters1=0 nprinters2=0 pjobs=0 + pprinters=0 ;; 2) echo "Running the medium tests (2)" nprinters1=10 nprinters2=20 pjobs=20 + pprinters=10 ;; 3) echo "Running the extreme tests (3)" nprinters1=500 nprinters2=1000 pjobs=100 + pprinters=50 ;; 4) echo "Running the torture tests (4)" nprinters1=10000 nprinters2=20000 pjobs=200 + pprinters=100 ;; *) echo "Running the timid tests (1)" nprinters1=0 nprinters2=0 pjobs=10 + pprinters=0 ;; esac @@ -335,6 +340,7 @@ AccessLog /tmp/cups-$user/log/access_log ErrorLog /tmp/cups-$user/log/error_log PageLog /tmp/cups-$user/log/page_log LogLevel debug2 +LogTimeFormat usecs PreserveJobHistory Yes @@ -454,7 +460,13 @@ echo "Starting scheduler:" echo " $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 &" echo "" -$valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 & +if test `uname` = Darwin -a "x$valgrind" = x; then + DYLD_INSERT_LIBRARIES=/usr/lib/libgmalloc.dylib \ + $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 & +else + $valgrind ../scheduler/cupsd -c /tmp/cups-$user/cupsd.conf -f >/tmp/cups-$user/log/debug_log 2>&1 & +fi + cupsd=$! if test "x$testtype" = x0; then @@ -568,7 +580,7 @@ for file in 5*.sh; do echo "" >>$strfile echo "\"$file\":" >>$strfile - sh $file $pjobs | tee -a $strfile + sh $file $pjobs $pprinters | tee -a $strfile status=$? if test $status != 0; then diff --git a/test/waitjobs.sh b/test/waitjobs.sh index d69e44080..7a79fb69b 100755 --- a/test/waitjobs.sh +++ b/test/waitjobs.sh @@ -4,7 +4,7 @@ # # Script to wait for jobs to complete. # -# Copyright 2008 by Apple Inc. +# Copyright 2008-2009 by Apple Inc. # # These coded instructions, statements, and computer programs are the # property of Apple Inc. and are protected by Federal copyright @@ -13,25 +13,48 @@ # file is missing or damaged, see the license at "http://www.cups.org/". # +# # Get timeout from command-line +# + if test $# = 1; then timeout=$1 else - timeout=60 + timeout=360 +fi + +# +# Figure out the proper echo options... +# + +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + ac_n=-n + ac_c= +else + ac_n= + ac_c='\c' fi -echo "Waiting for jobs to complete..." +echo $ac_n "Waiting for jobs to complete...$ac_c" +oldjobs=0 while test $timeout -gt 0; do - jobs=`../systemv/lpstat 2>/dev/null` - if test "x$jobs" = "x"; then + jobs=`../systemv/lpstat 2>/dev/null | wc -l | tr -d ' '` + if test $jobs = 0; then break fi + if test $jobs != $oldjobs; then + echo $ac_n "$jobs...$ac_c" + oldjobs=$jobs + fi + sleep 5 timeout=`expr $timeout - 5` done +echo "" + # # End of "$Id$". # -- 2.39.2