################################################################################
##
##  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.
##
################################################################################

# Developer RTE Section

# Animation
startValContainsNonNums=L'array startValue contiene elementi non numerici: è necessario fornire Interpolator ad Animation.
endValContainsNonNums=L'array endValue contiene elementi non numerici: è necessario fornire un Interpolator personalizzato ad Animation.

# ArrayInterpolator
arraysNotOfEqualLength=Gli array di inizio e di fine devono avere la stessa lunghezza.

# Constant
accDecWithinRange=Il valore (accelerazione + decelerazione) deve rientrare nell'intervallo [0,1].

# AnimateInstance
illegalPropValue=Valore di proprietà non valido: {0}.
propNotPropOrStyle=La proprietà {0} non è né una proprietà né uno stile di oggetto {1}: {2}.

# AnimateShaderTransition
cannotOperateOn=AnimateShaderTransition funziona solo su istanze IUIComponent e GraphicElement.

# NumberInterpolator
cannotCalculateValue=Interpolator non è in grado di calcolare i valori interpolati quando startValue ({0}) o endValue ({1}) non è un numero.
