#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
#
role.pluginTitle=Потребители
role.tree.root=Групи и потребители
role.new=Нова роля
role.key=Ключ
role.value=Стойност
role.properties=Атрибути
role.credentials=Акредитиви
role.new.title=Създаване на нова роля
role.name=Име
role.type.1=Потребител
role.type.2=Група
type.string=Низ
type.bytes=Данни
type.password=Парола
role.statline=Има {1} потребител(я) и {2} роли организирани в {0} групи.
role.help.initial=\
- Изберете роля от ляво, за да я отворите и промените нейните атрибути<br/>\
- Можете да завлачвате с мишката ролите за да ги аранжирате. По този начин декларирате тяхното членство в определена група<br/>\
- Ако при завлачването натиснете клавиша Ctrl, ще копирате избраната роля, вместо да я преместите<br/>\
- За да премахнете роля от група - завлачете я в основата на дървото<br/>\
- Ролите, които са в <i>курсив</i> са задължителни членове на групата<br/>\
- За да направите роля задължителна (или обикновена) за групата, изберете ролята и използвайте бутона за промяна на членство.
toggleRequired=Задължителен/Обикновен член

