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

# Seed entry used by MessagesTest. Real entries are added by migration tasks.
test.seed = 你好 %1$s

# === common ===

# TSDataType
error.common.invalid_input = 无效输入: %1$s

# RamUsageEstimator
error.common.no_array_classes = 此方法不支持数组类

# TsPrimitiveType — unsupported data type (typo fixed: added space after colon)
error.common.unsupported_data_type = 不支持的数据类型: %1$s

# TsPrimitiveType — get/set operations not supported for sub-class (14 sites collapsed to 1 key)
error.common.subclass_op_not_supported = 当前子类不支持 %1$s

# TsPrimitiveType — wrong value type passed to setObject (7 sites collapsed to 1 key)
error.common.tsprimitive_wrong_value_type = %1$s 只能设置 %2$s 类型的值

# TsBlockBuilderStatus
error.common.bytes_cannot_be_negative = 字节数不能为负

# ColumnEncoding
error.common.invalid_column_encoding_value = 无效值: %1$s

# ColumnBuilderStatus
error.common.cannot_determine_size_array = 无法确定 %1$s 的大小，因为它包含数组
error.common.class_is_interface = %1$s 是接口
error.common.class_is_abstract = %1$s 是抽象类
error.common.cannot_determine_size_subclass = 无法确定子类的大小。%1$s 继承自 %2$s

# BitMap
error.common.bitmap_range_size_exceeds = range size %1$s 应该 <= 最小的 bitmap size %2$s
error.common.bitmap_start_length_out_of_range = startPosition %1$s + length %2$s 越界 %3$s
error.common.bitmap_out_of_src_range = %1$s 超出源范围 %2$s
error.common.bitmap_out_of_dest_range = %1$s 超出目标范围 %2$s

# TSDataType
error.common.unsupported_cast = 不支持的类型转换: 从 %1$s 到 %2$s

# === write ===

# DataPoint — set<Type> not supported (7 sites collapsed to 1 key; arg = type name)
error.write.datapoint_set_not_supported = DataPoint 不支持 set %1$s

# DataPoint / Tablet / AlignedChunkGroupWriterImpl / NonAlignedChunkGroupWriterImpl / TableTsBlock2TsFileWriter
# — "Data type X is not supported." (many sites collapsed to 1 key)
error.write.type_not_supported = 不支持数据类型 %1$s。

# DataPoint — type/value mismatch in getDataPoint
error.write.datapoint_type_value_mismatch = %1$s 的数据类型为 %2$s，但输入值为 %3$s

# Tablet.addValue(rowIndex, indexOfSchema, Object) — wrong Java type for column type (7 sites collapsed to 1 key)
error.write.tablet_expected_type = 数据类型 %2$s 期望值类型为 %1$s，但得到 %3$s

# Tablet.addValue(rowIndex, columnIndex, primitiveVal) — wrong array type (7 sites collapsed to 1 key)
error.write.tablet_col_wrong_type = 列索引 %1$s 的数据类型不是 %2$s

# Tablet — null measurement argument
error.write.tablet_null_measurement = measurement 不能为 null

# Tablet — measurement not found
error.write.tablet_no_measurement = 找不到 measurement: %1$s

# Tablet.getValue — unsupported data type
error.write.tablet_unsupported_type = 不支持的类型: %1$s

# Tablet.readvaluesFromBuffer — unsupported type at client
error.write.tablet_client_type_not_supported = 在客户端转换数据时不支持数据类型 %1$s

# VectorMeasurementSchema — getCompressor deprecated method
error.write.schema_vector_aligned_no_compressor = 对齐时间序列不应调用此方法

# VectorMeasurementSchema — unsupported method (4 sites collapsed to 1 key)
error.write.schema_vector_method_unsupported = VectorMeasurementSchema 不支持此方法

# VectorMeasurementSchema — unexpected end of stream
error.write.schema_vector_unexpected_end_of_stream = 读取 compressor 时数据流意外结束

# MeasurementSchema — unsupported method (4 sites collapsed to 1 key)
error.write.schema_measurement_method_unsupported = MeasurementSchema 不支持此方法

# MeasurementSchemaBuilder — validation errors
error.write.schema_builder_null_name = Measurement 名称不能为空
error.write.schema_builder_null_type = 数据类型不能为 null
error.write.schema_builder_null_property = 属性的 key 和 value 不能为 null

# ValueChunkWriter / ChunkWriterImpl / TimeChunkWriter — page header IO exception (3 files, 1 key)
error.write.page_write_header_io_exception = writeDataPageHeader 发生 IO 异常，忽略此 page

# ValueChunkWriter / ChunkWriterImpl / TimeChunkWriter — written bytes inconsistent (3 files, 1 key)
error.write.chunk_bytes_inconsistent = 写入字节数与数据大小不一致: %1$s != %2$s

# AlignedChunkWriterImpl — unknown data type
error.write.chunk_unknown_type = 未知数据类型 %1$s

# AlignedChunkGroupWriterImpl — out-of-order write (aligned)
error.write.chunk_group_aligned_out_of_order = 时间序列 %1$s%2$s%3$s 不允许写入乱序数据，时间应当晚于 %4$s

# NonAlignedChunkGroupWriterImpl — out-of-order write
error.write.chunk_group_non_aligned_out_of_order = 时间序列 %1$s%2$s%3$s 不允许写入乱序数据，时间应当晚于 %4$s

# TsFileWriter — file writer cannot write
error.write.tsfile_writer_cannot_write = 给定的文件 Writer 已不能再写入。可能是已完成的 TsFile

# TsFileWriter — page size too large vs chunk group size
error.write.tsfile_writer_page_size_too_large = 无效的内存阈值配置: page size %1$d 必须小于 chunk group size %2$d。请增大 chunk group size 或减小 page size。

# TsFileWriter — template not found
error.write.tsfile_writer_template_not_found = 给定的 template 不存在: %1$s

# TsFileWriter — device already registered (via template)
error.write.tsfile_writer_device_registered = 设备 %1$s 已被注册，只能使用 registerDevice 方法注册空设备。

# TsFileWriter — nonAligned timeseries trying to register on already-aligned device
error.write.tsfile_writer_timeseries_registered_aligned = 给定设备 %1$s 已被注册为对齐时间序列。

# TsFileWriter — timeseries already registered (nonAligned)
error.write.tsfile_writer_timeseries_registered = 给定的非对齐时间序列 %1$s 已被注册。

# TsFileWriter — aligned device cannot be expanded
error.write.tsfile_writer_device_aligned_no_expand = 给定设备 %1$s 已被注册为对齐时间序列，不允许扩展。

# TsFileWriter — trying to register nonAligned on already-nonAligned device
error.write.tsfile_writer_device_registered_nonaligned = 给定设备 %1$s 已被注册为非对齐时间序列。

# TsFileWriter — new measurement after flush
error.write.tsfile_writer_new_measurement = TsFile 已刷新 chunk group，无法在设备 %2$s 中添加新 measurement %1$s

# TsFileWriter / AbstractTableModelTsFileWriter — flush size inconsistent
error.write.tsfile_writer_flush_inconsistent = Flush 的数据大小与计算不一致！预估: %1$d，实际: %2$d

# RestorableTsFileIOWriter — incompatible file format
error.write.restorable_writer_not_compatible = %1$s 不是 TsFile 格式。

# ForceAppendTsFileWriter — not a complete TsFile
error.write.force_append_not_complete = 文件 %1$s 不是完整的 TsFile

# DiskTSMIterator — read size mismatch
error.write.disk_tsm_read_size_mismatch = 期望读取 %1$s 字节，实际读取 %2$s 字节

# DeviceTableModelWriter / v4 — table name is null
error.write.v4_table_name_null = 表名为 null

# TableTsBlock2TsFileWriter — null value in time column
error.write.v4_all_time_null = 时间列中的所有值都不能为 null

# TsFileTreeWriter — delegate error messages
error.write.v4_tree_writer_register_failed = 注册设备 %1$s 的时间序列失败
error.write.v4_tree_writer_register_aligned_failed = 注册设备 %1$s 的对齐时间序列失败
error.write.v4_tree_writer_write_tablet_failed = 写入 tablet 数据失败
error.write.v4_tree_writer_write_record_failed = 写入 TSRecord 失败
error.write.v4_tree_writer_close_failed = 关闭 TsFileTreeWriter 失败

# TsFileTreeWriterBuilder — output file not specified
error.write.v4_output_file_required = 必须指定输出文件

# TsFileWriterBuilder — parameter validation
error.write.v4_file_non_null = 文件必须是非空且非目录的 File。
error.write.v4_table_schema_non_null = TableSchema 不能为 null。
error.write.v4_memory_threshold_positive = 内存阈值必须大于 0 字节。
error.write.v4_table_name_blank = TableName 不能为空。
error.write.v4_column_name_blank = 列名不能为空。

# --- write LOG messages ---

# DataPoint subclasses — null IChunkWriter (7 files, 1 key)
log.write.datapoint_chunk_writer_null = 给定的 IChunkWriter 为 null，不执行任何操作并返回

# ChunkWriterImpl / TimeChunkWriter / ValueChunkWriter — upper bound hit (3 files, 1 key)
log.write.chunk_writer_write_page = 当前行数达到上限，写入 page {}

# ChunkWriterImpl / TimeChunkWriter / ValueChunkWriter — page write error (3 files, 1 key)
log.write.chunk_writer_page_error = pageWriter.writePageHeaderAndDataIntoBuff 出错，忽略此 page:

# AlignedChunkGroupWriterImpl / NonAlignedChunkGroupWriterImpl — flush device (2 files, 1 key)
log.write.flush_device = 开始刷新设备 id: {}

# TsFileWriter / AbstractTableModelTsFileWriter — flush chunk groups (2 files, 1 key)
log.write.flush_chunk_groups = 开始刷新 chunk groups，占用内存空间: {}

# TsFileWriter / AbstractTableModelTsFileWriter — close file (2 files, 1 key)
log.write.close_file = 开始关闭文件

