# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

#{0} - Object Type(File/Property)
#{1} - Object Name
Error_does_not_exists={0} <{1}> does not exists
#{0} - File name
Error_specified_file_can_not_be_used=Specified File <{0}> can not be used.
#{0} - File Name
MSG_using_the_default_file=Using the default file {0}

Error_control_should_never_reach_here=Control should never reach here.
#{0} - File Name
Error_can_not_access_file=Can not access file {0}

Error_failed_to_create=Failed to create: {0}

Error_expects_argument_one_to_be_an_array_of_Objects=Expects Argument one to be an array of Objects.
#{0} - Constraint Name
#{1} - Constraint Field Name
Error_failed_to_set={0}: Failed to set {1}

MSG_Not_defined=No {0} defined.
#{0} - Constraint Name
MSG_Conflicting_Constraint_information=Conflicting information for Constraint <{0}>. Number of arguments specified in Constraints File varies from the number of parameter values specified in Validation File.

MSG_not_yet_implemented=Not yet implemented.
#{0}  -  Display utility name
#{1}  -  Name of the Object Display utility failed to diplay
MSG_does_not_support_displaying_of={0} does not support displaying of {1}

MSG_given_object_is_not_validatee=Given object <{0}>, neither implements Validatee nor its Validatee Implementation found.
#{0}  - True
#{1}  - False
MSG_BooleanConstraint_Failure=Should be one of the following(case ignored): {0}, {1}.

MSG_MandatoryConstraint_Failure=Cannot be null.

MSG_NonZeroLengthConstraint_Failure=Cannot be of Zero length.

MSG_RangeConstraint_Failure=Cannot be outside of range {0}

MSG_NumberConstraint_Failure=Should be a Number.

MSG_InConstraint_Failure=Should be one of the following: {0}.

MSG_CardinalConstraint_Failure=Cannot be null; must be present.

MSG_NonBlankConstraint_Failure=Cannot be just spaces.

MSG_ZeroToMaxIntegerConstraint_Failure=Should be an Integer between 0 and Integer.MAX_VALUE.

MSG_IntegerGreaterThanConstraint_Failure=Should be an Integer greater than {0}.
#{0} - Constraints Name
#{1) - Value, the Constraint failed for.
#{2} - Element Name
MSG_Failure={0} FAILED for value {1} of {2}.
#{0} - Constraints Name
#{2} - Element Name
MSG_Failure_1={0} FAILED for {1}.

Indexed_Name_Format={0}({1})

Name_Value_Pair_Format={0} : {1}

MSG_No_definition_for=No {0} defined for <{1}>

Warning_Not_available=No {0} available.
#{0} - Argument Name
#{1} - Check Name
Warning_no_value_specified_for=No Value specified for <{0}> of <{1}>
#{0} - File Name
MSG_Unable_to_use_file=Unable to use file <{0}>
