/*
 * @(#)$Id$
 *
 * The Apache Software License, Version 1.1
 *
 *
 * Copyright (c) 2001-2003 The Apache Software Foundation.  All rights
 * reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in
 *    the documentation and/or other materials provided with the
 *    distribution.
 *
 * 3. The end-user documentation included with the redistribution,
 *    if any, must include the following acknowledgment:
 *       "This product includes software developed by the
 *        Apache Software Foundation (http://www.apache.org/)."
 *    Alternately, this acknowledgment may appear in the software itself,
 *    if and wherever such third-party acknowledgments normally appear.
 *
 * 4. The names "Xalan" and "Apache Software Foundation" must
 *    not be used to endorse or promote products derived from this
 *    software without prior written permission. For written
 *    permission, please contact apache@apache.org.
 *
 * 5. Products derived from this software may not be called "Apache",
 *    nor may "Apache" appear in their name, without prior written
 *    permission of the Apache Software Foundation.
 *
 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 * ====================================================================
 *
 * This software consists of voluntary contributions made by many
 * individuals on behalf of the Apache Software Foundation and was
 * originally based on software copyright (c) 2001, Sun
 * Microsystems., http://www.sun.com.  For more
 * information on the Apache Software Foundation, please see
 * <http://www.apache.org/>.
 *
 * @author Morten Jorgensen
 *
 */

package org.apache.xalan.xsltc.compiler.util;

import java.util.Vector;
import java.util.Enumeration;
import java.util.ResourceBundle;

public class ErrorMessages extends ResourceBundle {

/*
 * XSLTC compile-time error messages.
 *
 * General notes to translators and definitions:
 *
 *   1) XSLTC is the name of the product.  It is an acronym for "XSLT Compiler".
 *      XSLT is an acronym for "XML Stylesheet Language: Transformations".
 *
 *   2) A stylesheet is a description of how to transform an input XML document
 *      into a resultant XML document (or HTML document or text).  The
 *      stylesheet itself is described in the form of an XML document.
 *
 *   3) A template is a component of a stylesheet that is used to match a
 *      particular portion of an input document and specifies the form of the
 *      corresponding portion of the output document.
 *
 *   4) An axis is a particular "dimension" in a tree representation of an XML
 *      document; the nodes in the tree are divided along different axes.
 *      Traversing the "child" axis, for instance, means that the program
 *      would visit each child of a particular node; traversing the "descendant"
 *      axis means that the program would visit the child nodes of a particular
 *      node, their children, and so on until the leaf nodes of the tree are
 *      reached.
 *
 *   5) An iterator is an object that traverses nodes in a tree along a
 *      particular axis, one at a time.
 *
 *   6) An element is a mark-up tag in an XML document; an attribute is a
 *      modifier on the tag.  For example, in <elem attr='val' attr2='val2'>
 *      "elem" is an element name, "attr" and "attr2" are attribute names with
 *      the values "val" and "val2", respectively.
 *
 *   7) A namespace declaration is a special attribute that is used to associate
 *      a prefix with a URI (the namespace).  The meanings of element names and
 *      attribute names that use that prefix are defined with respect to that
 *      namespace.
 *
 *   8) DOM is an acronym for Document Object Model.  It is a tree
 *      representation of an XML document.
 *
 *      SAX is an acronym for the Simple API for XML processing.  It is an API
 *      used inform an XML processor (in this case XSLTC) of the structure and
 *      content of an XML document.
 *
 *      Input to the stylesheet processor can come from an XML parser in the
 *      form of a DOM tree or through the SAX API.
 *
 *   9) DTD is a document type declaration.  It is a way of specifying the
 *      grammar for an XML file, the names and types of elements, attributes,
 *      etc.
 *
 *  10) XPath is a specification that describes a notation for identifying
 *      nodes in a tree-structured representation of an XML document.  An
 *      instance of that notation is referred to as an XPath expression.
 *
 *  11) Translet is an invented term that refers to the class file that contains
 *      the compiled form of a stylesheet.
 */

