# ***************************************************************
#  * 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.
# ***************************************************************

MemberFilterActionGroup_hide_variables_label=Hide &Variables
MemberFilterActionGroup_hide_variables_tooltip=Hide Variables
MemberFilterActionGroup_hide_variables_description=Toggles the visibility of variables
MemberFilterActionGroup_hide_functions_label=Hide &Functions
MemberFilterActionGroup_hide_functions_tooltip=Hide Functions
MemberFilterActionGroup_hide_functions_description=Toggles the visibility of functions
MemberFilterActionGroup_hide_classes_label=Hide &Classes
MemberFilterActionGroup_hide_classes_tooltip=Hide Classes
MemberFilterActionGroup_hide_classes_description=Toggles the visibility of classes
