# Explorer messages.properties
#
#/*******************************************************************************
# * Copyright (c) 2008 IBM Corporation and others.
# * All rights reserved. This program and the accompanying materials
# * are made available under the terms of the Eclipse Public License v1.0
# * which accompanies this distribution, and is available at
# * http://www.eclipse.org/legal/epl-v10.html
# *
# * Contributors:
# *     IBM Corporation - initial API and implementation
# *******************************************************************************/

# Explorer
EXPLORER.DECORATOR_FOLDER=Dekorierer
EXPLORER.EXPERIMENT_FOLDER=Experimente
EXPLORER.GRAPH_FOLDER=Graphen
EXPLORER.MODEL_FOLDER=Modelle
EXPLORER.MODIFIER_FOLDER=Modifikatoren
EXPLORER.PREDICATE_FOLDER=Eigenschaft
EXPLORER.SCENARIO_FOLDER=Szenarien
EXPLORER.SEQUENCER_FOLDER=Sequenzer
EXPLORER.TRIGGER_FOLDER=Ausl\u00f6ser
EXPLORER.RECORDED_SIMULATIONS_FOLDER=Aufgenommen Simulationen
EXPLORER.LOGGER_FOLDER=Loggers
