#
# Copyright (c) 2005, 2012, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#


model.nestedModelError=error de modelo: {0}
# Usage not found. TODO Remove
#model.duplicate.porttype=duplicate PortType added to model: {0}
# Usage not found. TODO Remove
#model.duplicate.operation=duplicate Operation added to model: {0}
# Usage not found. TODO Remove
#model.duplicate.faultmessage=duplicate fault message added to model: {0}
# Usage not found. TODO Remove
#model.duplicate.part=duplicate part added to model: {0}
# Usage not found. TODO Remove
#model.duplicate.property=duplicate property added to model: {0}
# Usage not found. TODO Remove
#model.duplicate.service=duplicate service added to model: {0}
model.invalid.message.type=tipo de mensaje no v\u00E1lido: {0}

model.schema.notImplemented=funci\u00F3n de esquema XML no soportada ({0})
model.schema.circularity=se ha detectado una circularidad en el esquema: \\"{0}\\"

model.schema.unsupportedType=tipo no soportado ({0}): \"{1}\" (espacio de nombres: {2})
# Usage not found. TODO Remove
#model.schema.unsupportedType.anonymous=unsupported anonymous type ({0})
# Usage not found. TODO Remove
#model.schema.invalidLiteralInEnumeration=invalid literal \"{0}\" in enumeration \"{1}\" (namespace: {2})
model.schema.invalidLiteralInEnumeration.anonymous=literal no v\u00E1lido \\"{0}\\" en la enumeraci\u00F3n an\u00F3nima

# Usage not found. TODO Remove
#model.schema.notImplemented.generatingSOAPElement=unsupported XML Schema feature: \"{0}\" in component {1}, mapping it to javax.xml.soap.SOAPElement

//replacement for Uxxx codes
# Usage not found. TODO Remove
#model.schema.unsupportedSchemaType=unsupported schema type: \"{0}\"
# Usage not found. TODO Remove
#model.schema.invalidSimpleType=invalid simpleType: \"{0}\"
# Usage not found. TODO Remove
#model.schema.invalidSimpleType.noJavaType=no java mapping for simpleType: \"{0}\"
model.schema.simpleTypeWithFacets=la faceta \"{0}\" no est\u00E1 soportada en un tipo simple: \"{0}\"
model.schema.unionNotSupported=simpleType: \\"{0}\\" la derivaci\u00F3n por xsd:union no est\u00E1 soportada
model.schema.listNotSupported=simpleType: \\"{0}\\" la derivaci\u00F3n por xsd:list no est\u00E1 soportada
model.schema.invalidSimpleType.invalidItemType=en simpleType: \\"{0}\\", itemType \\"{1}\\" no se puede derivar por lista
model.schema.invalidSimpleType.noItemLiteralType=en simpleType: \"{0}\", xsd:list itemType \"{1}\" no es v\u00E1lido
# Usage not found. TODO Remove
#model.schema.invalidSimpleType.noNamespaceURI=invalid simpleType: \"{0}\", had null namespaceURI
# Usage not found. TODO Remove
#model.schema.encoderNotFound=no encoder found for simpleType: \"{0}\"
model.schema.invalidWildcard.allCompositor=el compositor xsd:all no est\u00E1 soportado para el comod\u00EDn en el tipo de esquema: \\"{0}\\"