# AbstractTableModelTsFileWriter — close file exception (1 site)
log.write.close_file_exception = 关闭文件 writer 时发生异常。

# TsFileWriter / AbstractTableModelTsFileWriter — page size vs chunk group size warn (2 files, 1 key)
log.write.page_size_warn = TsFile 的 page size {} 大于 chunk group size {}，请增大 chunk group size 或减小 page size。

# TsFileWriter — ignore nonAligned measurement (1 site)
log.write.ignore_nonaligned_measurement = 忽略非对齐 measurement {}，因为它未被注册或不在默认 template 中

# ForceAppendTsFileWriter / RestorableTsFileIOWriter — writer opened debug (2 files, 1 key)
log.write.writer_opened = {} writer 已打开。

# TsFileIOWriter — start chunk group debug (1 site)
log.write.start_chunk_group = 开始 chunk group: {}，文件位置 {}

# TsFileIOWriter — start flush footer debug (1 site)
log.write.start_flush_footer = 开始刷新 footer，文件位置: {}

# TsFileIOWriter — device timeseries metadata error (1 site)
log.write.tsm_device_metadata_error = 获取设备时间序列 metadata map 失败

# TsFileIOWriter — flush metadata to temp file error (1 site)
log.write.flush_metadata_exception = 刷新 metadata 到临时文件 {} 时发生异常

# TsFileIOWriter — flushing series debug (1 site)
log.write.flushing_series = 正在刷新 {}

# DiskTSMIterator — IOException reading timeseries metadata from disk (1 site)
log.write.tsm_disk_read_error = 从磁盘读取时间序列 metadata 时发生 IOException

# ChunkWriterImpl / TimeChunkWriter / ValueChunkWriter — page header start (3 files, 1 key)
log.write.page_header_flush_start = 开始将 page header 刷入 buffer，buffer 位置 {}

# ChunkWriterImpl / TimeChunkWriter / ValueChunkWriter — page header done (3 files, 1 key)
log.write.page_header_flush_done = 完成将 {} 的 page header {} 刷入 buffer，buffer 位置 {}

# TimeChunkWriter / ValueChunkWriter — page header done (time page variant, 2 files)
log.write.page_header_flush_done_time = 完成将 time page 的 page header {} 刷入 buffer，buffer 位置 {}

# ChunkWriterImpl / TimeChunkWriter / ValueChunkWriter — enough size, write page (3 files, 1 key)
log.write.page_enough_size = 大小足够，写入 page {}，pageSizeThreshold: {}，currentPateSize: {}，valueCountInOnePage: {}

# ValueChunkWriter variant of above (uses currentPageSize instead of currentPateSize)
log.write.page_enough_size_value = 大小足够，写入 page {}，pageSizeThreshold: {}，currentPageSize: {}，valueCountInOnePage: {}

# TsFileIOWriter — end flushing a chunk (1 site)
log.write.end_flush_chunk = 完成刷新 chunk: {}，总值数: {}

# TsFileIOWriter — flushing chunk metadata summary (1 site)
log.write.flush_chunk_metadata = 正在刷新 chunk metadata，总大小: {}，数量: {}，平均大小: {}

# === read.common ===

# TimeRange — null input in compareTo
error.read.timerange_null_input = 输入不能为 null！

# TimeRange — setMin/setMax invalid input
error.read.timerange_invalid_input = 无效输入！

# TimeRange — set(min, max) range violation
error.read.timerange_min_gt_max = min: %1$s 不能大于 max: %2$s

# Chunk — unsupported data type in rewrite (2 sites, 1 key)
error.read.chunk_unsupported_type = 不支持的数据类型: %1$s

# Chunk — NonAlignedChunk null value at timestamp
error.read.chunk_non_aligned_null = NonAlignedChunk 包含 null，时间戳: %1$s

# BatchDataFactory — instantiation guard
error.read.factory_class = 工厂类

# Field — OBJECT type does not support getBinaryV
error.read.field_object_type_no_binary = OBJECT 类型只支持 getStringValue

# Path — getFullPathWithAlias not supported
error.read.path_no_alias = TSFile Path 中没有别名

# SignalBatchData — hasCurrent not supported
error.read.signal_batch_data_no_has_current = SignalBatchData 不支持 hasCurrent

# BatchData — unknown data type (2 sites, 1 key)
error.read.batch_data_unknown_type = BatchData 的数据类型未知: %1$s

# BatchData — invalid input in deserialize
error.read.batch_data_invalid_input = 无效输入: %1$s

# TypeFactory — invalid TSDataType
error.read.typefactory_invalid_tsdata_type = TypeFactory 接收到无效的 TSDataType: %1$s

# TypeFactory — invalid TypeEnum
error.read.typefactory_invalid_type_enum = TypeFactory 接收到无效的 TypeEnum: %1$s

# TsBlockBuilder — unknown data type (2 sites, 1 key)
error.read.tsblock_builder_unknown_type = 未知数据类型: %1$s

# TsBlockBuilder.build — declared positions mismatch (time column)
error.read.tsblock_builder_time_mismatch = 声明的 positions (%1$s) 与 time column 的条目数 (%2$s) 不匹配

# TsBlockBuilder.build — declared positions mismatch (value column)
error.read.tsblock_builder_col_mismatch = 声明的 positions (%1$s) 与 column %2$s 的条目数 (%3$s) 不匹配

# TsBlock.getRegion — invalid position/length
error.read.tsblock_invalid_region = 无效的 position %1$s 和 length %2$s，该 page 仅有 %3$s 个 positions

# TsBlock.subTsBlock — fromIndex over positionCount
error.read.tsblock_from_index_over = subTsBlock 的 fromIndex 不能超过 positionCount。

# TsBlock.determinePositionCount — columns is empty
error.read.tsblock_columns_empty = columns 为空

# TsBlock — unknown datatype in updateWithoutTimeColumn
error.read.tsblock_unknown_datatype = 未知数据类型: %1$s

# ColumnBuilder — type-specific unsupported data type (1 key per builder, 6 builders)
error.read.col_builder_double_type = DoubleColumn 只支持 Double 数据类型
error.read.col_builder_int_type = IntegerColumn 只支持 Integer 数据类型
error.read.col_builder_float_type = FloatColumn 只支持 Float 数据类型
error.read.col_builder_long_type = LongColumn 只支持 Long 数据类型
error.read.col_builder_boolean_type = BooleanColumn 只支持 Boolean 数据类型
error.read.col_builder_binary_type = BinaryColumn 只支持 Binary 数据类型

# ColumnFactory — unsupported data type
error.read.column_factory_unsupported_type = 不支持的数据类型: %1$s

# TsBlockSerde — block too large
error.read.tsblock_too_large = TsBlock 不应该这么大: %1$s

# Shared column constructor checks (reused across multiple column classes)
error.read.col_array_offset_negative = arrayOffset 为负
error.read.col_position_count_negative = positionCount 为负
error.read.col_values_length_lt_position = values 长度小于 positionCount
error.read.col_isnull_length_lt_position = isNull 长度小于 positionCount
error.read.col_ids_length_lt_position = ids 长度小于 positionCount

# Shared fromIndex validation (reused across multiple column classes)
error.read.col_from_index_invalid = fromIndex 无效

# TimeColumn — isNull not supported
error.read.time_column_isnull_unsupported = TimeColumn 不支持 isNull

# ColumnEncoderFactory — unsupported column encoding
error.read.col_encoder_unsupported = 不支持的 column encoding: %1$s

# Int32/Int64/Binary/ByteArray array column encoders — invalid data type
error.read.col_encoder_invalid_type = 无效的数据类型: %1$s

# RunLengthEncodedColumn — expected single position
error.read.rle_col_expected_single = 期望值仅含单个 position，但有 %1$s 个 positions

# RunLengthEncodedColumn — setNull not supported
error.read.rle_col_set_null_unsupported = 不支持 set null of %1$s！

# RunLengthColumnEncoder — nested RLE not supported
error.read.rle_encoder_nested = 无法编码嵌套的 RLE column。

# DictionaryColumn — sequential ids flag constraint
error.read.dict_col_sequential_ids = sequential ids 标志仅对 compacted dictionary 有效

# DictionaryColumn — non-existent key reference (2 sites, 1 key)
error.read.dict_col_nonexistent_key = 引用了不存在的 key

# DictionaryColumn — dictionary source ids mismatch
error.read.dict_col_source_ids_mismatch = dictionarySourceIds 必须相同

# NullColumn — unknown data type
error.read.null_col_unknown_type = 未知数据类型: %1$s

# ColumnUtil — invalid offset/length in array
error.read.col_util_invalid_offset_length = 无效的 offset %1$s 和 length %2$s，数组共有 %3$s 个元素

# ColumnUtil — invalid position/length in block
error.read.col_util_invalid_pos_length = 无效的 position %1$s 和 length %2$s，block 共有 %3$s 个 positions

# ColumnUtil — invalid positions array size
error.read.col_util_invalid_positions_size = 无效的 positions 数组大小 %1$d，实际 position 数为 %2$d

# ColumnUtil — invalid position in block
error.read.col_util_invalid_position = 无效的 position %1$s，block 共有 %2$s 个 positions

# ColumnUtil — cannot grow array
error.read.col_util_cannot_grow = 数组无法扩展到 '%1$s' 之外

# TimeColumnBuilder — position not valid
error.read.time_col_builder_position_invalid = position 无效

# PathParseError — syntax error with line and position
error.read.path_parse_error = 第 %1$s 行第 %2$s 列: %3$s

# === read ===

# TsFileSequenceReader / selfCheck — unexpected marker
error.read.unexpected_marker = 意外的 marker %1$s

# TsFileSequenceReader.selfCheck / checkChunkAndPagesStatistics — unexpected data type in switch
error.read.unexpected_type = 意外的类型 %1$s

# TsFileSequenceReader — device not in tsFileMetaData (with file name, 3 sites)
error.read.device_not_in_metadata_file = 设备 {%1$s} 不在 %2$s 的 tsFileMetaData 中

# TsFileSequenceReader — device not in tsFileMetaData (no file name, 1 site)
error.read.device_not_in_metadata = 设备 {%1$s} 不在 tsFileMetaData 中

