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


## CatalogEntryBeanInfo.java
PROP_public_id=Public ID
PROP_public_id_desc=Public ID identifying resource in catalog.
PROP_system_id_desc=System ID identifying resource in catalog.
PROP_system_id=System ID

## CatalogEntryNode.java
# {0} contains entity public ID
MSG_ENTITY_SAVE=Saving {0}.
# {0} contains URI (i.e. entity system ID)
MSG_ENTITY_TOOLTIP={0}
# {0} contains entity public ID
MSG_ENTITY_OPENING=Opening {0}.
# {0} contains entity public ID
MSG_ENTITY_OPENED={0} opened.
# {0} contains entity public ID
MSG_opened_entity={0}

## CatalogMounterPanel.java
CatalogMounterPanel.catalogLabel.mne=T
CatalogMounterPanel.catalogLabel.text=Catalog Type:
ACSD_catalogComboBox=n/a
ACSD_CatalogMounterPanel=Panel for selecting catalog providers showing customizer for selected one.
ACSN_CatalogMounterPanel=Entity catalog mounter

## CatalogRootNode.java
TEXT_catalog_root=DTD and XML Schema Catalogs
#it is HTML tooltip
PROP_catalog_root_desc=Lets you add XML entity catalogs and browse their contents.
PROP_Mount_Catalog=Add Catalog
LBL_mount=Add Catalog...

## RefreshAction.java
LBL_Action=Refresh
MSG_refreshed=Catalog refreshed!
# {0} stays for catalog name
MSG_refreshing=Refreshing {0}...

## Catalog Node
LBL_unmount=Remove



TXT_AddCatalogEntry=Add Local DTD or XML Schema...

RADIO_publicId=Public ID\:

RADIO_systemId=System ID\:

LBL_uri=URI\:

HINT_publicId=<html>Example\: <b>-//mycomp.org/Entity ID//EN</b></html>

HINT_systemId=<html>Example\: <b>http\://www.mycomp.org/schemas/AddressBook.xsd</b></html>

LBL_browse=Browse...

HINT_panel=Map PUBLIC ID or SYSTEM ID to your local DTD or XML Schema file\:

TITLE_addCatalogEntry=Register DTD or XML Schema resource

TITLE_SelectDTDorSchema=Select DTD or XML Schema File

TXT_DTDorSchema=DTD or XML Schema files

LBL_catalogReadOnly={0} [read-only]

LBL_catalogReadWrite={0} [read-write]

LBL_browse_mnem=B

RADIO_publicId_mnem=P

RADIO_systemId_mnem=S

LBL_uri_mnem=U

MSG_CannotOpenURI=Can not be open the file\: {0}.

LBL_catalogEntryDesc=<html>Recommendation\:<br>The common solution for <b>XML documents specified by DTD</b> is using the <b>Public ID -> URI</b> mapping.<br>System ID -> URI mapping can also be used to redirect the DTD location specified by SYSTEM ID.<br><b>For XML documents specified by XML schema</b> use the <b>System ID -> URI</b> mapping\: map the second value (usually URL)<br>from the <b>schemaLocation</b> attribute to a local XML schema resource.</html>

PROP_uri=URI

PROP_uri_desc=Absolute location of catalog file.

TXT_systemEntry={0} [System ID]

TXT_publicEntry={0} [Public ID]

# CatalogAction
BTN_CatalogPanel_CloseButton=&Close
BTN_CatalogPanel_OpenInEditorButton=&Open in Editor
LBL_CatalogAction_Name=&DTDs and XML Schemas
LBL_CatalogPanel_Title=DTDs and XML Schemas
BTN_CatalogPanel_Delete=&Delete
LBL_CatalogPanel_CatalogLabel=&DTDs and XML Schemas\:
BTN_CatalogPanel_Add=&Add Catalog...

TT_CatalogPanel_Add=Add Catalog
BTN_CatalogPanel_AddLocal=Add &Local DTD or Schema...
ACD_CatalogPanel_AddLocal=Add Local DTD or Schema
BTN_CatalogPanel_RemoveButton=&Remove

ACD_CatalogPanel_Add=Add Catalog

ACD_CatalogPanel_Remove=Remove selected DTD or schema