model.uniqueness=violaci\u00F3n de la restricci\u00F3n de unicidad
model.part.notUnique=partes de wsdl:message \\"{0}\\", referencia \\"{1}\\", deben hacer referencia a elementos globales \u00FAnicos.
model.exception.notunique=Fallo al generar la firma de Java: nombres de excepci\u00F3n duplicados {0}. Utilice la personalizaci\u00F3n de enlaces JAX-WS para cambiar el nombre de wsdl:part \\"{1}\\"
model.uniqueness.javastructuretype=violaci\u00F3n de la restricci\u00F3n de unicidad; se ha agregado un miembro duplicado \\"{0}\\" a JavaStructureType \\"{1}\\"
# Wrapped into an Exception. Not concatenated with any other string.
model.parent.type.already.set=El principal del tipo \"{0}\" ya se ha definido en \"{1}\", nuevo valor = \"{2}\".
# Usage not found. TODO Remove
#model.parent.fault.already.set=parent of fault \"{0}\" already set to \"{1}\", new value = \"{2}\"
model.exporter.unsupportedClass=exportador de modelo: clase no soportada: {0}
# Usage not found. TODO Remove
#model.importer.nonModel=not a valid model document
# Usage not found. TODO Remove
#model.importer.syntaxError=syntax error in model document (line {0})
model.importer.invalidVersion=versi\u00F3n no v\u00E1lida \"{1}\" en el documento del modelo (l\u00EDnea {0})
model.importer.invalidMinorMinorOrPatchVersion=la versi\u00F3n del modelo \\"{1}\\" es m\u00E1s reciente que la versi\u00F3n en tiempo de ejecuci\u00F3n \\"{2}\\" (l\u00EDnea {0}): hay que actualizarla a un tiempo de ejecuci\u00F3n m\u00E1s reciente
model.importer.invalidClass=nombre de clase no v\u00E1lido \"{1}\" en el documento del modelo (l\u00EDnea {0})
model.importer.invalidId=Identificador no v\u00E1lido \\"{1}\\" en el documento del modelo (l\u00EDnea {0})
# Usage not found. TODO Remove
#model.importer.invalidLiteral=invalid literal value in model document (line {0})
# Usage not found. TODO Remove
#model.importer.invalidProperty=invalid property in model document (line {0})
model.arraywrapper.only.one.member=LiteralArrayWrapper s\u00F3lo puede tener un miembro de elemento.
model.arraywrapper.member.already.set=El miembro del elemento LiteralArrayWrapper ya est\u00E1 definido.
model.arraywrapper.no.parent=LiteralArrayWrapper no puede tener un tipo principal
model.arraywrapper.no.subtypes=LiteralArrayWrapper no puede tener subtipos
model.arraywrapper.no.content.member=LiteralArrayWrapper no puede tener un miembro de contenido
model.complexType.simpleContent.reservedName=nombre de atributo no v\u00E1lido: "_value" en complexType: \\"{0}\\", _value es un nombre reservado de JAX-WS; este nombre se genera en la clase javabean generada para incluir el valor de contenido en la clase javabean generada para complexType/simpleContent.
model.parameter.notunique.wrapper=Fallo al generar la firma de Java: nombre de par\u00E1metro duplicado \\"{0}\\". Intente una de las siguientes acciones\n\t1. Utilice la personalizaci\u00F3n de enlace JAX-WS para cambiar el nombre de wsdl:part \\"{1}\\"\n\t2. Ejecute wsimport con el conmutador -extension.\n\t3. Esta operaci\u00F3n es de estilo de envoltorio. Para resolver el conflicto de nombres de par\u00E1metros, intente tambi\u00E9n desactivar el estilo de envoltorio utilizando la personalizaci\u00F3n wsdl <jaxws:enableWrapperStyle>false</jaxws:enableWrapperStyle>.
model.parameter.notunique=Fallo al generar la firma de Java: nombre de par\u00E1metro duplicado \\"{0}\\". Intente realizar una de las siguientes acciones\n\t1. Utilice la personalizaci\u00F3n de enlace JAX-WS para cambiar el nombre de wsdl:part \\"{1}\\"\n\t2. Ejecute wsimport con el conmutador -extension.

#JAXWS 2.0
model.schema.elementNotFound=No se ha encontrado el elemento \"{0}\".
model.schema.jaxbException.message="{0}"
model.saxparser.exception:{0}\n{1}

ConsoleErrorReporter.UnknownLocation = ubicaci\u00F3n desconocida

ConsoleErrorReporter.LineXOfY = \ \ l\u00EDnea {0} de {1}