# TsFileSequenceReader / readPlanIndex / readMarker — reach end of file (3 sites)
error.read.reach_end_of_file = 已到达文件末尾。

# TsFileSequenceReader.readData — reach end of data (short form)
error.read.reach_end_of_data = 已到达数据末尾

# TsFileSequenceReader.readData — reach end of data with position detail
error.read.reach_end_of_data_detail = 已到达数据末尾。期望读取大小: %1$s，实际读取大小: %2$s，位置: %3$s

# TsFileSequenceReader.uncompress — uncompress error with counts (no page header)
error.read.uncompress_error = 解压错误！uncompress size: %1$scompressed size: %2$s%3$s

# ChunkReader.uncompressPageData / decryptAndUncompressPageData / LazyLoadPageData — uncompress error with page header
error.read.uncompress_error_with_header = 解压错误！uncompress size: %1$scompressed size: %2$spage header: %3$s%4$s

# AbstractChunkReader — no more page
error.read.no_more_page = 没有更多 page

# ChunkReader.readCompressedPageData — incomplete page body
error.read.chunk_incomplete_page_body = page body 不完整。期望: %1$s，实际: %2$s

# TsFileSequenceReaderTimeseriesMetadataIterator — deserializeTimeseriesMetadataUsingTsFileInput failed
error.read.tsm_iterator_tsfinput_failed = TsFileSequenceReaderTimeseriesMetadataIterator: deserializeTimeseriesMetadataUsingTsFileInput 失败，currentEndOffset: %1$d，%2$s

# TsFileSequenceReaderTimeseriesMetadataIterator — deserializeMetadataIndexEntry failed
error.read.tsm_iterator_index_entry_failed = TsFileSequenceReaderTimeseriesMetadataIterator: deserializeMetadataIndexEntry 失败，MetadataIndexEntryInfo: %1$s，%2$s

# TsFileSequenceReaderTimeseriesMetadataIterator — currentBuffer still has remaining data
error.read.tsm_iterator_buffer_not_empty = deserializeLeafMeasurement 之前 currentBuffer 仍有剩余数据

# TsFileSequenceReader — timeseries of device are not aligned
error.read.timeseries_not_aligned = 设备 {%1$s} 的时间序列不是对齐的

# TsFileSequenceReader — aligned chunk metadata should only have one timeseriesMetadataList per device
error.read.aligned_chunk_metadata_one_device = 读取文件 %2$s 中设备 %1$s 的 timeseriesMetadata 时出错: 一个设备应只有一个 timeseriesMetadataList，实际: %3$d

# TsFileSequenceReader.selfCheckWithInfo — statistics mistakes in Chunk
error.read.stats_mistakes_chunk = 位置 %1$s 处的 Chunk 存在 statistics 错误

# TsFileSequenceReader.selfCheckWithInfo — statistics mistakes in TimeseriesMetadata
error.read.stats_mistakes_tsm = 位置 %1$s 处的 TimeseriesMetadata 存在 statistics 错误

# TsFileSequenceReader / TsFileDeviceIterator — error reading a time series metadata block (2 sites)
error.read.metadata_block_read_error = 读取时间序列 metadata block 时发生错误。

# LazyTsFileDeviceIterator.getDevicesOfLeafNode — first param should be device leaf node
error.read.device_leaf_node_required = 第一个参数应为 device leaf node。

# LazyTsFileDeviceIterator — next() must be called before accessing current device (3 sites)
error.read.device_iterator_no_current = 访问当前设备前必须先调用 next()

# DeviceMetaIterator — non-device node detected
error.read.non_device_node_detected = 检测到非设备节点: %1$s

# MetadataQuerierByFileImpl — spacePartitionStartPos > spacePartitionEndPos
error.read.metadata_querier_illegal_arg = 'spacePartitionStartPos' 不能大于 'spacePartitionEndPos'。

# ExpressionOptimizer — unsupported IExpression type in binary expression
error.read.expression_unsupported_binary_type = 不支持的 IExpression 类型: %1$s

# ExpressionOptimizer — StackOverflowError
error.read.expression_stack_overflow = 遇到 StackOverflowError。

# ExpressionOptimizer — unknown IExpression type
error.read.expression_unknown_type = 未知的 IExpression 类型: %1$s

# ExpressionOptimizer — unknown relation in IExpression
error.read.expression_unknown_relation = IExpression 中存在未知关系: %1$s

# ExpressionOptimizer — size of selectSeries could not be 0
error.read.expression_empty_select_series = selectSeries 的大小不能为 0

# ExpressionOptimizer — IExpression should contain only SingleSeriesExpression
error.read.expression_unexpected_type = IExpression 应只包含 SingleSeriesExpression，但发现其他类型: %1$s

# ExpressionOptimizer — unrecognized QueryFilterOperatorType
error.read.expression_unrecognized_operator = 无法识别的 QueryFilterOperatorType: %1$s

# ValueFilter — unsupported data type (7 satisfy methods, 1 key; arg = class name)
error.read.value_filter_unsupported_type = value filter 不支持的数据类型: %1$s

# ValueFilter — getTimeRanges not supported
error.read.value_filter_no_time_ranges = Value filter 不支持 getTimeRanges()

# Not filter — contains NOT (4 sites, 1 key; appended with filter.toString())
error.read.filter_contains_not = 该谓词包含 not！是否忘记将谓词传给 PredicateRemoveNotRewriter? %1$s

# Filter.deserialize — unsupported operator type
error.read.filter_unsupported_operator = 不支持的 operator 类型: %1$s

# TimeFilterOperators.In — set must not be null
error.read.filter_timein_set_null = set 不能为 null！

# ExtractTimeFilterOperators — unexpected extract field (2 sites)
error.read.extract_unexpected_field = 意外的 extract 字段: %1$s

# ValueFilterApi — unsupported data type (14 sites, 1 key)
error.read.filter_api_unsupported_type = 不支持的数据类型: %1$s

# TagFilterBuilder — column is not a tag column
error.read.tag_not_a_tag_column = 列 '%1$s' 不是 tag column

# TimeGenerator.getValues — OR node present
error.read.time_generator_or_get_values = where 子句中存在 OR operator 时不应调用 getValues() 方法

# TimeGenerator.getValues — path not in where clause
error.read.time_generator_path_not_found_values = where 子句中不存在的 path 不应调用 getValues() 方法

# TimeGenerator.getValue — OR node present
error.read.time_generator_or_get_value = where 子句中存在 OR operator 时不应调用 getValue() 方法

# TimeGenerator.getValue — path not in where clause
error.read.time_generator_path_not_found_value = where 子句中不存在的 path 不应调用 getValue() 方法

# TimeGenerator.construct — unsupported ExpressionType
error.read.time_generator_unsupported_expression = 构造 OperatorNode 时遇到不支持的 ExpressionType: %1$s

# AndNode / OrNode / LeafNode — no more data (3 sites)
error.read.node_no_more_data = 没有更多数据

# AbstractResultSet — column name not found
error.read.result_set_column_not_found = 在 result set 中找不到 columnName %1$s

# AbstractResultSet — field is null
error.read.result_set_null_field = columnIndex %1$s 处的 Field 为 null

# AbstractResultSet — column index out of bound
error.read.result_set_index_out_of_bound = column 索引 %1$s 越界

# DataSetWithoutTimeGenerator — unsupported data type
error.read.dataset_unsupported_type = 不支持 %1$s

# SingleDeviceTsBlockReader — unsupported data type (3 sites, same key)
error.read.block_reader_unsupported_type = 不支持的数据类型: %1$s

# TableQueryExecutor — unsupported ordering
error.read.table_query_unsupported_ordering = 不支持的 ordering: %1$s

# TableQueryExecutor — no column exception
error.read.table_query_no_column = 没有 column: %1$s

# TsFileTreeReaderBuilder — file must be set
error.read.tree_reader_file_required = 在 build() 之前必须设置 file

# TsFileReaderBuilder — file must be non-null and non-directory
error.read.reader_builder_file_non_null = 文件必须是非空且非目录的 File。

# --- read LOG messages ---

# TsFileRestorableReader — file has no correct tail magic
log.read.file_repair = 文件 {} 的 tail magic 不正确，尝试修复...

# LocalTsFileInput — error getting file size
log.read.local_input_size_error = 获取 {} 大小时出错

# LocalTsFileInput — error getting current position
log.read.local_input_position_error = 获取 {} 当前位置时出错

# LocalTsFileInput — error changing position
log.read.local_input_position_change_error = 将 {} 位置改为 {} 时出错

# LocalTsFileInput — ClosedByInterruptException on read (2 sites, 1 key)
log.read.local_input_interrupted = 当前线程在 channel 上阻塞执行 I/O 操作时被其他线程中断。

# LocalTsFileInput — error reading from current position
log.read.local_input_read_current_error = 从当前位置读取 {} 时出错

# LocalTsFileInput — error reading from position
log.read.local_input_read_position_error = 从位置 {} 读取 {} 时出错

# LocalTsFileInput — error closing
log.read.local_input_close_error = 关闭 {} 时出错

# TsFileSequenceReader — reading file metadata error
log.read.sequence_reader_file_metadata_error = 读取文件 {} 的 metadata 时出错

# TsFileSequenceReader — deserializing TimeseriesMetadata error (multiple sites, same key)
log.read.sequence_reader_tsm_deserialize_error = 反序列化文件 {} 的 TimeseriesMetadata 时出错

# TsFileSequenceReader — deserializing MetadataIndexNode error (constant METADATA_INDEX_NODE_DESERIALIZE_ERROR, 8 sites)
log.read.sequence_reader_metadata_index_node_error = 反序列化文件 {} 的 MetadataIndexNode 时出错

# TsFileSequenceReader — reading chunk header error (2 sites, 1 key)
log.read.sequence_reader_chunk_header_error = 读取 {} 的 chunk header 时发生异常 {}

# TsFileSequenceReader — reading chunk error (3 sites, 1 key)
log.read.sequence_reader_chunk_error = 读取 {} 的 chunk 时发生异常 {}

