Loading label bundle from XML file for translating the names of ContentTypes.
git-svn-id: https://svn.libreccm.org/ccm/trunk@2764 8810af33-2d31-482b-a856-94f89814c4dfmaster
parent
bca01fc9ee
commit
738ce745d9
|
|
@ -32,6 +32,9 @@ import com.arsdigita.persistence.OID;
|
|||
import com.arsdigita.persistence.SessionManager;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
import com.arsdigita.web.Web;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
|
|
@ -42,15 +45,22 @@ import java.util.ArrayList;
|
|||
import java.net.URL;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.StringTokenizer;
|
||||
import javax.xml.parsers.ParserConfigurationException;
|
||||
import javax.xml.parsers.SAXParser;
|
||||
import javax.xml.parsers.SAXParserFactory;
|
||||
import org.apache.log4j.Logger;
|
||||
import org.xml.sax.Attributes;
|
||||
import org.xml.sax.SAXException;
|
||||
import org.xml.sax.helpers.DefaultHandler;
|
||||
|
||||
/**
|
||||
* <p>A Content Type defines the characteristics of a content item. Content
|
||||
* management resources are registered to a content type, including
|
||||
* the {@link com.arsdigita.cms.AuthoringKit Authoring Kit}, and
|
||||
* {@link com.arsdigita.cms.Template templates}.</p>
|
||||
* <p>
|
||||
* A Content Type defines the characteristics of a content item. Content management resources are
|
||||
* registered to a content type, including the {@link com.arsdigita.cms.AuthoringKit Authoring Kit},
|
||||
* and {@link com.arsdigita.cms.Template templates}.</p>
|
||||
*
|
||||
* <p>Each content type is associated with a {@link
|
||||
* <p>
|
||||
* Each content type is associated with a {@link
|
||||
* com.arsdigita.domain.DomainObject domain object} and a {@link
|
||||
* com.arsdigita.persistence.DataObject data object} type.</p>
|
||||
*
|
||||
|
|
@ -60,26 +70,32 @@ import org.apache.log4j.Logger;
|
|||
*/
|
||||
public class ContentType extends ACSObject {
|
||||
|
||||
/** Internal logger instance to faciliate debugging. Enable logging output
|
||||
* by editing /WEB-INF/conf/log4j.properties int hte runtime environment
|
||||
* and set com.arsdigita.cms.ui.authoring.NewItemForm=DEBUG by uncommenting
|
||||
* or adding the line. */
|
||||
/**
|
||||
* Internal logger instance to faciliate debugging. Enable logging output by editing
|
||||
* /WEB-INF/conf/log4j.properties int hte runtime environment and set
|
||||
* com.arsdigita.cms.ui.authoring.NewItemForm=DEBUG by uncommenting or adding the line.
|
||||
*/
|
||||
private static final Logger s_log = Logger.getLogger(ContentType.class);
|
||||
|
||||
public static final String BASE_DATA_OBJECT_TYPE =
|
||||
"com.arsdigita.cms.ContentType";
|
||||
/** The path content types are expected to store their type definition
|
||||
* file (usually [domainObjectBaseName].xml by convention). Any content
|
||||
* item should use this location unless there are good reasons for a
|
||||
* different location. */
|
||||
public static final String CONTENTTYPE_DEFINITIONFILE_PATH =
|
||||
"/WEB-INF/content-types/";
|
||||
public static final String BASE_DATA_OBJECT_TYPE = "com.arsdigita.cms.ContentType";
|
||||
/**
|
||||
* The path content types are expected to store their type definition file (usually
|
||||
* [domainObjectBaseName].xml by convention). Any content item should use this location unless
|
||||
* there are good reasons for a different location.
|
||||
*/
|
||||
public static final String CONTENTTYPE_DEFINITIONFILE_PATH = "/WEB-INF/content-types/";
|
||||
public static final String OBJECT_TYPE = "associatedObjectType";
|
||||
/** The name or title of the content type, e.g. "File Storage Item" */
|
||||
/**
|
||||
* The name or title of the content type, e.g. "File Storage Item"
|
||||
*/
|
||||
public static final String LABEL = "label";
|
||||
/** A short description of the type, what is is meant to do / to use for. */
|
||||
/**
|
||||
* A short description of the type, what is is meant to do / to use for.
|
||||
*/
|
||||
public static final String DESCRIPTION = "description";
|
||||
/** Fully qualified name of the (main) domain class (and main entry point)*/
|
||||
/**
|
||||
* Fully qualified name of the (main) domain class (and main entry point)
|
||||
*/
|
||||
public static final String CLASSNAME = "className";
|
||||
public static final String MODE = "mode";
|
||||
public static final String AUTHORING_KIT = "authoringKit";
|
||||
|
|
@ -90,32 +106,31 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Default constructor. This creates a new folder.
|
||||
**/
|
||||
*
|
||||
*/
|
||||
public ContentType() {
|
||||
super(BASE_DATA_OBJECT_TYPE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor. The contained <code>DataObject</code> is retrieved
|
||||
* from the persistent storage mechanism with an <code>OID</code>
|
||||
* specified by <i>oid</i>.
|
||||
* Constructor. The contained <code>DataObject</code> is retrieved from the persistent storage
|
||||
* mechanism with an <code>OID</code> specified by <i>oid</i>.
|
||||
*
|
||||
* @param oid The <code>OID</code> for the retrieved
|
||||
* <code>DataObject</code>.
|
||||
**/
|
||||
* @param oid The <code>OID</code> for the retrieved <code>DataObject</code>.
|
||||
*
|
||||
*/
|
||||
public ContentType(OID oid) throws DataObjectNotFoundException {
|
||||
super(oid);
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor. The contained <code>DataObject</code> is retrieved
|
||||
* from the persistent storage mechanism with an <code>OID</code>
|
||||
* specified by <i>id</i> and
|
||||
* Constructor. The contained <code>DataObject</code> is retrieved from the persistent storage
|
||||
* mechanism with an <code>OID</code> specified by <i>id</i> and
|
||||
* <code>ContentType.BASE_DATA_OBJECT_TYPE</code>.
|
||||
*
|
||||
* @param id The <code>id</code> for the retrieved
|
||||
* <code>DataObject</code>.
|
||||
**/
|
||||
* @param id The <code>id</code> for the retrieved <code>DataObject</code>.
|
||||
*
|
||||
*/
|
||||
public ContentType(BigDecimal id) throws DataObjectNotFoundException {
|
||||
this(new OID(BASE_DATA_OBJECT_TYPE, id));
|
||||
}
|
||||
|
|
@ -129,8 +144,8 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return the base PDL object type for this item. Child classes should
|
||||
* override this method to return the correct value
|
||||
* @return the base PDL object type for this item. Child classes should override this method to
|
||||
* return the correct value
|
||||
*/
|
||||
@Override
|
||||
public String getBaseDataObjectType() {
|
||||
|
|
@ -146,10 +161,9 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* Returns the object type of the items of this content type. (For example:
|
||||
* If I create a ContentType "foo". Then a I create an item "bar"
|
||||
* of type foo. This associated object type is the same as
|
||||
* bar.getObjectType())
|
||||
* Returns the object type of the items of this content type. (For example: If I create a
|
||||
* ContentType "foo". Then a I create an item "bar" of type foo. This associated object type is
|
||||
* the same as bar.getObjectType())
|
||||
*
|
||||
* @return The data object type representation of this content type
|
||||
*/
|
||||
|
|
@ -165,96 +179,135 @@ public class ContentType extends ACSObject {
|
|||
public void setAssociatedObjectType(String objType) {
|
||||
set(OBJECT_TYPE, objType);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Fetches the label for the content type. The label is a globalized
|
||||
* notation displayed to the user to identify the content type. As an
|
||||
* example a content type named "Article" (as in getName()) will be
|
||||
* displayed in an english environment as the label "Article", in
|
||||
* German as "Artikel", etc.
|
||||
*
|
||||
* The label is retrieved from content type's resources. The message uses
|
||||
* some convention to retrieve the message key and resource bundle.
|
||||
*
|
||||
* Client classes may overwrite the method to provide a label from a
|
||||
* diffrent source.
|
||||
*
|
||||
* Fetches the label for the content type. The label is a globalized notation displayed to the
|
||||
* user to identify the content type. As an example a content type named "Article" (as in
|
||||
* getName()) will be displayed in an english environment as the label "Article", in German as
|
||||
* "Artikel", etc.
|
||||
*
|
||||
* The label is retrieved from content type's resources. The message uses some convention to
|
||||
* retrieve the message key and resource bundle.
|
||||
*
|
||||
* Client classes may overwrite the method to provide a label from a different source.
|
||||
*
|
||||
* @return The (globalized) label.
|
||||
*/
|
||||
public GlobalizedMessage getLabel() {
|
||||
|
||||
|
||||
GlobalizedMessage label; // the the type's label to return
|
||||
|
||||
// We assume the name of the ObjectType is the base for various
|
||||
// resources we need so we determine it first.
|
||||
String objectTypeName = getAssociatedObjectType();
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.debug(
|
||||
"Object Type is " + objectTypeName );
|
||||
}
|
||||
String objectTypeName = getAssociatedObjectType();
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.debug(
|
||||
"Object Type is " + objectTypeName);
|
||||
}
|
||||
// First we'll try to locate the resource file assuming it is named
|
||||
// as the object type with resources.properties appended.
|
||||
String bundleResourcePath = "/".concat(objectTypeName.replace(".","/"))
|
||||
.concat("Resources.properties");
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.debug("resource path is " + bundleResourcePath );
|
||||
}
|
||||
String bundleResourcePath = "/".concat(objectTypeName.replace(".", "/"))
|
||||
.concat("Resources.properties");
|
||||
if (s_log.isDebugEnabled()) {
|
||||
s_log.debug("resource path is " + bundleResourcePath);
|
||||
}
|
||||
// Alternatively we may try the content item's definition file. Just
|
||||
// guessing its name here.
|
||||
String typeResourcePath = CONTENTTYPE_DEFINITIONFILE_PATH
|
||||
.concat(objectTypeName.replace(".","/"))
|
||||
.concat(".xml");
|
||||
String typeResourcePath = CONTENTTYPE_DEFINITIONFILE_PATH
|
||||
.concat(objectTypeName.replace(".", "/"))
|
||||
.concat(".xml");
|
||||
|
||||
// We assume the name of the key in resource bundle is the same as
|
||||
// the ObjectType minus the domain part ("com.arsdigita.")
|
||||
// and starting with "cms" and suffix ".type_label" appended
|
||||
String labelKey = objectTypeName.substring(objectTypeName.indexOf("cms"))
|
||||
.concat(".type_label")
|
||||
.toLowerCase();
|
||||
.concat(".type_label")
|
||||
.toLowerCase();
|
||||
|
||||
// First try: check, if the resource file really exists, and if it does,
|
||||
// use it.
|
||||
if (this.getClass().getClassLoader().getResource(bundleResourcePath)!=null) {
|
||||
if (this.getClass().getClassLoader().getResource(bundleResourcePath) != null) {
|
||||
// Property file exists, use it!
|
||||
String bundleName = objectTypeName.concat("Resources");
|
||||
final String bundleName = objectTypeName.concat("Resources");
|
||||
// Create the globalized label
|
||||
label = new GlobalizedMessage(labelKey, bundleName);
|
||||
} else {
|
||||
// No property file found, try to use the item's definition file
|
||||
if (this.getClass().getClassLoader()
|
||||
.getResource(typeResourcePath)!=null) {
|
||||
// item definition file found. use it's
|
||||
// determine the bundle from attribute "descriptionBundle"
|
||||
// which should provide an item specific description (but
|
||||
// unfortunately due to lazy programmers not always does).
|
||||
// As a proper example:
|
||||
// /WEB-INF/content-types/com.arsditita.cms.contenttypes.Event.xml
|
||||
String bundleName = "REPLACE ME"; // REPLACE ME!
|
||||
final InputStream defFile = Thread.currentThread().getContextClassLoader()
|
||||
.getResourceAsStream(typeResourcePath);
|
||||
|
||||
label = new GlobalizedMessage(labelKey, bundleName);
|
||||
|
||||
} else {
|
||||
// No property file found, try to use the item's definition file
|
||||
if (defFile == null) {
|
||||
// Giving up!
|
||||
|
||||
|
||||
// As a fall back use the (not globalized) "name" of the type as
|
||||
// stored in the database to display the type to the user. Is is
|
||||
// used as the "key" in a GloablizedMessage, which it is definitely
|
||||
// not. But GlobalizedMessage displays the key if it could not be
|
||||
// found in a resource file.
|
||||
label = new GlobalizedMessage(getName());
|
||||
} else {
|
||||
// item definition file found. use it's
|
||||
// determine the bundle from attribute "descriptionBundle"
|
||||
// which should provide an item specific description (but
|
||||
// unfortunately due to lazy programmers not always does).
|
||||
// As a proper example:
|
||||
// /WEB-INF/content-types/com.arsditita.cms.contenttypes.Event.xml
|
||||
|
||||
try {
|
||||
final SAXParserFactory parserFactory = SAXParserFactory.newInstance();
|
||||
final SAXParser parser = parserFactory.newSAXParser();
|
||||
final BundleName bundleName = new BundleName();
|
||||
parser.parse(defFile, bundleName);
|
||||
|
||||
//String bundleName = "REPLACE ME"; // REPLACE ME!
|
||||
if (bundleName.getName() == null) {
|
||||
return new GlobalizedMessage(getName());
|
||||
} else {
|
||||
label = new GlobalizedMessage(labelKey, bundleName.getName());
|
||||
}
|
||||
} catch (ParserConfigurationException ex) {
|
||||
label = new GlobalizedMessage(getName());
|
||||
} catch (SAXException ex) {
|
||||
label = new GlobalizedMessage(getName());
|
||||
} catch (IOException ex) {
|
||||
label = new GlobalizedMessage(getName());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return label;
|
||||
}
|
||||
|
||||
private class BundleName extends DefaultHandler {
|
||||
|
||||
private String name;
|
||||
|
||||
public BundleName() {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void startElement(final String namespaceURI,
|
||||
final String localName,
|
||||
final String qName,
|
||||
final Attributes attributes) {
|
||||
if ("ctd:authoring-step".equals(qName)) {
|
||||
name = attributes.getValue("labelBundle");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches the name for the content type. The name is a fixed String, which
|
||||
* 'names' a content type and is not localizible. It is stored in the
|
||||
* database and a symbolic name for the formal ID. It may contain any
|
||||
* characters but is preferable an english term. Examples are "FAQ item" or
|
||||
* "Article" or "Multipart Article". It has to be unique system-wide.
|
||||
* Fetches the name for the content type. The name is a fixed String, which 'names' a content
|
||||
* type and is not localizible. It is stored in the database and a symbolic name for the formal
|
||||
* ID. It may contain any characters but is preferable an english term. Examples are "FAQ item"
|
||||
* or "Article" or "Multipart Article". It has to be unique system-wide.
|
||||
*
|
||||
* @return The name (ie. may be used as a non-localized label)
|
||||
*/
|
||||
|
|
@ -264,11 +317,11 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Sets the name for this content type. The name is a fixed String.
|
||||
*
|
||||
* @see getName() for additional details.
|
||||
*
|
||||
* The name is stored in the database. In the database this property is
|
||||
* stored under 'label', when globliation was not an issue.
|
||||
* The Method is primarly used in the initial loading step.
|
||||
*
|
||||
* The name is stored in the database. In the database this property is stored under 'label',
|
||||
* when globliation was not an issue. The Method is primarly used in the initial loading step.
|
||||
*
|
||||
* @param name The name
|
||||
*/
|
||||
|
|
@ -313,36 +366,32 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* <p>An internal content type is one that is not user-defined and maintained
|
||||
* internally. A content type should be made internal under the following
|
||||
* two conditions:</p>
|
||||
* <p>
|
||||
* An internal content type is one that is not user-defined and maintained internally. A content
|
||||
* type should be made internal under the following two conditions:</p>
|
||||
*
|
||||
* <ol>
|
||||
* <li>The object type needs to take advantage of content type services
|
||||
* (i.e., versioning, categorization, lifecycle, workflow) that are
|
||||
* already implemented in CMS.</li>
|
||||
* <li>The content type cannot be explicitly registered to a content
|
||||
* section.</li>
|
||||
* <li>The object type needs to take advantage of content type services (i.e., versioning,
|
||||
* categorization, lifecycle, workflow) that are already implemented in CMS.</li>
|
||||
* <li>The content type cannot be explicitly registered to a content section.</li>
|
||||
* </ol>
|
||||
*
|
||||
* <p>The {@link com.arsdigita.cms.Template} content type is one such
|
||||
* internal content type.</p>
|
||||
* <p>
|
||||
* The {@link com.arsdigita.cms.Template} content type is one such internal content type.</p>
|
||||
*
|
||||
* @return Boolean.TRUE if this content type is internal, Boolean.FALSE
|
||||
* otherwise.
|
||||
* @return Boolean.TRUE if this content type is internal, Boolean.FALSE otherwise.
|
||||
*/
|
||||
public Boolean isInternal() {
|
||||
return "I".equalsIgnoreCase((String) get(MODE));
|
||||
}
|
||||
|
||||
/**
|
||||
* <p>A hidden content type is one that is not user-defined but not meant
|
||||
* to be used directly (p. ex. GenericArticle). in contrast they provide
|
||||
* some basic features for different kind of content type to be extended
|
||||
* from. Also, they are legit perents for UDCTs.
|
||||
* <p>
|
||||
* A hidden content type is one that is not user-defined but not meant to be used directly (p.
|
||||
* ex. GenericArticle). in contrast they provide some basic features for different kind of
|
||||
* content type to be extended from. Also, they are legit perents for UDCTs.
|
||||
*
|
||||
* @return Boolean.TRUE if this content type is internal, Boolean.FALSE
|
||||
* otherwise.
|
||||
* @return Boolean.TRUE if this content type is internal, Boolean.FALSE otherwise.
|
||||
*/
|
||||
public Boolean isHidden() {
|
||||
return "H".equalsIgnoreCase((String) get(MODE));
|
||||
|
|
@ -380,21 +429,18 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* Create an authoring kit to this content type. To save this authoring
|
||||
* kit, you need to call <code>save()</code> method on the
|
||||
* returned AuthoringKit.
|
||||
* Create an authoring kit to this content type. To save this authoring kit, you need to call
|
||||
* <code>save()</code> method on the returned AuthoringKit.
|
||||
*/
|
||||
public AuthoringKit createAuthoringKit() {
|
||||
return createAuthoringKit(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create an authoring kit to this content type. To save this authoring
|
||||
* kit, you need to call <code>save()</code> method on the
|
||||
* returned AuthoringKit.
|
||||
* Create an authoring kit to this content type. To save this authoring kit, you need to call
|
||||
* <code>save()</code> method on the returned AuthoringKit.
|
||||
*
|
||||
* @param createComponent the create component class associated with
|
||||
* the authoring kit
|
||||
* @param createComponent the create component class associated with the authoring kit
|
||||
*/
|
||||
public AuthoringKit createAuthoringKit(String createComponent) {
|
||||
|
||||
|
|
@ -407,27 +453,25 @@ public class ContentType extends ACSObject {
|
|||
return kit;
|
||||
} else {
|
||||
throw new RuntimeException(
|
||||
"An AuthorigKit exists for this ContentType.");
|
||||
"An AuthorigKit exists for this ContentType.");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetch the item creation form id of the Java domain object implementation.
|
||||
* applies to user-defined types
|
||||
* Fetch the item creation form id of the Java domain object implementation. applies to
|
||||
* user-defined types
|
||||
*
|
||||
* @return The id of the persistent form used to create an item
|
||||
* of this content type
|
||||
* @return The id of the persistent form used to create an item of this content type
|
||||
*/
|
||||
public BigDecimal getItemFormID() {
|
||||
return (BigDecimal) get(ITEM_FORM_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the item creation form id of the Java domain object implementation.
|
||||
* applies to user-defined types
|
||||
* Sets the item creation form id of the Java domain object implementation. applies to
|
||||
* user-defined types
|
||||
*
|
||||
* @param itemFormID The id of the persistent form used to create an item
|
||||
* of this content type
|
||||
* @param itemFormID The id of the persistent form used to create an item of this content type
|
||||
*/
|
||||
public void setItemFormID(BigDecimal itemFormID) {
|
||||
set(ITEM_FORM_ID, itemFormID);
|
||||
|
|
@ -436,8 +480,8 @@ public class ContentType extends ACSObject {
|
|||
/**
|
||||
* Retrieve the persistent form of this content type
|
||||
*
|
||||
* @return the persistent form used to create or edit content items
|
||||
* of this type (only applies to user-defined types)
|
||||
* @return the persistent form used to create or edit content items of this type (only applies
|
||||
* to user-defined types)
|
||||
*/
|
||||
public PersistentForm getItemForm() throws DataObjectNotFoundException {
|
||||
|
||||
|
|
@ -452,7 +496,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Add an ancestor to the list of descendants, if not already in the list.
|
||||
*
|
||||
*
|
||||
* @param newAncestor ID of the ancestor to add
|
||||
*/
|
||||
public void addAncestor(BigDecimal newAncestor) {
|
||||
|
|
@ -478,7 +522,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Remove an ancestor id from the list of descendants.
|
||||
*
|
||||
*
|
||||
* @param ancestor ID to be removed
|
||||
*/
|
||||
public void delAncestor(BigDecimal ancestor) {
|
||||
|
|
@ -506,7 +550,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Get the list of ancestors.
|
||||
*
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getAncestors() {
|
||||
|
|
@ -515,7 +559,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Add a descendant to the list of descendants, if not already in list.
|
||||
*
|
||||
*
|
||||
* @param newDescendant ID of the descendant to add
|
||||
*/
|
||||
public void addDescendants(BigDecimal newDescendant) {
|
||||
|
|
@ -523,7 +567,7 @@ public class ContentType extends ACSObject {
|
|||
if (getID().equals(newDescendant)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
// Get the list of descendants from db
|
||||
String descendants = (String) get(DESCENDANTS);
|
||||
|
||||
|
|
@ -547,6 +591,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Get the list of descendants
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public String getDescendants() {
|
||||
|
|
@ -555,6 +600,7 @@ public class ContentType extends ACSObject {
|
|||
|
||||
/**
|
||||
* Remove a descendant from the list of descendants
|
||||
*
|
||||
* @param descendant ID to be removed
|
||||
*/
|
||||
public void delDescendants(BigDecimal descendant) {
|
||||
|
|
@ -585,36 +631,35 @@ public class ContentType extends ACSObject {
|
|||
// Fetching/Finding content types.
|
||||
//
|
||||
//////////////////////////////////////
|
||||
|
||||
/**
|
||||
* Find the content type with the associated with the object type.
|
||||
*
|
||||
* @param objType The fully-qualified name of the data object type
|
||||
*
|
||||
* @return The content type associated with the object type
|
||||
*/
|
||||
public static ContentType findByAssociatedObjectType(String objType)
|
||||
throws DataObjectNotFoundException {
|
||||
|
||||
throws DataObjectNotFoundException {
|
||||
|
||||
ContentTypeCollection types = getAllContentTypes();
|
||||
types.addFilter("associatedObjectType = :type").set("type", objType);
|
||||
|
||||
if (types.next()) {
|
||||
ContentType type = types.getContentType();
|
||||
types.close();
|
||||
|
||||
|
||||
return type;
|
||||
|
||||
} else {
|
||||
// no match
|
||||
types.close();
|
||||
throw new DataObjectNotFoundException(
|
||||
"No matching content type for object type " + objType);
|
||||
"No matching content type for object type " + objType);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Fetches a collection of all content types, including internal content
|
||||
* types.
|
||||
* Fetches a collection of all content types, including internal content types.
|
||||
*
|
||||
* @return A collection of all content types
|
||||
*/
|
||||
|
|
@ -623,11 +668,10 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* Fetches a collection of all content types, including internal content
|
||||
* types.
|
||||
* Fetches a collection of all content types, including internal content types.
|
||||
*
|
||||
* @param hidden If false, fetch all content types, ecluding hidden content types
|
||||
*
|
||||
* @param hidden If false, fetch all content types, ecluding hidden
|
||||
* content types
|
||||
* @return A collection of all content types
|
||||
*/
|
||||
public static ContentTypeCollection getAllContentTypes(boolean hidden) {
|
||||
|
|
@ -644,10 +688,8 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param internal If false, fetch all content types, excluding internal
|
||||
* content types.
|
||||
* @param hidden If false, fetch all content types, excluding hidden
|
||||
* content types.
|
||||
* @param internal If false, fetch all content types, excluding internal content types.
|
||||
* @param hidden If false, fetch all content types, excluding hidden content types.
|
||||
*/
|
||||
private static ContentTypeCollection getAllContentTypes(boolean internal, boolean hidden) {
|
||||
DataCollection da = SessionManager.getSession().retrieve(BASE_DATA_OBJECT_TYPE);
|
||||
|
|
@ -664,8 +706,8 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* Fetches a collection of content types that have been registered
|
||||
* to at least one content section, excluding internal content types.
|
||||
* Fetches a collection of content types that have been registered to at least one content
|
||||
* section, excluding internal content types.
|
||||
*
|
||||
* @return A collection of registered content types
|
||||
*/
|
||||
|
|
@ -677,9 +719,10 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
* @param ct
|
||||
* @return
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static ContentTypeCollection getDescendantsOf(ContentType ct) {
|
||||
ContentTypeCollection ctc = ContentType.getRegisteredContentTypes();
|
||||
|
|
@ -706,13 +749,12 @@ public class ContentType extends ACSObject {
|
|||
ctc.addFilter(or);
|
||||
return ctc;
|
||||
}
|
||||
|
||||
|
||||
private static List s_xsl = new ArrayList();
|
||||
|
||||
/**
|
||||
* Registers an XSL file against a content type.
|
||||
* NB this interface is liable to change.
|
||||
*
|
||||
* Registers an XSL file against a content type. NB this interface is liable to change.
|
||||
*
|
||||
* @param type the content type
|
||||
* @param path the path relative to the server root
|
||||
*/
|
||||
|
|
@ -721,29 +763,27 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
|
||||
/**
|
||||
* Unregisters an XSL file against a content type.
|
||||
* NB this interface is liable to change.
|
||||
*
|
||||
* Unregisters an XSL file against a content type. NB this interface is liable to change.
|
||||
*
|
||||
* @param type the content type
|
||||
* @param path the path relative to the server root
|
||||
*/
|
||||
public static void unregisterXSLFile(ContentType type,
|
||||
String path) {
|
||||
String path) {
|
||||
s_xsl.remove(new XSLEntry(type, path));
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an iterator of java.net.URL objects for
|
||||
* all registered XSL files.
|
||||
*
|
||||
* @return
|
||||
* Gets an iterator of java.net.URL objects for all registered XSL files.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
public static Iterator getXSLFileURLs() {
|
||||
return new EntryIterator(s_xsl.iterator());
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
private static class EntryIterator implements Iterator {
|
||||
|
||||
|
|
@ -765,9 +805,9 @@ public class ContentType extends ACSObject {
|
|||
|
||||
try {
|
||||
return new URL(Web.getConfig().getDefaultScheme(),
|
||||
Web.getConfig().getHost().getName(),
|
||||
Web.getConfig().getHost().getPort(),
|
||||
path);
|
||||
Web.getConfig().getHost().getName(),
|
||||
Web.getConfig().getHost().getPort(),
|
||||
path);
|
||||
} catch (MalformedURLException ex) {
|
||||
throw new UncheckedWrapperException("path malformed" + path, ex);
|
||||
}
|
||||
|
|
@ -777,10 +817,11 @@ public class ContentType extends ACSObject {
|
|||
public void remove() {
|
||||
m_inner.remove();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*
|
||||
*/
|
||||
private static class XSLEntry {
|
||||
|
||||
|
|
@ -788,7 +829,7 @@ public class ContentType extends ACSObject {
|
|||
private final String m_path;
|
||||
|
||||
public XSLEntry(ContentType type,
|
||||
String path) {
|
||||
String path) {
|
||||
m_type = type;
|
||||
m_path = path;
|
||||
}
|
||||
|
|
@ -808,12 +849,14 @@ public class ContentType extends ACSObject {
|
|||
}
|
||||
XSLEntry e = (XSLEntry) o;
|
||||
return m_path.equals(e.m_path)
|
||||
&& m_type.equals(e.m_type);
|
||||
&& m_type.equals(e.m_type);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return m_path.hashCode() + m_type.hashCode();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,27 +4,27 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type
|
||||
label="SciPublications/ArticleInCollectedVolume"
|
||||
description="Base type for articleInCollectedVolumes"
|
||||
objectType="com.arsdigita.cms.contenttypes.ArticleInCollectedVolume"
|
||||
classname="com.arsdigita.cms.contenttypes.ArticleInCollectedVolume">
|
||||
<ctd:content-type
|
||||
label="SciPublications/ArticleInCollectedVolume"
|
||||
description="Base type for articleInCollectedVolumes"
|
||||
objectType="com.arsdigita.cms.contenttypes.ArticleInCollectedVolume"
|
||||
classname="com.arsdigita.cms.contenttypes.ArticleInCollectedVolume">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.ArticleInCollectedVolumeCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.ArticleInCollectedVolumeCreate">
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.articleInCollectedVolume_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.Publication.Resources"
|
||||
descriptionKey="publications.ui.articleInCollectedVolume.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.ArticleInCollectedVolumePropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.articleInCollectedVolume_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.articleInCollectedVolume.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.ArticleInCollectedVolumePropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -4,27 +4,27 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type
|
||||
label="SciPublications/ArticleInJournal"
|
||||
description="Base type for articleInJournals"
|
||||
objectType="com.arsdigita.cms.contenttypes.ArticleInJournal"
|
||||
classname="com.arsdigita.cms.contenttypes.ArticleInJournal">
|
||||
<ctd:content-type
|
||||
label="SciPublications/ArticleInJournal"
|
||||
description="Base type for articleInJournals"
|
||||
objectType="com.arsdigita.cms.contenttypes.ArticleInJournal"
|
||||
classname="com.arsdigita.cms.contenttypes.ArticleInJournal">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.ArticleInJournalCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.ArticleInJournalCreate">
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.articleInJournal_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.articleInJournal.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.ArticleInJournalPropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.articleInJournal_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.articleInJournal.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.ArticleInJournalPropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.journal_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationResources"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.journal.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.JournalPropertiesStep"
|
||||
|
|
|
|||
|
|
@ -3,32 +3,32 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type label="SciPublications/Author"
|
||||
description="Author of a publication"
|
||||
objectType="com.arsdigita.cms.contenttypes.SciAuthor"
|
||||
classname="com.arsdigita.cms.contenttypes.SciAuthor">
|
||||
<ctd:content-type label="SciPublications/Author"
|
||||
description="Author of a publication"
|
||||
objectType="com.arsdigita.cms.contenttypes.SciAuthor"
|
||||
classname="com.arsdigita.cms.contenttypes.SciAuthor">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.GenericPersonCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.GenericPersonCreate">
|
||||
|
||||
<ctd:authoring-step labelKey="cms.contenttypes.shared.basic_properties.title"
|
||||
labelBundle="com.arsdigita.cms.CMSResources"
|
||||
descriptionKey="cms.contenttypes.shared.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.CMSResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.SciAuthorPropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step labelKey="cms.contenttypes.shared.basic_properties.title"
|
||||
labelBundle="com.arsdigita.cms.CMSResources"
|
||||
descriptionKey="cms.contenttypes.shared.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.CMSResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.SciAuthorPropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="person.authoring.contact_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.ContenttypesResources"
|
||||
descriptionKey="person.authoring.contact_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.ContenttypesResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.GenericPersonContactPropertiesStep"
|
||||
ordering="2"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="person.authoring.contact_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.ContenttypesResources"
|
||||
descriptionKey="person.authoring.contact_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.ContenttypesResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.GenericPersonContactPropertiesStep"
|
||||
ordering="2"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -4,27 +4,27 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type
|
||||
label="SciPublications/Series"
|
||||
description="Base type for seriess"
|
||||
objectType="com.arsdigita.cms.contenttypes.Series"
|
||||
classname="com.arsdigita.cms.contenttypes.Series">
|
||||
<ctd:content-type
|
||||
label="SciPublications/Series"
|
||||
description="Base type for seriess"
|
||||
objectType="com.arsdigita.cms.contenttypes.Series"
|
||||
classname="com.arsdigita.cms.contenttypes.Series">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.SeriesCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.SeriesCreate">
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.series_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.series.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.SeriesPropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.series_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.series.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.SeriesPropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -4,28 +4,28 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type
|
||||
label="SciPublications/UnPublished"
|
||||
description="Base type for unPublisheds"
|
||||
objectType="com.arsdigita.cms.contenttypes.UnPublished"
|
||||
classname="com.arsdigita.cms.contenttypes.UnPublished"
|
||||
mode="hidden">
|
||||
<ctd:content-type
|
||||
label="SciPublications/UnPublished"
|
||||
description="Base type for unPublisheds"
|
||||
objectType="com.arsdigita.cms.contenttypes.UnPublished"
|
||||
classname="com.arsdigita.cms.contenttypes.UnPublished"
|
||||
mode="hidden">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.UnPublishedCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.UnPublishedCreate">
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.unPublished_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.unPublished.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.UnPublishedPropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.unPublished_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.unPublished.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.UnPublishedPropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -4,27 +4,27 @@
|
|||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://xmlns.redhat.com/cms/content-types content-types.xsd">
|
||||
|
||||
<ctd:content-type
|
||||
label="SciPublications/WorkingPaper"
|
||||
description="Base type for workingPapers"
|
||||
objectType="com.arsdigita.cms.contenttypes.WorkingPaper"
|
||||
classname="com.arsdigita.cms.contenttypes.WorkingPaper">
|
||||
<ctd:content-type
|
||||
label="SciPublications/WorkingPaper"
|
||||
description="Base type for workingPapers"
|
||||
objectType="com.arsdigita.cms.contenttypes.WorkingPaper"
|
||||
classname="com.arsdigita.cms.contenttypes.WorkingPaper">
|
||||
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.UnPublishedCreate">
|
||||
<ctd:authoring-kit createComponent="com.arsdigita.cms.contenttypes.ui.UnPublishedCreate">
|
||||
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.workingPaper_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.workingPaper.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.WorkingPaperPropertiesStep"
|
||||
ordering="1"/>
|
||||
<ctd:authoring-step
|
||||
labelKey="publications.ui.workingPaper_properties.title"
|
||||
labelBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
descriptionKey="publications.ui.workingPaper.basic_properties.description"
|
||||
descriptionBundle="com.arsdigita.cms.contenttypes.PublicationsResources"
|
||||
component="com.arsdigita.cms.contenttypes.ui.WorkingPaperPropertiesStep"
|
||||
ordering="1"/>
|
||||
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
<ctd:include href="/WEB-INF/content-types/assign-categories-step.xml"/>
|
||||
|
||||
</ctd:authoring-kit>
|
||||
</ctd:authoring-kit>
|
||||
|
||||
</ctd:content-type>
|
||||
</ctd:content-type>
|
||||
|
||||
|
||||
</ctd:content-types>
|
||||
|
|
@ -417,9 +417,9 @@ publications.ui.publication.language=Language of publication
|
|||
publications.ui.series.number=Volume of series
|
||||
person.ui.publications.header=Publications with {0} as author
|
||||
person.ui.publications.header.alias_of=(Alias of {0})
|
||||
cms.contenttypes.ArticleInCollectedVolume.type_label=Publication / Article in Collected Volume
|
||||
cms.contenttypes.ArticleInJournal.type_label=Publication / Article in Journal
|
||||
cms.contenttypes.CollectedVolume.type_label=Publication / Collected Volume
|
||||
cms.contenttypes.articleincollectedvolume.type_label=Publication / Article in Collected Volume
|
||||
cms.contenttypes.articleinjournal.type_label=Publication / Article in Journal
|
||||
cms.contenttypes.collectedvolume.type_label=Publication / Collected Volume
|
||||
cms.contenttypes.Expertise.type_label=Publication / Expertise
|
||||
cms.contenttypes.GreyLiterature.type_label=Publication / Grey Literature
|
||||
cms.contenttypes.InProceedings.type_label=Publication / In Proceedings
|
||||
|
|
|
|||
|
|
@ -416,9 +416,9 @@ publications.ui.publication.language=Sprache der Publikation
|
|||
publications.ui.series.number=Band der Reihe
|
||||
person.ui.publications.header=Publikationen mit {0} als Autorin/Autor
|
||||
person.ui.publications.header.alias_of=\ (Alias von {0})
|
||||
cms.contenttypes.ArticleInCollectedVolume.type_label=Publkation / Sammelbandbeitrag
|
||||
cms.contenttypes.ArticleInJournal.type_label=Publikation / Zeitschriftenbeitrag
|
||||
cms.contenttypes.CollectedVolume.type_label=Publication / Collected Volume
|
||||
cms.contenttypes.articleincollectedvolume.type_label=Publikation / Sammelbandbeitrag
|
||||
cms.contenttypes.articleinjournal.type_label=Publikation / Zeitschriftenbeitrag
|
||||
cms.contenttypes.collectedvolume.type_label=Publication / Collected Volume
|
||||
cms.contenttypes.Expertise.type_label=Publikation / Gutachten
|
||||
cms.contenttypes.GreyLiterature.type_label=Publikation / Graue Literatur
|
||||
cms.contenttypes.InProceedings.type_label=Publikation / Beitrag in Tagungsband
|
||||
|
|
|
|||
Loading…
Reference in New Issue