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

# Components plugin
components.pluginTitle=Компоненты
scr.status.no_service=Сервис Declarative Service не найден!
scr.status.no_components=Нет установленных компонентов!
scr.status.ok=Количество установленных компонентов: {0}
scr.action.enable=Включить
scr.action.disable=Выключить
scr.action.configure=Конфигурировать
scr.prop.bundle=Модуль
scr.prop.defstate=Состояние по умолчанию
scr.prop.activation=Активация
scr.prop.properties=Конфигурации
scr.prop.class=Класс реализации
scr.prop.componentfactory=Имя фабрики компонентов
scr.prop.configurationpolicy=Политика конфигурирования
scr.serv.type=Тип сервиса
scr.serv=Сервисы
scr.title.actions=Действия
scr.title.status=Состояние
scr.title.name=Имя