# TsFileSequenceReader — reading page header error
log.read.sequence_reader_page_header_error = 读取 {} 的 page header 时发生异常 {}

# TsFileSequenceReader — reading data error
log.read.sequence_reader_data_error = 读取 {} 的 data 时发生异常 {}

# TsFileSequenceReader — getting all paths error
log.read.sequence_reader_paths_error = 获取文件 {} 的所有 paths 时出错

# TsFileSequenceReader — generating MetadataIndex error (2 sites, 1 key)
log.read.sequence_reader_metadata_index_error = 生成文件 {} 的 MetadataIndex 时出错

# TsFileSequenceReader — deserializing MetadataIndex error (2 sites, 1 key; different from MetadataIndexNode constant)
log.read.sequence_reader_deserialize_metadata_error = 反序列化文件 {} 的 MetadataIndex 时出错

# TsFileSequenceReader.selfCheck — cannot proceed warning
log.read.sequence_reader_self_check_warn = TsFile {} self-check 无法在位置 {} 继续，已恢复，原因: {}

# TsFileSequenceReader.selfCheckWithInfo — file length info
log.read.sequence_reader_file_length = 文件长度: {}

# TsFileSequenceReader.selfCheckWithInfo — fast check error
log.read.sequence_reader_fast_check_error = 快速校验 TsFile 时发生错误。

# TsFileSequenceReader.selfCheckWithInfo — statistics check error
log.read.sequence_reader_stats_check_error = 校验 chunk 及其 pages 的 statistics 时发生错误

# TsFileSequenceReader — collecting offset ranges error
log.read.sequence_reader_collect_offset_error = 收集文件 {} 的 measurement node offset 范围时发生错误

# TsFileSequenceReader.TimeseriesMetadataIterator — cannot read timeseries metadata
log.read.sequence_reader_tsm_warn = 无法从 {} 读取时间序列 metadata，

# TsFileLastReader — cannot read timeseries metadata from file (2 sites, 1 key)
log.read.last_reader_tsm_error = 无法从 {} 读取时间序列 metadata

# TsFileLastReader — error while reading timeseries metadata (async)
log.read.last_reader_tsm_meta_error = 读取时间序列 metadata 时出错

# DeviceOrderedTsBlockReader — failed to construct reader
log.read.block_reader_construct_error = 为 {} 构造 reader 失败

# SingleDeviceTsBlockReader — cannot fill measurements
log.read.block_reader_fill_measurements_error = 无法填充 measurements

# TableResultSet — failed to close tsBlockReader
log.read.table_result_set_close_error = 关闭 tsBlockReader 失败

# DeviceMetaIterator — failed to load device meta data
log.read.device_meta_iterator_error = 加载设备 meta data 失败

# DeviceTableModelReader — close file reader exception
log.read.v4_close_reader_error = 关闭文件 reader 时发生异常:

# === encoding ===

# --- encoder error messages ---

# Encoder — method not supported (8 sites, 1 key per type; parameterized on method name and class)
error.encoding.encoder_method_not_supported = Encoder 不支持 encode 方法 %1$s

# FloatEncoder / FloatDecoder — data type not supported (3+3 sites; same English text)
error.encoding.float_encoder_unsupported_type = FloatEncoder 不支持数据类型 %1$s

# FloatDecoder — encoding not supported
error.encoding.float_decoder_unsupported_encoding = FloatDecoder 不支持 %1$s encoding

# FloatEncoder — encoding not supported
error.encoding.float_encoder_unsupported_encoding = FloatEncoder 不支持 %1$s encoding

# PlainEncoder — BigDecimal not supported
error.encoding.plain_encoder_bigdecimal_unsupported = tsfile-encoding PlainEncoder: 当前版本不支持 BigDecimal 值的编码

# RleEncoder/RleDecoder — getClass().getName() sites (8 RleEncoder throws; skip — data-only)

# RleDecoder — method not supported (8 sites, 1 key; note typo "supproted" preserved for backward compat)
error.encoding.rle_decoder_method_not_supported = RleDecoder 不支持方法 %1$s

# RleDecoder — unknown encoding mode
error.encoding.rle_decoder_unknown_mode = tsfile-encoding IntRleDecoder: 未知的 encoding mode %1$s

# RleDecoder — bitPackedGroupCount < 1
error.encoding.rle_decoder_bit_packed_group_count = tsfile-encoding IntRleDecoder: bitPackedGroupCount %1$d 小于 1

# IntRleDecoder / LongRleDecoder — not a valid mode
error.encoding.rle_decoder_invalid_mode_int = tsfile-encoding IntRleDecoder: 不是有效的 mode %1$s
error.encoding.rle_decoder_invalid_mode_long = tsfile-encoding LongRleDecoder: 不是有效的 mode %1$s

# BitmapDecoder — method not supported (7 sites, 1 key)
error.encoding.bitmap_decoder_method_not_supported = BitmapDecoder 不支持方法 %1$s

# FloatDecoder — method not supported (5 sites, 1 key)
error.encoding.float_decoder_method_not_supported = FloatDecoder 不支持方法 %1$s

# PlainDecoder — BigDecimal not supported
error.encoding.plain_decoder_bigdecimal_unsupported = PlainDecoder 不支持 readBigDecimal 方法

# Decoder — method not supported (8 sites, 1 key)
error.encoding.decoder_method_not_supported = Decoder 不支持方法 %1$s

# Decoder.getDecoderByType — encoding+type combination not found (many sites, 1 key using ERROR_MSG)
error.encoding.decoder_not_found = 未找到 Decoder: %1$s，DataType: %2$s

# GorillaDecoderV1 — reading from empty buffer
error.encoding.gorilla_empty_buffer = 从空 buffer 读取

# CamelDecoder — no more data
error.encoding.camel_no_more_data = 没有更多数据可解码

# CamelDecoder — unexpected empty block
error.encoding.camel_unexpected_empty_block = 意外的空 block

# FloatSprintzDecoder / IntSprintzDecoder / DoubleSprintzDecoder / LongSprintzDecoder — unsupported predictive method (4 sites, 1 key)
error.encoding.sprintz_unsupported_predict_method = 不支持 Sprintz 预测方法 {}。

# FloatSprintzEncoder / IntSprintzEncoder / DoubleSprintzEncoder / LongSprintzEncoder — unsupported predictive method (4 sites, 1 key)
error.encoding.sprintz_encoder_unsupported_predict_method = Config: SprintzEncoder 不支持预测方法 {}。

# TSEncodingBuilder — unsupported encoding type
error.encoding.ts_encoding_builder_unsupported = 不支持的 encoding: %1$s

# TSEncodingBuilder — data type not supported (many sites using ERROR_MSG pattern, 1 key)
error.encoding.ts_encoding_builder_unsupported_type = %1$s 不支持数据类型: %2$s

# --- encoder LOG messages ---

# DeltaBinaryEncoder / RegularDataEncoder — flush data to stream failed (2 sites, 1 key)
log.encoding.flush_data_failed = 刷新数据到流失败！

# DoubleSprintzEncoder — encoding error
log.encoding.sprintz_double_encode_error = 使用 Sprintz 编码 INT32 类型值时发生错误

# FloatSprintzEncoder — encoding error
log.encoding.sprintz_float_encode_error = 使用 Sprintz 编码 Float 类型值时发生错误

# IntSprintzEncoder — encoding error
log.encoding.sprintz_int_encode_error = 使用 Sprintz 编码 INT32 类型值时发生错误

# LongSprintzEncoder — encoding error
log.encoding.sprintz_long_encode_error = 使用 Sprintz 编码 INT64 类型值时发生错误

# DictionaryEncoder — flush error
log.encoding.dictionary_encoder_flush_error = tsfile-encoding DictionaryEncoder: 刷新时发生错误

# PlainEncoder — encode Binary error
log.encoding.plain_encoder_binary_error = tsfile-encoding PlainEncoder: 编码 Binary 值 {} 时发生错误

# RleEncoder — flush rle run error (context-carrying message)
log.encoding.rle_flush_rle_run_error = tsfile-encoding RleEncoder: 刷新剩余 nums 时向 OutputStram 写入 nums 发生错误。numBufferedValues {}，repeatCount {}，bitPackedGroupCount {}，isBitPackRun {}，isBitWidthSaved {}

# RleEncoder — write full rle run debug
log.encoding.rle_write_full_rle_run = tsfile-encoding RleEncoder: 向流写入完整的 rle run

# RleEncoder — writing full rle run error
log.encoding.rle_full_rle_run_error =  当 repeatCount = {} 时，向 OutputStram 写入完整 rle run 发生错误。numBufferedValues {}，repeatCount {}，bitPackedGroupCount {}，isBitPackRun {}，isBitWidthSaved {}

# RleEncoder — writing num error when repeatCount > min
log.encoding.rle_write_num_error = tsfile-encoding RleEncoder: 当 repeatCount > {} 时，向 OutputStram 写入 num 发生错误。numBufferedValues {}，repeatCount {}，bitPackedGroupCount {}，isBitPackRun {}，isBitWidthSaved {}

# --- decoder LOG messages ---

# SinglePrecisionDecoderV1 — cannot read first float
log.encoding.single_precision_v1_first_float_error = SinglePrecisionDecoderV1 无法读取首个 float 数字

# SinglePrecisionDecoderV1 — cannot read following float
log.encoding.single_precision_v1_following_float_error = SinglePrecisionDecoderV1 无法读取后续 float 数字

# DoublePrecisionDecoderV1 — cannot read first double
log.encoding.double_precision_v1_first_double_error = DoublePrecisionDecoderV1 无法读取首个 double 数字

# DoublePrecisionDecoderV1 — cannot read following double
log.encoding.double_precision_v1_following_double_error = DoublePrecisionDecoderV1 无法读取后续 double 数字

# GorillaDecoderV1 — fill buffer failed
log.encoding.gorilla_fill_buffer_failed = 填充新 buffer 失败，因为没有可读的字节