    // These message should be read from a locale-specific resource bundle
    private static final String errorMessages[] = { 
	//MULTIPLE_STYLESHEET_ERR
	"More than one stylesheet defined in the same file.",

	/*
	 * Note to translators:  The substitution text is the name of a
	 * template.  The same name was used on two different templates in the
	 * same stylesheet.
	 */
	// TEMPLATE_REDEF_ERR
	"Template ''{0}'' already defined in this stylesheet.",


	/*
	 * Note to translators:  The substitution text is the name of a
	 * template.  A reference to the template name was encountered, but the
	 * template is undefined.
	 */
	//TEMPLATE_UNDEF_ERR
	"Template ''{0}'' not defined in this stylesheet.",

	/*
	 * Note to translators:  The substitution text is the name of a variable
	 * that was defined more than once.
	 */
	//VARIABLE_REDEF_ERR
	"Variable ''{0}'' is multiply defined in the same scope.",

	/*
	 * Note to translators:  The substitution text is the name of a variable
	 * or parameter.  A reference to the variable or parameter was found,
	 * but it was never defined.
	 */
	//VARIABLE_UNDEF_ERR
	"Variable or parameter ''{0}'' is undefined.",

	/*
	 * Note to translators:  The word "class" here refers to a Java class.
	 * Processing the stylesheet required a class to be loaded, but it could
	 * not be found.  The substitution text is the name of the class.
	 */
	//CLASS_NOT_FOUND_ERR
	"Cannot find class ''{0}''.",

	/*
	 * Note to translators:  The word "method" here refers to a Java method.
	 * Processing the stylesheet required a reference to the method named by
	 * the substitution text, but it could not be found.  "public" is the
	 * Java keyword.
	 */
	//METHOD_NOT_FOUND_ERR
	"Cannot find external method ''{0}'' (must be public).",

	/*
	 * Note to translators:  The word "method" here refers to a Java method.
	 * Processing the stylesheet required a reference to the method named by
	 * the substitution text, but no method with the required types of
	 * arguments or return type could be found.
	 */
	//ARGUMENT_CONVERSION_ERR
	"Cannot convert argument/return type in call to method ''{0}''",

	/*
	 * Note to translators:  The file or URI named in the substitution text
	 * is missing.
	 */
	//FILE_NOT_FOUND_ERR
	"File or URI ''{0}'' not found.",

	/*
	 * Note to translators:  This message is displayed when the URI
	 * mentioned in the substitution text is not well-formed syntactically.
	 */
	//INVALID_URI_ERR
	"Invalid URI ''{0}''.",

	/*
	 * Note to translators:  The file or URI named in the substitution text
	 * exists but could not be opened.
	 */
	//FILE_ACCESS_ERR
	"Cannot open file or URI ''{0}''.",

	/*
	 * Note to translators: <xsl:stylesheet> and <xsl:transform> are
	 * keywords that should not be translated.
	 */
	//MISSING_ROOT_ERR
	"<xsl:stylesheet> or <xsl:transform> element expected.",

	/*
	 * Note to translators:  The stylesheet contained a reference to a
	 * namespace prefix that was undefined.  The value of the substitution
	 * text is the name of the prefix.
	 */
	//NAMESPACE_UNDEF_ERR
	"Namespace prefix ''{0}'' is undeclared.",

	/*
	 * Note to translators:  The Java function named in the stylesheet could
	 * not be found.
	 */
	//FUNCTION_RESOLVE_ERR
	"Unable to resolve call to function ''{0}''.",

	/*
	 * Note to translators:  The substitution text is the name of a
	 * function.  A literal string here means a constant string value.
	 */
	//NEED_LITERAL_ERR
	"Argument to ''{0}'' must be a literal string.",

	/*
	 * Note to translators:  This message indicates there was a syntactic
	 * error in the form of an XPath expression.  The substitution text is
	 * the expression.
	 */
	//XPATH_PARSER_ERR
	"Error parsing XPath expression ''{0}''.",

	/*
	 * Note to translators:  An element in the stylesheet requires a
	 * particular attribute named by the substitution text, but that
	 * attribute was not specified in the stylesheet.
	 */
	//REQUIRED_ATTR_ERR
	"Required attribute ''{0}'' is missing.",

	/*
	 * Note to translators:  This message indicates that a character not
	 * permitted in an XPath expression was encountered.  The substitution
	 * text is the offending character.
	 */
	//ILLEGAL_CHAR_ERR
	"Illegal character ''{0}'' in XPath expression.",

	/*
	 * Note to translators:  A processing instruction is a mark-up item in
	 * an XML document that request some behaviour of an XML processor.  The
	 * form of the name of was invalid in this case, and the substitution
	 * text is the name.
	 */
	//ILLEGAL_PI_ERR
	"Illegal name ''{0}'' for processing instruction.",

	/*
	 * Note to translators:  This message is reported if the stylesheet
	 * being processed attempted to construct an XML document with an
	 * attribute in a place other than on an element.  The substitution text
	 * specifies the name of the attribute.
	 */
	//STRAY_ATTRIBUTE_ERR
	"Attribute ''{0}'' outside of element.",

	/*
	 * Note to translators:  An attribute that wasn't recognized was
	 * specified on an element in the stylesheet.  The attribute is named
	 * by the substitution
	 * text.
	 */
	//ILLEGAL_ATTRIBUTE_ERR
	"Illegal attribute ''{0}''.",

	/*
	 * Note to translators:  "import" and "include" are keywords that should
	 * not be translated.  This messages indicates that the stylesheet
	 * named in the substitution text imported or included itself either
	 * directly or indirectly.
	 */
	//CIRCULAR_INCLUDE_ERR
	"Circular import/include. Stylesheet ''{0}'' already loaded.",

	/*
	 * Note to translators:  A result-tree fragment is a portion of a
	 * resulting XML document represented as a tree.  "<xsl:sort>" is a
	 * keyword and should not be translated.
	 */
	//RESULT_TREE_SORT_ERR
	"Result-tree fragments cannot be sorted (<xsl:sort> elements are " +
        "ignored). You must sort the nodes when creating the result tree.",

	/*
	 * Note to translators:  A name can be given to a particular style to be
	 * used to format decimal values.  The substitution text gives the name
	 * of such a style for which more than one declaration was encountered.
	 */
	//SYMBOLS_REDEF_ERR
	"Decimal formatting ''{0}'' is already defined.",

	/*
	 * Note to translators:  The stylesheet version named in the
	 * substitution text is not supported.
	 */
	//XSL_VERSION_ERR
	"XSL version ''{0}'' is not supported by XSLTC.",

	/*
	 * Note to translators:  The definitions of one or more variables or
	 * parameters depend on one another.
	 */
	//CIRCULAR_VARIABLE_ERR
	"Circular variable/parameter reference in ''{0}''.",

	/*
	 * Note to translators:  The operator in an expresion with two operands was
	 * not recognized.
	 */
	//ILLEGAL_BINARY_OP_ERR
	"Unknown operator for binary expression.",

	/*
	 * Note to translators:  This message is produced if a reference to a
	 * function has too many or too few arguments.
	 */
	//ILLEGAL_ARG_ERR
	"Illegal argument(s) for function call.",

	/*
	 * Note to translators:  "document()" is the name of function and must
	 * not be translated.  A node-set is a set of the nodes in the tree
	 * representation of an XML document.
	 */
	//DOCUMENT_ARG_ERR
	"Second argument to document() function must be a node-set.",

	/*
	 * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
	 * and should not be translated.  This message describes a syntax error
	 * in the stylesheet.
	 */
	//MISSING_WHEN_ERR
	"At least one <xsl:when> element required in <xsl:choose>.",

	/*
	 * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
	 * keywords and should not be translated.  This message describes a
	 * syntax error in the stylesheet.
	 */
	//MULTIPLE_OTHERWISE_ERR
	"Only one <xsl:otherwise> element allowed in <xsl:choose>.",

	/*
	 * Note to translators:  "<xsl:otherwise>" and "<xsl:choose>" are
	 * keywords and should not be translated.  This message describes a
	 * syntax error in the stylesheet.
	 */
	//STRAY_OTHERWISE_ERR
	"<xsl:otherwise> can only be used within <xsl:choose>.",

	/*
	 * Note to translators:  "<xsl:when>" and "<xsl:choose>" are keywords
	 * and should not be translated.  This message describes a syntax error
	 * in the stylesheet.
	 */
	//STRAY_WHEN_ERR
	"<xsl:when> can only be used within <xsl:choose>.",

	/*
	 * Note to translators:  "<xsl:when>", "<xsl:otherwise>" and
	 * "<xsl:choose>" are keywords and should not be translated.  This
	 * message describes a syntax error in the stylesheet.
	 */
	//WHEN_ELEMENT_ERR
	"Only <xsl:when> and <xsl:otherwise> elements allowed in <xsl:choose>.",

	/*
	 * Note to translators:  "<xsl:attribute-set>" and "name" are keywords
	 * that should not be translated.
	 */
	//UNNAMED_ATTRIBSET_ERR
	"<xsl:attribute-set> is missing the 'name' attribute.",

	/*
	 * Note to translators:  An element in the stylesheet contained an
	 * element of a type that it was not permitted to contain.
	 */
	//ILLEGAL_CHILD_ERR
	"Illegal child element.",

	/*
	 * Note to translators:  The stylesheet tried to create an element with
	 * a name that was not a valid XML name.  The substitution text contains
	 * the name.
	 */
	//ILLEGAL_ELEM_NAME_ERR
	"You cannot call an element ''{0}''",

	/*
	 * Note to translators:  The stylesheet tried to create an attribute
	 * with a name that was not a valid XML name.  The substitution text
	 * contains the name.
	 */
	//ILLEGAL_ATTR_NAME_ERR
	"You cannot call an attribute ''{0}''",

	/*
	 * Note to translators:  The children of the outermost element of a
	 * stylesheet are referred to as top-level elements.  No text should
	 * occur within that outermost element unless it is within a top-level
	 * element.  This message indicates that that constraint was violated.
	 * "<xsl:stylesheet>" is a keyword that should not be translated.
	 */
	//ILLEGAL_TEXT_NODE_ERR
	"Text data outside of top-level <xsl:stylesheet> element.",

	/*
	 * Note to translators:  JAXP is an acronym for the Java API for XML
	 * Processing.  This message indicates that the XML parser provided to
	 * XSLTC to process the XML input document had a configuration problem.
	 */
	//SAX_PARSER_CONFIG_ERR
	"JAXP parser not configured correctly",

	/*
	 * Note to translators:  The substitution text names the internal error
	 * encountered.
	 */
	//INTERNAL_ERR
	"Unrecoverable XSLTC-internal error: ''{0}''",

	/*
	 * Note to translators:  The stylesheet contained an element that was
	 * not recognized as part of the XSL syntax.  The substitution text
	 * gives the element name.
	 */
	//UNSUPPORTED_XSL_ERR
	"Unsupported XSL element ''{0}''.",

	/*
	 * Note to translators:  The stylesheet referred to an extension to the
	 * XSL syntax and indicated that it was defined by XSLTC, but XSTLC does
	 * not recognized the particular extension named.  The substitution text
	 * gives the extension name.
	 */
	//UNSUPPORTED_EXT_ERR
	"Unrecognised XSLTC extension ''{0}''.",

	/*
	 * Note to translators:  The XML document given to XSLTC as a stylesheet
	 * was not, in fact, a stylesheet.  XSLTC is able to detect that in this
	 * case because the outermost element in the stylesheet has to be
	 * declared with respect to the XSL namespace URI, but no declaration
	 * for that namespace was seen.
	 */
	//MISSING_XSLT_URI_ERR
	"The input document is not a stylesheet (the XSL namespace is not "+
        "declared in the root element).",

	/*
	 * Note to translators:  XSLTC could not find the stylesheet document
	 * with the name specified by the substitution text.
	 */
	//MISSING_XSLT_TARGET_ERR
	"Could not find stylesheet target ''{0}''.",

	/*
	 * Note to translators:  This message represents an internal error in
	 * condition in XSLTC.  The substitution text is the class name in XSLTC
	 * that is missing some functionality.
	 */
	//NOT_IMPLEMENTED_ERR
	"Not implemented: ''{0}''.",

	/*
	 * Note to translators:  The XML document given to XSLTC as a stylesheet
	 * was not, in fact, a stylesheet.
	 */
	//NOT_STYLESHEET_ERR
	"The input document does not contain an XSL stylesheet.",

	/*
	 * Note to translators:  The element named in the substitution text was
	 * encountered in the stylesheet but is not recognized.
	 */
	//ELEMENT_PARSE_ERR
	"Could not parse element ''{0}''",

	/*
	 * Note to translators:  "use", "<key>", "node", "node-set", "string"
	 * and "number" are keywords in this context and should not be
	 * translated.  This message indicates that the value of the "use"
	 * attribute was not one of the permitted values.
	 */
	//KEY_USE_ATTR_ERR
	"The use attribute of <key> must be node, node-set, string or number.",

	/*
	 * Note to translators:  An XML document can specify the version of the
	 * XML specification to which it adheres.  This message indicates that
	 * the version specified for the output document was not valid.
	 */
	//OUTPUT_VERSION_ERR
	"Output XML document version should be 1.0",

	/*
	 * Note to translators:  The operator in a comparison operation was
	 * not recognized.
	 */
	//ILLEGAL_RELAT_OP_ERR
	"Unknown operator for relational expression",

	/*
	 * Note to translators:  An attribute set defines as a set of XML
	 * attributes that can be added to an element in the output XML document
	 * as a group.  This message is reported if the name specified was not
	 * used to declare an attribute set.  The substitution text is the name
	 * that is in error.
	 */
	//ATTRIBSET_UNDEF_ERR
	"Attempting to use non-existing attribute set ''{0}''.",

	/*
	 * Note to translators:  The term "attribute value template" is a term
	 * defined by XSLT which describes the value of an attribute that is
	 * determined by an XPath expression.  The message indicates that the
	 * expression was syntactically incorrect; the substitution text
	 * contains the expression that was in error.
	 */
	//ATTR_VAL_TEMPLATE_ERR
	"Cannot parse attribute value template ''{0}''.",

	/*
	 * Note to translators:  ???
	 */
	//UNKNOWN_SIG_TYPE_ERR
	"Unknown data-type in signature for class ''{0}''.",

	/*
	 * Note to translators:  The substitution text refers to data types.
	 * The message is displayed if a value in a particular context needs to
	 * be converted to type {1}, but that's not possible for a value of
	 * type {0}.
	 */
	//DATA_CONVERSION_ERR
	"Cannot convert data-type ''{0}'' to ''{1}''.",

	/*
	 * Note to translators:  "Templates" is a Java class name that should
	 * not be translated.
	 */
	//NO_TRANSLET_CLASS_ERR
	"This Templates does not contain a valid translet class definition.",

	/*
	 * Note to translators:  "Templates" is a Java class name that should
	 * not be translated.
	 */
	//NO_MAIN_TRANSLET_ERR
	"This Templates does not contain a class with the name ''{0}''.",

	/*
	 * Note to translators:  The substitution text is the name of a class.
	 */
	//TRANSLET_CLASS_ERR
	"Could not load the translet class ''{0}''.",

	//TRANSLET_OBJECT_ERR
	"Translet class loaded, but unable to create translet instance.",

	/*
	 * Note to translators:  "ErrorListener" is a Java interface name that
	 * should not be translated.  The message indicates that the user tried
	 * to set an ErrorListener object on object of the class named in the
	 * substitution text with "null" Java value.
	 */
	//ERROR_LISTENER_NULL_ERR
	"Attempting to set ErrorListener for ''{0}'' to null",

	/*
	 * Note to translators:  StreamSource, SAXSource and DOMSource are Java
	 * interface names that should not be translated.
	 */
	//JAXP_UNKNOWN_SOURCE_ERR
	"Only StreamSource, SAXSource and DOMSource are supported by XSLTC",

	/*
	 * Note to translators:  "Source" is a Java class name that should not
	 * be translated.  The substitution text is the name of Java method.
	 */
	//JAXP_NO_SOURCE_ERR
	"Source object passed to ''{0}'' has no contents.",

	/*
	 * Note to translators:  The message indicates that XSLTC failed to
	 * compile the stylesheet into a translet (class file).
	 */
	//JAXP_COMPILE_ERR
	"Could not compile stylesheet",

	/*
	 * Note to translators:  "TransformerFactory" is a class name.  In this
	 * context, an attribute is a property or setting of the
	 * TransformerFactory object.  The substitution text is the name of the
	 * unrecognised attribute.  The method used to retrieve the attribute is
	 * "getAttribute", so it's not clear whether it would be best to
	 * translate the term "attribute".
	 */
	//JAXP_INVALID_ATTR_ERR
	"TransformerFactory does not recognise attribute ''{0}''.",

	/*
	 * Note to translators:  "setResult()" and "startDocument()" are Java
	 * method names that should not be translated.
	 */
	//JAXP_SET_RESULT_ERR
	"setResult() must be called prior to startDocument().",

	/*
	 * Note to translators:  "Transformer" is a Java interface name that
	 * should not be translated.  A Transformer object should contained a
	 * reference to a translet object in order to be used for
	 * transformations; this message is produced if that requirement is not
	 * met.
	 */
	//JAXP_NO_TRANSLET_ERR
	"The Transformer has no encapsulated translet object.",

	/*
	 * Note to translators:  The XML document that results from a
	 * transformation needs to be sent to an output handler object; this
	 * message is produced if that requirement is not met.
	 */
	//JAXP_NO_HANDLER_ERR
	"No defined output handler for transformation result.",

	/*
	 * Note to translators:  "Result" is a Java interface name in this
	 * context.  The substitution text is a method name.
	 */
	//JAXP_NO_RESULT_ERR
	"Result object passed to ''{0}'' is invalid.",

	/*
	 * Note to translators:  "Transformer" is a Java interface name.  The
	 * user's program attempted to access an unrecognized property with the
	 * name specified in the substitution text.  The method used to retrieve
	 * the property is "getOutputProperty", so it's not clear whether it
	 * would be best to translate the term "property".
	 */
	//JAXP_UNKNOWN_PROP_ERR
	"Attempting to access invalid Transformer property ''{0}''.",

	/*
	 * Note to translators:  SAX2DOM is the name of a Java class that should
	 * not be translated.  This is an adapter in the sense that it takes a
	 * DOM object and converts it to something that uses the SAX API.
	 */
	//SAX2DOM_ADAPTER_ERR
	"Could not create SAX2DOM adapter: ''{0}''.",

	/*
	 * Note to translators:  "XSLTCSource.build()" is a Java method name.
	 * "systemId" is an XML term that is short for "system identification".
	 */
	//XSLTC_SOURCE_ERR
	"XSLTCSource.build() called without systemId being set.",


	//COMPILE_STDIN_ERR
	"The -i option must be used with the -o option.",


	/*
	 * Note to translators:  This message contains usage information for a
	 * means of invoking XSLTC from the command-line.  The message is
         * formatted for presentation in English.  The strings <output>,
         * <directory>, etc. indicate user-specified argument values, and can
         * be translated - the argument <package> refers to a Java package, so
         * it should be handled in the same way the term is handled for JDK
         * documentation.
	 */
	//COMPILE_USAGE_STR
	"SYNOPSIS\n"+
	"   java org.apache.xalan.xsltc.cmdline.Compile [-o <output>]\n"+
	"      [-d <directory>] [-j <jarfile>] [-p <package>]\n"+
	"      [-n] [-x] [-s] [-u] [-v] [-h] { <stylesheet> | -i }\n\n"+
	"OPTIONS\n"+
	"   -o <output>    assigns the name <output> to the generated\n"+
	"                  translet. By default the translet name\n"+
	"                  is taken from the <stylesheet> name. This option\n"+
	"                  is ignored if compiling multiple stylesheets.\n"+
	"   -d <directory> specifies a destination directory for translet\n"+
	"   -j <jarfile>   packages translet classes into a jar file of the\n"+
	"                  name specified as <jarfile>\n"+
	"   -p <package>   specifies a package name prefix for all generated\n"+
	"                  translet classes.\n"+
	"   -n             enables template inlining (default behavior better\n"+
	"                  on average).\n"+
	"   -x             turns on additional debugging message output\n"+
	"   -s             disables calling System.exit\n"+
	"   -u             interprets <stylesheet> arguments as URLs\n"+
	"   -i             forces compiler to read stylesheet from stdin\n"+
	"   -v             prints the version of the compiler\n"+
	"   -h             prints this usage statement\n",

	/*
	 * Note to translators:  This message contains usage information for a
	 * means of invoking XSLTC from the command-line.  The message is
         * formatted for presentation in English.  The strings <jarfile>,
         * <document>, etc. indicate user-specified argument values, and can
         * be translated - the argument <class> refers to a Java class, so it
         * should be handled in the same way the term is handled for JDK
         * documentation.
	 */
	//TRANSFORM_USAGE_STR
	"SYNOPSIS \n"+
	"   java org.apache.xalan.xsltc.cmdline.Transform [-j <jarfile>]\n"+
	"      [-x] [-s] [-n <iterations>] {-u <document_url> | <document>}\n"+
	"      <class> [<param1>=<value1> ...]\n\n"+
	"   uses the translet <class> to transform an XML document \n"+
	"   specified as <document>. The translet <class> is either in\n"+
	"   the user's CLASSPATH or in the optionally specified <jarfile>.\n"+
	"OPTIONS\n"+
	"   -j <jarfile>    specifies a jarfile from which to load translet\n"+
	"   -x              turns on additional debugging message output\n"+
	"   -s              disables calling System.exit\n"+
	"   -n <iterations> runs the transformation <iterations> times and\n"+
	"                   displays profiling information\n"+
	"   -u <document_url> specifies XML input document as a URL\n",



	/*
	 * Note to translators:  "<xsl:sort>", "<xsl:for-each>" and
	 * "<xsl:apply-templates>" are keywords that should not be translated.
	 * The message indicates that an xsl:sort element must be a child of
	 * one of the other kinds of elements mentioned.
	 */
	//STRAY_SORT_ERR
	"<xsl:sort> can only be used within <xsl:for-each> or <xsl:apply-templates>.",

	/*
	 * Note to translators:  The message indicates that the encoding
	 * requested for the output document was on that requires support that
	 * is not available from the Java Virtual Machine being used to execute
	 * the program.
	 */
	//UNSUPPORTED_ENCODING
	"Output encoding ''{0}'' is not supported on this JVM.",

	/*
	 * Note to translators:  The message indicates that the XPath expression
	 * named in the substitution text was not well formed syntactically.
	 */
	//SYNTAX_ERR
	"Syntax error in ''{0}''.",

	/*
	 * Note to translators:  The substitution text is the name of a Java
	 * class.  The term "constructor" here is the Java term.  The message is
	 * displayed if XSLTC could not find a constructor for the specified
	 * class.
	 */
	//CONSTRUCTOR_NOT_FOUND
	"Cannot find external constructor ''{0}''.",

	/*
	 * Note to translators:  "static" is the Java keyword.  The substitution
	 * text is the name of a function.  The first argument of that function
	 * is not of the required type.
	 */
	//NO_JAVA_FUNCT_THIS_REF
	"The first argument to the non-static Java function ''{0}'' is not a "+
	"valid object reference.",

	/*
	 * Note to translators:  An XPath expression was not of the type
	 * required in a particular context.  The substitution text is the
	 * expression that was in error.
	 */
	//TYPE_CHECK_ERR
	"Error checking type of the expression ''{0}''.",

	/*
	 * Note to translators:  An XPath expression was not of the type
	 * required in a particular context.  However, the location of the
	 * problematic expression is unknown.
	 */
	//TYPE_CHECK_UNK_LOC_ERR
	"Error checking type of an expression at an unknown location.",

	/*
	 * Note to translators:  The substitution text is the name of a command-
	 * line option that was not recognized.
	 */
	//ILLEGAL_CMDLINE_OPTION_ERR
	"The command-line option ''{0}'' is not valid.",

	/*
	 * Note to translators:  The substitution text is the name of a command-
	 * line option.
	 */
	//CMDLINE_OPT_MISSING_ARG_ERR
	"The command-line option ''{0}'' is missing a required argument.",

	/*
	 * Note to translators:  This message is used to indicate the severity
	 * of another message.  The substitution text contains two error
	 * messages.  The spacing before the second substitution text indents
         * it the same amount as the first in English.
	 */
	//WARNING_PLUS_WRAPPED_MSG
	"WARNING:  ''{0}''\n       :{1}",

	/*
	 * Note to translators:  This message is used to indicate the severity
         * of another message.  The substitution text is an error message.
	 */
	//WARNING_MSG
	"WARNING:  ''{0}''",

	/*
	 * Note to translators:  This message is used to indicate the severity
	 * of another message.  The substitution text contains two error
	 * messages.  The spacing before the second substitution text indents
         * it the same amount as the first in English.
	 */
	//FATAL_ERR_PLUS_WRAPPED_MSG
	"FATAL ERROR:  ''{0}''\n           :{1}",

	/*
	 * Note to translators:  This message is used to indicate the severity
         * of another message.  The substitution text is an error message.
	 */
	//FATAL_ERR_MSG
	"FATAL ERROR:  ''{0}''",

	/*
	 * Note to translators:  This message is used to indicate the severity
	 * of another message.  The substitution text contains two error
	 * messages.  The spacing before the second substitution text indents
         * it the same amount as the first in English.
	 */
	//ERROR_PLUS_WRAPPED_MSG
	"ERROR:  ''{0}''\n     :{1}",

	/*
	 * Note to translators:  This message is used to indicate the severity
         * of another message.  The substitution text is an error message.
	 */
	//ERROR_MSG
	"ERROR:  ''{0}''",
	
	/*
	 * Note to translators:  The substitution text is the name of a class.
	 */
	//TRANSFORM_WITH_TRANSLET_STR
	"Transform using translet ''{0}'' ",

	/*
	 * Note to translators:  The first substitution is the name of a class,
         * while the second substitution is the name of a jar file.
	 */
	//TRANSFORM_WITH_JAR_STR
	"Transform using translet ''{0}'' from jar file ''{1}''",

        /*
	 * Note to translators:  "TransformerFactory" is the name of a Java
         * interface and must not be translated.  The substitution text is
         * the name of the class that could not be instantiated.
	 */
        //COULD_NOT_CREATE_TRANS_FACT
        "Could not create an instance of the TransformerFactory class ''{0}''."
    };

    private static Vector _keys;

    static {
	_keys = new Vector();
	_keys.addElement(ErrorMsg.ERROR_MESSAGES_KEY);
	_keys.addElement(ErrorMsg.COMPILER_ERROR_KEY);
	_keys.addElement(ErrorMsg.COMPILER_WARNING_KEY);
	_keys.addElement(ErrorMsg.RUNTIME_ERROR_KEY);
    }

    public Enumeration getKeys() {
	return _keys.elements();
    }

    public Object handleGetObject(String key) {
	if (key == null) return null;
	if (key.equals(ErrorMsg.ERROR_MESSAGES_KEY))
	    return errorMessages;
 	else if (key.equals(ErrorMsg.COMPILER_ERROR_KEY))
	    return "Compiler error(s): ";
	else if (key.equals(ErrorMsg.COMPILER_WARNING_KEY))
	    return "Compiler warning(s): ";	    
 	else if (key.equals(ErrorMsg.RUNTIME_ERROR_KEY))
	    return "Translet error(s): ";
	return(null);
    }

}
