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

#
# Web Console strings for reference all strings here are commented.
# This file may be used to produce a translation of the strings
#
# Note that properties files are ISO-8859-1 encoded. To provide translations
# for languages requiring different character encodings, you may use the
# native2ascii Maven Plugin from http://mojo.codehaus.org/native2ascii-maven-plugin/
# to translate the natively encoded files to ISO-8859-1 during bundle build
#
# Translations requiring non-ISO-8859-1 encoding are placed in the
# src/main/native2ascii/OSGI-INF/l10n folder and are converted using said
# plugin while building the bundle
#


# Memory Usage Plugin
dump.title = Memory Usage
dump.dump = Dump Heap
dump.gc = Run Garbage Collector

dump.overview = Memory Usage Overview
dump.threshold = Automatic Heap Dump Threshold (%)
dump.threshold.set = Set Threshold
dump.interval = Automatic Heap Dump Interval (s)
dump.interval.set = Set Interval

dump.pools.name = Name
dump.pools.score = Usage Score
dump.pools.used = Used
dump.pools.committed = Committed
dump.pools.max = Maximum
dump.pools.init = Initial
dump.pools.type = Type

dump.statline = Dump Files: {0} file(s), {1} bytes
dump.name = File Name
dump.date = Creation Date
dump.size = File Size
dump.action = Action
dump.remove = Remove Heap Dump