# IntRleDecoder — reading error
log.encoding.int_rle_decoder_read_error = tsfile-encoding IntRleDecoder: 读取所有 encoding number 时发生错误，length {}，bit width {}

# LongRleDecoder — reading error (same text but different logger)
log.encoding.long_rle_decoder_read_error = tsfile-encoding IntRleDecoder: 读取所有 encoding number 时发生错误，length {}，bit width {}

# DictionaryDecoder — decoding error
log.encoding.dictionary_decoder_error = tsfile-decoding DictionaryDecoder: 解码时发生错误

# FloatSprintzDecoder / IntSprintzDecoder / DoubleSprintzDecoder / LongSprintzDecoder — readInt error (4 sites, 1 key)
log.encoding.sprintz_decoder_read_error = 使用 Sprintz Decoder 执行 readInt 时发生错误。

# TSEncodingBuilder — max string length negative value warning
log.encoding.ts_encoding_max_string_length_negative = max string length 不能设置为负值，已替换为默认值: {}

# TSEncodingBuilder — max point number bad format warning
log.encoding.ts_encoding_max_point_number_format = max point number {} 格式不正确。使用默认 float 精度。

# TSEncodingBuilder — max point number negative value warning
log.encoding.ts_encoding_max_point_number_negative = max point number 不能设置为负值，已替换为默认值: {}

# IntZigzagEncoder — constructor debug
log.encoding.int_zigzag_encoder_init = tsfile-encoding IntZigzagEncoder: int zigzag encoder

# LongZigzagEncoder — constructor debug
log.encoding.long_zigzag_encoder_init = tsfile-encoding LongZigzagEncoder: long zigzag encoder

# BitmapEncoder — constructor debug
log.encoding.bitmap_encoder_init = tsfile-encoding BitmapEncoder: 初始化 bitmap encoder

# IntZigzagDecoder — constructor debug
log.encoding.int_zigzag_decoder_init = tsfile-decoding IntZigzagDecoder: int zigzag decoder

# LongZigzagDecoder — constructor debug
log.encoding.long_zigzag_decoder_init = tsfile-encoding LongZigzagDecoder: long zigzag decoder

# BitmapDecoder — constructor debug
log.encoding.bitmap_decoder_init = tsfile-encoding BitmapDecoder: 初始化 bitmap decoder

# BitmapDecoder — page data debug (2 args: number, byteArrayLength)
log.encoding.bitmap_decoder_page_data = tsfile-encoding BitmapDecoder: 当前 page 中数量 {}，byte length {}

# FloatDecoder — init decoder debug (6 keys for 6 branches)
log.encoding.float_decoder_init_int_rle = tsfile-encoding FloatDecoder: 使用 int-rle 和 float 初始化 decoder
log.encoding.float_decoder_init_long_rle = tsfile-encoding FloatDecoder: 使用 long-rle 和 double 初始化 decoder
log.encoding.float_decoder_init_int_delta = tsfile-encoding FloatDecoder: 使用 int-delta 和 float 初始化 decoder
log.encoding.float_decoder_init_long_delta = tsfile-encoding FloatDecoder: 使用 long-delta 和 double 初始化 decoder
log.encoding.float_decoder_init_int_rlbe = tsfile-encoding FloatDecoder: 使用 int-rlbe 和 float 初始化 decoder
log.encoding.float_decoder_init_long_rlbe = tsfile-encoding FloatDecoder: 使用 long-rlbe 和 double 初始化 decoder

# === file ===

# MetaMarker — unexpected marker byte
error.file.unexpected_marker = 意外的 marker %1$s

# AbstractAlignedChunkMetadata — unsupported getNewType/setNewType (2 sites, 1 key)
error.file.aligned_chunk_metadata_new_type_unsupported = AlignedChunkMetadata 不支持 setNewType 方法

# AbstractAlignedChunkMetadata — serializeTo not supported
error.file.aligned_chunk_metadata_serialize_unsupported = VectorChunkMetadata 不支持 serial 方法

# MetadataIndexConstructor — utility class guard
error.file.utility_class = 工具类

# TsFileMetadata — encryptType missing for encryptLevel 1 or 2 (2 sites, 1 key with level arg)
error.file.tsfile_metadata_no_encrypt_type = encryptLevel 为 %1$s 时 TsfileMetadata 缺少 encryptType

# TsFileMetadata — encryptKey missing for encryptLevel 1 or 2 (2 sites, 1 key with level arg)
error.file.tsfile_metadata_no_encrypt_key = encryptLevel 为 %1$s 时 TsfileMetadata 缺少 encryptKey

# TsFileMetadata — encryptKey null/empty for encryptLevel 1 or 2 (2 sites, 1 key with level arg)
error.file.tsfile_metadata_null_encrypt_key = encryptLevel 为 %1$s 时 TsfileMetadata 的 encryptKey 为 null

# TsFileMetadata — unsupported encryptLevel
error.file.tsfile_metadata_unsupported_encrypt_level = 不支持的 encryptLevel: %1$s

# TableSchema — duplicate column name (4 sites, 1 key)
error.file.table_schema_duplicate_column = table 中每个 column name 必须唯一（不区分大小写）。

# ColumnSchemaBuilder — name must be non-empty
error.file.column_schema_builder_name_empty = Column name 必须是非空字符串

# ColumnSchemaBuilder — name must be set before building
error.file.column_schema_builder_name_not_set = 构建前必须先设置 column name

# ColumnSchemaBuilder — data type must be set before building
error.file.column_schema_builder_type_not_set = 构建前必须先设置 column 数据类型

# StringArrayDeviceID — all segments are null
error.file.device_id_all_segments_null = 所有 segments 均为 null

# Statistics — unsupported stat operation (many sites across subclasses; args: type name, op name)
error.file.stats_unsupported = %1$s statistics 不支持: %2$s

# --- file LOG messages ---

# IDeviceID — using default inefficient serialized size implementation
log.file.device_id_default_serialized_size = {} 正在使用默认的低效 serialized size 实现

# IDeviceID — failed to serialize device ID
log.file.device_id_serialize_failed = 序列化设备 ID 失败: {}

# Statistics — statistics classes mismatched, no merge
log.file.stats_classes_mismatched = Statistics 类不匹配，不合并: {} vs {}

# === external ===

# ArrayUtils.remove — index out of bounds
error.external.array_index_out_of_bounds = Index: %1$s，Length: %2$s

# ArrayUtils.addAll — incompatible array types
error.external.array_incompatible_types = 无法将 %1$s 存入 %2$s 类型的数组

# Validate.isTrue() — default false expression
error.external.validate_expression_false = 校验的表达式为 false

# Validate.isTrue(boolean, String, long) — formatted message with long value
# (caller passes String.format'd message; key used as wrapper for the pattern arg itself)
error.external.validate_size_too_large = 请求 %1$,d 超过最大值 %2$,d

# IOUtils.toByteArray — cannot read more than max bytes
error.external.io_cannot_read_max_bytes = 无法读取超过 %1$,d 字节到 byte 数组

# IOUtils.toByteArray — size must be non-negative
error.external.io_size_non_negative = 大小必须大于等于 0: %1$s

# IOUtils.toByteArray — unexpected read size
error.external.io_unexpected_read_size = 意外的读取大小，当前: %1$s，期望: %2$s

# IOUtils.toString — null input stream supplier
error.external.io_null_input = input

# FileUtils.requireDirectoryExists — not a directory
error.external.file_not_a_directory = 参数 '%1$s' 不是目录: '%2$s'

# FileUtils.requireDirectoryExists — directory does not exist
error.external.file_directory_not_exist = 目录 '%1$s' 不存在。

# FileUtils.listFiles — I/O error listing directory
error.external.file_list_io_error = 列出目录内容时发生未知 I/O 错误: %1$s

# FileUtils.forceDelete — cannot delete file
error.external.file_cannot_delete = 无法删除文件: %1$s

# FileUtils.forceDelete — file does not exist
error.external.file_not_exist = 文件不存在: %1$s

# FileUtils.moveFile — failed to delete original after copy
error.external.file_move_delete_original = 复制到 '%2$s' 后删除原文件 '%1$s' 失败

# FileUtils.checkFileExists — not a file
error.external.file_param_not_a_file = 参数 '%1$s' 不是文件: %2$s

# FileUtils.checkFileExists — source does not exist
error.external.file_source_not_exist = 源 '%1$s' 不存在

# FileUtils.requireAbsent — file already exists
error.external.file_already_exists = 参数 '%1$s' 中的文件元素已存在: '%2$s'

# FileUtils.copyFile — cannot set file time
error.external.file_cannot_set_time = 无法设置文件时间。

# FileUtils.requireCanonicalPathsNotEquals — canonical paths equal
error.external.file_canonical_paths_equal = 文件 canonical paths 相等: '%1$s'（file1='%2$s'，file2='%3$s'）

# FileUtils.mkdirs — cannot create directory
error.external.file_cannot_create_directory = 无法创建目录 '%1$s'。

# FileUtils.validateMoveParameters — source does not exist (same key as checkFileExists for source)
# (reuses error.external.file_source_not_exist)

# FileUtils.requireExistsChecked — file system element does not exist
error.external.file_element_not_exist = 参数 '%1$s' 的文件系统元素不存在: '%2$s'

# FileUtils.requireDirectory — not a directory (same pattern as requireDirectoryExists)
# (reuses error.external.file_not_a_directory)

# FileUtils.moveDirectory — cannot move to subdirectory of itself
error.external.file_move_to_subdirectory = 无法将目录 %1$s 移动到其自身的子目录: %2$s

# FileUtils.moveDirectory — failed to delete original directory after copy
error.external.file_move_delete_directory = 复制到 '%2$s' 后删除原目录 '%1$s' 失败

# FileUtils.requireCanWrite — file is not writable
error.external.file_not_writable = 文件参数 '%1$s 不可写: '%2$s'

# FilenameUtils.requireNonNullChars — null character in path
error.external.filename_null_char = 文件/路径名中包含 null 字符。此类数据没有已知的合法用例，但可能被多种注入攻击利用

