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

# Shared

outOfBounds=指定的索引“{0}”越界。
invalidIndex=无效的索引：“{0}”。

# ListCollectionView

unknownProperty=未知的属性：“{0}”。
incorrectAddition=试图添加的项目已存在于视图中。
itemNotFound=视图未经过排序时无法执行查找。
bookmarkNotFound=书签并非来自该视图。

# ListCollectionViewCursor

invalidInsert=当前为 beforeFirst 时，无法插入。
invalidRemove=当前为 beforeFirst 或 afterLast 时，无法移动。
bookmarkInvalid=书签不再有效。
invalidCursor=光标不再有效。

# NumericDataProvider

addItemError=此类中 addItem() 不可用。
addItemAtError=此类中 addItemAt() 不可用。
itemUpdatedError=此类中 itemUpdated() 不可用。
removeAllError=此类中 removeAll() 不可用。
removeItemAtError=此类中 removeItemAt() 不可用。
setItemAtError=此类中 setItemAt() 不可用。
stepSizeError=stepSize 不能设置为零值。

# OnDemandDataProvider

addItemError=此类中 addItem() 不可用。
addItemAtError=此类中 addItemAt() 不可用。
itemUpdatedError=此类中 itemUpdated() 不可用。
getItemAtError=此类中 getItemAt() 不可用。
getItemIndexError=此类中 getItemIndex() 不可用。
lengthError=此类中 length() 不可用。
removeAllError=此类中 removeAll() 不可用。
removeItemAtError=此类中 removeItemAt() 不可用。
setItemAtError=此类中 setItemAt() 不可用。
toArrayError=此类中 toArray() 不可用。

# Sort

noItems=没有要搜索的项目。
findCondition=查找条件必须包含“{0}”之前的所有排序域。
findRestriction=查找条件必须至少包含一个排序域值。
unknownMode=查找模式未知。
nonUnique=项目中的值不唯一。
noComparator=无法确定“{0}”的比较条件。

# SortField

noComparatorSortField=无法确定名为“{0}”的 SortField 的比较条件。

# XMLListAdapter

invalidType=类型不正确。必须是 XML 类型，或包含一个 XML 对象的 XMLList。 