# FilenameUtils.indexOfExtension — NTFS ADS separator in file name
error.external.filename_ntfs_ads_forbidden = 文件名中禁止使用 NTFS ADS 分隔符（':')。

# FilenameUtils.flipSeparator — invalid separator character
error.external.filename_invalid_separator = %1$s

# PathUtils.setReadOnly — DOS or POSIX not available
error.external.path_file_ops_not_available = '%1$s' 不支持 DOS 或 POSIX 文件操作，linkOptions %2$s

# PathUtils.deleteFile — is a directory, not a file
error.external.path_is_directory = %1$s

# PathUtils.deleteFile — I/O error
error.external.path_set_readonly_io_error = '%1$s' 不支持 DOS 或 POSIX 文件操作，linkOptions %2$s

# ReaderInputStream.checkMinBufferSize — buffer too small
error.external.reader_input_stream_buffer_too_small = Buffer size %1$,d 必须至少为 %2$s（CharsetEncoder %3$s）。

# ReaderInputStream.read — index out of bounds
error.external.reader_input_stream_index_out_of_bounds = Array size=%1$s，offset=%2$s，length=%3$s

# UnsynchronizedByteArrayInputStream — length cannot be negative
error.external.ubais_length_negative = length 不能为负

# UnsynchronizedByteArrayInputStream — offset cannot be negative
error.external.ubais_offset_negative = offset 不能为负

# UnsynchronizedByteArrayInputStream.skip — skipping backward not supported
error.external.ubais_skip_backward = 不支持向后 skip

# UnsynchronizedByteArrayOutputStream — negative initial size
error.external.ubaos_negative_initial_size = 初始大小为负: %1$s

# UnsynchronizedByteArrayOutputStream.write — offset/length out of bounds
error.external.ubaos_offset_length_out_of_bounds = offset=%1$,d，length=%2$,d

# ByteArrayOutputStream — negative initial size (same as UBAOS)
# (reuses error.external.ubaos_negative_initial_size)

# WriterOutputStream — UTF-16 IBM JDK broken support
error.external.writer_output_stream_utf16_ibm = 在 UTF-16 支持有问题的 IBM JDK 上请求 UTF-16。如需在 WriterOutputStream 中使用 UTF-16，请寻找支持 UTF-16 的 JDK

# WriterOutputStream.processInput — unexpected coder result
error.external.writer_output_stream_unexpected_coder = 意外的 coder 结果

# AbstractOrigin.getFile — not supported
error.external.abstract_origin_get_file = %1$s#getFile()，origin %2$s %3$s

# AbstractOrigin.getPath — not supported
error.external.abstract_origin_get_path = %1$s#getPath()，origin %2$s %3$s

# AbstractStreamBuilder.throwIae — request exceeds maximum
error.external.stream_builder_request_exceeds_max = 请求 %1$,d 超过最大值 %2$,d

# AbstractOriginSupplier.checkOrigin — origin is null
error.external.origin_null = origin == null

# AbstractEmptyMapIterator — iterator contains no elements (3 operations: setValue, getKey, getValue)
error.external.empty_map_iterator_no_elements = Iterator 不包含任何元素

# AbstractEmptyIterator — iterator contains no elements (3 operations: remove, next, previous)
error.external.empty_iterator_no_elements = Iterator 不包含任何元素

# AbstractLinkedMap — map is empty (first/last)
error.external.linked_map_empty = Map 为空

# AbstractLinkedMap — index less than zero
error.external.linked_map_index_negative = Index %1$s 小于 0

# AbstractLinkedMap — index invalid for size
error.external.linked_map_index_invalid = Index %1$s 对于 size %2$s 无效

# AbstractHashedMap — initial capacity negative
error.external.hashed_map_capacity_negative = 初始容量必须是非负数

# AbstractHashedMap — load factor not positive
error.external.hashed_map_load_factor_invalid = Load factor 必须大于 0

# AbstractHashedMap constants — iterator state errors (6 constants → 6 keys)
error.external.map_no_next_entry = 迭代中没有 next() entry
error.external.map_no_previous_entry = 迭代中没有 previous() entry
error.external.map_remove_invalid = next() 之后 remove() 只能调用一次
error.external.map_getkey_invalid = getKey() 只能在 next() 之后、remove() 之前调用
error.external.map_getvalue_invalid = getValue() 只能在 next() 之后、remove() 之前调用
error.external.map_setvalue_invalid = setValue() 只能在 next() 之后、remove() 之前调用

# LRUMap — max size constraint
error.external.lrumap_max_size_positive = LRUMap max size 必须大于 0

# LRUMap — initial size vs max size constraint (note: typo "greather" preserved for behaviour parity)
error.external.lrumap_initial_exceeds_max = LRUMap initial size 不能大于 max size

# LRUMap.moveToMRU — entry.before is null
error.external.lrumap_entry_before_null = Entry.before 为 null。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# LRUMap.moveToMRU — cannot move header to MRU
error.external.lrumap_cannot_move_header = 无法将 header 移至 MRU。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# LRUMap.addMapping — entry.after is null (scanUntilRemovable path)
error.external.lrumap_entry_after_null = Entry.after=null，header.after=%1$s header.before=%2$s key=%3$s value=%4$s size=%5$s maxSize=%6$s。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# LRUMap.addMapping — reuse is null
error.external.lrumap_reuse_null = reuse=null，header.after=%1$s header.before=%2$s key=%3$s value=%4$s size=%5$s maxSize=%6$s。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# LRUMap.reuseMapping — loop is null (entry not found)
error.external.lrumap_loop_null = Entry.next=null，data[removeIndex]=%1$s previous=%2$s key=%3$s value=%4$s size=%5$s maxSize=%6$s。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# LRUMap.reuseMapping — NullPointerException
error.external.lrumap_npe = NPE，entry=%1$s entryIsHeader=%2$s key=%3$s value=%4$s size=%5$s maxSize=%6$s。如果你的 keys 是不可变的且正确使用了同步，则不应发生这种情况。

# ComparatorChain.checkChainIntegrity — must contain at least one comparator
error.external.comparator_chain_empty = ComparatorChain 必须至少包含一个 Comparator

# === encrypt ===

# IEncryptor.getEncryptor — class not found (class name arg)
error.encrypt.encryptor_class_not_found = 获取 encryptor class 失败，class not found: %1$s

# IEncryptor.getEncryptor — no constructor (class name arg)
error.encrypt.encryptor_no_constructor = 获取 encryptor 构造函数失败: %1$s

# IEncryptor.getEncryptor — instantiation failed (class name arg)
error.encrypt.encryptor_instantiation_failed = 实例化 encryptor 失败: %1$s

# IDecryptor.getDecryptor — class not found (class name arg)
error.encrypt.decryptor_class_not_found = 获取 decryptor class 失败，class not found: %1$s

# IDecryptor.getDecryptor — no constructor (class name arg)
error.encrypt.decryptor_no_constructor = 获取 decryptor 构造函数失败: %1$s

# IDecryptor.getDecryptor — instantiation failed (class name arg)
error.encrypt.decryptor_instantiation_failed = 实例化 decryptor 失败: %1$s

# EncryptUtils.getEncryptKeyFromToken — key derivation failed
error.encrypt.key_derivation_failed = 从 token 派生 key 失败

# EncryptUtils.deriveKeyInternal — dkLen not positive (value arg)
error.encrypt.dklen_not_positive = main key 的 dkLen 必须为正整数: %1$s

# EncryptUtils.deriveKeyInternal — dkLen too long (value arg)
error.encrypt.dklen_too_long = main key 的 dkLen 过长: %1$s

# EncryptUtils.getNormalKeyStr / generateEncryptParameter — SHA-256 not found
error.encrypt.sha256_not_found = 使用 SHA-256 生成 data key 时找不到 SHA-256 算法

# EncryptUtils.getEncrypt — class not found (encryptType arg)
error.encrypt.encrypt_class_not_found = 获取 encryptor class 失败: %1$s

# EncryptUtils.getEncrypt — no constructor (encryptType arg)
error.encrypt.encrypt_no_constructor = 获取 encryptor 构造函数失败: %1$s

# EncryptUtils.getEncrypt — instantiation failed (encryptType arg)
error.encrypt.encrypt_instantiation_failed = 实例化 encryptor 失败: %1$s

# === compress ===

# ICompressor.getCompressor / IUnCompressor.getUnCompressor — null type
error.compress.type_not_supported_null = NULL

# ICompressor.getCompressor / IUnCompressor.getUnCompressor — unsupported type (name arg)
error.compress.type_not_supported = %1$s

# NoCompressor — compress not supported (3 method variants, 1 key)
error.compress.no_compressor_not_supported = NoCompressor 不支持压缩功能

# NoUnCompressor — uncompress ByteBuffer not supported
error.compress.no_uncompressor_not_supported = NoUnCompressor 不支持此方法。

# LZ4UnCompressor / GZIPUnCompressor / LZMA2UnCompressor — getUncompressedLength not supported (6 sites, 1 key)
error.compress.get_uncompress_length_unsupported = 不支持获取 uncompress length

# --- compress LOG messages ---

# SnappyUnCompressor — uncompress input byte error (2 sites, 1 key)
log.compress.snappy_uncompress_error = tsfile-compression SnappyUnCompressor: 解压输入字节时发生错误

# LZ4UnCompressor — uncompress input byte error (3 sites, 1 key)
log.compress.lz4_uncompress_error = tsfile-compression LZ4UnCompressor: 解压输入字节时发生错误

# === fileSystem ===

# HDFSOutputFactory / OSFileOutputFactory — init error: get input class
log.fs.hdfs_output_factory_init_error = 在 Hadoop file system 中获取 HDFSInput 失败。请检查 Hadoop 模块的依赖。
log.fs.os_output_factory_init_error = 在 object storage 中获取 OSInput 失败。请检查 object storage 模块的依赖。

# HDFSOutputFactory / OSFileOutputFactory — getTsFileOutput error (path arg)
log.fs.hdfs_output_factory_get_error = 获取文件 {} 的 TsFile output 失败。请检查 Hadoop 模块的依赖。
log.fs.os_output_factory_get_error = 获取文件 {} 的 TsFile output 失败。请检查 object storage 模块的依赖。

# LocalFSOutputFactory — getTsFileOutput error (path arg)
log.fs.local_output_factory_get_error = 获取文件 {} 的 TsFile output 失败，

# HDFSFactory — init error
log.fs.hdfs_factory_init_error = 获取 Hadoop file system 失败。请检查 Hadoop 模块的依赖。

# OSFSFactory — init error
log.fs.os_factory_init_error = 获取 object storage 失败。请检查 object storage 模块的依赖。

# HDFSFactory.getFileWithParent — get file error (path arg)
log.fs.hdfs_factory_get_file_with_parent_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getFile(String) — get file error (path arg)
log.fs.hdfs_factory_get_file_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getFile(String, String) — get file error (path arg)
log.fs.hdfs_factory_get_file2_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getFile(File, String) — get file error (path arg)
log.fs.hdfs_factory_get_file3_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getFile(URI) — get file error (uri arg)
log.fs.hdfs_factory_get_file_uri_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getBufferedReader — error (path arg)
log.fs.hdfs_factory_get_reader_error = 获取 {} 的 buffered reader 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getBufferedWriter — error (path arg)
log.fs.hdfs_factory_get_writer_error = 获取 {} 的 buffered writer 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getBufferedInputStream — error (path arg)
log.fs.hdfs_factory_get_input_stream_error = 获取 {} 的 buffered input stream 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.getBufferedOutputStream — error (path arg)
log.fs.hdfs_factory_get_output_stream_error = 获取 {} 的 buffered output stream 失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.listFilesBySuffix — error (folder, suffix args)
log.fs.hdfs_factory_list_suffix_error = 列出 {} 中后缀为 {} 的文件失败。请检查 Hadoop 模块的依赖。

# HDFSFactory.listFilesByPrefix — error (folder, prefix args)
log.fs.hdfs_factory_list_prefix_error = 列出 {} 中前缀为 {} 的文件失败。请检查 Hadoop 模块的依赖。

# OSFSFactory.getFileWithParent — error (path arg)
log.fs.os_factory_get_file_with_parent_error = 获取文件 {} 失败。请检查 object storage 模块的依赖。

# OSFSFactory.getFile(String) — error (path arg)  [note: message says Hadoop module — matching original]
log.fs.os_factory_get_file_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# OSFSFactory.getFile(String, String) — error (path arg) [matches original]
log.fs.os_factory_get_file2_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# OSFSFactory.getFile(File, String) — error (path arg) [matches original]
log.fs.os_factory_get_file3_error = 获取文件 {} 失败。请检查 Hadoop 模块的依赖。

# OSFSFactory.getFile(URI) — error (uri arg)
log.fs.os_factory_get_file_uri_error = 获取文件 {} 失败。请检查 object storage 模块的依赖。

# OSFSFactory.getBufferedReader — error (path arg)
log.fs.os_factory_get_reader_error = 获取 {} 的 buffered reader 失败。请检查 object storage 模块的依赖。

# OSFSFactory.getBufferedWriter — error (path arg)
log.fs.os_factory_get_writer_error = 获取 {} 的 buffered writer 失败。请检查 object storage 模块的依赖。

# OSFSFactory.getBufferedInputStream — error (path arg)
log.fs.os_factory_get_input_stream_error = 获取 {} 的 buffered input stream 失败。请检查 object storage 模块的依赖。

# OSFSFactory.getBufferedOutputStream — error (path arg)
log.fs.os_factory_get_output_stream_error = 获取 {} 的 buffered output stream 失败。请检查 object storage 模块的依赖。

# OSFSFactory.listFilesBySuffix — error (folder, suffix args)
log.fs.os_factory_list_suffix_error = 列出 {} 中后缀为 {} 的文件失败。请检查 object storage 模块的依赖。

# OSFSFactory.listFilesByPrefix — error (folder, prefix args)
log.fs.os_factory_list_prefix_error = 列出 {} 中前缀为 {} 的文件失败。请检查 object storage 模块的依赖。

# OSFSFactory.copyFile — unsupported copy direction (srcType, destType args)
error.fs.os_factory_copy_unsupported = 不支持从 %1$s 复制文件到 %2$s。

# LocalFSFactory — buffered reader/writer/stream errors (4 sites, 4 keys)
log.fs.local_factory_get_reader_error = 获取 {} 的 buffered reader 失败。
log.fs.local_factory_get_writer_error = 获取 {} 的 buffered writer 失败。
log.fs.local_factory_get_input_stream_error = 获取 {} 的 buffered input stream 失败。
log.fs.local_factory_get_output_stream_error = 获取 {} 的 buffered output stream 失败。

# HybridFSFactory.moveFile — unsupported cross-type move (srcType, destType args)
error.fs.hybrid_factory_move_unsupported = 不支持从 %1$s 移动文件到 %2$s。

# HybridFSFactory.copyFile — unsupported cross-type copy (srcType, destType args)
error.fs.hybrid_factory_copy_unsupported = 不支持从 %1$s 移动文件到 %2$s。

# OSFileInputFactory / HDFSInputFactory — init error
log.fs.os_input_factory_init_error = 在 object storage 中获取 OSInput 失败。请检查 object storage 模块的依赖。
log.fs.hdfs_input_factory_init_error = 在 Hadoop file system 中获取 HDFSInput 失败。请检查 Hadoop 模块的依赖。

# OSFileInputFactory.getTsFileInput — error (path arg)
error.fs.os_input_factory_get_error = 获取文件 %1$s 的 TsFile input 失败。请检查 object storage 模块的依赖。

# HDFSInputFactory.getTsFileInput — error (path arg)
error.fs.hdfs_input_factory_get_error = 获取文件 %1$s 的 TsFile input 失败。请检查 Hadoop 模块的依赖。

# FSUtils — load file system class error (fsType name arg)
log.fs.fsutils_load_class_error = 获取 {} file system 失败。请检查 {} 模块的依赖。

# === utils ===

# NoSyncBufferedOutputStream — buffer size <= 0
error.utils.buffer_size_not_positive = Buffer size <= 0

# NoSyncBufferedInputStream — stream closed (2 sites, 1 key)
error.utils.stream_closed = 流已关闭

# NoSyncBufferedInputStream — buffer size <= 0
error.utils.buffer_size_not_positive_input = Buffer size <= 0

# NoSyncBufferedInputStream — index out of bounds
error.utils.index_out_of_bounds_read = 索引越界

# NoSyncBufferedInputStream — resetting to invalid mark
error.utils.reset_invalid_mark = 重置到无效的 mark

# PublicBAOS — index out of bounds
error.utils.public_baos_index_out_of_bounds = 索引越界

# Loader — null input object
error.utils.loader_null_input = 输入对象不能为 null

# FilterDeserialize — unsupported operator type (type arg)
error.utils.filter_unsupported_operator_type = 不支持的 operator 类型: %1$s

# FilterDeserialize — unsupported class serialize id (used for 15 methods via constant; id arg)
error.utils.filter_unsupported_class_id = 不支持的 class serialize id: %1$s

# ReadWriteForEncodingUtils — too many bytes for bit width (paddedByteNum arg; 4 sites, 1 key)
error.utils.too_long_byte_format = 字节数过长 %1$s

# BytesUtils — invalid input: desc.length - offset < 4 (intToBytes float variant)
error.utils.bytes_desc_offset_too_short = 无效输入: desc.length - offset < 4

# BytesUtils — invalid input: i > 0xFFFF
error.utils.bytes_int_too_large = 无效输入: %1$s > 0xFFFF

# BytesUtils — invalid input: ret.length != 2
error.utils.bytes_ret_length_not_two = 无效输入: ret.length != 2

# BytesUtils — row count too large
error.utils.bytes_row_count_too_large = 行数大于 Integer.MAX_VALUE

# BytesUtils — invalid input: bytes.length - offset < 4
error.utils.bytes_offset_too_short_4 = 无效输入: bytes.length - offset < 4

# BytesUtils — invalid input: b.length != 4
error.utils.bytes_b_length_not_four = 无效输入: b.length != 4

# BytesUtils — invalid input: b.length - offset < 4
error.utils.bytes_b_offset_too_short_4 = 无效输入: b.length - offset < 4

# BytesUtils — invalid input: bytes.length - offset < 8
error.utils.bytes_offset_too_short_8 = 无效输入: bytes.length - offset < 8

# BytesUtils — invalid input: b.length != 1
error.utils.bytes_b_length_not_one = 无效输入: b.length != 1

# BytesUtils — invalid input: b.length - offset < 1
error.utils.bytes_b_offset_too_short_1 = 无效输入: b.length - offset < 1

# BytesUtils — invalid input: byteNum.length - offset < len
error.utils.bytes_bytenum_offset_too_short = 无效输入: byteNum.length - offset < len

# BytesUtils.intToBytes — cannot convert int to byte array (3 args: srcNum, pos, width)
log.utils.bytes_int_to_bytes_error = tsfile-common BytesUtils: 无法将 integer {} 转换为 byte 数组，pos {}，width {}

# BytesUtils.longToBytes — cannot convert long to byte array (3 args: srcNum, pos, width)
log.utils.bytes_long_to_bytes_error = tsfile-common BytesUtils: 无法将 long {} 转换为 byte 数组，pos {}，width {}

# TsFileSketchTool — cannot load file (filename arg)
error.utils.sketch_tool_cannot_load = 无法加载文件 %1$s，因为文件已损坏。

# ReadWriteIOUtils — short read (expectedLen, readLen args; 7 sites use String.format directly)
error.utils.rwio_short_read = 期望读取 %1$d 字节，但实际返回 %2$d 字节

# ReadWriteIOUtils — string list must not be null (2 sites, 1 key)
error.utils.rwio_stringlist_null = stringList 不能为 null！

# ReadWriteIOUtils — set must not be null (2 sites via SET_NOT_NULL_MSG constant)
error.utils.rwio_set_null = set 不能为 null！

# StringContainer — index out of bounds (getSubString; 1 site)
error.utils.string_container_index_out_of_bounds = Index: %1$d，Real Index: %2$d，Size: %3$d

# StringContainer — start index out of bounds (getSubStringContainer)
error.utils.string_container_start_index_out_of_bounds = start Index: %1$d，Real start Index: %2$d，Size: %3$d

# StringContainer — end index out of bounds (getSubStringContainer)
error.utils.string_container_end_index_out_of_bounds = end Index: %1$d，Real end Index: %2$d，Size: %3$d

# TimeDuration — unsupported operation
error.utils.time_duration_unsupported = 不支持的操作

# DateUtils — date expression null or empty (2 sites, 1 key)
error.utils.date_expression_null_or_empty = 日期表达式为 null 或为空。

# DateUtils — invalid date format (parse exception)
error.utils.date_invalid_format = 无效的日期格式。请使用 YYYY-MM-DD 格式。

# DateUtils — year out of range (dateExpression arg)
error.utils.date_year_out_of_range = 年份必须在 1000 到 9999 之间。

# DateUtils — invalid date format (parseIntToLocalDate)
error.utils.date_invalid_format_local = 无效的日期格式。

# TsFileGeneratorUtils — invalid input (value arg)
error.utils.generator_invalid_input = 无效输入: %1$s

# FSUtils — failed to get file system (fsType name arg — used with string concat in original)
log.fs.fsutils_class_not_found = 获取 {} file system 失败。请检查 {} 模块的依赖。

# === tools ===

# ArrowSourceReader / ParquetSourceReader / CsvSourceReader — inferSchema called in schema mode
error.tools.infer_schema_not_in_auto_mode = inferSchema() 仅在 auto 模式下可用

# CsvSourceReader.inferSchema — inferSchema called in schema mode (more descriptive variant)
error.tools.infer_schema_not_in_auto_mode_csv = inferSchema() 仅在 auto 模式下可用（未提供 schema）

# ArrowSourceReader / ParquetSourceReader / CsvSourceReader — failed to infer schema
error.tools.infer_schema_failed = 推断 schema 失败: %1$s

# CsvSourceReader.inferSchema — CSV file is empty
error.tools.csv_file_empty = CSV 文件为空: %1$s

# CsvSourceReader.validateColumnCount — column count mismatch
error.tools.csv_column_count_mismatch = 列数不匹配: schema 定义了 %1$s 列，但 CSV header 有 %2$s 列，文件 %3$s

# TimeConverter — time value cannot be null (2 sites, 1 key)
error.tools.time_value_null = 时间值不能为 null

# TimeConverter.toNanos / fromNanos — unknown precision (2 sites, 1 key)
error.tools.unknown_precision = 未知精度: %1$s

# TsFileTool.parseBlockSize — unsupported block_size unit
error.tools.block_size_unsupported_unit = block_size 仅支持 K、M、G 单位或数字

# SchemaParser.parseIdColumns — invalid id_columns format
error.tools.schema_id_columns_invalid = id_columns 的数据格式不正确

# SchemaParser.parseCsvColumns — invalid csv_columns format
error.tools.schema_csv_columns_invalid = csv_columns 的数据格式不正确

# SchemaParser — has_header not true/false
error.tools.schema_has_header_invalid = has_header 的数据格式不正确

# SchemaParser.validateParams — time_precision not supported
error.tools.schema_time_precision_unsupported = time_precision 参数仅支持 ms、us、ns

# SchemaParser.validateParams — separator invalid
error.tools.schema_separator_invalid = separator 必须为 ","、tab 或 ";"

# SchemaParser.validateParams — table_name required
error.tools.schema_table_name_required = table_name 是必需的

# SchemaParser.validateParams — id_columns required
error.tools.schema_id_columns_required = id_columns 是必需的

# SchemaParser.validateParams — csv_columns required
error.tools.schema_csv_columns_required = csv_columns 是必需的

# SchemaParser.validateParams — time_column required
error.tools.schema_time_column_required = time_column 是必需的

# SchemaParser.validateParams — time_column value not in csv_columns
error.tools.schema_time_column_not_in_csv = time_column 的值 %1$s 不在 csv_columns 中

# SchemaParser.validateParams — id_columns value not in csv_columns
error.tools.schema_id_column_not_in_csv = id_columns 的值 %1$s 不在 csv_columns 中

# ImportSchemaParser — has_header not true/false
error.tools.import_has_header_invalid = has_header 必须为 true 或 false

# ImportSchemaParser.parseTagColumn — invalid tag_columns format
error.tools.import_tag_columns_invalid = 无效的 tag_columns 格式: %1$s

# ImportSchemaParser.parseSourceColumn — invalid source_columns format
error.tools.import_source_columns_invalid = 无效的 source_columns 格式: %1$s

# ImportSchemaParser.resolveDataType — unknown data type
error.tools.import_unknown_data_type = 未知数据类型: %1$s

# ImportSchemaParser.validate — time_precision not supported
error.tools.import_time_precision_unsupported = time_precision 必须为 ms、us、ns 或 s

# ImportSchemaParser.validate — separator invalid
error.tools.import_separator_invalid = separator 必须为 ","、tab 或 ";"

# ImportSchemaParser.validate — table_name required
error.tools.import_table_name_required = table_name 是必需的

# ImportSchemaParser.validate — time_column required
error.tools.import_time_column_required = time_column 是必需的

# ImportSchemaParser.validate — source_columns required
error.tools.import_source_columns_required = source_columns 是必需的

# ImportSchemaParser.validate — time_column not found in source_columns
error.tools.import_time_column_not_found = source_columns 中找不到 time_column '%1$s'

# ImportSchemaParser.validate — tag_columns entry not found in source_columns
error.tools.import_tag_column_not_found = source_columns 中找不到 tag_columns '%1$s'

# AutoSchemaInferer.detectTimeColumn — no time column found
error.tools.auto_no_time_column = 找不到时间列。auto 模式要求恰好有一个名为 'time' 或 'TIME' 的列。

# AutoSchemaInferer.detectTimeColumn — ambiguous time column
error.tools.auto_ambiguous_time_column = 时间列不明确: 找到多个匹配 'time'/'TIME' 的列: %1$s

# TabletBuilder.resolveTimeColumnIndex — time column not found in source columns
error.tools.tablet_time_column_not_found = 源列中找不到 time column '%1$s'

# DateTimeUtils.convertDatetimeStrToLong — failed to convert timestamp (depth >= 2)
error.tools.datetime_convert_failed = 将 %1$s 转换为毫秒失败，zone offset 为 %2$s，请输入类似 2011-12-03T10:15:30 或 2011-12-03T10:15:30+01:00 的格式

# DateTimeUtils.convertDatetimeStrToLong — time-region not supported
error.tools.datetime_time_region_unsupported = 暂不支持末尾带 [time-region] 的 %1$s，请输入类似 2011-12-03T10:15:30 或 2011-12-03T10:15:30+01:00 的格式

# --- tools LOG messages ---

# ImportExecutor — failed to create output directory
log.tools.executor_create_dir_failed = 创建输出目录失败: %1$s

# ImportExecutor — failed to write chunk
log.tools.executor_write_chunk_failed = 写入 chunk %1$s 到 %2$s 失败

# ImportExecutor — no data read from source
log.tools.executor_no_data = 从源 %1$s 未读取到数据

# ImportExecutor — failed to rename indexed file to single name
log.tools.executor_rename_failed = 将 %1$s 重命名为 %2$s 失败

# ImportExecutor.writeTsFile — failed to write file
log.tools.executor_write_file_failed = 写入文件失败: %1$s

# ImportExecutor.writeTsFile — failed to close file
log.tools.executor_close_file_failed = 关闭文件失败: %1$s

# ImportExecutor.deleteFile — failed to delete file
log.tools.executor_delete_failed = 删除失败: %1$s

# TsFileTool — failed to parse schema file
log.tools.tool_parse_schema_failed = 解析 schema 文件失败: %1$s

# TsFileTool — failed to await termination
log.tools.tool_await_termination_failed = 等待终止失败

# TsFileTool — directory or file has completed execution
log.tools.tool_execution_completed = %1$s 目录或文件已完成执行

# TsFileTool — failed to process file
log.tools.tool_process_file_failed = 处理文件失败: %1$s

# TsFileTool — file successfully generated
log.tools.tool_file_generated = %1$s.tsfile 生成成功

# TsFileTool — failed to copy file
log.tools.tool_copy_file_failed = 复制文件失败: %1$s

# TsFileTool — error parsing command line options
log.tools.tool_parse_cli_error = 解析命令行选项时出错

# TsFileTool.validateParams — source is required
log.tools.tool_source_required = 缺少必需参数。--source/-s 是必需的

# TsFileTool.validateParams — target is required
log.tools.tool_target_required = 缺少必需参数。--target/-t 是必需的

# TsFileTool.validateParams — source does not exist
log.tools.tool_source_not_exist = %1$s 目录或文件不存在。

# TsFileTool.validateParams — schema file does not exist
log.tools.tool_schema_not_exist = %1$s schema 文件不存在。

# TsFileTool.validateParams — invalid thread number
log.tools.tool_invalid_thread_num = 无效的线程数。线程数必须大于 0。

# ArrowSourceReader — error reading Arrow file
log.tools.arrow_read_error = 读取 Arrow 文件出错: %1$s

# ArrowSourceReader — error closing Arrow reader
log.tools.arrow_close_reader_error = 关闭 Arrow reader 出错

# ArrowSourceReader — error closing FileInputStream
log.tools.arrow_close_stream_error = 关闭 FileInputStream 出错

# ParquetSourceReader — error reading Parquet file
log.tools.parquet_read_error = 读取 Parquet 文件出错: %1$s

# ParquetSourceReader — error closing Parquet reader
log.tools.parquet_close_reader_error = 关闭 Parquet reader 出错

# CsvSourceReader — error reading CSV file
log.tools.csv_read_error = 读取 CSV 文件出错: %1$s

# CsvSourceReader — error closing CSV reader
log.tools.csv_close_reader_error = 关闭 CSV reader 出错
