mirror of
https://github.com/overcuriousity/autopsy-flatpak.git
synced 2025-07-14 17:06:16 +00:00
Merge branch 'develop' of https://github.com/sleuthkit/autopsy into 6065-contactbook-personas
This commit is contained in:
commit
26bb492920
@ -55,6 +55,10 @@ Case.exceptionMessage.unsupportedSchemaVersionMessage=Unsupported case database
|
||||
Case.lockingException.couldNotAcquireExclusiveLock=Failed to get a exclusive lock on the case.
|
||||
Case.lockingException.couldNotAcquireSharedLock=Failed to get an shared lock on the case.
|
||||
Case.open.exception.multiUserCaseNotEnabled=Cannot open a multi-user case if multi-user cases are not enabled. See Tools, Options, Multi-User.
|
||||
# {0} - image
|
||||
Case.openFileSystems.openingImage=Opening all filesystems for image: {0}...
|
||||
# {0} - case
|
||||
Case.openFileSystems.retrievingImages=Retrieving images for case: {0}...
|
||||
Case.progressIndicatorCancelButton.label=Cancel
|
||||
Case.progressIndicatorTitle.closingCase=Closing Case
|
||||
Case.progressIndicatorTitle.creatingCase=Creating Case
|
||||
@ -186,7 +190,6 @@ NewCaseVisualPanel1.caseNameLabel.text_1=Case Name:
|
||||
NewCaseVisualPanel1.caseDirLabel.text=Base Directory:
|
||||
NewCaseVisualPanel1.caseDirBrowseButton.text=Browse
|
||||
NewCaseVisualPanel1.caseNameTextField.text_1=
|
||||
NewCaseVisualPanel1.jLabel2.text_1=Case data will be stored in the following directory:
|
||||
NewCaseVisualPanel1.caseParentDirTextField.text=
|
||||
NewCaseVisualPanel1.caseDirTextField.text_1=
|
||||
CueBannerPanel.autopsyLogo.text=
|
||||
@ -467,3 +470,4 @@ UnpackagePortableCaseProgressDialog.okButton.text=OK
|
||||
UnpackagePortableCaseProgressDialog.resultLabel.text=resultLabel
|
||||
UnpackagePortableCaseDialog.extractLabel.text=Folder to extract to:
|
||||
UnpackagePortableCaseDialog.caseLabel.text=Portable Case:
|
||||
NewCaseVisualPanel1.caseDataStoredLabel.text_1=Case data will be stored in the following directory:
|
||||
|
@ -1555,7 +1555,19 @@ public class Case {
|
||||
* @param newTag new ContentTag added
|
||||
*/
|
||||
public void notifyContentTagAdded(ContentTag newTag) {
|
||||
eventPublisher.publish(new ContentTagAddedEvent(newTag));
|
||||
notifyContentTagAdded(newTag, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies case event subscribers that a content tag has been added.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param newTag new ContentTag added
|
||||
* @param deletedTag Removed ContentTag
|
||||
*/
|
||||
public void notifyContentTagAdded(ContentTag newTag, ContentTag deletedTag) {
|
||||
eventPublisher.publish(new ContentTagAddedEvent(newTag, deletedTag));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1607,7 +1619,19 @@ public class Case {
|
||||
* @param newTag new BlackboardArtifactTag added
|
||||
*/
|
||||
public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag) {
|
||||
eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag));
|
||||
notifyBlackBoardArtifactTagAdded(newTag, null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies case event subscribers that an artifact tag has been added.
|
||||
*
|
||||
* This should not be called from the event dispatch thread (EDT)
|
||||
*
|
||||
* @param newTag new BlackboardArtifactTag added
|
||||
* @param removedTag The BlackboardArtifactTag that was removed.
|
||||
*/
|
||||
public void notifyBlackBoardArtifactTagAdded(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) {
|
||||
eventPublisher.publish(new BlackBoardArtifactTagAddedEvent(newTag, removedTag));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2006,7 +2030,7 @@ public class Case {
|
||||
|
||||
/**
|
||||
* Starts a background task that reads a sector from each file system of
|
||||
* each image of a case to do an eager open of the filesystems in the case.
|
||||
* each image of a case to do an eager open of the filesystems in the case.
|
||||
* If this method is called before another background file system read has
|
||||
* finished the earlier one will be cancelled.
|
||||
*
|
||||
|
@ -22,6 +22,7 @@ import java.io.Serializable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifactTag;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
@ -37,6 +38,10 @@ public class BlackBoardArtifactTagAddedEvent extends TagAddedEvent<BlackboardArt
|
||||
super(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), newTag);
|
||||
}
|
||||
|
||||
public BlackBoardArtifactTagAddedEvent(BlackboardArtifactTag newTag, BlackboardArtifactTag removedTag) {
|
||||
super(Case.Events.BLACKBOARD_ARTIFACT_TAG_ADDED.toString(), newTag, (removedTag != null ? new DeletedBlackboardArtifactTagInfo(removedTag) : null));
|
||||
}
|
||||
|
||||
/**
|
||||
* get the BlackboardArtifactTag that was added by its id
|
||||
*
|
||||
|
@ -58,7 +58,7 @@ public class BlackBoardArtifactTagDeletedEvent extends TagDeletedEvent<Blackboar
|
||||
|
||||
private final long artifactID;
|
||||
|
||||
private DeletedBlackboardArtifactTagInfo(BlackboardArtifactTag deletedTag) {
|
||||
DeletedBlackboardArtifactTagInfo(BlackboardArtifactTag deletedTag) {
|
||||
super(deletedTag);
|
||||
artifactID = deletedTag.getArtifact().getArtifactID();
|
||||
contentID = deletedTag.getContent().getId();
|
||||
|
@ -22,6 +22,7 @@ import java.io.Serializable;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent.DeletedContentTagInfo;
|
||||
import org.sleuthkit.datamodel.ContentTag;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
|
||||
@ -36,6 +37,10 @@ public class ContentTagAddedEvent extends TagAddedEvent<ContentTag> implements S
|
||||
public ContentTagAddedEvent(ContentTag newTag) {
|
||||
super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag);
|
||||
}
|
||||
|
||||
public ContentTagAddedEvent(ContentTag newTag, ContentTag deletedTag) {
|
||||
super(Case.Events.CONTENT_TAG_ADDED.toString(), newTag, (deletedTag != null ? new DeletedContentTagInfo(deletedTag) : null));
|
||||
}
|
||||
|
||||
/**
|
||||
* get the ContentTag that was added by its id
|
||||
|
@ -58,7 +58,7 @@ public class ContentTagDeletedEvent extends TagDeletedEvent<ContentTag> implemen
|
||||
private final long beginByteOffset;
|
||||
private final long endByteOffset;
|
||||
|
||||
private DeletedContentTagInfo(ContentTag deletedTag) {
|
||||
DeletedContentTagInfo(ContentTag deletedTag) {
|
||||
super(deletedTag);
|
||||
beginByteOffset = deletedTag.getBeginByteOffset();
|
||||
endByteOffset = deletedTag.getEndByteOffset();
|
||||
|
@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.casemodule.events;
|
||||
import java.io.Serializable;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.casemodule.events.TagDeletedEvent.DeletedTagInfo;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.events.AutopsyEvent;
|
||||
import org.sleuthkit.datamodel.Tag;
|
||||
@ -46,7 +47,11 @@ abstract class TagAddedEvent<T extends Tag> extends AutopsyEvent implements Seri
|
||||
private final Long tagID;
|
||||
|
||||
TagAddedEvent(String propertyName, T addedTag) {
|
||||
super(propertyName, null, null);
|
||||
this(propertyName, addedTag, null);
|
||||
}
|
||||
|
||||
TagAddedEvent(String propertyName, T addedTag, DeletedTagInfo<T> deletedTagInfo) {
|
||||
super(propertyName, deletedTagInfo, null);
|
||||
tag = addedTag;
|
||||
tagID = addedTag.getId();
|
||||
}
|
||||
|
0
Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties
Normal file → Executable file
0
Core/src/org/sleuthkit/autopsy/casemodule/services/Bundle.properties
Normal file → Executable file
274
Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java
Normal file → Executable file
274
Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDefinition.java
Normal file → Executable file
@ -20,19 +20,22 @@ package org.sleuthkit.autopsy.casemodule.services;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.LinkedHashSet;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import javax.annotation.concurrent.Immutable;
|
||||
import org.openide.util.NbBundle;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.ModuleSettings;
|
||||
import org.sleuthkit.datamodel.TagName;
|
||||
import org.sleuthkit.autopsy.datamodel.DhsImageCategory;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
@ -44,22 +47,42 @@ import org.sleuthkit.datamodel.TskData;
|
||||
final class TagNameDefinition implements Comparable<TagNameDefinition> {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(TagNameDefinition.class.getName());
|
||||
@NbBundle.Messages({"TagNameDefinition.predefTagNames.bookmark.text=Bookmark",
|
||||
@Messages({
|
||||
"TagNameDefinition.predefTagNames.bookmark.text=Bookmark",
|
||||
"TagNameDefinition.predefTagNames.followUp.text=Follow Up",
|
||||
"TagNameDefinition.predefTagNames.notableItem.text=Notable Item"})
|
||||
private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS
|
||||
private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS
|
||||
"TagNameDefinition.predefTagNames.notableItem.text=Notable Item",})
|
||||
|
||||
private static final String TAGS_SETTINGS_NAME = "Tags"; //NON-NLS
|
||||
private static final String TAG_NAMES_SETTING_KEY = "TagNames"; //NON-NLS
|
||||
private static final String TAG_SETTING_VERSION_KEY = "CustomTagNameVersion";
|
||||
private static final int TAG_SETTINGS_VERSION = 1;
|
||||
|
||||
private static final String CATEGORY_ONE_NAME = "CAT-1: Child Exploitation (Illegal)";
|
||||
private static final String CATEGORY_TWO_NAME = "CAT-2: Child Exploitation (Non-Illegal/Age Difficult)";
|
||||
private static final String CATEGORY_THREE_NAME = "CAT-3: CGI/Animation (Child Exploitive)";
|
||||
private static final String CATEGORY_FOUR_NAME = "CAT-4: Exemplar/Comparison (Internal Use Only)";
|
||||
private static final String CATEGORY_FIVE_NAME = "CAT-5: Non-pertinent";
|
||||
|
||||
private static final List<String> STANDARD_NOTABLE_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(), DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName()); // NON-NLS
|
||||
private static final List<String> STANDARD_TAG_DISPLAY_NAMES = Arrays.asList(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), Bundle.TagNameDefinition_predefTagNames_followUp_text(),
|
||||
Bundle.TagNameDefinition_predefTagNames_notableItem_text(), DhsImageCategory.ONE.getDisplayName(),
|
||||
DhsImageCategory.TWO.getDisplayName(), DhsImageCategory.THREE.getDisplayName(),
|
||||
DhsImageCategory.FOUR.getDisplayName(), DhsImageCategory.FIVE.getDisplayName(), DhsImageCategory.ZERO.getDisplayName());
|
||||
private final String displayName;
|
||||
private final String description;
|
||||
private final TagName.HTML_COLOR color;
|
||||
private final TskData.FileKnown knownStatus;
|
||||
|
||||
private static final Map<String, TagNameDefinition> STANDARD_TAGS_DEFINITIONS = new HashMap<>();
|
||||
private static final Map<String, TagNameDefinition> PROJECT_VIC_TAG_DEFINITIONS = new HashMap<>();
|
||||
|
||||
static {
|
||||
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_bookmark_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
|
||||
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_followUp_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_followUp_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
|
||||
STANDARD_TAGS_DEFINITIONS.put(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), new TagNameDefinition(Bundle.TagNameDefinition_predefTagNames_notableItem_text(), "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD));
|
||||
|
||||
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_ONE_NAME, new TagNameDefinition(CATEGORY_ONE_NAME, "", TagName.HTML_COLOR.RED, TskData.FileKnown.BAD));
|
||||
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_TWO_NAME, new TagNameDefinition(CATEGORY_TWO_NAME, "", TagName.HTML_COLOR.LIME, TskData.FileKnown.BAD));
|
||||
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_THREE_NAME, new TagNameDefinition(CATEGORY_THREE_NAME, "", TagName.HTML_COLOR.YELLOW, TskData.FileKnown.BAD));
|
||||
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FOUR_NAME, new TagNameDefinition(CATEGORY_FOUR_NAME, "", TagName.HTML_COLOR.PURPLE, TskData.FileKnown.UNKNOWN));
|
||||
PROJECT_VIC_TAG_DEFINITIONS.put(CATEGORY_FIVE_NAME, new TagNameDefinition(CATEGORY_FIVE_NAME, "", TagName.HTML_COLOR.SILVER, TskData.FileKnown.UNKNOWN));
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs a tag name definition consisting of a display name,
|
||||
* description, color and knownStatus.
|
||||
@ -76,8 +99,20 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
|
||||
this.knownStatus = status;
|
||||
}
|
||||
|
||||
static Collection<TagNameDefinition> getProjectVICDefaultDefinitions() {
|
||||
return Collections.unmodifiableCollection(PROJECT_VIC_TAG_DEFINITIONS.values());
|
||||
}
|
||||
|
||||
static Collection<TagNameDefinition> getStandardTagNameDefinitions() {
|
||||
return Collections.unmodifiableCollection(STANDARD_TAGS_DEFINITIONS.values());
|
||||
}
|
||||
|
||||
static List<String> getStandardTagNames() {
|
||||
return STANDARD_TAG_DISPLAY_NAMES;
|
||||
List<String> strList = new ArrayList<>();
|
||||
strList.addAll(STANDARD_TAGS_DEFINITIONS.keySet());
|
||||
strList.addAll(PROJECT_VIC_TAG_DEFINITIONS.keySet());
|
||||
|
||||
return strList;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -194,94 +229,41 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
|
||||
* Gets tag name definitions from the tag settings file as well as the
|
||||
* default tag name definitions.
|
||||
*
|
||||
* The currently custom tags properties are stored in one string property
|
||||
* value separated by ;. The properties of an individual tag are comma
|
||||
* separated in the format of:
|
||||
* tag_name,tag_description,tag_color,known_status
|
||||
*
|
||||
* In prior versions of autopsy the known_status was stored in the central
|
||||
* repository, therefore the properties file only had three values.
|
||||
*
|
||||
* @return A set of tag name definition objects.
|
||||
*/
|
||||
static synchronized Set<TagNameDefinition> getTagNameDefinitions() {
|
||||
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
|
||||
//modifiable copy of default tags list for us to keep track of which default tags have already been created
|
||||
Set<String> standardTags = new LinkedHashSet<>(STANDARD_TAG_DISPLAY_NAMES);
|
||||
String setting = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
|
||||
if (null != setting && !setting.isEmpty()) {
|
||||
List<String> tagNameTuples = Arrays.asList(setting.split(";"));
|
||||
int numberOfAttributes = 0;
|
||||
if (tagNameTuples.size() > 0) {
|
||||
// Determine if Tags.properties file needs to be upgraded
|
||||
numberOfAttributes = tagNameTuples.get(0).split(",").length;
|
||||
}
|
||||
if (numberOfAttributes == 3) {
|
||||
// Upgrade Tags.Properties with the settings in Central Repository Settings if necessary
|
||||
tagNames.addAll(upgradeTagPropertiesFile(tagNameTuples, standardTags));
|
||||
} else if (numberOfAttributes == 4) {
|
||||
// if the Tags.Properties file is up to date parse it
|
||||
tagNames.addAll(readCurrentTagPropertiesFile(tagNameTuples, standardTags));
|
||||
}
|
||||
if (needsVersionUpdate()) {
|
||||
updateTagDefinitions();
|
||||
}
|
||||
//create standard tags which should always exist which were not already created for whatever reason, such as upgrade
|
||||
for (String standardTagName : standardTags) {
|
||||
if (STANDARD_NOTABLE_TAG_DISPLAY_NAMES.contains(standardTagName)) {
|
||||
tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.BAD));
|
||||
} else {
|
||||
tagNames.add(new TagNameDefinition(standardTagName, "", TagName.HTML_COLOR.NONE, TskData.FileKnown.UNKNOWN));
|
||||
}
|
||||
}
|
||||
return tagNames;
|
||||
|
||||
}
|
||||
String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
|
||||
if (tagsProperty == null || tagsProperty.isEmpty()) {
|
||||
return new HashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Read the central repository properties file to get any knownStatus
|
||||
* related tag settings that may exist in it.
|
||||
*
|
||||
* @param tagProperties the list of comma seperated tags in the
|
||||
* Tags.properties file
|
||||
* @param standardTagsToBeCreated the list of standard tags which have yet
|
||||
* to be created
|
||||
*
|
||||
* @return tagNames a list of TagNameDefinitions
|
||||
*/
|
||||
private static Set<TagNameDefinition> upgradeTagPropertiesFile(List<String> tagProperties, Set<String> standardTagsToBeCreated) {
|
||||
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
|
||||
List<String> legacyNotableTags = new ArrayList<>();
|
||||
String badTagsStr = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS
|
||||
if (badTagsStr == null || badTagsStr.isEmpty()) { //if there were no bad tags in the central repo properties file use the default list
|
||||
legacyNotableTags.addAll(STANDARD_NOTABLE_TAG_DISPLAY_NAMES);
|
||||
} else { //otherwise use the list that was in the central repository properties file
|
||||
legacyNotableTags.addAll(Arrays.asList(badTagsStr.split(",")));
|
||||
}
|
||||
for (String tagNameTuple : tagProperties) {
|
||||
String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes
|
||||
standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created
|
||||
if (legacyNotableTags.contains(tagNameAttributes[0])) { //if tag should be notable mark create it as such
|
||||
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
|
||||
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.BAD));
|
||||
} else { //otherwise create it as unknown
|
||||
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
|
||||
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.UNKNOWN)); //add the default value for that tag
|
||||
}
|
||||
}
|
||||
return tagNames;
|
||||
}
|
||||
List<String> individualTags = Arrays.asList(tagsProperty.split(";"));
|
||||
|
||||
/**
|
||||
* Read the Tags.properties file to get the TagNameDefinitions that are
|
||||
* preserved accross cases.
|
||||
*
|
||||
* @param tagProperties the list of comma seperated tags in the
|
||||
* Tags.properties file
|
||||
* @param standardTagsToBeCreated the list of standard tags which have yet
|
||||
* to be created
|
||||
*
|
||||
* @return tagNames a list of TagNameDefinitions
|
||||
*/
|
||||
private static Set<TagNameDefinition> readCurrentTagPropertiesFile(List<String> tagProperties, Set<String> standardTagsToBeCreated) {
|
||||
Set<TagNameDefinition> tagNames = new LinkedHashSet<>();
|
||||
for (String tagNameTuple : tagProperties) {
|
||||
String[] tagNameAttributes = tagNameTuple.split(","); //get the attributes
|
||||
standardTagsToBeCreated.remove(tagNameAttributes[0]); //remove the tag from the list of standard tags which have not been created
|
||||
tagNames.add(new TagNameDefinition(tagNameAttributes[0], tagNameAttributes[1],
|
||||
TagName.HTML_COLOR.valueOf(tagNameAttributes[2]), TskData.FileKnown.valueOf(tagNameAttributes[3])));
|
||||
if (individualTags == null || individualTags.isEmpty()) {
|
||||
return new HashSet<>();
|
||||
}
|
||||
return tagNames;
|
||||
|
||||
Set<TagNameDefinition> definitions = new HashSet<>();
|
||||
for (String tagProps : individualTags) {
|
||||
String[] attributes = tagProps.split(",");
|
||||
|
||||
definitions.add(new TagNameDefinition(attributes[0], attributes[1],
|
||||
TagName.HTML_COLOR.valueOf(attributes[2]), TskData.FileKnown.valueOf(attributes[3])));
|
||||
}
|
||||
|
||||
return definitions;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -303,7 +285,113 @@ final class TagNameDefinition implements Comparable<TagNameDefinition> {
|
||||
LOGGER.log(Level.SEVERE, "Exception while getting open case.", ex);
|
||||
}
|
||||
}
|
||||
|
||||
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION));
|
||||
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, setting.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the Tag Definition file to the current format.
|
||||
*/
|
||||
private static void updateTagDefinitions() {
|
||||
Integer version = getPropertyFileVersion();
|
||||
List<TagNameDefinition> definitions = new ArrayList<>();
|
||||
|
||||
if (version == null) {
|
||||
String tagsProperty = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY);
|
||||
if (tagsProperty == null || tagsProperty.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> individualTags = Arrays.asList(tagsProperty.split(";"));
|
||||
|
||||
if (individualTags == null || individualTags.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
List<String> notableTagList = null;
|
||||
for (String tagProps : individualTags) {
|
||||
String[] attributes = tagProps.split(",");
|
||||
TskData.FileKnown fileKnown = TskData.FileKnown.UNKNOWN;
|
||||
if (attributes.length == 3) {
|
||||
// If notableTagList is null load it from the CR.
|
||||
if (notableTagList == null) {
|
||||
notableTagList = getCRNotableList();
|
||||
} else {
|
||||
if (notableTagList.contains(attributes[0])) {
|
||||
fileKnown = TskData.FileKnown.BAD;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
fileKnown = TskData.FileKnown.valueOf(attributes[3]);
|
||||
}
|
||||
|
||||
definitions.add(new TagNameDefinition(attributes[0], attributes[1],
|
||||
TagName.HTML_COLOR.valueOf(attributes[2]), fileKnown));
|
||||
}
|
||||
}
|
||||
|
||||
if (definitions.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Remove the standard and Project VIC tags from the list
|
||||
List<String> tagStrings = new ArrayList<>();
|
||||
List<String> standardTags = getStandardTagNames();
|
||||
for (TagNameDefinition def : definitions) {
|
||||
if (!standardTags.contains(def.getDisplayName())) {
|
||||
tagStrings.add(def.toSettingsFormat());
|
||||
}
|
||||
}
|
||||
|
||||
// Write out the version and the new tag list.
|
||||
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY, Integer.toString(TAG_SETTINGS_VERSION));
|
||||
ModuleSettings.setConfigSetting(TAGS_SETTINGS_NAME, TAG_NAMES_SETTING_KEY, String.join(";", tagStrings));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a list notable tag names from the CR bagTag list.
|
||||
*
|
||||
* @return A list of tag names, or empty list if none were found.
|
||||
*/
|
||||
private static List<String> getCRNotableList() {
|
||||
String notableTagsProp = ModuleSettings.getConfigSetting("CentralRepository", "db.badTags"); // NON-NLS
|
||||
if (notableTagsProp != null && !notableTagsProp.isEmpty()) {
|
||||
return Arrays.asList(notableTagsProp.split(","));
|
||||
}
|
||||
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Based on the version in the Tags property file, returns whether or not
|
||||
* the file needs updating.
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
private static boolean needsVersionUpdate() {
|
||||
Integer version = getPropertyFileVersion();
|
||||
return version == null || version < TAG_SETTINGS_VERSION;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Tags property file version.
|
||||
*
|
||||
* @return The current version of tags property file, or null if no version
|
||||
* was found.
|
||||
*/
|
||||
private static Integer getPropertyFileVersion() {
|
||||
String version = ModuleSettings.getConfigSetting(TAGS_SETTINGS_NAME, TAG_SETTING_VERSION_KEY);
|
||||
if (version == null || version.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return Integer.parseInt(version);
|
||||
} catch (NumberFormatException ex) {
|
||||
// The version is not an integer
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
0
Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java
Normal file → Executable file
0
Core/src/org/sleuthkit/autopsy/casemodule/services/TagNameDialog.java
Normal file → Executable file
3
Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java
Normal file → Executable file
3
Core/src/org/sleuthkit/autopsy/casemodule/services/TagOptionsPanel.java
Normal file → Executable file
@ -446,8 +446,7 @@ final class TagOptionsPanel extends javax.swing.JPanel implements OptionsPanel {
|
||||
boolean isSelected = tagNamesList.getSelectedIndex() != -1;
|
||||
boolean enableEdit = !ingestIsRunning && isSelected;
|
||||
editTagNameButton.setEnabled(enableEdit);
|
||||
boolean enableDelete = enableEdit && !TagNameDefinition.getStandardTagNames().contains(tagNamesList.getSelectedValue().getDisplayName());
|
||||
deleteTagNameButton.setEnabled(enableDelete);
|
||||
deleteTagNameButton.setEnabled(enableEdit);
|
||||
if (isSelected) {
|
||||
descriptionTextArea.setText(tagNamesList.getSelectedValue().getDescription());
|
||||
if (tagNamesList.getSelectedValue().getKnownStatus() == TskData.FileKnown.BAD) {
|
||||
|
53
Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java
Normal file → Executable file
53
Core/src/org/sleuthkit/autopsy/casemodule/services/TagsManager.java
Normal file → Executable file
@ -40,6 +40,8 @@ import org.sleuthkit.datamodel.Content;
|
||||
import org.sleuthkit.datamodel.ContentTag;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TagName;
|
||||
import org.sleuthkit.datamodel.TagSet;
|
||||
import org.sleuthkit.datamodel.TaggingManager;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
import org.sleuthkit.datamodel.TskData;
|
||||
import org.sleuthkit.datamodel.TskData.DbType;
|
||||
@ -52,9 +54,12 @@ public class TagsManager implements Closeable {
|
||||
|
||||
private static final Logger LOGGER = Logger.getLogger(TagsManager.class.getName());
|
||||
private final SleuthkitCase caseDb;
|
||||
|
||||
|
||||
static String DEFAULT_TAG_SET_NAME = "Project VIC (United States)";
|
||||
|
||||
static {
|
||||
//Create the contentviewer tags table (beta) if the current case does not
|
||||
|
||||
//Create the contentviewer tags table if the current case does not
|
||||
//have the table present
|
||||
Case.addEventTypeSubscriber(EnumSet.of(Case.Events.CURRENT_CASE), evt -> {
|
||||
if (evt.getNewValue() != null) {
|
||||
@ -64,7 +69,7 @@ public class TagsManager implements Closeable {
|
||||
if (caseDb.tableExists(ContentViewerTagManager.TABLE_NAME)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.SQLITE)) {
|
||||
caseDb.createTable(ContentViewerTagManager.TABLE_NAME, ContentViewerTagManager.TABLE_SCHEMA_SQLITE);
|
||||
} else if (currentCase.getSleuthkitCase().getDatabaseType().equals(DbType.POSTGRESQL)) {
|
||||
@ -168,6 +173,28 @@ public class TagsManager implements Closeable {
|
||||
*/
|
||||
TagsManager(SleuthkitCase caseDb) {
|
||||
this.caseDb = caseDb;
|
||||
|
||||
// Add standard tags and the Project VIC default tag set and tags.
|
||||
TaggingManager taggingMgr = caseDb.getTaggingManager();
|
||||
try {
|
||||
List<TagSet> setList = taggingMgr.getTagSets();
|
||||
if (setList.isEmpty()) {
|
||||
//Assume new case and add Project VIC tags.
|
||||
|
||||
List<TagName> tagNameList = new ArrayList<>();
|
||||
for (TagNameDefinition def : TagNameDefinition.getProjectVICDefaultDefinitions()) {
|
||||
tagNameList.add(caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus()));
|
||||
}
|
||||
taggingMgr.addTagSet(DEFAULT_TAG_SET_NAME, tagNameList);
|
||||
|
||||
for (TagNameDefinition def : TagNameDefinition.getStandardTagNameDefinitions()) {
|
||||
caseDb.addOrUpdateTagName(def.getDisplayName(), def.getDescription(), def.getColor(), def.getKnownStatus());
|
||||
}
|
||||
}
|
||||
} catch (TskCoreException ex) {
|
||||
LOGGER.log(Level.SEVERE, "Error updating non-file object ", ex);
|
||||
}
|
||||
|
||||
for (TagNameDefinition tagName : TagNameDefinition.getTagNameDefinitions()) {
|
||||
tagName.saveToCase(caseDb);
|
||||
}
|
||||
@ -242,7 +269,8 @@ public class TagsManager implements Closeable {
|
||||
/**
|
||||
* Selects all of the rows from the tag_names table in the case database for
|
||||
* which there is at least one matching row in the content_tags or
|
||||
* blackboard_artifact_tags tables, for the given data source object id and user.
|
||||
* blackboard_artifact_tags tables, for the given data source object id and
|
||||
* user.
|
||||
*
|
||||
* @param dsObjId data source object id
|
||||
* @param userName - the user name that you want to get tags for
|
||||
@ -449,14 +477,16 @@ public class TagsManager implements Closeable {
|
||||
* database.
|
||||
*/
|
||||
public ContentTag addContentTag(Content content, TagName tagName, String comment, long beginByteOffset, long endByteOffset) throws TskCoreException {
|
||||
ContentTag tag;
|
||||
tag = caseDb.addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
|
||||
TaggingManager.ContentTagChange tagChange = caseDb.getTaggingManager().addContentTag(content, tagName, comment, beginByteOffset, endByteOffset);
|
||||
try {
|
||||
Case.getCurrentCaseThrows().notifyContentTagAdded(tag);
|
||||
Case currentCase = Case.getCurrentCaseThrows();
|
||||
|
||||
currentCase.notifyContentTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0));
|
||||
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
throw new TskCoreException("Added a tag to a closed case", ex);
|
||||
}
|
||||
return tag;
|
||||
return tagChange.getAddedTag();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -668,13 +698,14 @@ public class TagsManager implements Closeable {
|
||||
* database.
|
||||
*/
|
||||
public BlackboardArtifactTag addBlackboardArtifactTag(BlackboardArtifact artifact, TagName tagName, String comment) throws TskCoreException {
|
||||
BlackboardArtifactTag tag = caseDb.addBlackboardArtifactTag(artifact, tagName, comment);
|
||||
TaggingManager.BlackboardArtifactTagChange tagChange = caseDb.getTaggingManager().addArtifactTag(artifact, tagName, comment);
|
||||
try {
|
||||
Case.getCurrentCaseThrows().notifyBlackBoardArtifactTagAdded(tag);
|
||||
Case currentCase = Case.getCurrentCaseThrows();
|
||||
currentCase.notifyBlackBoardArtifactTagAdded(tagChange.getAddedTag(), tagChange.getRemovedTags().isEmpty() ? null : tagChange.getRemovedTags().get(0));
|
||||
} catch (NoCurrentCaseException ex) {
|
||||
throw new TskCoreException("Added a tag to a closed case", ex);
|
||||
}
|
||||
return tag;
|
||||
return tagChange.getAddedTag();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -19,11 +19,13 @@
|
||||
package org.sleuthkit.autopsy.communications;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.stream.Collectors;
|
||||
import javax.swing.AbstractAction;
|
||||
import javax.swing.ImageIcon;
|
||||
import javax.swing.JMenuItem;
|
||||
import org.openide.util.Utilities;
|
||||
import org.openide.util.actions.Presenter;
|
||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
|
||||
/**
|
||||
* Base class for actions that act on the selected AccountDeviceInstanceKeys.
|
||||
@ -37,8 +39,11 @@ abstract class AbstractCVTAction extends AbstractAction implements Presenter.Pop
|
||||
*
|
||||
* @return The selected accounts
|
||||
*/
|
||||
Collection<? extends AccountDeviceInstanceKey> getSelectedAccounts() {
|
||||
return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class);
|
||||
Collection<? extends AccountDeviceInstance> getSelectedAccounts() {
|
||||
return Utilities.actionsGlobalContext().lookupAll(AccountDeviceInstanceKey.class)
|
||||
.stream()
|
||||
.map((adiKey -> adiKey.getAccountDeviceInstance()))
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -24,6 +24,7 @@ import java.util.Collection;
|
||||
import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState;
|
||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||
import org.sleuthkit.autopsy.communications.StateManager.CommunicationsState;
|
||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
|
||||
/**
|
||||
* Provide the singleton EventBus.
|
||||
@ -73,19 +74,19 @@ final class CVTEvents {
|
||||
*/
|
||||
static final class PinAccountsEvent {
|
||||
|
||||
private final ImmutableSet<AccountDeviceInstanceKey> accountDeviceInstances;
|
||||
private final ImmutableSet<AccountDeviceInstance> accounInstances;
|
||||
private final boolean replace;
|
||||
|
||||
public boolean isReplace() {
|
||||
return replace;
|
||||
}
|
||||
|
||||
ImmutableSet<AccountDeviceInstanceKey> getAccountDeviceInstances() {
|
||||
return accountDeviceInstances;
|
||||
ImmutableSet<AccountDeviceInstance> getAccountDeviceInstances() {
|
||||
return accounInstances;
|
||||
}
|
||||
|
||||
PinAccountsEvent(Collection<? extends AccountDeviceInstanceKey> accountDeviceInstances, boolean replace) {
|
||||
this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances);
|
||||
PinAccountsEvent(Collection<? extends AccountDeviceInstance> accountDeviceInstances, boolean replace) {
|
||||
this.accounInstances = ImmutableSet.copyOf(accountDeviceInstances);
|
||||
this.replace = replace;
|
||||
}
|
||||
}
|
||||
@ -95,14 +96,14 @@ final class CVTEvents {
|
||||
*/
|
||||
static final class UnpinAccountsEvent {
|
||||
|
||||
private final ImmutableSet<AccountDeviceInstanceKey> accountDeviceInstances;
|
||||
private final ImmutableSet<AccountDeviceInstance> accountInstances;
|
||||
|
||||
public ImmutableSet<AccountDeviceInstanceKey> getAccountDeviceInstances() {
|
||||
return accountDeviceInstances;
|
||||
public ImmutableSet<AccountDeviceInstance> getAccountDeviceInstances() {
|
||||
return accountInstances;
|
||||
}
|
||||
|
||||
UnpinAccountsEvent(Collection<? extends AccountDeviceInstanceKey> accountDeviceInstances) {
|
||||
this.accountDeviceInstances = ImmutableSet.copyOf(accountDeviceInstances);
|
||||
UnpinAccountsEvent(Collection<? extends AccountDeviceInstance> accountDeviceInstances) {
|
||||
this.accountInstances = ImmutableSet.copyOf(accountDeviceInstances);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -32,6 +32,7 @@ import java.io.InputStreamReader;
|
||||
import java.io.StringWriter;
|
||||
import java.net.URL;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
@ -147,7 +148,7 @@ final class CommunicationsGraph extends mxGraph {
|
||||
scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID());
|
||||
scopes.put("size", Math.round(Math.log(adiKey.getMessageCount()) + 5));
|
||||
scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType())));
|
||||
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey));
|
||||
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance()));
|
||||
scopes.put("MARKER_PIN_URL", MARKER_PIN_URL);
|
||||
scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell));
|
||||
scopes.put("LOCK_URL", LOCK_URL);
|
||||
@ -172,7 +173,7 @@ final class CommunicationsGraph extends mxGraph {
|
||||
scopes.put("accountName", adiKey.getAccountDeviceInstance().getAccount().getTypeSpecificID());
|
||||
scopes.put("relationships", 12);// Math.round(Math.log(adiKey.getMessageCount()) + 5));
|
||||
scopes.put("iconFileName", CommunicationsGraph.class.getResource(Utils.getIconFilePath(adiKey.getAccountDeviceInstance().getAccount().getAccountType())));
|
||||
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey));
|
||||
scopes.put("pinned", pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance()));
|
||||
scopes.put("MARKER_PIN_URL", MARKER_PIN_URL);
|
||||
scopes.put("locked", lockedVertexModel.isVertexLocked((mxCell) cell));
|
||||
scopes.put("LOCK_URL", LOCK_URL);
|
||||
@ -199,16 +200,24 @@ final class CommunicationsGraph extends mxGraph {
|
||||
lockedVertexModel.clear();
|
||||
}
|
||||
|
||||
private mxCell getOrCreateVertex(AccountDeviceInstanceKey accountDeviceInstanceKey) {
|
||||
final AccountDeviceInstance accountDeviceInstance = accountDeviceInstanceKey.getAccountDeviceInstance();
|
||||
private mxCell getOrCreateVertex(AccountDeviceInstance adi, CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
|
||||
final AccountDeviceInstance accountDeviceInstance = adi;
|
||||
final String name = accountDeviceInstance.getAccount().getTypeSpecificID();
|
||||
|
||||
final mxCell vertex = nodeMap.computeIfAbsent(name + accountDeviceInstance.getDeviceId(), vertexName -> {
|
||||
double size = Math.sqrt(accountDeviceInstanceKey.getMessageCount()) + 10;
|
||||
|
||||
long adiRelationshipsCount = 1;
|
||||
try {
|
||||
adiRelationshipsCount = commsManager.getRelationshipSourcesCount(accountDeviceInstance, currentFilter);
|
||||
} catch (TskCoreException tskCoreException) {
|
||||
logger.log(Level.SEVERE, "There was an error fetching relationships for the node: " + accountDeviceInstance, tskCoreException);
|
||||
}
|
||||
|
||||
double size = Math.sqrt(adiRelationshipsCount) + 10;
|
||||
AccountDeviceInstanceKey adiKey = new AccountDeviceInstanceKey(adi, currentFilter, adiRelationshipsCount);
|
||||
|
||||
mxCell newVertex = (mxCell) insertVertex(
|
||||
getDefaultParent(),
|
||||
name, accountDeviceInstanceKey,
|
||||
name, adiKey,
|
||||
Math.random() * 400,
|
||||
Math.random() * 400,
|
||||
size,
|
||||
@ -219,9 +228,11 @@ final class CommunicationsGraph extends mxGraph {
|
||||
}
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
private mxCell addOrUpdateEdge(long relSources, AccountDeviceInstanceKey account1, AccountDeviceInstanceKey account2) {
|
||||
mxCell vertex1 = getOrCreateVertex(account1);
|
||||
mxCell vertex2 = getOrCreateVertex(account2);
|
||||
private mxCell addOrUpdateEdge(long relSources,
|
||||
AccountDeviceInstance account1, AccountDeviceInstance account2,
|
||||
CommunicationsManager commsManager, CommunicationsFilter currentFilter) {
|
||||
mxCell vertex1 = getOrCreateVertex(account1, commsManager, currentFilter);
|
||||
mxCell vertex2 = getOrCreateVertex(account2, commsManager, currentFilter);
|
||||
Object[] edgesBetween = getEdgesBetween(vertex1, vertex2);
|
||||
mxCell edge;
|
||||
if (edgesBetween.length == 0) {
|
||||
@ -260,28 +271,24 @@ final class CommunicationsGraph extends mxGraph {
|
||||
/**
|
||||
* set to keep track of accounts related to pinned accounts
|
||||
*/
|
||||
final Map<AccountDeviceInstance, AccountDeviceInstanceKey> relatedAccounts = new HashMap<>();
|
||||
for (final AccountDeviceInstanceKey adiKey : pinnedAccountModel.getPinnedAccounts()) {
|
||||
final Set<AccountDeviceInstance> relatedAccounts = new HashSet<>();
|
||||
for (final AccountDeviceInstance adi : pinnedAccountModel.getPinnedAccounts()) {
|
||||
if (isCancelled()) {
|
||||
break;
|
||||
}
|
||||
//get accounts related to pinned account
|
||||
final List<AccountDeviceInstance> relatedAccountDeviceInstances
|
||||
= commsManager.getRelatedAccountDeviceInstances(adiKey.getAccountDeviceInstance(), currentFilter);
|
||||
relatedAccounts.put(adiKey.getAccountDeviceInstance(), adiKey);
|
||||
getOrCreateVertex(adiKey);
|
||||
= commsManager.getRelatedAccountDeviceInstances(adi, currentFilter);
|
||||
relatedAccounts.add(adi);
|
||||
getOrCreateVertex(adi, commsManager, currentFilter);
|
||||
|
||||
for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances)
|
||||
relatedAccounts.add(relatedADI);
|
||||
|
||||
for (final AccountDeviceInstance relatedADI : relatedAccountDeviceInstances) {
|
||||
final long adiRelationshipsCount = commsManager.getRelationshipSourcesCount(relatedADI, currentFilter);
|
||||
final AccountDeviceInstanceKey relatedADIKey = new AccountDeviceInstanceKey(relatedADI, currentFilter, adiRelationshipsCount);
|
||||
relatedAccounts.put(relatedADI, relatedADIKey); //store related accounts
|
||||
}
|
||||
progressIndicator.progress(++progressCounter);
|
||||
}
|
||||
|
||||
Set<AccountDeviceInstance> accounts = relatedAccounts.keySet();
|
||||
|
||||
Map<AccountPair, Long> relationshipCounts = commsManager.getRelationshipCountsPairwise(accounts, currentFilter);
|
||||
Map<AccountPair, Long> relationshipCounts = commsManager.getRelationshipCountsPairwise(relatedAccounts, currentFilter);
|
||||
|
||||
int total = relationshipCounts.size();
|
||||
int progress = 0;
|
||||
@ -290,12 +297,12 @@ final class CommunicationsGraph extends mxGraph {
|
||||
for (Map.Entry<AccountPair, Long> entry : relationshipCounts.entrySet()) {
|
||||
Long count = entry.getValue();
|
||||
AccountPair relationshipKey = entry.getKey();
|
||||
AccountDeviceInstanceKey account1 = relatedAccounts.get(relationshipKey.getFirst());
|
||||
AccountDeviceInstanceKey account2 = relatedAccounts.get(relationshipKey.getSecond());
|
||||
AccountDeviceInstance account1 = relationshipKey.getFirst();
|
||||
AccountDeviceInstance account2 = relationshipKey.getSecond();
|
||||
|
||||
if (pinnedAccountModel.isAccountPinned(account1)
|
||||
|| pinnedAccountModel.isAccountPinned(account2)) {
|
||||
mxCell addEdge = addOrUpdateEdge(count, account1, account2);
|
||||
mxCell addEdge = addOrUpdateEdge(count, account1, account2, commsManager, currentFilter);
|
||||
progressText = addEdge.getId();
|
||||
}
|
||||
progressIndicator.progress(progressText, progress++);
|
||||
|
@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet;
|
||||
import com.google.common.eventbus.EventBus;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
|
||||
/**
|
||||
* Model of what accounts are pinned to a visualization.
|
||||
@ -34,7 +35,7 @@ class PinnedAccountModel {
|
||||
* to pinned accounts and pass the filters are show. Pinning accounts is the
|
||||
* primary way to populate the graph.
|
||||
*/
|
||||
private final Set<AccountDeviceInstanceKey> pinnedAccountDevices = new HashSet<>();
|
||||
private final Set<AccountDeviceInstance> pinnedAccountDevices = new HashSet<>();
|
||||
|
||||
private final EventBus eventBus = new EventBus();
|
||||
|
||||
@ -46,7 +47,7 @@ class PinnedAccountModel {
|
||||
eventBus.unregister(handler);
|
||||
}
|
||||
|
||||
boolean isAccountPinned(AccountDeviceInstanceKey account) {
|
||||
boolean isAccountPinned(AccountDeviceInstance account) {
|
||||
return pinnedAccountDevices.contains(account);
|
||||
}
|
||||
|
||||
@ -57,7 +58,7 @@ class PinnedAccountModel {
|
||||
*
|
||||
* @param accountDeviceInstances The accounts to unpin.
|
||||
*/
|
||||
void unpinAccount(Set<AccountDeviceInstanceKey> accountDeviceInstances) {
|
||||
void unpinAccount(Set<AccountDeviceInstance> accountDeviceInstances) {
|
||||
pinnedAccountDevices.removeAll(accountDeviceInstances);
|
||||
}
|
||||
|
||||
@ -68,7 +69,7 @@ class PinnedAccountModel {
|
||||
*
|
||||
* @param accountDeviceInstances The accounts to pin.
|
||||
*/
|
||||
void pinAccount(Set<AccountDeviceInstanceKey> accountDeviceInstances) {
|
||||
void pinAccount(Set<AccountDeviceInstance> accountDeviceInstances) {
|
||||
pinnedAccountDevices.addAll(accountDeviceInstances);
|
||||
}
|
||||
|
||||
@ -86,7 +87,7 @@ class PinnedAccountModel {
|
||||
pinnedAccountDevices.clear();
|
||||
}
|
||||
|
||||
ImmutableSet<AccountDeviceInstanceKey> getPinnedAccounts() {
|
||||
ImmutableSet<AccountDeviceInstance> getPinnedAccounts() {
|
||||
return ImmutableSet.copyOf(pinnedAccountDevices);
|
||||
}
|
||||
|
||||
|
@ -23,6 +23,7 @@ import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import org.sleuthkit.autopsy.communications.FiltersPanel.DateControlState;
|
||||
import org.sleuthkit.autopsy.coreutils.History;
|
||||
import org.sleuthkit.datamodel.AccountDeviceInstance;
|
||||
import org.sleuthkit.datamodel.CommunicationsFilter;
|
||||
|
||||
/**
|
||||
@ -51,11 +52,11 @@ final class StateManager {
|
||||
@Subscribe
|
||||
void pinAccount(CVTEvents.PinAccountsEvent pinEvent) {
|
||||
if(pinEvent.isReplace()){
|
||||
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
|
||||
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
|
||||
pinnedList.addAll(pinEvent.getAccountDeviceInstances());
|
||||
historyManager.advance(new CommunicationsState(comFilter, pinnedList, -1, currentStartState, currentEndState));
|
||||
} else {
|
||||
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
|
||||
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
|
||||
pinnedList.addAll(pinEvent.getAccountDeviceInstances());
|
||||
pinnedList.addAll(pinModel.getPinnedAccounts());
|
||||
|
||||
@ -74,7 +75,7 @@ final class StateManager {
|
||||
@Subscribe
|
||||
void unpinAccounts(CVTEvents.UnpinAccountsEvent pinEvent) {
|
||||
|
||||
HashSet<AccountDeviceInstanceKey> pinnedList = new HashSet<>();
|
||||
HashSet<AccountDeviceInstance> pinnedList = new HashSet<>();
|
||||
pinnedList.addAll(pinModel.getPinnedAccounts());
|
||||
pinnedList.removeAll(pinEvent.getAccountDeviceInstances());
|
||||
|
||||
@ -135,7 +136,7 @@ final class StateManager {
|
||||
*/
|
||||
final class CommunicationsState{
|
||||
private final CommunicationsFilter communcationFilter;
|
||||
private final Set<AccountDeviceInstanceKey> pinnedList;
|
||||
private final Set<AccountDeviceInstance> pinnedList;
|
||||
private final double zoomValue;
|
||||
private final DateControlState startDateState;
|
||||
private final DateControlState endDateState;
|
||||
@ -149,7 +150,7 @@ final class StateManager {
|
||||
* @param zoomValue Double value of the current graph scale
|
||||
*/
|
||||
protected CommunicationsState(CommunicationsFilter communcationFilter,
|
||||
Set<AccountDeviceInstanceKey> pinnedList, double zoomValue,
|
||||
Set<AccountDeviceInstance> pinnedList, double zoomValue,
|
||||
DateControlState startDateState, DateControlState endDateState){
|
||||
this.pinnedList = pinnedList;
|
||||
this.communcationFilter = communcationFilter;
|
||||
@ -172,7 +173,7 @@ final class StateManager {
|
||||
*
|
||||
* @return Set of AccountDeviceInstanceKey
|
||||
*/
|
||||
public Set<AccountDeviceInstanceKey> getPinnedList(){
|
||||
public Set<AccountDeviceInstance> getPinnedList(){
|
||||
return pinnedList;
|
||||
}
|
||||
|
||||
|
@ -1100,7 +1100,7 @@ final public class VisualizationPanel extends JPanel {
|
||||
} else {
|
||||
jPopupMenu.add(new JMenuItem(new LockAction(selectedVertices)));
|
||||
}
|
||||
if (pinnedAccountModel.isAccountPinned(adiKey)) {
|
||||
if (pinnedAccountModel.isAccountPinned(adiKey.getAccountDeviceInstance())) {
|
||||
jPopupMenu.add(UnpinAccountsAction.getInstance().getPopupPresenter());
|
||||
} else {
|
||||
jPopupMenu.add(PinAccountsAction.getInstance().getPopupPresenter());
|
||||
|
@ -1,3 +1,19 @@
|
||||
# Copyright 2014-2020 Basis Technology Corp.
|
||||
#
|
||||
# Copyright 2006-2017 ICEsoft Technologies Canada Corp.
|
||||
#
|
||||
# Licensed 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.
|
||||
#
|
||||
|
||||
FXVideoPanel.pauseButton.infoLabel.playbackErr=Unable to play video.
|
||||
FXVideoPanel.progress.bufferingCancelled=media buffering was canceled
|
||||
@ -93,3 +109,848 @@ MediaPlayerPanel.playButton.text=
|
||||
MediaPlayerPanel.infoLabel.text=No Errors
|
||||
MediaPlayerPanel.VolumeIcon.text=Volume
|
||||
MediaPlayerPanel.playBackSpeedLabel.text=Speed:
|
||||
|
||||
# The following message properties were taken from IcePDF 6.2.2 to allow
|
||||
# for Japanese translation.
|
||||
#
|
||||
|
||||
#####
|
||||
### This MessageBundle contains English text for ICEpdf View and Pilot RI's
|
||||
##
|
||||
#
|
||||
|
||||
|
||||
## Window toolbar Title
|
||||
viewer.window.title.default = ICEpdf Viewer
|
||||
viewer.window.title.open.default = ICEpdf Viewer - [{0}]
|
||||
|
||||
#status bar
|
||||
viewer.statusbar.currentPage = Page {0} / {1}
|
||||
|
||||
viewer.common.number.one = 1
|
||||
viewer.common.number.two = 2
|
||||
viewer.common.number.three = 3
|
||||
viewer.common.number.four = 4
|
||||
viewer.common.number.five = 5
|
||||
viewer.common.number.six = 6
|
||||
viewer.common.number.seven = 7
|
||||
viewer.common.number.eight = 8
|
||||
viewer.common.number.nine = 9
|
||||
viewer.common.number.ten = 10
|
||||
viewer.common.number.eleven = 11
|
||||
viewer.common.number.twelve = 12
|
||||
viewer.common.number.thirteen = 13
|
||||
viewer.common.number.fourteen = 14
|
||||
viewer.common.number.fifteen = 15
|
||||
viewer.common.number.sixteen = 16
|
||||
viewer.common.number.seventeen = 17
|
||||
viewer.common.number.eighteen = 18
|
||||
viewer.common.number.nineteen = 19
|
||||
viewer.common.number.twenty = 20
|
||||
viewer.common.number.twentyOne = 21
|
||||
viewer.common.number.twentyTwo = 22
|
||||
viewer.common.number.twentyThree = 23
|
||||
viewer.common.number.twentyFour = 24
|
||||
viewer.common.number.twentyFive = 25
|
||||
viewer.common.number.twentySix = 26
|
||||
viewer.common.number.twentySeven = 27
|
||||
viewer.common.number.thirtySix = 36
|
||||
viewer.common.number.fortyEight = 48
|
||||
|
||||
## Top Page Control Toolbar
|
||||
viewer.toolbar.hideToolBar.label = Hide Toolbar
|
||||
viewer.toolbar.showToolBar.label = Show Toolbar
|
||||
viewer.toolbar.showUtilityPane.label = Show Utility Pane
|
||||
viewer.toolbar.hideUtilityPane.label = Hide Utility Pane
|
||||
viewer.toolbar.open.label =
|
||||
viewer.toolbar.open.tooltip = Open Document
|
||||
viewer.toolbar.saveAs.label = Save As
|
||||
viewer.toolbar.saveAs.tooltip = Save As...
|
||||
viewer.toolbar.print.label = Print
|
||||
viewer.toolbar.print.tooltip = Print Document
|
||||
viewer.toolbar.search.label = Search
|
||||
viewer.toolbar.search.tooltip = Search Document
|
||||
viewer.toolbar.utilityPane.label = Utility Pane
|
||||
viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane
|
||||
viewer.toolbar.navigation.label =
|
||||
viewer.toolbar.navigation.pages.tooltip = Number of Pages
|
||||
viewer.toolbar.navigation.pages.firstPage.label =
|
||||
viewer.toolbar.navigation.current.tooltip = Current Page Number
|
||||
viewer.toolbar.navigation.current.firstPage.label =
|
||||
viewer.toolbar.navigation.firstPage.label =
|
||||
viewer.toolbar.navigation.firstPage.tooltip = First Page
|
||||
viewer.toolbar.navigation.previousPage.label =
|
||||
viewer.toolbar.navigation.previousPage.tooltip = Previous Page
|
||||
viewer.toolbar.navigation.nextPage.label =
|
||||
viewer.toolbar.navigation.nextPage.tooltip = Next Page
|
||||
viewer.toolbar.navigation.lastPage.label =
|
||||
viewer.toolbar.navigation.lastPage.tooltip = Last Page
|
||||
viewer.toolbar.pageIndicator = of {0}
|
||||
viewer.toolbar.zoom.label =
|
||||
viewer.toolbar.zoom.tooltip = Zoom
|
||||
viewer.toolbar.zoom.out.label =
|
||||
viewer.toolbar.zoom.out.tooltip = Zoom Out
|
||||
viewer.toolbar.zoom.in.label =
|
||||
viewer.toolbar.zoom.in.tooltip = Zoom In
|
||||
viewer.toolbar.pageFit.actualsize.label =
|
||||
viewer.toolbar.pageFit.actualsize.tooltip = Actual Size
|
||||
viewer.toolbar.pageFit.fitWindow.label =
|
||||
viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window
|
||||
viewer.toolbar.pageFit.fitWidth.label =
|
||||
viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width
|
||||
viewer.toolbar.rotation.left.label =
|
||||
viewer.toolbar.rotation.left.tooltip = Rotate Left
|
||||
viewer.toolbar.rotation.right.label =
|
||||
viewer.toolbar.rotation.right.tooltip = Rotate Right
|
||||
viewer.toolbar.tool.pan.label =
|
||||
viewer.toolbar.tool.pan.tooltip = Pan Tool
|
||||
viewer.toolbar.tool.text.label =
|
||||
viewer.toolbar.tool.text.tooltip = Text Select Tool
|
||||
viewer.toolbar.tool.select.label =
|
||||
viewer.toolbar.tool.select.tooltip = Select Tool
|
||||
viewer.toolbar.tool.link.label =
|
||||
viewer.toolbar.tool.link.tooltip = Link Annotation Tool
|
||||
viewer.toolbar.tool.highlight.label = Highlight
|
||||
viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool
|
||||
viewer.toolbar.tool.strikeOut.label = Strike Out
|
||||
viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool
|
||||
viewer.toolbar.tool.underline.label = Underline
|
||||
viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool
|
||||
viewer.toolbar.tool.line.label = Line
|
||||
viewer.toolbar.tool.line.tooltip = Line Annotation Tool
|
||||
viewer.toolbar.tool.lineArrow.label = Line Arrow
|
||||
viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool
|
||||
viewer.toolbar.tool.rectangle.label = Rectangle
|
||||
viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool
|
||||
viewer.toolbar.tool.circle.label = Circle
|
||||
viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool
|
||||
viewer.toolbar.tool.ink.label = Ink
|
||||
viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool
|
||||
viewer.toolbar.tool.freeText.label = Free Text
|
||||
viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool
|
||||
viewer.toolbar.tool.textAnno.label = Text Annotation
|
||||
viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool
|
||||
viewer.toolbar.tool.plolyLine.label = Poly Line
|
||||
viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool
|
||||
viewer.toolbar.tool.zoomIn.label =
|
||||
viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool
|
||||
viewer.toolbar.tool.zoomMarquis.label =
|
||||
viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool
|
||||
viewer.toolbar.tool.zoomDynamic.label =
|
||||
viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool
|
||||
viewer.toolbar.tool.zoomOut.label =
|
||||
viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool
|
||||
viewer.toolbar.pageFit.fontEngine.label =
|
||||
viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine
|
||||
viewer.toolbar.tool.forms.highlight.label = Highlight Forms
|
||||
viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting
|
||||
|
||||
## Bottom Page View Control Toolbar
|
||||
viewer.toolbar.pageView.nonContinuous.singlePage.label =
|
||||
viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous
|
||||
viewer.toolbar.pageView.nonContinuous.facingPage.label =
|
||||
viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous
|
||||
viewer.toolbar.pageView.continuous.singlePage.label =
|
||||
viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous
|
||||
viewer.toolbar.pageView.continuous.facingPage.label =
|
||||
viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous
|
||||
|
||||
|
||||
## File Menu and submenu items
|
||||
viewer.menu.file.label = File
|
||||
viewer.menu.file.mnemonic = F
|
||||
viewer.menu.open.label = Open
|
||||
viewer.menu.open.file.label = File...
|
||||
viewer.menu.open.URL.label = URL...
|
||||
viewer.menu.close.label = Close
|
||||
viewer.menu.saveAs.label = Save As...
|
||||
viewer.menu.exportText.label = Export Text...
|
||||
viewer.menu.exportSVG.label = Export SVG...
|
||||
viewer.menu.documentPermission.label = Document Permissions...
|
||||
viewer.menu.documentInformation.label = Document Information...
|
||||
viewer.menu.documentFonts.label = Document Fonts...
|
||||
viewer.menu.printSetup.label = Print Setup...
|
||||
viewer.menu.print.label = Print...
|
||||
viewer.menu.exit.label = Exit
|
||||
|
||||
## View Menu and submenu items
|
||||
viewer.menu.edit.label = Edit
|
||||
viewer.menu.edit.mnemonic = E
|
||||
viewer.menu.edit.undo.label = Undo
|
||||
viewer.menu.edit.redo.label = Redo
|
||||
viewer.menu.edit.copy.label = Copy
|
||||
viewer.menu.edit.delete.label = Delete
|
||||
viewer.menu.edit.selectAll.label = Select All
|
||||
viewer.menu.edit.deselectAll.label = Deselect All
|
||||
## View Menu and submenu items
|
||||
viewer.menu.view.label = View
|
||||
viewer.menu.view.mnemonic = V
|
||||
viewer.menu.view.actualSize.label = Actual Size
|
||||
viewer.menu.view.fitInWindow.label = Fit in Window
|
||||
viewer.menu.view.fitWidth.label = Fit Width
|
||||
viewer.menu.view.zoomIn.label = Zoom In
|
||||
viewer.menu.view.zoomOut.label = Zoom Out
|
||||
viewer.menu.view.rotateLeft.label = Rotate Left
|
||||
viewer.menu.view.rotateRight.label = Rotate Right
|
||||
viewer.menu.view.hideToolBar.label = Hide Toolbar
|
||||
viewer.menu.view.showToolBar.label = Show Toolbar
|
||||
viewer.menu.view.showUtilityPane.label = Show Utility Pane
|
||||
viewer.menu.view.hideUtilityPane.label = Hide Utility Pane
|
||||
|
||||
## Document Menu and submenu items
|
||||
viewer.menu.document.label = Document
|
||||
viewer.menu.document.mnemonic = D
|
||||
viewer.menu.document.firstPage.label = First Page
|
||||
viewer.menu.document.previousPage.label = Previous Page
|
||||
viewer.menu.document.nextPage.label = Next Page
|
||||
viewer.menu.document.lastPage.label = Last Page
|
||||
viewer.menu.document.search.label = Search...
|
||||
viewer.menu.document.gotToPage.label = Go To Page...
|
||||
|
||||
## Window Menu and submenu items
|
||||
viewer.menu.window.label = Window
|
||||
viewer.menu.window.mnemonic = W
|
||||
viewer.menu.window.minAll.label = Minimize All
|
||||
viewer.menu.window.minAll.mnemonic = M
|
||||
viewer.menu.window.frontAll.label = Bring All to Front
|
||||
viewer.menu.window.frontAll.mnemonic = B
|
||||
viewer.menu.window.1.label = 1
|
||||
viewer.menu.window.1.mnemonic = 1
|
||||
viewer.menu.window.2.label = 2
|
||||
viewer.menu.window.2.mnemonic = 2
|
||||
viewer.menu.window.3.label = 3
|
||||
viewer.menu.window.3.mnemonic = 3
|
||||
viewer.menu.window.4.label = 4
|
||||
viewer.menu.window.4.mnemonic = 4
|
||||
viewer.menu.window.5.label = 5
|
||||
viewer.menu.window.5.mnemonic = 5
|
||||
viewer.menu.window.6.label = 6
|
||||
viewer.menu.window.6.mnemonic = 6
|
||||
viewer.menu.window.7.label = 7
|
||||
viewer.menu.window.7.mnemonic = 7
|
||||
viewer.menu.window.8.label = 8
|
||||
viewer.menu.window.8.mnemonic = 8
|
||||
viewer.menu.window.9.label = 9
|
||||
viewer.menu.window.9.mnemonic = 9
|
||||
## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic
|
||||
## where X is an incrementing integer. The mnemonic should be one unique
|
||||
## character found within the label
|
||||
|
||||
## Help Menu and submenu items
|
||||
viewer.menu.help.label = Help
|
||||
viewer.menu.help.mnemonic = H
|
||||
viewer.menu.help.about.label = About ICEpdf viewer...
|
||||
|
||||
## General error dialog
|
||||
viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception
|
||||
viewer.dialog.error.exception.msg = \
|
||||
There was an error executing your command do to the following exception\n\
|
||||
{0}.
|
||||
|
||||
## Open File Dialog
|
||||
viewer.dialog.openFile.title = Open File
|
||||
viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error
|
||||
viewer.dialog.openFile.error.msg = \
|
||||
ICEpdf could not open the specified file at {0}\n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception
|
||||
viewer.dialog.openDocument.pdfException.msg = \
|
||||
ICEpdf could not open the specified file {0} \n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception
|
||||
viewer.dialog.openDocument.pdfSecurityException.msg = \
|
||||
ICEpdf could not open the encrypted file at {0}\n\
|
||||
This may be the result of an invalid password or a missing JCE Security Provider.\n\n\
|
||||
Please refer to ICEpdf Developer's Guide for more information.
|
||||
|
||||
viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception
|
||||
viewer.dialog.openDocument.exception.msg = \
|
||||
ICEpdf could not open the specified file at {0}\n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception
|
||||
viewer.dialog.openURL.exception.msg = \
|
||||
ICEpdf could not open the specified file. {0} \n\
|
||||
at URL: {1}
|
||||
viewer.dialog.openURL.downloading.msg = Downloading {0}
|
||||
|
||||
## General error dialog
|
||||
viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information
|
||||
viewer.dialog.information.copyAll.msg = \
|
||||
The document has more than {0} pages, please use\n\
|
||||
"Export text..." to extract document text.
|
||||
|
||||
## Open URL Dialog
|
||||
viewer.dialog.security.title = Document Security
|
||||
viewer.dialog.security.msg = This PDF is protected
|
||||
viewer.dialog.security.password.label = Password:
|
||||
viewer.dialog.security.okButton.label = Ok
|
||||
viewer.dialog.security.okButton.mnemonic = O
|
||||
viewer.dialog.security.cancelButton.label = Cancel
|
||||
viewer.dialog.security.cancelButton.mnemonic = C
|
||||
|
||||
|
||||
## Open URL Dialog
|
||||
viewer.dialog.openURL.title = Open URL
|
||||
|
||||
### Save a Copy Dialog
|
||||
viewer.dialog.saveAs.title = Save As
|
||||
viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.extensionError.msg = \
|
||||
ICEpdf could not save to {0} because it is not a supported file type.
|
||||
viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension.
|
||||
viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.noneUniqueName.msg = \
|
||||
The file named {0} already exists. Please specify a unique name.
|
||||
viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error
|
||||
viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document.
|
||||
viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI
|
||||
viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO.
|
||||
viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI
|
||||
viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}?
|
||||
|
||||
## Export Text Dialog
|
||||
viewer.dialog.exportText.title = Export Document Text
|
||||
viewer.dialog.exportText.progress.msg = Extracting PDF Text
|
||||
viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension.
|
||||
# Text extraction output file
|
||||
viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc.
|
||||
viewer.exportText.pageStamp.msg = <!----- Page {0} Text ---->
|
||||
# Completed x out of y page(s).
|
||||
viewer.exportText.fileStamp.progress.msg = \
|
||||
Completed {0} out of {1}.
|
||||
viewer.exportText.fileStamp.progress.oneFile.msg = {2} page
|
||||
viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages
|
||||
|
||||
## Export SVG Dialog
|
||||
viewer.dialog.exportSVG.title = Export to SVG
|
||||
viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ...
|
||||
viewer.dialog.exportSVG.status.error.msg = \
|
||||
Problem exporting page {0} to SVG file {1} : {2}
|
||||
viewer.dialog.exportSVG.status.finished.msg = \
|
||||
Finished exporting page {0} to SVG file {1}
|
||||
viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error
|
||||
viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension.
|
||||
viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error
|
||||
viewer.dialog.exportSVG.exportError.msg = \
|
||||
ICEpdf could not export to {0} \n\
|
||||
becuase it is either not a supported file type or \n\
|
||||
because the file has been corrupted.
|
||||
|
||||
# Printing Progress bar
|
||||
viewer.dialog.printing.status.progress.msg = Page {0} of {1}
|
||||
viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer
|
||||
|
||||
|
||||
## Document Permissions Dialog
|
||||
viewer.dialog.documentPermissions.title = Document Permissions
|
||||
viewer.dialog.documentPermissions.securityMethod.label = Security Method:
|
||||
viewer.dialog.documentPermissions.userPassword.label = User Password:
|
||||
viewer.dialog.documentPermissions.ownerPassword.label = Owner Password:
|
||||
viewer.dialog.documentPermissions.printing.label = Printing:
|
||||
viewer.dialog.documentPermissions.changing.label = Changing the Document:
|
||||
viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction:
|
||||
viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields:
|
||||
viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing:
|
||||
viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled:
|
||||
viewer.dialog.documentPermissions.assembly.label = Document Assembly:
|
||||
viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level:
|
||||
viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2}
|
||||
viewer.dialog.documentPermissions.none = None
|
||||
viewer.dialog.documentPermissions.no = No
|
||||
viewer.dialog.documentPermissions.yes = Yes
|
||||
viewer.dialog.documentPermissions.allowed = Allowed
|
||||
viewer.dialog.documentPermissions.notAllowed = Not Allowed
|
||||
viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed
|
||||
viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security
|
||||
viewer.dialog.documentPermissions.partial = Partial (Low Quality)
|
||||
|
||||
|
||||
## Document Information Dialog
|
||||
viewer.dialog.documentInformation.title = Document Information
|
||||
viewer.dialog.documentInformation.title.label = Title:
|
||||
viewer.dialog.documentInformation.subject.label = Subject:
|
||||
viewer.dialog.documentInformation.author.label = Author:
|
||||
viewer.dialog.documentInformation.keywords.label = Keywords:
|
||||
viewer.dialog.documentInformation.creator.label = Creator:
|
||||
viewer.dialog.documentInformation.producer.label = Producer:
|
||||
viewer.dialog.documentInformation.created.label = Created:
|
||||
viewer.dialog.documentInformation.modified.label = Modified:
|
||||
viewer.dialog.documentInformation.notAvailable = Not Available
|
||||
|
||||
## Go to Page Dialog
|
||||
viewer.dialog.goToPage.title = Go to Page...
|
||||
viewer.dialog.goToPage.description.label = Page Number
|
||||
|
||||
## About Dialog
|
||||
viewer.dialog.about.title = About ICEpdf Viewer
|
||||
viewer.dialog.about.pageNumber.label = \n\
|
||||
\n\
|
||||
Check the ICEpdf web site for the latest news:\n\
|
||||
http://www.icepdf.org/ \n\n
|
||||
|
||||
## Font Properties Dialog
|
||||
viewer.dialog.fonts.title = Document Font Properties
|
||||
viewer.dialog.fonts.border.label = Fonts used by this document
|
||||
viewer.dialog.fonts.info.type.label = Type: {0}
|
||||
viewer.dialog.fonts.info.encoding.label = Encoding: {0}
|
||||
viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0}
|
||||
viewer.dialog.fonts.info.substitution.path.label = Path: {0}
|
||||
viewer.dialog.fonts.searching.label = Collecting font data ({0}%).
|
||||
viewer.dialog.fonts.resetCache.label = Reset Cache
|
||||
viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts.
|
||||
|
||||
## Utility Pane Bookmarks Tab
|
||||
viewer.utilityPane.bookmarks.tab.title = Bookmarks
|
||||
|
||||
## Utility Pane Bookmarks Tab
|
||||
viewer.utilityPane.attachments.tab.title = Attachments
|
||||
viewer.utilityPane.attachments.column.fileName.title = Name
|
||||
viewer.utilityPane.attachments.column.description.title = Description
|
||||
viewer.utilityPane.attachments.column.modified.title = Modified
|
||||
viewer.utilityPane.attachments.column.size.title = Size
|
||||
viewer.utilityPane.attachments.column.compressedSize.title = Compressed size
|
||||
viewer.utilityPane.attachments.menu.saveAs.label = Save As...
|
||||
viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.utilityPane.attachments.saveAs.replace.msg = \
|
||||
The file named {0} already exists. Do you want to replace It?
|
||||
|
||||
## Utility Pane Thumbnails
|
||||
viewer.utilityPane.thumbs.tab.title = Thumbnails
|
||||
|
||||
## Layers Pane
|
||||
viewer.utilityPane.layers.tab.title = Layers
|
||||
|
||||
## Signature Pane
|
||||
viewer.utilityPane.signatures.tab.title = Signatures
|
||||
viewer.utilityPane.signatures.tab.certTree.error.label = \
|
||||
Unsigned Signature Fields Signer certificate could not be validated {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid:
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid:
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown:
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \
|
||||
This version of the document is unaltered but subsequent changes have been made
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \
|
||||
Signer's identity is unknown because it could not be found in your keystore
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \
|
||||
Signature is valid, but revocation of the signer's identity could not be checked
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \
|
||||
Signature included an embedded timestamp but it could not be validated
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details...
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields
|
||||
|
||||
## Signature certificate view dialog.
|
||||
viewer.utilityPane.signatures.cert.dialog.title = Certificate Details
|
||||
viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close
|
||||
viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C
|
||||
viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A
|
||||
viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject
|
||||
viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer
|
||||
viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field
|
||||
viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value
|
||||
viewer.utilityPane.signatures.cert.dialog.info.version.label = Version
|
||||
viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number
|
||||
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer
|
||||
viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \
|
||||
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity
|
||||
viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject
|
||||
viewer.utilityPane.signatures.cert.dialog.info.subject.value = \
|
||||
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature
|
||||
viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint
|
||||
viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint
|
||||
viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0}
|
||||
viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures
|
||||
viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete
|
||||
viewer.utilityPane.signatures.verify.validating.label = Validating signature...
|
||||
## Annotation Tab
|
||||
viewer.utilityPane.annotation.tab.title = Annotations
|
||||
## Utility Pane Annotation Link Tab
|
||||
viewer.utilityPane.annotation.link.appearance.title = Link Annotation
|
||||
viewer.utilityPane.annotation.link.highlightType = Highlight Style:
|
||||
viewer.utilityPane.annotation.link.none = None
|
||||
viewer.utilityPane.annotation.link.invert = Invert`
|
||||
viewer.utilityPane.annotation.link.outline = Outline
|
||||
viewer.utilityPane.annotation.link.push = Push
|
||||
|
||||
## Utility Pane Annotation text markup Tab
|
||||
viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation
|
||||
viewer.utilityPane.annotation.textMarkup.highlightType = Type:
|
||||
viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color
|
||||
viewer.utilityPane.annotation.textMarkup.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation line Tab
|
||||
viewer.utilityPane.annotation.line.appearance.title = Line Annotation
|
||||
viewer.utilityPane.annotation.line.lineThickness = Line Thickness:
|
||||
viewer.utilityPane.annotation.line.lineStyle = Line Style:
|
||||
viewer.utilityPane.annotation.line.startStyle = Start:
|
||||
viewer.utilityPane.annotation.line.endStyle = End:
|
||||
viewer.utilityPane.annotation.line.colorChooserTitle = Line Color
|
||||
viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color
|
||||
viewer.utilityPane.annotation.line.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.line.end.none = None
|
||||
viewer.utilityPane.annotation.line.end.openArrow = Open Arrow
|
||||
viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow
|
||||
viewer.utilityPane.annotation.line.end.diamond = Diamond
|
||||
viewer.utilityPane.annotation.line.end.square = Square
|
||||
viewer.utilityPane.annotation.line.end.circle = Circle
|
||||
viewer.utilityPane.annotation.line.transparencyLabel = Transparency:
|
||||
|
||||
## Utility Pane Annotation square Tab
|
||||
viewer.utilityPane.annotation.square.appearance.title = Square Annotation
|
||||
viewer.utilityPane.annotation.square.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.square.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color
|
||||
viewer.utilityPane.annotation.square.borderTypeLabel = Border Type:
|
||||
viewer.utilityPane.annotation.square.colorBorderLabel = Border Color:
|
||||
viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type:
|
||||
viewer.utilityPane.annotation.square.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation free text Tab
|
||||
viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation
|
||||
viewer.utilityPane.annotation.freeText.font.name = Font Name:
|
||||
viewer.utilityPane.annotation.freeText.font.style = Font Style:
|
||||
viewer.utilityPane.annotation.freeText.font.size = Font Size:
|
||||
viewer.utilityPane.annotation.freeText.font.color = Font Color:
|
||||
viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color
|
||||
viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.freeText.border.type = Border Type:
|
||||
viewer.utilityPane.annotation.freeText.border.style = Border Style:
|
||||
viewer.utilityPane.annotation.freeText.border.color = Border Color:
|
||||
viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.freeText.fill.type = Fill Type:
|
||||
viewer.utilityPane.annotation.freeText.fill.color = Fill Color:
|
||||
viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency:
|
||||
viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color
|
||||
viewer.utilityPane.annotation.freeText.font.dialog = Dialog
|
||||
viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput
|
||||
viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced
|
||||
viewer.utilityPane.annotation.freeText.font.serif = Serif
|
||||
viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif
|
||||
viewer.utilityPane.annotation.freeText.font.style.plain = Plain
|
||||
viewer.utilityPane.annotation.freeText.font.style.italic = Italic
|
||||
viewer.utilityPane.annotation.freeText.font.style.bold = Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica
|
||||
viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman
|
||||
viewer.utilityPane.annotation.freeText.font.name.courier = Courier
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold
|
||||
|
||||
## Utility Pane Annotation text Tab
|
||||
viewer.utilityPane.annotation.text.appearance.title = Text Annotation
|
||||
viewer.utilityPane.annotation.text.iconName = Icon:
|
||||
viewer.utilityPane.annotation.text.iconName.comment = Comment
|
||||
viewer.utilityPane.annotation.text.iconName.check = Check
|
||||
viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark
|
||||
viewer.utilityPane.annotation.text.iconName.circle = Circle
|
||||
viewer.utilityPane.annotation.text.iconName.cross = Cross
|
||||
viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs
|
||||
viewer.utilityPane.annotation.text.iconName.help = Help
|
||||
viewer.utilityPane.annotation.text.iconName.insert = Insert
|
||||
viewer.utilityPane.annotation.text.iconName.key = Key
|
||||
viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph
|
||||
viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph
|
||||
viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow
|
||||
viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer
|
||||
viewer.utilityPane.annotation.text.iconName.star = Star
|
||||
viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow
|
||||
viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow
|
||||
|
||||
## Utility Pane Annotation circle Tab
|
||||
viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation
|
||||
viewer.utilityPane.annotation.circle.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.circle.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color
|
||||
viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color:
|
||||
viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type:
|
||||
viewer.utilityPane.annotation.circle.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation ink Tab
|
||||
viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation
|
||||
viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness:
|
||||
viewer.utilityPane.annotation.ink.lineStyle = Ink Style:
|
||||
viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color
|
||||
viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color:
|
||||
viewer.utilityPane.annotation.ink.transparencyLabel = Transparency:
|
||||
## Utility Pane border Tab
|
||||
viewer.utilityPane.annotation.border.title = Border
|
||||
viewer.utilityPane.annotation.border.linkType = Border Type:
|
||||
viewer.utilityPane.annotation.border.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.border.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.border.colorChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.border.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible
|
||||
viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible
|
||||
viewer.utilityPane.annotation.border.solid = Solid
|
||||
viewer.utilityPane.annotation.border.dashed = Dashed
|
||||
viewer.utilityPane.annotation.border.beveled = Beveled
|
||||
viewer.utilityPane.annotation.border.inset = Inset
|
||||
viewer.utilityPane.annotation.border.underline = Underline
|
||||
## Utility Pane border Tab
|
||||
viewer.utilityPane.annotation.flags.title = Flags
|
||||
viewer.utilityPane.annotation.flags.noRotate = No Rotate:
|
||||
viewer.utilityPane.annotation.flags.noZoom = No Zoom:
|
||||
viewer.utilityPane.annotation.flags.readOnly = Read Only:
|
||||
viewer.utilityPane.annotation.flags.printable = Printable:
|
||||
viewer.utilityPane.annotation.flags.yes = Printable:
|
||||
viewer.utilityPane.annotation.flags.enabled = Enabled
|
||||
viewer.utilityPane.annotation.flags.disabled = Disabled
|
||||
## annotation action pane and dialogs.
|
||||
viewer.utilityPane.action.selectionTitle = Action
|
||||
viewer.utilityPane.action.addAction = Add
|
||||
viewer.utilityPane.action.editAction = Edit
|
||||
viewer.utilityPane.action.removeAction = Remove
|
||||
viewer.utilityPane.action.type.destination.label = Destination
|
||||
viewer.utilityPane.action.type.uriAction.label = URI Action
|
||||
viewer.utilityPane.action.type.goToAction.label = GoTo Action
|
||||
viewer.utilityPane.action.type.launchAction.label = Launch Action
|
||||
viewer.utilityPane.action.dialog.new.title = Add New Action
|
||||
viewer.utilityPane.action.dialog.new.msgs = Action Type:
|
||||
viewer.utilityPane.action.dialog.delete.title = Delete Confirmation
|
||||
viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action?
|
||||
## uri action dialog test
|
||||
viewer.utilityPane.action.dialog.uri.title = URI Action Properties
|
||||
viewer.utilityPane.action.dialog.uri.msgs = URI:
|
||||
## launch action dialog test
|
||||
viewer.utilityPane.action.dialog.launch.title = Launch Action Properties
|
||||
viewer.utilityPane.action.dialog.launch.msgs = File Path:
|
||||
## GoTo action dialog text
|
||||
viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties
|
||||
viewer.utilityPane.action.dialog.goto.page.label = Page:
|
||||
viewer.utilityPane.action.dialog.goto.type.label = Type
|
||||
viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute
|
||||
viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page
|
||||
viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width
|
||||
viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width
|
||||
viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box
|
||||
viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds
|
||||
viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top
|
||||
viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left
|
||||
viewer.utilityPane.action.dialog.goto.right.label = Right:
|
||||
viewer.utilityPane.action.dialog.goto.left.label = Left:
|
||||
viewer.utilityPane.action.dialog.goto.top.label = Top:
|
||||
viewer.utilityPane.action.dialog.goto.bottom.label = Bottom:
|
||||
viewer.utilityPane.action.dialog.goto.zoom.label = Zoom:
|
||||
viewer.utilityPane.action.dialog.goto.unassigned.label = NaN
|
||||
viewer.utilityPane.action.dialog.goto.current.label = Current View:
|
||||
viewer.utilityPane.action.dialog.goto.current = Set Location
|
||||
viewer.utilityPane.action.dialog.goto.name.label = Name:
|
||||
viewer.utilityPane.action.dialog.goto.browse = Browse...
|
||||
viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination
|
||||
viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination
|
||||
# Destination Named Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1}
|
||||
|
||||
## Utility Pane Search Tab
|
||||
viewer.utilityPane.search.tab.title = Search
|
||||
viewer.utilityPane.search.searchText.label = Search Text:
|
||||
viewer.utilityPane.search.results.label = Results:
|
||||
viewer.utilityPane.search.searchButton.label = Search
|
||||
viewer.utilityPane.search.clearSearchButton.label = Clear
|
||||
viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive
|
||||
viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only
|
||||
viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative
|
||||
viewer.utilityPane.search.showPagesCheckbox.label = Show Pages
|
||||
viewer.utilityPane.search.stopButton.label = Stop
|
||||
viewer.utilityPane.search.searching.msg = Search...
|
||||
# Searching x out of y page(s)
|
||||
viewer.utilityPane.search.searching1.msg = \
|
||||
Searching {0} out of {1}
|
||||
viewer.utilityPane.search.searching1.oneFile.msg = {2} page
|
||||
viewer.utilityPane.search.searching1.moreFile.msg = {2} pages
|
||||
# Page x (y result(s))
|
||||
viewer.utilityPane.search.result.msg = Page {0} ({1})
|
||||
viewer.utilityPane.search.result.oneFile.msg = {2} result
|
||||
viewer.utilityPane.search.result.moreFile.msg = {2} results
|
||||
# Searched x page(s) (y matches)
|
||||
viewer.utilityPane.search.progress.msg = \
|
||||
Searched {0} {1} ({2})
|
||||
viewer.utilityPane.search.progress.onePage.msg = page
|
||||
viewer.utilityPane.search.progress.morePage.msg = pages
|
||||
viewer.utilityPane.search.progress.oneMatch.msg = {2} match
|
||||
viewer.utilityPane.search.progress.moreMatch.msg = {2} matches
|
||||
|
||||
## Popup Annotation component
|
||||
viewer.annotation.popup.reply.label = Reply
|
||||
viewer.annotation.popup.delete.label = Delete
|
||||
viewer.annotation.popup.status.label = Set Status
|
||||
viewer.annotation.popup.status.accepted.label = Accepted
|
||||
viewer.annotation.popup.status.cancelled.label = Cancelled
|
||||
viewer.annotation.popup.status.completed.label = Completed
|
||||
viewer.annotation.popup.status.rejected.label = Rejected
|
||||
viewer.annotation.popup.status.none.label = None
|
||||
viewer.annotation.popup.openAll.label = Open all Popups
|
||||
viewer.annotation.popup.minimizeAll.label = Minimize Popups
|
||||
viewer.annotation.popup.replyTo.label = Re: {0}
|
||||
viewer.annotation.popup.status.none.title = None: {0}
|
||||
viewer.annotation.popup.status.none.msg = None set by {0}
|
||||
viewer.annotation.popup.status.accepted.title = Accepted: {0}
|
||||
viewer.annotation.popup.status.accepted.msg = Accepted set by {0}
|
||||
viewer.annotation.popup.status.cancelled.title = Cancelled: {0}
|
||||
viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0}
|
||||
viewer.annotation.popup.status.completed.title = Completed: {0}
|
||||
viewer.annotation.popup.status.completed.msg = Completed set by {0}
|
||||
viewer.annotation.popup.status.rejected.title = Rejected: {0}
|
||||
viewer.annotation.popup.status.rejected.msg = Rejected set by {0}
|
||||
|
||||
## Signature component
|
||||
viewer.annotation.signature.menu.validateSignature.label = Validate Signature
|
||||
viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties
|
||||
viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties
|
||||
viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page...
|
||||
|
||||
## Signature validation dialog.
|
||||
viewer.annotation.signature.validation.dialog.title = Signature Validation Summary
|
||||
viewer.annotation.signature.validation.dialog.close.button.label = Close
|
||||
viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties...
|
||||
# common validation messages
|
||||
viewer.annotation.signature.validation.common.invalid.label = Signature is invalid:
|
||||
viewer.annotation.signature.validation.common.unknown.label = Signature is valid:
|
||||
viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown:
|
||||
viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1}
|
||||
viewer.annotation.signature.validation.common.doc.modified.label = \
|
||||
- This version of the document is unaltered but subsequent changes have been made
|
||||
viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed
|
||||
viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed
|
||||
viewer.annotation.signature.validation.common.identity.unknown.label = \
|
||||
- Signer's identity is unknown because it could not be found in your keystore
|
||||
viewer.annotation.signature.validation.common.identity.unchecked.label = \
|
||||
- Signature is valid, but revocation of the signer's identity could not be checked
|
||||
viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid
|
||||
viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer
|
||||
viewer.annotation.signature.validation.common.time.embedded.label = \
|
||||
- Signature included an embedded timestamp but it could not be validated
|
||||
viewer.annotation.signature.validation.common.notAvailable.label = N/A
|
||||
|
||||
## Signatures properties Dialog.
|
||||
viewer.annotation.signature.properties.dialog.title = Signature Properties
|
||||
viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid
|
||||
viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid
|
||||
viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown
|
||||
viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1}
|
||||
viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0}
|
||||
viewer.annotation.signature.properties.dialog.reason.label = Reason: {0}
|
||||
viewer.annotation.signature.properties.dialog.location.label = Location: {0}
|
||||
# SignatureSigner Info
|
||||
viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful.
|
||||
viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful.
|
||||
viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked.
|
||||
viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed.
|
||||
viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired.
|
||||
viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate...
|
||||
viewer.annotation.signature.properties.dialog.validity.title = Validity Summary
|
||||
viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info
|
||||
|
||||
## Common Button Labels
|
||||
viewer.button.ok.label = Ok
|
||||
viewer.button.ok.mnemonic = O
|
||||
viewer.button.cancel.label = Cancel
|
||||
viewer.button.cancel.mnemonic = C
|
||||
|
||||
## Pilot Specific Mesages
|
||||
pilot.title = ICEbrowser - ICEpdf Pilot Errror
|
||||
pilot.loading.msg =Opening document {0} ...
|
||||
pilot.display.msg = Displaying {0}
|
||||
pilot.loading.error.msg = PDF Pilot: Failed to load {0}.
|
||||
pilot.error.classLoading = Required class {0} not found. Required library \
|
||||
'icepdf.jar' may not be on the classpath - PDF Pilot disabled.";
|
||||
|
||||
###
|
||||
# General Error Messages
|
||||
|
||||
|
||||
# Command Line Errors
|
||||
viewer.commandLin.error = \
|
||||
Usage: java org.icepdf.ri.viewer.Main [-loadfile <value>] [-loadurl <value>]
|
||||
# Launcher errors
|
||||
viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf
|
||||
viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}.
|
||||
viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform.
|
||||
|
||||
# Pilot Loading Errors
|
||||
|
||||
|
||||
### parser error dialogs
|
||||
parse.title = Properties Parsing Error
|
||||
parse.integer = Warning : {0} is not a correct integer.
|
||||
parse.float = Warning : {0} is not a correct float.
|
||||
parse.double = Warning : {0} is not a correct double.
|
||||
parse.choice = Warning : {0} is not a valid choice.
|
||||
parse.laf = Warning : look-and-feel {0} is not supported.
|
||||
|
||||
### Properties Manager Errors
|
||||
manager.properties.title = ICEpdf Properties Manager
|
||||
fontManager.properties.title = ICEpdf Font Manager
|
||||
|
||||
manager.properties.createNewDirectory = \
|
||||
To create the directory {0},\n\
|
||||
where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\
|
||||
If you click "No", all changes you make to the ICEpdf Viewer setup\n\
|
||||
will be lost when you quit the application. \n\n
|
||||
|
||||
manager.properties.failedCreation = \
|
||||
ICEpdf Viewer directory to store user data can not be created:\n\
|
||||
{0}\n\
|
||||
ICEpdf Viewer will not save changes to its default setup.
|
||||
|
||||
manager.properties.session.nolock = \
|
||||
Error creating the lock file :\n\
|
||||
{0}\n
|
||||
|
||||
manager.properties.session.readError = \
|
||||
Error loading properties file: \n\
|
||||
{0}
|
||||
|
||||
manager.properties.deleted = Property file has been deleted\n\
|
||||
({0})\n\
|
||||
Recreate it ?
|
||||
|
||||
manager.properties.modified = Property file has been modified since last update\n\
|
||||
({0,date,long})\n\
|
||||
Would you like to merge changes in the file with the current properties?
|
||||
|
||||
manager.properties.saveError = Impossible to save property file.\n\
|
||||
Encountered the folowing error :\n\
|
||||
{0}
|
||||
|
||||
manager.properties.lafError =\
|
||||
Look&Feel {0} given in the default properties is unsupported.\n\
|
||||
Using system default.
|
||||
|
||||
manager.properties.brokenProperty = Broken default property {0} value: {1}
|
||||
|
||||
manager.properties.missingProperty = Missing default property {0} value: {1}
|
@ -1,3 +1,19 @@
|
||||
# Copyright 2014-2020 Basis Technology Corp.
|
||||
#
|
||||
# Copyright 2006-2017 ICEsoft Technologies Canada Corp.
|
||||
#
|
||||
# Licensed 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.
|
||||
#
|
||||
|
||||
AnnotationsContentViewer.centralRepositoryEntryDataLabel.case=Case:
|
||||
AnnotationsContentViewer.centralRepositoryEntryDataLabel.comment=Comment:
|
||||
@ -167,6 +183,17 @@ MediaPlayerPanel.playButton.text=
|
||||
MediaPlayerPanel.infoLabel.text=No Errors
|
||||
MediaPlayerPanel.VolumeIcon.text=Volume
|
||||
MediaPlayerPanel.playBackSpeedLabel.text=Speed:
|
||||
|
||||
# The following message properties were taken from IcePDF 6.2.2 to allow
|
||||
# for Japanese translation.
|
||||
#
|
||||
|
||||
#####
|
||||
### This MessageBundle contains English text for ICEpdf View and Pilot RI's
|
||||
##
|
||||
#
|
||||
|
||||
|
||||
# {0} - tableName
|
||||
SQLiteViewer.readTable.errorText=Error getting rows for table: {0}
|
||||
# {0} - tableName
|
||||
@ -175,3 +202,837 @@ TranslatablePanel.comboBoxOption.originalText=Original Text
|
||||
TranslatablePanel.comboBoxOption.translatedText=Translated Text
|
||||
# {0} - exception message
|
||||
TranslatablePanel.onSetContentError.text=There was an error displaying the text: {0}
|
||||
## Window toolbar Title
|
||||
viewer.window.title.default = ICEpdf Viewer
|
||||
viewer.window.title.open.default = ICEpdf Viewer - [{0}]
|
||||
|
||||
#status bar
|
||||
viewer.statusbar.currentPage = Page {0} / {1}
|
||||
|
||||
viewer.common.number.one = 1
|
||||
viewer.common.number.two = 2
|
||||
viewer.common.number.three = 3
|
||||
viewer.common.number.four = 4
|
||||
viewer.common.number.five = 5
|
||||
viewer.common.number.six = 6
|
||||
viewer.common.number.seven = 7
|
||||
viewer.common.number.eight = 8
|
||||
viewer.common.number.nine = 9
|
||||
viewer.common.number.ten = 10
|
||||
viewer.common.number.eleven = 11
|
||||
viewer.common.number.twelve = 12
|
||||
viewer.common.number.thirteen = 13
|
||||
viewer.common.number.fourteen = 14
|
||||
viewer.common.number.fifteen = 15
|
||||
viewer.common.number.sixteen = 16
|
||||
viewer.common.number.seventeen = 17
|
||||
viewer.common.number.eighteen = 18
|
||||
viewer.common.number.nineteen = 19
|
||||
viewer.common.number.twenty = 20
|
||||
viewer.common.number.twentyOne = 21
|
||||
viewer.common.number.twentyTwo = 22
|
||||
viewer.common.number.twentyThree = 23
|
||||
viewer.common.number.twentyFour = 24
|
||||
viewer.common.number.twentyFive = 25
|
||||
viewer.common.number.twentySix = 26
|
||||
viewer.common.number.twentySeven = 27
|
||||
viewer.common.number.thirtySix = 36
|
||||
viewer.common.number.fortyEight = 48
|
||||
|
||||
## Top Page Control Toolbar
|
||||
viewer.toolbar.hideToolBar.label = Hide Toolbar
|
||||
viewer.toolbar.showToolBar.label = Show Toolbar
|
||||
viewer.toolbar.showUtilityPane.label = Show Utility Pane
|
||||
viewer.toolbar.hideUtilityPane.label = Hide Utility Pane
|
||||
viewer.toolbar.open.label =
|
||||
viewer.toolbar.open.tooltip = Open Document
|
||||
viewer.toolbar.saveAs.label = Save As
|
||||
viewer.toolbar.saveAs.tooltip = Save As...
|
||||
viewer.toolbar.print.label = Print
|
||||
viewer.toolbar.print.tooltip = Print Document
|
||||
viewer.toolbar.search.label = Search
|
||||
viewer.toolbar.search.tooltip = Search Document
|
||||
viewer.toolbar.utilityPane.label = Utility Pane
|
||||
viewer.toolbar.utilityPane.tooltip = Show/Hide Utility Pane
|
||||
viewer.toolbar.navigation.label =
|
||||
viewer.toolbar.navigation.pages.tooltip = Number of Pages
|
||||
viewer.toolbar.navigation.pages.firstPage.label =
|
||||
viewer.toolbar.navigation.current.tooltip = Current Page Number
|
||||
viewer.toolbar.navigation.current.firstPage.label =
|
||||
viewer.toolbar.navigation.firstPage.label =
|
||||
viewer.toolbar.navigation.firstPage.tooltip = First Page
|
||||
viewer.toolbar.navigation.previousPage.label =
|
||||
viewer.toolbar.navigation.previousPage.tooltip = Previous Page
|
||||
viewer.toolbar.navigation.nextPage.label =
|
||||
viewer.toolbar.navigation.nextPage.tooltip = Next Page
|
||||
viewer.toolbar.navigation.lastPage.label =
|
||||
viewer.toolbar.navigation.lastPage.tooltip = Last Page
|
||||
viewer.toolbar.pageIndicator = of {0}
|
||||
viewer.toolbar.zoom.label =
|
||||
viewer.toolbar.zoom.tooltip = Zoom
|
||||
viewer.toolbar.zoom.out.label =
|
||||
viewer.toolbar.zoom.out.tooltip = Zoom Out
|
||||
viewer.toolbar.zoom.in.label =
|
||||
viewer.toolbar.zoom.in.tooltip = Zoom In
|
||||
viewer.toolbar.pageFit.actualsize.label =
|
||||
viewer.toolbar.pageFit.actualsize.tooltip = Actual Size
|
||||
viewer.toolbar.pageFit.fitWindow.label =
|
||||
viewer.toolbar.pageFit.fitWindow.tooltip = Fit in Window
|
||||
viewer.toolbar.pageFit.fitWidth.label =
|
||||
viewer.toolbar.pageFit.fitWidth.tooltip = Fit Width
|
||||
viewer.toolbar.rotation.left.label =
|
||||
viewer.toolbar.rotation.left.tooltip = Rotate Left
|
||||
viewer.toolbar.rotation.right.label =
|
||||
viewer.toolbar.rotation.right.tooltip = Rotate Right
|
||||
viewer.toolbar.tool.pan.label =
|
||||
viewer.toolbar.tool.pan.tooltip = Pan Tool
|
||||
viewer.toolbar.tool.text.label =
|
||||
viewer.toolbar.tool.text.tooltip = Text Select Tool
|
||||
viewer.toolbar.tool.select.label =
|
||||
viewer.toolbar.tool.select.tooltip = Select Tool
|
||||
viewer.toolbar.tool.link.label =
|
||||
viewer.toolbar.tool.link.tooltip = Link Annotation Tool
|
||||
viewer.toolbar.tool.highlight.label = Highlight
|
||||
viewer.toolbar.tool.highlight.tooltip = Highlight Annotation Tool
|
||||
viewer.toolbar.tool.strikeOut.label = Strike Out
|
||||
viewer.toolbar.tool.strikeOut.tooltip = Strike Out Annotation Tool
|
||||
viewer.toolbar.tool.underline.label = Underline
|
||||
viewer.toolbar.tool.underline.tooltip = Underline Annotation Tool
|
||||
viewer.toolbar.tool.line.label = Line
|
||||
viewer.toolbar.tool.line.tooltip = Line Annotation Tool
|
||||
viewer.toolbar.tool.lineArrow.label = Line Arrow
|
||||
viewer.toolbar.tool.lineArrow.tooltip = Line Arrow Annotation Tool
|
||||
viewer.toolbar.tool.rectangle.label = Rectangle
|
||||
viewer.toolbar.tool.rectangle.tooltip = Rectangle Annotation Tool
|
||||
viewer.toolbar.tool.circle.label = Circle
|
||||
viewer.toolbar.tool.circle.tooltip = Circle Annotation Tool
|
||||
viewer.toolbar.tool.ink.label = Ink
|
||||
viewer.toolbar.tool.ink.tooltip = Ink Annotation Tool
|
||||
viewer.toolbar.tool.freeText.label = Free Text
|
||||
viewer.toolbar.tool.freeText.tooltip = Free Text Annotation Tool
|
||||
viewer.toolbar.tool.textAnno.label = Text Annotation
|
||||
viewer.toolbar.tool.textAnno.tooltip = Text Annotation Tool
|
||||
viewer.toolbar.tool.plolyLine.label = Poly Line
|
||||
viewer.toolbar.tool.plolyLine.tooltip = Poly Line Annotation Tool
|
||||
viewer.toolbar.tool.zoomIn.label =
|
||||
viewer.toolbar.tool.zoomIn.tooltip = Zoom In Tool
|
||||
viewer.toolbar.tool.zoomMarquis.label =
|
||||
viewer.toolbar.tool.zoomMarquis.tooltip = Zoom Marquee Tool
|
||||
viewer.toolbar.tool.zoomDynamic.label =
|
||||
viewer.toolbar.tool.zoomDynamic.tooltip = Zoom Dynamic Tool
|
||||
viewer.toolbar.tool.zoomOut.label =
|
||||
viewer.toolbar.tool.zoomOut.tooltip = Zoom Out Tool
|
||||
viewer.toolbar.pageFit.fontEngine.label =
|
||||
viewer.toolbar.pageFit.fontEngine.tooltip = Enable/Disable Font Engine
|
||||
viewer.toolbar.tool.forms.highlight.label = Highlight Forms
|
||||
viewer.toolbar.tool.forms.highlight.tooltip = Show/Hide Form Highlighting
|
||||
|
||||
## Bottom Page View Control Toolbar
|
||||
viewer.toolbar.pageView.nonContinuous.singlePage.label =
|
||||
viewer.toolbar.pageView.nonContinuous.singlePage.tooltip = Single Page View Non-Continuous
|
||||
viewer.toolbar.pageView.nonContinuous.facingPage.label =
|
||||
viewer.toolbar.pageView.nonContinuous.facingPage.tooltip = Facing Page View Non-Continuous
|
||||
viewer.toolbar.pageView.continuous.singlePage.label =
|
||||
viewer.toolbar.pageView.continuous.singlePage.tooltip = Single Page View Continuous
|
||||
viewer.toolbar.pageView.continuous.facingPage.label =
|
||||
viewer.toolbar.pageView.continuous.facingPage.tooltip = Facing Page View Continuous
|
||||
|
||||
|
||||
## File Menu and submenu items
|
||||
viewer.menu.file.label = File
|
||||
viewer.menu.file.mnemonic = F
|
||||
viewer.menu.open.label = Open
|
||||
viewer.menu.open.file.label = File...
|
||||
viewer.menu.open.URL.label = URL...
|
||||
viewer.menu.close.label = Close
|
||||
viewer.menu.saveAs.label = Save As...
|
||||
viewer.menu.exportText.label = Export Text...
|
||||
viewer.menu.exportSVG.label = Export SVG...
|
||||
viewer.menu.documentPermission.label = Document Permissions...
|
||||
viewer.menu.documentInformation.label = Document Information...
|
||||
viewer.menu.documentFonts.label = Document Fonts...
|
||||
viewer.menu.printSetup.label = Print Setup...
|
||||
viewer.menu.print.label = Print...
|
||||
viewer.menu.exit.label = Exit
|
||||
|
||||
## View Menu and submenu items
|
||||
viewer.menu.edit.label = Edit
|
||||
viewer.menu.edit.mnemonic = E
|
||||
viewer.menu.edit.undo.label = Undo
|
||||
viewer.menu.edit.redo.label = Redo
|
||||
viewer.menu.edit.copy.label = Copy
|
||||
viewer.menu.edit.delete.label = Delete
|
||||
viewer.menu.edit.selectAll.label = Select All
|
||||
viewer.menu.edit.deselectAll.label = Deselect All
|
||||
## View Menu and submenu items
|
||||
viewer.menu.view.label = View
|
||||
viewer.menu.view.mnemonic = V
|
||||
viewer.menu.view.actualSize.label = Actual Size
|
||||
viewer.menu.view.fitInWindow.label = Fit in Window
|
||||
viewer.menu.view.fitWidth.label = Fit Width
|
||||
viewer.menu.view.zoomIn.label = Zoom In
|
||||
viewer.menu.view.zoomOut.label = Zoom Out
|
||||
viewer.menu.view.rotateLeft.label = Rotate Left
|
||||
viewer.menu.view.rotateRight.label = Rotate Right
|
||||
viewer.menu.view.hideToolBar.label = Hide Toolbar
|
||||
viewer.menu.view.showToolBar.label = Show Toolbar
|
||||
viewer.menu.view.showUtilityPane.label = Show Utility Pane
|
||||
viewer.menu.view.hideUtilityPane.label = Hide Utility Pane
|
||||
|
||||
## Document Menu and submenu items
|
||||
viewer.menu.document.label = Document
|
||||
viewer.menu.document.mnemonic = D
|
||||
viewer.menu.document.firstPage.label = First Page
|
||||
viewer.menu.document.previousPage.label = Previous Page
|
||||
viewer.menu.document.nextPage.label = Next Page
|
||||
viewer.menu.document.lastPage.label = Last Page
|
||||
viewer.menu.document.search.label = Search...
|
||||
viewer.menu.document.gotToPage.label = Go To Page...
|
||||
|
||||
## Window Menu and submenu items
|
||||
viewer.menu.window.label = Window
|
||||
viewer.menu.window.mnemonic = W
|
||||
viewer.menu.window.minAll.label = Minimize All
|
||||
viewer.menu.window.minAll.mnemonic = M
|
||||
viewer.menu.window.frontAll.label = Bring All to Front
|
||||
viewer.menu.window.frontAll.mnemonic = B
|
||||
viewer.menu.window.1.label = 1
|
||||
viewer.menu.window.1.mnemonic = 1
|
||||
viewer.menu.window.2.label = 2
|
||||
viewer.menu.window.2.mnemonic = 2
|
||||
viewer.menu.window.3.label = 3
|
||||
viewer.menu.window.3.mnemonic = 3
|
||||
viewer.menu.window.4.label = 4
|
||||
viewer.menu.window.4.mnemonic = 4
|
||||
viewer.menu.window.5.label = 5
|
||||
viewer.menu.window.5.mnemonic = 5
|
||||
viewer.menu.window.6.label = 6
|
||||
viewer.menu.window.6.mnemonic = 6
|
||||
viewer.menu.window.7.label = 7
|
||||
viewer.menu.window.7.mnemonic = 7
|
||||
viewer.menu.window.8.label = 8
|
||||
viewer.menu.window.8.mnemonic = 8
|
||||
viewer.menu.window.9.label = 9
|
||||
viewer.menu.window.9.mnemonic = 9
|
||||
## Add as many entries as you want, to viewer.menu.window.X.label and mnemonic
|
||||
## where X is an incrementing integer. The mnemonic should be one unique
|
||||
## character found within the label
|
||||
|
||||
## Help Menu and submenu items
|
||||
viewer.menu.help.label = Help
|
||||
viewer.menu.help.mnemonic = H
|
||||
viewer.menu.help.about.label = About ICEpdf viewer...
|
||||
|
||||
## General error dialog
|
||||
viewer.dialog.error.exception.title = ICEsoft ICEpdf - Exception
|
||||
viewer.dialog.error.exception.msg = \
|
||||
There was an error executing your command do to the following exception\n\
|
||||
{0}.
|
||||
|
||||
## Open File Dialog
|
||||
viewer.dialog.openFile.title = Open File
|
||||
viewer.dialog.openFile.error.title = ICEsoft ICEpdf - Open File Error
|
||||
viewer.dialog.openFile.error.msg = \
|
||||
ICEpdf could not open the specified file at {0}\n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openDocument.pdfException.title = ICEsoft ICEpdf - PDF Exception
|
||||
viewer.dialog.openDocument.pdfException.msg = \
|
||||
ICEpdf could not open the specified file {0} \n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openDocument.pdfSecurityException.title = ICEsoft ICEpdf - PDF Security Exception
|
||||
viewer.dialog.openDocument.pdfSecurityException.msg = \
|
||||
ICEpdf could not open the encrypted file at {0}\n\
|
||||
This may be the result of an invalid password or a missing JCE Security Provider.\n\n\
|
||||
Please refer to ICEpdf Developer's Guide for more information.
|
||||
|
||||
viewer.dialog.openDocument.exception.title = ICEsoft ICEpdf - Exception
|
||||
viewer.dialog.openDocument.exception.msg = \
|
||||
ICEpdf could not open the specified file at {0}\n\
|
||||
The file may be corrupt or not a supported file type.
|
||||
|
||||
viewer.dialog.openURL.exception.title = ICEsoft ICEpdf - URL Exception
|
||||
viewer.dialog.openURL.exception.msg = \
|
||||
ICEpdf could not open the specified file. {0} \n\
|
||||
at URL: {1}
|
||||
viewer.dialog.openURL.downloading.msg = Downloading {0}
|
||||
|
||||
## General error dialog
|
||||
viewer.dialog.information.copyAll.title = ICEsoft ICEpdf - Information
|
||||
viewer.dialog.information.copyAll.msg = \
|
||||
The document has more than {0} pages, please use\n\
|
||||
"Export text..." to extract document text.
|
||||
|
||||
## Open URL Dialog
|
||||
viewer.dialog.security.title = Document Security
|
||||
viewer.dialog.security.msg = This PDF is protected
|
||||
viewer.dialog.security.password.label = Password:
|
||||
viewer.dialog.security.okButton.label = Ok
|
||||
viewer.dialog.security.okButton.mnemonic = O
|
||||
viewer.dialog.security.cancelButton.label = Cancel
|
||||
viewer.dialog.security.cancelButton.mnemonic = C
|
||||
|
||||
|
||||
## Open URL Dialog
|
||||
viewer.dialog.openURL.title = Open URL
|
||||
|
||||
### Save a Copy Dialog
|
||||
viewer.dialog.saveAs.title = Save As
|
||||
viewer.dialog.saveAs.extensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.extensionError.msg = \
|
||||
ICEpdf could not save to {0} because it is not a supported file type.
|
||||
viewer.dialog.saveAs.noExtensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.noExtensionError.msg = Please specify a file extension.
|
||||
viewer.dialog.saveAs.noneUniqueName.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.saveAs.noneUniqueName.msg = \
|
||||
The file named {0} already exists. Please specify a unique name.
|
||||
viewer.dialog.saveAs.noPermission.title = ICEpdf Viewer RI - Save Error
|
||||
viewer.dialog.saveAs.noPermission.msg = You do not have permission or the credentials to save this document.
|
||||
viewer.dialog.saveAs.noUpdates.title = ICEpdf Viewer RI
|
||||
viewer.dialog.saveAs.noUpdates.msg = Document changes will not be saved, please upgrade to ICEpdf PRO.
|
||||
viewer.dialog.saveOnClose.noUpdates.title = ICEpdf Viewer RI
|
||||
viewer.dialog.saveOnClose.noUpdates.msg = Do you want to save changes to {0}?
|
||||
|
||||
## Export Text Dialog
|
||||
viewer.dialog.exportText.title = Export Document Text
|
||||
viewer.dialog.exportText.progress.msg = Extracting PDF Text
|
||||
viewer.dialog.exportText.noExtensionError.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.dialog.exportText.noExtensionError.msg = Please specify a file extension.
|
||||
# Text extraction output file
|
||||
viewer.exportText.fileStamp.msg = ICEsoft ICEpdf Viewer, (c) ICEsoft Technologies, Inc.
|
||||
viewer.exportText.pageStamp.msg = <!----- Page {0} Text ---->
|
||||
# Completed x out of y page(s).
|
||||
viewer.exportText.fileStamp.progress.msg = \
|
||||
Completed {0} out of {1}.
|
||||
viewer.exportText.fileStamp.progress.oneFile.msg = {2} page
|
||||
viewer.exportText.fileStamp.progress.moreFile.msg = {2} pages
|
||||
|
||||
## Export SVG Dialog
|
||||
viewer.dialog.exportSVG.title = Export to SVG
|
||||
viewer.dialog.exportSVG.status.exporting.msg = Exporting page {0} to SVG file {1} ...
|
||||
viewer.dialog.exportSVG.status.error.msg = \
|
||||
Problem exporting page {0} to SVG file {1} : {2}
|
||||
viewer.dialog.exportSVG.status.finished.msg = \
|
||||
Finished exporting page {0} to SVG file {1}
|
||||
viewer.dialog.exportSVG.noExtensionError.title = ICEsoft ICEpdf - SVG Error
|
||||
viewer.dialog.exportSVG.noExtensionError.msg = Please specify a file extension.
|
||||
viewer.dialog.exportSVG.exportError.title = ICEsoft ICEpdf - SVG Error
|
||||
viewer.dialog.exportSVG.exportError.msg = \
|
||||
ICEpdf could not export to {0} \n\
|
||||
becuase it is either not a supported file type or \n\
|
||||
because the file has been corrupted.
|
||||
|
||||
# Printing Progress bar
|
||||
viewer.dialog.printing.status.progress.msg = Page {0} of {1}
|
||||
viewer.dialog.printing.status.start.msg = Spooling Page(s) to Printer
|
||||
|
||||
|
||||
## Document Permissions Dialog
|
||||
viewer.dialog.documentPermissions.title = Document Permissions
|
||||
viewer.dialog.documentPermissions.securityMethod.label = Security Method:
|
||||
viewer.dialog.documentPermissions.userPassword.label = User Password:
|
||||
viewer.dialog.documentPermissions.ownerPassword.label = Owner Password:
|
||||
viewer.dialog.documentPermissions.printing.label = Printing:
|
||||
viewer.dialog.documentPermissions.changing.label = Changing the Document:
|
||||
viewer.dialog.documentPermissions.copyExtraction.label = Content Copying or Extraction:
|
||||
viewer.dialog.documentPermissions.comments.label = Aurthoring Comments and Form Fields:
|
||||
viewer.dialog.documentPermissions.formFillingIn.label = Form Field Fill-in or Signing:
|
||||
viewer.dialog.documentPermissions.accessibility.label = Content Accessibility Enabled:
|
||||
viewer.dialog.documentPermissions.assembly.label = Document Assembly:
|
||||
viewer.dialog.documentPermissions.encryptionLevel.label = Encryption Level:
|
||||
viewer.dialog.documentPermissions.securityLevel = {0}-bit v{1} R {2}
|
||||
viewer.dialog.documentPermissions.none = None
|
||||
viewer.dialog.documentPermissions.no = No
|
||||
viewer.dialog.documentPermissions.yes = Yes
|
||||
viewer.dialog.documentPermissions.allowed = Allowed
|
||||
viewer.dialog.documentPermissions.notAllowed = Not Allowed
|
||||
viewer.dialog.documentPermissions.fullyAllowed = Fully Allowed
|
||||
viewer.dialog.documentPermissions.standardSecurity = Adobe Acrobat Standard Security
|
||||
viewer.dialog.documentPermissions.partial = Partial (Low Quality)
|
||||
|
||||
|
||||
## Document Information Dialog
|
||||
viewer.dialog.documentInformation.title = Document Information
|
||||
viewer.dialog.documentInformation.title.label = Title:
|
||||
viewer.dialog.documentInformation.subject.label = Subject:
|
||||
viewer.dialog.documentInformation.author.label = Author:
|
||||
viewer.dialog.documentInformation.keywords.label = Keywords:
|
||||
viewer.dialog.documentInformation.creator.label = Creator:
|
||||
viewer.dialog.documentInformation.producer.label = Producer:
|
||||
viewer.dialog.documentInformation.created.label = Created:
|
||||
viewer.dialog.documentInformation.modified.label = Modified:
|
||||
viewer.dialog.documentInformation.notAvailable = Not Available
|
||||
|
||||
## Go to Page Dialog
|
||||
viewer.dialog.goToPage.title = Go to Page...
|
||||
viewer.dialog.goToPage.description.label = Page Number
|
||||
|
||||
## About Dialog
|
||||
viewer.dialog.about.title = About ICEpdf Viewer
|
||||
viewer.dialog.about.pageNumber.label = \n\
|
||||
\n\
|
||||
Check the ICEpdf web site for the latest news:\n\
|
||||
http://www.icepdf.org/ \n\n
|
||||
|
||||
## Font Properties Dialog
|
||||
viewer.dialog.fonts.title = Document Font Properties
|
||||
viewer.dialog.fonts.border.label = Fonts used by this document
|
||||
viewer.dialog.fonts.info.type.label = Type: {0}
|
||||
viewer.dialog.fonts.info.encoding.label = Encoding: {0}
|
||||
viewer.dialog.fonts.info.substitution.type.label = Actual Type: {0}
|
||||
viewer.dialog.fonts.info.substitution.path.label = Path: {0}
|
||||
viewer.dialog.fonts.searching.label = Collecting font data ({0}%).
|
||||
viewer.dialog.fonts.resetCache.label = Reset Cache
|
||||
viewer.dialog.fonts.resetCache.tip = Reset font properties cache file and rescan system for new fonts.
|
||||
|
||||
## Utility Pane Bookmarks Tab
|
||||
viewer.utilityPane.bookmarks.tab.title = Bookmarks
|
||||
|
||||
## Utility Pane Bookmarks Tab
|
||||
viewer.utilityPane.attachments.tab.title = Attachments
|
||||
viewer.utilityPane.attachments.column.fileName.title = Name
|
||||
viewer.utilityPane.attachments.column.description.title = Description
|
||||
viewer.utilityPane.attachments.column.modified.title = Modified
|
||||
viewer.utilityPane.attachments.column.size.title = Size
|
||||
viewer.utilityPane.attachments.column.compressedSize.title = Compressed size
|
||||
viewer.utilityPane.attachments.menu.saveAs.label = Save As...
|
||||
viewer.utilityPane.attachments.saveAs.replace.title = ICEsoft ICEpdf - Save Error
|
||||
viewer.utilityPane.attachments.saveAs.replace.msg = \
|
||||
The file named {0} already exists. Do you want to replace It?
|
||||
|
||||
## Utility Pane Thumbnails
|
||||
viewer.utilityPane.thumbs.tab.title = Thumbnails
|
||||
|
||||
## Layers Pane
|
||||
viewer.utilityPane.layers.tab.title = Layers
|
||||
|
||||
## Signature Pane
|
||||
viewer.utilityPane.signatures.tab.title = Signatures
|
||||
viewer.utilityPane.signatures.tab.certTree.error.label = \
|
||||
Unsigned Signature Fields Signer certificate could not be validated {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.rootSigned.label = Signed by {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.rootValidating.label = Validating signature {0} {1}
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.invalid.label = Signature is invalid:
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.unknown.label = Signature is valid:
|
||||
viewer.utilityPane.signatures.tab.certTree.cert.valid.label = Signature validity is unknown:
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.modified.label = \
|
||||
This version of the document is unaltered but subsequent changes have been made
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.unmodified.label = Document has not been modified since it was signed
|
||||
viewer.utilityPane.signatures.tab.certTree.doc.major.label = Document has been altered or corrupted since it was signed
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.unknown.label = \
|
||||
Signer's identity is unknown because it could not be found in your keystore
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.unchecked.label = \
|
||||
Signature is valid, but revocation of the signer's identity could not be checked
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.identity.valid.label = Signer's identity is valid
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.time.local.label = Signing time is from the clock on this signer's computer
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.time.embedded.label = \
|
||||
Signature included an embedded timestamp but it could not be validated
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.label = Signature Details
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.reason.label = Reason: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.location.label = Location: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.details.full.label = Certificate Details...
|
||||
viewer.utilityPane.signatures.tab.certTree.signature.lastChecked.label = Last Checked: {0}
|
||||
viewer.utilityPane.signatures.tab.certTree.unsigned.label = Unsigned Signature Fields
|
||||
|
||||
## Signature certificate view dialog.
|
||||
viewer.utilityPane.signatures.cert.dialog.title = Certificate Details
|
||||
viewer.utilityPane.signatures.cert.dialog.closeButton.label = Close
|
||||
viewer.utilityPane.signatures.cert.dialog.closeButton.mnemonic = C
|
||||
viewer.utilityPane.signatures.cert.dialog.info.notAvailable.label = N/A
|
||||
viewer.utilityPane.signatures.cert.dialog.info.unknownSubject.label = N/A Subject
|
||||
viewer.utilityPane.signatures.cert.dialog.info.unknownIssuer.label = N/A Issuer
|
||||
viewer.utilityPane.signatures.cert.dialog.info.certificateInfo.label = {0} - {1}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.column1.label = Field
|
||||
viewer.utilityPane.signatures.cert.dialog.info.column2.label = Value
|
||||
viewer.utilityPane.signatures.cert.dialog.info.version.label = Version
|
||||
viewer.utilityPane.signatures.cert.dialog.info.version.value = v{0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.label = Serial Number
|
||||
viewer.utilityPane.signatures.cert.dialog.info.serialNumber.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.label = Signature Algorithm
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signatureAlgorithm.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.issuer.label = Issuer
|
||||
viewer.utilityPane.signatures.cert.dialog.info.issuer.value = \
|
||||
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.validity.label = Validity
|
||||
viewer.utilityPane.signatures.cert.dialog.info.validity.value = From: {0}\n To: {1}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.subject.label = Subject
|
||||
viewer.utilityPane.signatures.cert.dialog.info.subject.value = \
|
||||
Organization: {0} \nOrganization Unit: {1} \nCommon Name: {2} \nLocal: {3} \nState: {4} \nCountry: {5} \nEmail: {6}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.signature.label = Signature
|
||||
viewer.utilityPane.signatures.cert.dialog.info.md5.label = MD5 Fingerprint
|
||||
viewer.utilityPane.signatures.cert.dialog.info.md5.value = {0}
|
||||
viewer.utilityPane.signatures.cert.dialog.info.sha1.label = SHA1 Fingerprint
|
||||
viewer.utilityPane.signatures.cert.dialog.info.sha1.value = {0}
|
||||
viewer.utilityPane.signatures.verify.initializingMessage.label = Validating {0} of {1} Signatures
|
||||
viewer.utilityPane.signatures.verify.completeMessage.label = Validating process complete
|
||||
viewer.utilityPane.signatures.verify.validating.label = Validating signature...
|
||||
## Annotation Tab
|
||||
viewer.utilityPane.annotation.tab.title = Annotations
|
||||
## Utility Pane Annotation Link Tab
|
||||
viewer.utilityPane.annotation.link.appearance.title = Link Annotation
|
||||
viewer.utilityPane.annotation.link.highlightType = Highlight Style:
|
||||
viewer.utilityPane.annotation.link.none = None
|
||||
viewer.utilityPane.annotation.link.invert = Invert`
|
||||
viewer.utilityPane.annotation.link.outline = Outline
|
||||
viewer.utilityPane.annotation.link.push = Push
|
||||
|
||||
## Utility Pane Annotation text markup Tab
|
||||
viewer.utilityPane.annotation.textMarkup.appearance.title = Text Markup Annotation
|
||||
viewer.utilityPane.annotation.textMarkup.highlightType = Type:
|
||||
viewer.utilityPane.annotation.textMarkup.colorChooserTitle = MarKup Color
|
||||
viewer.utilityPane.annotation.textMarkup.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.textMarkup.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation line Tab
|
||||
viewer.utilityPane.annotation.line.appearance.title = Line Annotation
|
||||
viewer.utilityPane.annotation.line.lineThickness = Line Thickness:
|
||||
viewer.utilityPane.annotation.line.lineStyle = Line Style:
|
||||
viewer.utilityPane.annotation.line.startStyle = Start:
|
||||
viewer.utilityPane.annotation.line.endStyle = End:
|
||||
viewer.utilityPane.annotation.line.colorChooserTitle = Line Color
|
||||
viewer.utilityPane.annotation.line.colorInternalChooserTitle = Line Internal Color
|
||||
viewer.utilityPane.annotation.line.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.line.colorInternalLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.line.end.none = None
|
||||
viewer.utilityPane.annotation.line.end.openArrow = Open Arrow
|
||||
viewer.utilityPane.annotation.line.end.closedArrow = Closed Arrow
|
||||
viewer.utilityPane.annotation.line.end.diamond = Diamond
|
||||
viewer.utilityPane.annotation.line.end.square = Square
|
||||
viewer.utilityPane.annotation.line.end.circle = Circle
|
||||
viewer.utilityPane.annotation.line.transparencyLabel = Transparency:
|
||||
|
||||
## Utility Pane Annotation square Tab
|
||||
viewer.utilityPane.annotation.square.appearance.title = Square Annotation
|
||||
viewer.utilityPane.annotation.square.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.square.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.square.colorBorderChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.square.colorInteriorChooserTitle = Fill Color
|
||||
viewer.utilityPane.annotation.square.borderTypeLabel = Border Type:
|
||||
viewer.utilityPane.annotation.square.colorBorderLabel = Border Color:
|
||||
viewer.utilityPane.annotation.square.colorInteriorLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.square.fillTypeLabel = Fill Type:
|
||||
viewer.utilityPane.annotation.square.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation free text Tab
|
||||
viewer.utilityPane.annotation.freeText.appearance.title = FreeText Annotation
|
||||
viewer.utilityPane.annotation.freeText.font.name = Font Name:
|
||||
viewer.utilityPane.annotation.freeText.font.style = Font Style:
|
||||
viewer.utilityPane.annotation.freeText.font.size = Font Size:
|
||||
viewer.utilityPane.annotation.freeText.font.color = Font Color:
|
||||
viewer.utilityPane.annotation.freeText.font.color.ChooserTitle = Font Color
|
||||
viewer.utilityPane.annotation.freeText.border.thickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.freeText.border.type = Border Type:
|
||||
viewer.utilityPane.annotation.freeText.border.style = Border Style:
|
||||
viewer.utilityPane.annotation.freeText.border.color = Border Color:
|
||||
viewer.utilityPane.annotation.freeText.border.color.ChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.freeText.fill.type = Fill Type:
|
||||
viewer.utilityPane.annotation.freeText.fill.color = Fill Color:
|
||||
viewer.utilityPane.annotation.freeText.transparencyLabel = Transparency:
|
||||
viewer.utilityPane.annotation.freeText.fill.color.ChooserTitle = Fill Color
|
||||
viewer.utilityPane.annotation.freeText.font.dialog = Dialog
|
||||
viewer.utilityPane.annotation.freeText.font.dialogInput = DialogInput
|
||||
viewer.utilityPane.annotation.freeText.font.monospaced = Monospaced
|
||||
viewer.utilityPane.annotation.freeText.font.serif = Serif
|
||||
viewer.utilityPane.annotation.freeText.font.sanSerif = SansSerif
|
||||
viewer.utilityPane.annotation.freeText.font.style.plain = Plain
|
||||
viewer.utilityPane.annotation.freeText.font.style.italic = Italic
|
||||
viewer.utilityPane.annotation.freeText.font.style.bold = Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.helvetica = Helvetica
|
||||
viewer.utilityPane.annotation.freeText.font.name.helveticaOblique = Helvetica-Oblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.helveticaBold = Helvetica-Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.HelveticaBoldOblique = Helvetica-BoldOblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesItalic = Times-Italic
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesBold = Times-Bold
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesBoldItalic = Times-BoldItalic
|
||||
viewer.utilityPane.annotation.freeText.font.name.timesRoman = Times-Roman
|
||||
viewer.utilityPane.annotation.freeText.font.name.courier = Courier
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierOblique = Courier-Oblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierBoldOblique = Courier-BoldOblique
|
||||
viewer.utilityPane.annotation.freeText.font.name.courierBold = Courier-Bold
|
||||
|
||||
## Utility Pane Annotation text Tab
|
||||
viewer.utilityPane.annotation.text.appearance.title = Text Annotation
|
||||
viewer.utilityPane.annotation.text.iconName = Icon:
|
||||
viewer.utilityPane.annotation.text.iconName.comment = Comment
|
||||
viewer.utilityPane.annotation.text.iconName.check = Check
|
||||
viewer.utilityPane.annotation.text.iconName.checkMark = CheckMark
|
||||
viewer.utilityPane.annotation.text.iconName.circle = Circle
|
||||
viewer.utilityPane.annotation.text.iconName.cross = Cross
|
||||
viewer.utilityPane.annotation.text.iconName.crossHairs = CrossHairs
|
||||
viewer.utilityPane.annotation.text.iconName.help = Help
|
||||
viewer.utilityPane.annotation.text.iconName.insert = Insert
|
||||
viewer.utilityPane.annotation.text.iconName.key = Key
|
||||
viewer.utilityPane.annotation.text.iconName.newParagraph = NewParagraph
|
||||
viewer.utilityPane.annotation.text.iconName.paragraph = Paragraph
|
||||
viewer.utilityPane.annotation.text.iconName.rightArrow = RightArrow
|
||||
viewer.utilityPane.annotation.text.iconName.rightPointer = RightPointer
|
||||
viewer.utilityPane.annotation.text.iconName.star = Star
|
||||
viewer.utilityPane.annotation.text.iconName.upArrow = UpArrow
|
||||
viewer.utilityPane.annotation.text.iconName.upLeftArrow = UpLeftArrow
|
||||
|
||||
## Utility Pane Annotation circle Tab
|
||||
viewer.utilityPane.annotation.circle.appearance.title = Circle Annotation
|
||||
viewer.utilityPane.annotation.circle.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.circle.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.circle.colorBorderChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.circle.colorInteriorChooserTitle = Interior Color
|
||||
viewer.utilityPane.annotation.circle.colorBorderLabel = Border Color:
|
||||
viewer.utilityPane.annotation.circle.colorInteriorLabel = Fill Color:
|
||||
viewer.utilityPane.annotation.circle.fillTypeLabel = Fill Type:
|
||||
viewer.utilityPane.annotation.circle.transparencyLabel = Transparency:
|
||||
## Utility Pane Annotation ink Tab
|
||||
viewer.utilityPane.annotation.ink.appearance.title = Ink Annotation
|
||||
viewer.utilityPane.annotation.ink.lineThickness = Ink Thickness:
|
||||
viewer.utilityPane.annotation.ink.lineStyle = Ink Style:
|
||||
viewer.utilityPane.annotation.ink.colorBorderChooserTitle = Ink Color
|
||||
viewer.utilityPane.annotation.ink.colorBorderLabel = Ink Color:
|
||||
viewer.utilityPane.annotation.ink.transparencyLabel = Transparency:
|
||||
## Utility Pane border Tab
|
||||
viewer.utilityPane.annotation.border.title = Border
|
||||
viewer.utilityPane.annotation.border.linkType = Border Type:
|
||||
viewer.utilityPane.annotation.border.lineThickness = Border Thickness:
|
||||
viewer.utilityPane.annotation.border.lineStyle = Border Style:
|
||||
viewer.utilityPane.annotation.border.colorChooserTitle = Border Color
|
||||
viewer.utilityPane.annotation.border.colorLabel = Color:
|
||||
viewer.utilityPane.annotation.border.borderType.visibleRectangle = Visible
|
||||
viewer.utilityPane.annotation.border.borderType.invisibleRectangle = Invisible
|
||||
viewer.utilityPane.annotation.border.solid = Solid
|
||||
viewer.utilityPane.annotation.border.dashed = Dashed
|
||||
viewer.utilityPane.annotation.border.beveled = Beveled
|
||||
viewer.utilityPane.annotation.border.inset = Inset
|
||||
viewer.utilityPane.annotation.border.underline = Underline
|
||||
## Utility Pane border Tab
|
||||
viewer.utilityPane.annotation.flags.title = Flags
|
||||
viewer.utilityPane.annotation.flags.noRotate = No Rotate:
|
||||
viewer.utilityPane.annotation.flags.noZoom = No Zoom:
|
||||
viewer.utilityPane.annotation.flags.readOnly = Read Only:
|
||||
viewer.utilityPane.annotation.flags.printable = Printable:
|
||||
viewer.utilityPane.annotation.flags.yes = Printable:
|
||||
viewer.utilityPane.annotation.flags.enabled = Enabled
|
||||
viewer.utilityPane.annotation.flags.disabled = Disabled
|
||||
## annotation action pane and dialogs.
|
||||
viewer.utilityPane.action.selectionTitle = Action
|
||||
viewer.utilityPane.action.addAction = Add
|
||||
viewer.utilityPane.action.editAction = Edit
|
||||
viewer.utilityPane.action.removeAction = Remove
|
||||
viewer.utilityPane.action.type.destination.label = Destination
|
||||
viewer.utilityPane.action.type.uriAction.label = URI Action
|
||||
viewer.utilityPane.action.type.goToAction.label = GoTo Action
|
||||
viewer.utilityPane.action.type.launchAction.label = Launch Action
|
||||
viewer.utilityPane.action.dialog.new.title = Add New Action
|
||||
viewer.utilityPane.action.dialog.new.msgs = Action Type:
|
||||
viewer.utilityPane.action.dialog.delete.title = Delete Confirmation
|
||||
viewer.utilityPane.action.dialog.delete.msgs = Are you sure your want to delete this action?
|
||||
## uri action dialog test
|
||||
viewer.utilityPane.action.dialog.uri.title = URI Action Properties
|
||||
viewer.utilityPane.action.dialog.uri.msgs = URI:
|
||||
## launch action dialog test
|
||||
viewer.utilityPane.action.dialog.launch.title = Launch Action Properties
|
||||
viewer.utilityPane.action.dialog.launch.msgs = File Path:
|
||||
## GoTo action dialog text
|
||||
viewer.utilityPane.action.dialog.goto.title = GoTo Action Properties
|
||||
viewer.utilityPane.action.dialog.goto.page.label = Page:
|
||||
viewer.utilityPane.action.dialog.goto.type.label = Type
|
||||
viewer.utilityPane.action.dialog.goto.type.xyz.label = Absolute
|
||||
viewer.utilityPane.action.dialog.goto.type.fit.label = Fit Page
|
||||
viewer.utilityPane.action.dialog.goto.type.fith.label = Fit Top Width
|
||||
viewer.utilityPane.action.dialog.goto.type.fitv.label = Fit Left Width
|
||||
viewer.utilityPane.action.dialog.goto.type.fitr.label = Fit Zoom Box
|
||||
viewer.utilityPane.action.dialog.goto.type.fitb.label = Fit Page Bounds
|
||||
viewer.utilityPane.action.dialog.goto.type.fitbh.label = Fit Bounds Top
|
||||
viewer.utilityPane.action.dialog.goto.type.fitbv.label = Fit Bounds Left
|
||||
viewer.utilityPane.action.dialog.goto.right.label = Right:
|
||||
viewer.utilityPane.action.dialog.goto.left.label = Left:
|
||||
viewer.utilityPane.action.dialog.goto.top.label = Top:
|
||||
viewer.utilityPane.action.dialog.goto.bottom.label = Bottom:
|
||||
viewer.utilityPane.action.dialog.goto.zoom.label = Zoom:
|
||||
viewer.utilityPane.action.dialog.goto.unassigned.label = NaN
|
||||
viewer.utilityPane.action.dialog.goto.current.label = Current View:
|
||||
viewer.utilityPane.action.dialog.goto.current = Set Location
|
||||
viewer.utilityPane.action.dialog.goto.name.label = Name:
|
||||
viewer.utilityPane.action.dialog.goto.browse = Browse...
|
||||
viewer.utilityPane.action.dialog.goto.explicitDestination.title = Implicit Destination
|
||||
viewer.utilityPane.action.dialog.goto.nameDestination.title = Named Destination
|
||||
# Destination Named Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.title = Document Name Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.root.label = Name Tree
|
||||
viewer.utilityPane.action.dialog.goto.nameTree.branch.label = {0} to {1}
|
||||
|
||||
## Utility Pane Search Tab
|
||||
viewer.utilityPane.search.tab.title = Search
|
||||
viewer.utilityPane.search.searchText.label = Search Text:
|
||||
viewer.utilityPane.search.results.label = Results:
|
||||
viewer.utilityPane.search.searchButton.label = Search
|
||||
viewer.utilityPane.search.clearSearchButton.label = Clear
|
||||
viewer.utilityPane.search.caseSenstiveCheckbox.label = Case-sensitive
|
||||
viewer.utilityPane.search.wholeWordCheckbox.label = Whole words only
|
||||
viewer.utilityPane.search.cumlitiveCheckbox.label = Cumulative
|
||||
viewer.utilityPane.search.showPagesCheckbox.label = Show Pages
|
||||
viewer.utilityPane.search.stopButton.label = Stop
|
||||
viewer.utilityPane.search.searching.msg = Search...
|
||||
# Searching x out of y page(s)
|
||||
viewer.utilityPane.search.searching1.msg = \
|
||||
Searching {0} out of {1}
|
||||
viewer.utilityPane.search.searching1.oneFile.msg = {2} page
|
||||
viewer.utilityPane.search.searching1.moreFile.msg = {2} pages
|
||||
# Page x (y result(s))
|
||||
viewer.utilityPane.search.result.msg = Page {0} ({1})
|
||||
viewer.utilityPane.search.result.oneFile.msg = {2} result
|
||||
viewer.utilityPane.search.result.moreFile.msg = {2} results
|
||||
# Searched x page(s) (y matches)
|
||||
viewer.utilityPane.search.progress.msg = \
|
||||
Searched {0} {1} ({2})
|
||||
viewer.utilityPane.search.progress.onePage.msg = page
|
||||
viewer.utilityPane.search.progress.morePage.msg = pages
|
||||
viewer.utilityPane.search.progress.oneMatch.msg = {2} match
|
||||
viewer.utilityPane.search.progress.moreMatch.msg = {2} matches
|
||||
|
||||
## Popup Annotation component
|
||||
viewer.annotation.popup.reply.label = Reply
|
||||
viewer.annotation.popup.delete.label = Delete
|
||||
viewer.annotation.popup.status.label = Set Status
|
||||
viewer.annotation.popup.status.accepted.label = Accepted
|
||||
viewer.annotation.popup.status.cancelled.label = Cancelled
|
||||
viewer.annotation.popup.status.completed.label = Completed
|
||||
viewer.annotation.popup.status.rejected.label = Rejected
|
||||
viewer.annotation.popup.status.none.label = None
|
||||
viewer.annotation.popup.openAll.label = Open all Popups
|
||||
viewer.annotation.popup.minimizeAll.label = Minimize Popups
|
||||
viewer.annotation.popup.replyTo.label = Re: {0}
|
||||
viewer.annotation.popup.status.none.title = None: {0}
|
||||
viewer.annotation.popup.status.none.msg = None set by {0}
|
||||
viewer.annotation.popup.status.accepted.title = Accepted: {0}
|
||||
viewer.annotation.popup.status.accepted.msg = Accepted set by {0}
|
||||
viewer.annotation.popup.status.cancelled.title = Cancelled: {0}
|
||||
viewer.annotation.popup.status.cancelled.msg = Cancelled set by {0}
|
||||
viewer.annotation.popup.status.completed.title = Completed: {0}
|
||||
viewer.annotation.popup.status.completed.msg = Completed set by {0}
|
||||
viewer.annotation.popup.status.rejected.title = Rejected: {0}
|
||||
viewer.annotation.popup.status.rejected.msg = Rejected set by {0}
|
||||
|
||||
## Signature component
|
||||
viewer.annotation.signature.menu.validateSignature.label = Validate Signature
|
||||
viewer.annotation.signature.menu.showCertificates.label = Show Certificate Properties
|
||||
viewer.annotation.signature.menu.signatureProperties.label = Show Signature Properties
|
||||
viewer.annotation.signature.menu.signaturePageNavigation.label = Go to Page...
|
||||
|
||||
## Signature validation dialog.
|
||||
viewer.annotation.signature.validation.dialog.title = Signature Validation Summary
|
||||
viewer.annotation.signature.validation.dialog.close.button.label = Close
|
||||
viewer.annotation.signature.validation.dialog.signerProperties.button.label = Signature Properties...
|
||||
# common validation messages
|
||||
viewer.annotation.signature.validation.common.invalid.label = Signature is invalid:
|
||||
viewer.annotation.signature.validation.common.unknown.label = Signature is valid:
|
||||
viewer.annotation.signature.validation.common.valid.label = Signature validity is unknown:
|
||||
viewer.annotation.signature.validation.common.signedBy.label = - Signed by {0} {1}
|
||||
viewer.annotation.signature.validation.common.doc.modified.label = \
|
||||
- This version of the document is unaltered but subsequent changes have been made
|
||||
viewer.annotation.signature.validation.common.doc.unmodified.label = - Document has not been modified since it was signed
|
||||
viewer.annotation.signature.validation.common.doc.major.label = - Document has been altered or corrupted since it was signed
|
||||
viewer.annotation.signature.validation.common.identity.unknown.label = \
|
||||
- Signer's identity is unknown because it could not be found in your keystore
|
||||
viewer.annotation.signature.validation.common.identity.unchecked.label = \
|
||||
- Signature is valid, but revocation of the signer's identity could not be checked
|
||||
viewer.annotation.signature.validation.common.identity.valid.label = - Signer's identity is valid
|
||||
viewer.annotation.signature.validation.common.time.local.label = - Signing time is from the clock on this signer's computer
|
||||
viewer.annotation.signature.validation.common.time.embedded.label = \
|
||||
- Signature included an embedded timestamp but it could not be validated
|
||||
viewer.annotation.signature.validation.common.notAvailable.label = N/A
|
||||
|
||||
## Signatures properties Dialog.
|
||||
viewer.annotation.signature.properties.dialog.title = Signature Properties
|
||||
viewer.annotation.signature.properties.dialog.invalid.label = Signature is invalid
|
||||
viewer.annotation.signature.properties.dialog.unknown.label = Signature is valid
|
||||
viewer.annotation.signature.properties.dialog.valid.label = Signature validity is unknown
|
||||
viewer.annotation.signature.properties.dialog.signedBy.label = Signed by {0} {1}
|
||||
viewer.annotation.signature.properties.dialog.signingTime.label = Signed time: {0}
|
||||
viewer.annotation.signature.properties.dialog.reason.label = Reason: {0}
|
||||
viewer.annotation.signature.properties.dialog.location.label = Location: {0}
|
||||
# SignatureSigner Info
|
||||
viewer.annotation.signature.properties.dialog.pathValidation.success = - Path validation checks were successful.
|
||||
viewer.annotation.signature.properties.dialog.pathValidation.failure = - Path validation checks were unsuccessful.
|
||||
viewer.annotation.signature.properties.dialog.revocation.success = - Signer's certificate is valid and has not been revoked.
|
||||
viewer.annotation.signature.properties.dialog.revocation.failure = - Revocation checking was not performed.
|
||||
viewer.annotation.signature.properties.dialog.certificateExpired.failure = - Signer certificate has expired.
|
||||
viewer.annotation.signature.properties.dialog.showCertificates.label = Signer's Certificate...
|
||||
viewer.annotation.signature.properties.dialog.validity.title = Validity Summary
|
||||
viewer.annotation.signature.properties.dialog.signerInfo.title = Signer Info
|
||||
|
||||
## Common Button Labels
|
||||
viewer.button.ok.label = Ok
|
||||
viewer.button.ok.mnemonic = O
|
||||
viewer.button.cancel.label = Cancel
|
||||
viewer.button.cancel.mnemonic = C
|
||||
|
||||
## Pilot Specific Mesages
|
||||
pilot.title = ICEbrowser - ICEpdf Pilot Errror
|
||||
pilot.loading.msg =Opening document {0} ...
|
||||
pilot.display.msg = Displaying {0}
|
||||
pilot.loading.error.msg = PDF Pilot: Failed to load {0}.
|
||||
pilot.error.classLoading = Required class {0} not found. Required library \
|
||||
'icepdf.jar' may not be on the classpath - PDF Pilot disabled.";
|
||||
|
||||
###
|
||||
# General Error Messages
|
||||
|
||||
|
||||
# Command Line Errors
|
||||
viewer.commandLin.error = \
|
||||
Usage: java org.icepdf.ri.viewer.Main [-loadfile <value>] [-loadurl <value>]
|
||||
# Launcher errors
|
||||
viewer.launcher.URLError.dialog.title =ICEsoft ICEpdf
|
||||
viewer.launcher.URLError.dialog.message = ICEpdf could not open the specified file. {0} at URL: {1}.
|
||||
viewer.launcher.lookAndFeel.error.message = The specified look-and-feel ({0}) is not accessible from this platform.
|
||||
|
||||
# Pilot Loading Errors
|
||||
|
||||
|
||||
### parser error dialogs
|
||||
parse.title = Properties Parsing Error
|
||||
parse.integer = Warning : {0} is not a correct integer.
|
||||
parse.float = Warning : {0} is not a correct float.
|
||||
parse.double = Warning : {0} is not a correct double.
|
||||
parse.choice = Warning : {0} is not a valid choice.
|
||||
parse.laf = Warning : look-and-feel {0} is not supported.
|
||||
|
||||
### Properties Manager Errors
|
||||
manager.properties.title = ICEpdf Properties Manager
|
||||
fontManager.properties.title = ICEpdf Font Manager
|
||||
|
||||
manager.properties.createNewDirectory = \
|
||||
To create the directory {0},\n\
|
||||
where the ICEpdf Viewer will store changes to its setup, click Yes.\n\n\
|
||||
If you click "No", all changes you make to the ICEpdf Viewer setup\n\
|
||||
will be lost when you quit the application. \n\n
|
||||
|
||||
manager.properties.failedCreation = \
|
||||
ICEpdf Viewer directory to store user data can not be created:\n\
|
||||
{0}\n\
|
||||
ICEpdf Viewer will not save changes to its default setup.
|
||||
|
||||
manager.properties.session.nolock = \
|
||||
Error creating the lock file :\n\
|
||||
{0}\n
|
||||
|
||||
manager.properties.session.readError = \
|
||||
Error loading properties file: \n\
|
||||
{0}
|
||||
|
||||
manager.properties.deleted = Property file has been deleted\n\
|
||||
({0})\n\
|
||||
Recreate it ?
|
||||
|
||||
manager.properties.modified = Property file has been modified since last update\n\
|
||||
({0,date,long})\n\
|
||||
Would you like to merge changes in the file with the current properties?
|
||||
|
||||
manager.properties.saveError = Impossible to save property file.\n\
|
||||
Encountered the folowing error :\n\
|
||||
{0}
|
||||
|
||||
manager.properties.lafError =\
|
||||
Look&Feel {0} given in the default properties is unsupported.\n\
|
||||
Using system default.
|
||||
|
||||
manager.properties.brokenProperty = Broken default property {0} value: {1}
|
||||
|
||||
manager.properties.missingProperty = Missing default property {0} value: {1}
|
||||
|
@ -21,19 +21,24 @@ package org.sleuthkit.autopsy.contentviewers;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.io.IOException;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
import java.util.ResourceBundle;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.logging.Level;
|
||||
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.SwingUtilities;
|
||||
import javax.swing.SwingWorker;
|
||||
import org.icepdf.core.SecurityCallback;
|
||||
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
import org.sleuthkit.datamodel.AbstractFile;
|
||||
import org.sleuthkit.datamodel.ReadContentInputStream;
|
||||
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
|
||||
|
||||
@ -42,6 +47,7 @@ import org.icepdf.core.exceptions.PDFSecurityException;
|
||||
import org.icepdf.core.pobjects.Document;
|
||||
|
||||
import org.icepdf.ri.common.ComponentKeyBinding;
|
||||
import org.icepdf.ri.common.MyGUISecurityCallback;
|
||||
import org.icepdf.ri.common.SwingController;
|
||||
import org.icepdf.ri.common.SwingViewBuilder;
|
||||
import org.icepdf.ri.common.views.DocumentViewControllerImpl;
|
||||
@ -51,15 +57,17 @@ import org.icepdf.ri.util.PropertiesManager;
|
||||
/**
|
||||
* Application content viewer for PDF files.
|
||||
*/
|
||||
public class PDFViewer implements FileTypeViewer {
|
||||
final class PDFViewer implements FileTypeViewer {
|
||||
|
||||
private static final Logger logger = Logger.getLogger(PDFViewer.class.getName());
|
||||
|
||||
private JPanel container;
|
||||
private final PropertiesManager propsManager;
|
||||
private final ResourceBundle messagesBundle;
|
||||
|
||||
public PDFViewer() {
|
||||
PDFViewer() {
|
||||
container = createNewContainer();
|
||||
messagesBundle = getMessagesBundle();
|
||||
propsManager = getCustomProperties();
|
||||
}
|
||||
|
||||
@ -71,7 +79,7 @@ public class PDFViewer implements FileTypeViewer {
|
||||
@Override
|
||||
public void setFile(AbstractFile file) {
|
||||
// The 'C' in IcePDFs MVC set up.
|
||||
SwingController controller = new SwingController();
|
||||
SwingController controller = new SwingController(messagesBundle);
|
||||
|
||||
// Builder for the 'V' in IcePDFs MVC set up
|
||||
SwingViewBuilder viewBuilder = new SwingViewBuilder(controller, propsManager);
|
||||
@ -97,7 +105,13 @@ public class PDFViewer implements FileTypeViewer {
|
||||
protected Document doInBackground() throws PDFException, PDFSecurityException, IOException {
|
||||
ReadContentInputStream stream = new ReadContentInputStream(file);
|
||||
Document doc = new Document();
|
||||
// This will read the stream into memory.
|
||||
|
||||
// Prompts the user for a password if the document is password
|
||||
// protected.
|
||||
doc.setSecurityCallback(createPasswordDialogCallback());
|
||||
|
||||
// This will read the stream into memory and invoke the
|
||||
// security callback if needed.
|
||||
doc.setInputStream(stream, null);
|
||||
return doc;
|
||||
}
|
||||
@ -169,9 +183,12 @@ public class PDFViewer implements FileTypeViewer {
|
||||
// This suppresses a pop-up, from IcePDF, that asks if you'd like to
|
||||
// save configuration changes to disk.
|
||||
props.setProperty("application.showLocalStorageDialogs", "false");
|
||||
|
||||
ResourceBundle defaultMessageBundle = ResourceBundle.getBundle(PropertiesManager.DEFAULT_MESSAGE_BUNDLE);
|
||||
return new PropertiesManager(System.getProperties(), props, defaultMessageBundle);
|
||||
|
||||
return new PropertiesManager(System.getProperties(), props, messagesBundle);
|
||||
}
|
||||
|
||||
private ResourceBundle getMessagesBundle() {
|
||||
return NbBundle.getBundle(PDFViewer.class);
|
||||
}
|
||||
|
||||
@NbBundle.Messages({
|
||||
@ -189,4 +206,27 @@ public class PDFViewer implements FileTypeViewer {
|
||||
private void showEncryptionDialog() {
|
||||
MessageNotifyUtil.Message.error(Bundle.PDFViewer_encryptedDialog());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a callback that will prompt the user for password input.
|
||||
*/
|
||||
private SecurityCallback createPasswordDialogCallback() {
|
||||
// MyGUISecurityCallback is a reference implementation from IcePDF.
|
||||
return new MyGUISecurityCallback(null, messagesBundle) {
|
||||
private String password;
|
||||
|
||||
@Override
|
||||
public String requestPassword(Document document) {
|
||||
try {
|
||||
SwingUtilities.invokeAndWait(() -> {
|
||||
// Show the password dialog on the EDT.
|
||||
this.password = super.requestPassword(document);
|
||||
});
|
||||
return this.password;
|
||||
} catch (InterruptedException | InvocationTargetException ex) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
@ -19,11 +19,13 @@
|
||||
package org.sleuthkit.autopsy.coreutils;
|
||||
|
||||
import com.google.common.collect.ImmutableSet;
|
||||
import java.util.Arrays;
|
||||
import static java.util.Arrays.asList;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import javax.imageio.ImageIO;
|
||||
import static org.apache.commons.collections4.ListUtils.removeAll;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.openide.util.NbBundle;
|
||||
|
||||
/**
|
||||
@ -33,7 +35,14 @@ public final class FileTypeUtils {
|
||||
|
||||
private static final ImmutableSet<String> IMAGE_MIME_TYPES
|
||||
= new ImmutableSet.Builder<String>()
|
||||
.addAll(removeAll(asList(ImageIO.getReaderMIMETypes()),
|
||||
.addAll(removeAll(
|
||||
asList(
|
||||
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
|
||||
// This prevents mime types added by SPI implementations from causing errors
|
||||
// (i.e. 'jai-imageio' utilized with IcePDF)
|
||||
Arrays.stream(ImageIO.getReaderMIMETypes())
|
||||
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
|
||||
.toArray(String[]::new)),
|
||||
asList("application/octet-stream"))) //this claims to be supported, but is not really an image.
|
||||
.add("image/bmp", //NON-NLS
|
||||
"image/gif", //NON-NLS
|
||||
|
@ -46,6 +46,8 @@ import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.Executor;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.logging.Level;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.stream.Stream;
|
||||
import javafx.concurrent.Task;
|
||||
import javafx.embed.swing.SwingFXUtils;
|
||||
import javax.annotation.Nonnull;
|
||||
@ -137,11 +139,25 @@ public class ImageUtils {
|
||||
}
|
||||
FFMPEG_LOADED = tempFfmpegLoaded;
|
||||
|
||||
SUPPORTED_IMAGE_EXTENSIONS.addAll(Arrays.asList(ImageIO.getReaderFileSuffixes()));
|
||||
// remove any empty extension types provided by ImageIO.getReaderFileSuffixes()
|
||||
// This prevents extensions added by SPI implementations from causing errors
|
||||
// (i.e. 'jai-imageio' utilized with IcePDF)
|
||||
List<String> imageSuffixList = Arrays.stream(ImageIO.getReaderFileSuffixes())
|
||||
.filter((extension) -> StringUtils.isNotBlank(extension))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
SUPPORTED_IMAGE_EXTENSIONS.addAll(imageSuffixList);
|
||||
SUPPORTED_IMAGE_EXTENSIONS.add("tec"); // Add JFIF .tec files
|
||||
SUPPORTED_IMAGE_EXTENSIONS.removeIf("db"::equals); // remove db files
|
||||
|
||||
SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(Arrays.asList(ImageIO.getReaderMIMETypes()));
|
||||
List<String> mimeTypeList = Stream.of(ImageIO.getReaderMIMETypes())
|
||||
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
|
||||
// This prevents mime types added by SPI implementations from causing errors
|
||||
// (i.e. 'jai-imageio' utilized with IcePDF)
|
||||
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
SUPPORTED_IMAGE_MIME_TYPES = new TreeSet<>(mimeTypeList);
|
||||
/*
|
||||
* special cases and variants that we support, but don't get registered
|
||||
* with ImageIO automatically
|
||||
|
@ -23,6 +23,8 @@ import java.awt.Graphics;
|
||||
import java.awt.GridBagConstraints;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
@ -38,9 +40,9 @@ import javax.swing.SwingWorker;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
import org.sleuthkit.autopsy.casemodule.Case;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import org.sleuthkit.autopsy.datamodel.utils.IconsUtil;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact;
|
||||
import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
import org.sleuthkit.datamodel.BlackboardAttribute;
|
||||
import org.sleuthkit.datamodel.DataSource;
|
||||
import org.sleuthkit.datamodel.SleuthkitCase;
|
||||
import org.sleuthkit.datamodel.TskCoreException;
|
||||
@ -482,6 +484,54 @@ class GeoFilterPanel extends javax.swing.JPanel {
|
||||
return new Sources(validSources, atCountsTotal);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a count of artifacts of the given type containing GPS data for
|
||||
* the given data case and source. Does not include rejected artifacts.
|
||||
*
|
||||
* @param sleuthkitCase
|
||||
* @param dataSource
|
||||
* @param artifactType
|
||||
*
|
||||
* @return The artifacts count that match the criteria
|
||||
*
|
||||
* @throws TskCoreException
|
||||
*/
|
||||
private long getGPSDataCount(SleuthkitCase sleuthkitCase,
|
||||
DataSource dataSource, BlackboardArtifact.ARTIFACT_TYPE artifactType) throws TskCoreException {
|
||||
long count = 0;
|
||||
String queryStr
|
||||
= "SELECT count(DISTINCT artifact_id) AS count FROM"
|
||||
+ " ("
|
||||
+ " SELECT * FROM blackboard_artifacts as arts"
|
||||
+ " INNER JOIN blackboard_attributes as attrs"
|
||||
+ " ON attrs.artifact_id = arts.artifact_id"
|
||||
+ " WHERE arts.artifact_type_id = " + artifactType.getTypeID()
|
||||
+ " AND arts.data_source_obj_id = " + dataSource.getId()
|
||||
+ " AND arts.review_status_id != " + BlackboardArtifact.ReviewStatus.REJECTED.getID()
|
||||
+ " AND"
|
||||
+ " ("
|
||||
+ "attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE.getTypeID()
|
||||
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE.getTypeID()
|
||||
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_TRACKPOINTS.getTypeID()
|
||||
+ " or attrs.attribute_type_id = " + BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_WAYPOINTS.getTypeID()
|
||||
+ " )"
|
||||
+ " )";
|
||||
try (SleuthkitCase.CaseDbQuery queryResult = sleuthkitCase.executeQuery(queryStr);
|
||||
ResultSet resultSet = queryResult.getResultSet()) {
|
||||
if (resultSet.next()) {
|
||||
count = resultSet.getLong("count");
|
||||
}
|
||||
} catch (SQLException ex) {
|
||||
Throwable cause = ex.getCause();
|
||||
if (cause != null) {
|
||||
logger.log(Level.SEVERE, cause.getMessage(), cause);
|
||||
} else {
|
||||
logger.log(Level.SEVERE, ex.getMessage(), ex);
|
||||
}
|
||||
}
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a Map representing the number of sources found for each
|
||||
* artifact type. If no data was found, an empty map is returned.
|
||||
@ -496,7 +546,7 @@ class GeoFilterPanel extends javax.swing.JPanel {
|
||||
private Map<ARTIFACT_TYPE, Long> getGPSDataSources(SleuthkitCase sleuthkitCase, DataSource dataSource) throws TskCoreException {
|
||||
HashMap<ARTIFACT_TYPE, Long> ret = new HashMap<>();
|
||||
for (BlackboardArtifact.ARTIFACT_TYPE type : GPS_ARTIFACT_TYPES) {
|
||||
long count = sleuthkitCase.getBlackboardArtifactsTypeCount(type.getTypeID(), dataSource.getId());
|
||||
long count = getGPSDataCount(sleuthkitCase, dataSource, type);
|
||||
if (count > 0) {
|
||||
ret.put(type, count);
|
||||
}
|
||||
|
@ -39,6 +39,7 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@ -83,9 +84,13 @@ import org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
|
||||
final public class MapPanel extends javax.swing.JPanel {
|
||||
|
||||
static final String CURRENT_MOUSE_GEOPOSITION = "CURRENT_MOUSE_GEOPOSITION";
|
||||
|
||||
private static final Logger logger = Logger.getLogger(MapPanel.class.getName());
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private static final Set<Integer> DOT_WAYPOINT_TYPES = new HashSet<>();
|
||||
private static final int DOT_SIZE = 12;
|
||||
|
||||
private boolean zoomChanging;
|
||||
private KdTree<MapWaypoint> waypointTree;
|
||||
private Set<MapWaypoint> waypointSet;
|
||||
@ -104,6 +109,12 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
private MapWaypoint currentlySelectedWaypoint;
|
||||
private Set<MapWaypoint> currentlySelectedTrack;
|
||||
|
||||
static {
|
||||
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID());
|
||||
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID());
|
||||
DOT_WAYPOINT_TYPES.add(ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID());
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates new form MapPanel
|
||||
*/
|
||||
@ -486,14 +497,30 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
|
||||
Iterator<MapWaypoint> iterator = waypoints.iterator();
|
||||
|
||||
// These maybe the points closest to lat/log was clicked but
|
||||
// that doesn't mean they are close in terms of pixles.
|
||||
// These may be the points closest to the lat/lon location that was
|
||||
// clicked, but that doesn't mean they are close in terms of pixles.
|
||||
List<MapWaypoint> closestPoints = new ArrayList<>();
|
||||
while (iterator.hasNext()) {
|
||||
MapWaypoint nextWaypoint = iterator.next();
|
||||
|
||||
Point2D point = mapViewer.convertGeoPositionToPoint(nextWaypoint.getPosition());
|
||||
Rectangle rect = new Rectangle((int) point.getX() - (whiteWaypointImage.getWidth() / 2), (int) point.getY() - whiteWaypointImage.getHeight(), whiteWaypointImage.getWidth(), whiteWaypointImage.getHeight());
|
||||
int pointX = (int) point.getX();
|
||||
int pointY = (int) point.getY();
|
||||
Rectangle rect;
|
||||
if (DOT_WAYPOINT_TYPES.contains(nextWaypoint.getArtifactTypeID())) {
|
||||
rect = new Rectangle(
|
||||
pointX - (DOT_SIZE / 2),
|
||||
pointY - (DOT_SIZE / 2),
|
||||
DOT_SIZE,
|
||||
DOT_SIZE
|
||||
);
|
||||
} else {
|
||||
rect = new Rectangle(
|
||||
pointX - (whiteWaypointImage.getWidth() / 2),
|
||||
pointY - whiteWaypointImage.getHeight(),
|
||||
whiteWaypointImage.getWidth(),
|
||||
whiteWaypointImage.getHeight()
|
||||
);
|
||||
}
|
||||
|
||||
if (rect.contains(clickPoint)) {
|
||||
closestPoints.add(nextWaypoint);
|
||||
@ -689,6 +716,7 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
if (waypoints.size() > 0) {
|
||||
MapWaypoint selection = waypoints.get(0);
|
||||
currentlySelectedWaypoint = selection;
|
||||
currentlySelectedTrack = null;
|
||||
for (Set<MapWaypoint> track : tracks) {
|
||||
if (track.contains(selection)) {
|
||||
currentlySelectedTrack = track;
|
||||
@ -751,17 +779,16 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
* @return the new dot image
|
||||
*/
|
||||
private BufferedImage createTrackDotImage(Color color) {
|
||||
int w = 10;
|
||||
int h = 10;
|
||||
int s = DOT_SIZE;
|
||||
|
||||
BufferedImage ret = new BufferedImage(w + 2, h + 2, BufferedImage.TYPE_INT_ARGB);
|
||||
BufferedImage ret = new BufferedImage(s, s, BufferedImage.TYPE_INT_ARGB);
|
||||
Graphics2D g = ret.createGraphics();
|
||||
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
|
||||
g.setColor(color);
|
||||
g.fillOval(1, 1, w, h);
|
||||
g.fillOval(1, 1, s - 2, s - 2);
|
||||
g.setColor(Color.BLACK);
|
||||
g.setStroke(new BasicStroke(1));
|
||||
g.drawOval(1, 1, w, h);
|
||||
g.drawOval(1, 1, s - 2, s - 2);
|
||||
g.dispose();
|
||||
return ret;
|
||||
}
|
||||
@ -794,14 +821,11 @@ final public class MapPanel extends javax.swing.JPanel {
|
||||
public void paintWaypoint(Graphics2D g, JXMapViewer map, MapWaypoint waypoint) {
|
||||
Color color = getColor(waypoint);
|
||||
BufferedImage image;
|
||||
int artifactType = waypoint.getArtifactTypeID();
|
||||
Point2D point = map.getTileFactory().geoToPixel(waypoint.getPosition(), map.getZoom());
|
||||
int x = (int) point.getX();
|
||||
int y = (int) point.getY();
|
||||
|
||||
if (artifactType == ARTIFACT_TYPE.TSK_GPS_TRACKPOINT.getTypeID()
|
||||
|| artifactType == ARTIFACT_TYPE.TSK_GPS_TRACK.getTypeID()
|
||||
|| artifactType == ARTIFACT_TYPE.TSK_GPS_ROUTE.getTypeID()) {
|
||||
if (DOT_WAYPOINT_TYPES.contains(waypoint.getArtifactTypeID())) {
|
||||
image = dotImageCache.computeIfAbsent(color, k -> {
|
||||
return createTrackDotImage(color);
|
||||
});
|
||||
|
@ -64,7 +64,7 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog {
|
||||
display(parent);
|
||||
this.hashes = new ArrayList<>();
|
||||
this.invalidHashes = new ArrayList<>();
|
||||
this.md5Pattern = Pattern.compile("^[a-fA-F0-9]{32}$"); // NON-NLS
|
||||
this.md5Pattern = Pattern.compile("^([a-fA-F0-9]{32})"); // NON-NLS
|
||||
this.parentRef = parent;
|
||||
this.hashDb = hashDb;
|
||||
this.text = text;
|
||||
@ -162,9 +162,16 @@ public class AddHashValuesToDatabaseProgressDialog extends javax.swing.JDialog {
|
||||
for (String hashEntry : linesInTextArea) {
|
||||
hashEntry = hashEntry.trim();
|
||||
Matcher m = md5Pattern.matcher(hashEntry);
|
||||
if (m.find()) {
|
||||
// more information can be added to the HashEntry - sha-1, sha-512, comment
|
||||
hashes.add(new HashEntry(null, m.group(0), null, null, null));
|
||||
if (m.find()) {
|
||||
// Is there any text left on this line? If so, treat it as a comment.
|
||||
String comment = hashEntry.substring(m.end()).trim();
|
||||
if (comment.length() > 0) {
|
||||
comment = (comment.charAt(0) == ',') ? comment.substring(1) : comment;
|
||||
hashes.add(new HashEntry(null, m.group(0), null, null, comment));
|
||||
} else {
|
||||
// more information can be added to the HashEntry - sha-1, sha-512, comment
|
||||
hashes.add(new HashEntry(null, m.group(0), null, null, null));
|
||||
}
|
||||
} else {
|
||||
if (!hashEntry.isEmpty()) {
|
||||
invalidHashes.add(hashEntry);
|
||||
|
@ -18,7 +18,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All
|
||||
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
|
||||
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
|
||||
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
|
||||
ReportVisualPanel2.advancedButton.text=Result Types
|
||||
ReportVisualPanel2.advancedButton.text=Choose Result Types...
|
||||
ReportVisualPanel2.deselectAllButton.text=Deselect All
|
||||
ReportVisualPanel2.selectAllButton.text=Select All
|
||||
ReportVisualPanel2.dataLabel.text=Select which data to report on:
|
||||
|
@ -33,7 +33,7 @@ PortableCaseInterestingItemsListPanel.selectButton.text=Select All
|
||||
PortableCaseInterestingItemsListPanel.descLabel.text=Include Interesting Items from these sets:
|
||||
PortableCaseInterestingItemsListPanel.jAllSetsCheckBox.text=All Interesting Items
|
||||
ReportVisualPanel2.allTaggedResultsRadioButton.text=All Tagged Results
|
||||
ReportVisualPanel2.advancedButton.text=Result Types
|
||||
ReportVisualPanel2.advancedButton.text=Choose Result Types...
|
||||
ReportVisualPanel2.deselectAllButton.text=Deselect All
|
||||
ReportVisualPanel2.selectAllButton.text=Select All
|
||||
ReportVisualPanel2.dataLabel.text=Select which data to report on:
|
||||
|
@ -7,7 +7,7 @@
|
||||
</NonVisualComponents>
|
||||
<Properties>
|
||||
<Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[650, 250]"/>
|
||||
<Dimension value="[650, 275]"/>
|
||||
</Property>
|
||||
</Properties>
|
||||
<AuxValues>
|
||||
@ -25,7 +25,7 @@
|
||||
<Layout>
|
||||
<DimensionLayout dim="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" alignment="0" attributes="0">
|
||||
@ -33,7 +33,6 @@
|
||||
<Component id="tagsScrollPane" max="32767" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
<Component id="advancedButton" linkSize="1" alignment="1" max="32767" attributes="0"/>
|
||||
<Component id="deselectAllButton" linkSize="1" max="32767" attributes="0"/>
|
||||
<Component id="selectAllButton" linkSize="1" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
@ -44,8 +43,9 @@
|
||||
<Component id="dataLabel" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="allResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="specificTaggedResultsRadioButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
<Component id="advancedButton" alignment="0" min="-2" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace min="0" pref="402" max="32767" attributes="0"/>
|
||||
<EmptySpace min="0" pref="454" max="32767" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
@ -64,17 +64,20 @@
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="specificTaggedResultsRadioButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Group type="103" groupAlignment="0" max="-2" attributes="0">
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Group type="103" groupAlignment="0" attributes="0">
|
||||
<Group type="102" attributes="0">
|
||||
<Component id="selectAllButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
<Component id="deselectAllButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="32767" attributes="0"/>
|
||||
<Component id="advancedButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="136" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Group type="102" alignment="1" attributes="0">
|
||||
<Component id="tagsScrollPane" min="-2" pref="150" max="-2" attributes="0"/>
|
||||
<EmptySpace min="-2" pref="5" max="-2" attributes="0"/>
|
||||
<Component id="advancedButton" min="-2" max="-2" attributes="0"/>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<Component id="tagsScrollPane" alignment="1" min="-2" pref="161" max="-2" attributes="0"/>
|
||||
</Group>
|
||||
<EmptySpace max="-2" attributes="0"/>
|
||||
</Group>
|
||||
</Group>
|
||||
</DimensionLayout>
|
||||
|
@ -321,7 +321,7 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
advancedButton = new javax.swing.JButton();
|
||||
allTaggedResultsRadioButton = new javax.swing.JRadioButton();
|
||||
|
||||
setPreferredSize(new java.awt.Dimension(650, 250));
|
||||
setPreferredSize(new java.awt.Dimension(650, 275));
|
||||
|
||||
optionsButtonGroup.add(specificTaggedResultsRadioButton);
|
||||
org.openide.awt.Mnemonics.setLocalizedText(specificTaggedResultsRadioButton, org.openide.util.NbBundle.getMessage(ReportVisualPanel2.class, "ReportVisualPanel2.specificTaggedResultsRadioButton.text")); // NOI18N
|
||||
@ -381,7 +381,6 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
.addComponent(tagsScrollPane)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||
.addComponent(advancedButton, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(deselectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(selectAllButton, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
@ -389,12 +388,13 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
.addComponent(allTaggedResultsRadioButton)
|
||||
.addComponent(dataLabel)
|
||||
.addComponent(allResultsRadioButton)
|
||||
.addComponent(specificTaggedResultsRadioButton))
|
||||
.addGap(0, 402, Short.MAX_VALUE)))
|
||||
.addComponent(specificTaggedResultsRadioButton)
|
||||
.addComponent(advancedButton))
|
||||
.addGap(0, 454, Short.MAX_VALUE)))
|
||||
.addContainerGap())
|
||||
);
|
||||
|
||||
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {advancedButton, deselectAllButton, selectAllButton});
|
||||
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {deselectAllButton, selectAllButton});
|
||||
|
||||
layout.setVerticalGroup(
|
||||
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
@ -408,15 +408,17 @@ final class ReportVisualPanel2 extends JPanel {
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(specificTaggedResultsRadioButton)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
|
||||
.addGroup(layout.createSequentialGroup()
|
||||
.addComponent(selectAllButton)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
|
||||
.addComponent(deselectAllButton)
|
||||
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
|
||||
.addComponent(advancedButton))
|
||||
.addComponent(tagsScrollPane, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, 161, javax.swing.GroupLayout.PREFERRED_SIZE))
|
||||
.addContainerGap())
|
||||
.addGap(136, 136, 136))
|
||||
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
|
||||
.addComponent(tagsScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 150, javax.swing.GroupLayout.PREFERRED_SIZE)
|
||||
.addGap(5, 5, 5)
|
||||
.addComponent(advancedButton)
|
||||
.addContainerGap())))
|
||||
);
|
||||
}// </editor-fold>//GEN-END:initComponents
|
||||
|
||||
|
@ -190,20 +190,16 @@
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTextArea" name="instructionsTextArea">
|
||||
<Component class="javax.swing.JTextPane" name="instructionsTextArea">
|
||||
<Properties>
|
||||
<Property name="editable" type="boolean" value="false"/>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="f0" green="f0" red="f0" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="columns" type="int" value="20"/>
|
||||
<Property name="lineWrap" type="boolean" value="true"/>
|
||||
<Property name="rows" type="int" value="4"/>
|
||||
<Property name="contentType" type="java.lang.String" value="text/html" noResource="true"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="BingTranslatorSettingsPanel.instructionsTextArea.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="BingTranslatorSettingsPanel.instructionsTextArea.text_1" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="wrapStyleWord" type="boolean" value="true"/>
|
||||
<Property name="caretPosition" type="int" value="0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[1000, 200]"/>
|
||||
</Property>
|
||||
|
@ -32,6 +32,10 @@ import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.event.DocumentEvent;
|
||||
import javax.swing.event.DocumentListener;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import java.awt.Desktop;
|
||||
import java.net.URISyntaxException;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
|
||||
@ -75,6 +79,23 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
populateComboBox();
|
||||
selectLanguageByCode(code);
|
||||
targetLanguageCode = code;
|
||||
|
||||
instructionsTextArea.addHyperlinkListener(new HyperlinkListener() {
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
|
||||
// Try to display the URL in the user's browswer.
|
||||
if(Desktop.isDesktopSupported()) {
|
||||
try {
|
||||
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||
} catch (IOException | URISyntaxException ex) {
|
||||
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -140,7 +161,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
testResultValueLabel = new javax.swing.JLabel();
|
||||
authenticationKeyLabel = new javax.swing.JLabel();
|
||||
instructionsScrollPane = new javax.swing.JScrollPane();
|
||||
instructionsTextArea = new javax.swing.JTextArea();
|
||||
instructionsTextArea = new javax.swing.JTextPane();
|
||||
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
|
||||
|
||||
setLayout(new java.awt.GridBagLayout());
|
||||
@ -265,12 +286,8 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
|
||||
instructionsTextArea.setEditable(false);
|
||||
instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240));
|
||||
instructionsTextArea.setColumns(20);
|
||||
instructionsTextArea.setLineWrap(true);
|
||||
instructionsTextArea.setRows(4);
|
||||
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N
|
||||
instructionsTextArea.setWrapStyleWord(true);
|
||||
instructionsTextArea.setCaretPosition(0);
|
||||
instructionsTextArea.setContentType("text/html"); // NOI18N
|
||||
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(BingTranslatorSettingsPanel.class, "BingTranslatorSettingsPanel.instructionsTextArea.text_1")); // NOI18N
|
||||
instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200));
|
||||
instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78));
|
||||
instructionsScrollPane.setViewportView(instructionsTextArea);
|
||||
@ -316,7 +333,7 @@ public class BingTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
private javax.swing.JTextField authenticationKeyField;
|
||||
private javax.swing.JLabel authenticationKeyLabel;
|
||||
private javax.swing.JScrollPane instructionsScrollPane;
|
||||
private javax.swing.JTextArea instructionsTextArea;
|
||||
private javax.swing.JTextPane instructionsTextArea;
|
||||
private javax.swing.JLabel resultLabel;
|
||||
private javax.swing.JComboBox<LanguageWrapper> targetLanguageComboBox;
|
||||
private javax.swing.JLabel targetLanguageLabel;
|
||||
|
@ -13,5 +13,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated:
|
||||
GoogleTranslatorSettingsPanel.resultLabel.text=Result:
|
||||
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
|
||||
BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key:
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
|
||||
GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
|
||||
GoogleTranslatorSettingsPanel.instructionsTextArea.text=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: <a style="color: #1E2A60;" href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>.</div>
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text_1=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: <a style="color: \\#1E2A60;" href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>.</div>
|
||||
|
@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=Untranslated:
|
||||
GoogleTranslatorSettingsPanel.resultLabel.text=Result:
|
||||
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
|
||||
BingTranslatorSettingsPanel.authenticationKeyLabel.text=Authentication Key:
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text=You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
|
||||
GoogleTranslatorSettingsPanel.instructionsTextArea.text=You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
|
||||
GoogleTranslatorSettingsPanel.instructionsTextArea.text=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need a JSON credentials file which contains your service account key for your Google Translate account. Information on how to create a service account key is available here: <a style="color: #1E2A60;" href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>.</div>
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text_1=<div style\\="font-size: 12pt; font-family: Verdana, 'Verdana CE', Arial, 'Arial CE', 'Lucida Grande CE', lucida, 'Helvetica CE', sans-serif; ">You will need to provide a Microsoft Translator authentication key for your Microsoft Translator account. Instructions on how to get one are available here: <a style="color: \\#1E2A60;" href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>.</div>
|
||||
|
@ -26,5 +26,5 @@ GoogleTranslatorSettingsPanel.untranslatedLabel.text=\u672a\u7ffb\u8a33:
|
||||
GoogleTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c:
|
||||
GoogleTranslatorSettingsPanel.testResultValueLabel.text=
|
||||
BingTranslatorSettingsPanel.authenticationKeyLabel.text=\u8a8d\u8a3c\u30ad\u30fc:
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
|
||||
GoogleTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eGoogle\u7ffb\u8a33\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306b\u542b\u307e\u308c\u308bJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u5fc5\u8981\u306b\u306a\u308a\u307e\u3059\u3002\u30b5\u30fc\u30d3\u30b9\u30a2\u30ab\u30a6\u30f3\u30c8\u30ad\u30fc\u306e\u4f5c\u6210\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u60c5\u5831\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u3042\u307e\u3059: https://cloud.google.com/iam/docs/creating-managing-service-account-keys
|
||||
BingTranslatorSettingsPanel.instructionsTextArea.text=\u304a\u4f7f\u3044\u306eMicrosoft Translator\u30a2\u30ab\u30a6\u30f3\u30c8\u306bMicrosoft Translator\u8a8d\u8a3c\u30ad\u30fc\u3092\u63d0\u4f9b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30ad\u30fc\u306e\u53d6\u5f97\u65b9\u6cd5\u306b\u95a2\u3059\u308b\u624b\u9806\u306f\u3053\u3061\u3089\u306b\u3042\u308a\u307e\u3059: https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup
|
||||
|
@ -212,20 +212,16 @@
|
||||
|
||||
<Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
|
||||
<SubComponents>
|
||||
<Component class="javax.swing.JTextArea" name="instructionsTextArea">
|
||||
<Component class="javax.swing.JTextPane" name="instructionsTextArea">
|
||||
<Properties>
|
||||
<Property name="editable" type="boolean" value="false"/>
|
||||
<Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
|
||||
<Color blue="f0" green="f0" red="f0" type="rgb"/>
|
||||
</Property>
|
||||
<Property name="columns" type="int" value="20"/>
|
||||
<Property name="lineWrap" type="boolean" value="true"/>
|
||||
<Property name="rows" type="int" value="4"/>
|
||||
<Property name="contentType" type="java.lang.String" value="text/html" noResource="true"/>
|
||||
<Property name="text" type="java.lang.String" editor="org.netbeans.modules.i18n.form.FormI18nStringEditor">
|
||||
<ResourceString bundle="org/sleuthkit/autopsy/texttranslation/translators/Bundle.properties" key="GoogleTranslatorSettingsPanel.instructionsTextArea.text" replaceFormat="org.openide.util.NbBundle.getMessage({sourceFileName}.class, "{key}")"/>
|
||||
</Property>
|
||||
<Property name="wrapStyleWord" type="boolean" value="true"/>
|
||||
<Property name="caretPosition" type="int" value="0"/>
|
||||
<Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
|
||||
<Dimension value="[1000, 200]"/>
|
||||
</Property>
|
||||
|
@ -24,17 +24,21 @@ import com.google.cloud.translate.Language;
|
||||
import com.google.cloud.translate.Translate;
|
||||
import com.google.cloud.translate.TranslateOptions;
|
||||
import com.google.cloud.translate.Translation;
|
||||
import java.awt.Desktop;
|
||||
import java.awt.event.ItemListener;
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.net.URISyntaxException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.logging.Level;
|
||||
import org.sleuthkit.autopsy.coreutils.Logger;
|
||||
import javax.swing.JFileChooser;
|
||||
import javax.swing.event.HyperlinkEvent;
|
||||
import javax.swing.event.HyperlinkListener;
|
||||
import javax.swing.filechooser.FileNameExtensionFilter;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.openide.util.NbBundle.Messages;
|
||||
@ -59,6 +63,23 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
targetLanguageCode = languageCode;
|
||||
credentialsPathField.setText(credentialsPath);
|
||||
populateTargetLanguageComboBox();
|
||||
|
||||
instructionsTextArea.addHyperlinkListener(new HyperlinkListener() {
|
||||
@Override
|
||||
public void hyperlinkUpdate(HyperlinkEvent e) {
|
||||
if(e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
|
||||
// Try to display the URL in the user's browswer.
|
||||
if(Desktop.isDesktopSupported()) {
|
||||
try {
|
||||
Desktop.getDesktop().browse(e.getURL().toURI());
|
||||
} catch (IOException | URISyntaxException ex) {
|
||||
logger.log(Level.WARNING, "Failed to display URL in external viewer", ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -198,7 +219,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
testUntranslatedTextField = new javax.swing.JTextField();
|
||||
testButton = new javax.swing.JButton();
|
||||
instructionsScrollPane = new javax.swing.JScrollPane();
|
||||
instructionsTextArea = new javax.swing.JTextArea();
|
||||
instructionsTextArea = new javax.swing.JTextPane();
|
||||
javax.swing.Box.Filler filler1 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 0));
|
||||
|
||||
setLayout(new java.awt.GridBagLayout());
|
||||
@ -335,12 +356,8 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
|
||||
instructionsTextArea.setEditable(false);
|
||||
instructionsTextArea.setBackground(new java.awt.Color(240, 240, 240));
|
||||
instructionsTextArea.setColumns(20);
|
||||
instructionsTextArea.setLineWrap(true);
|
||||
instructionsTextArea.setRows(4);
|
||||
instructionsTextArea.setContentType("text/html"); // NOI18N
|
||||
instructionsTextArea.setText(org.openide.util.NbBundle.getMessage(GoogleTranslatorSettingsPanel.class, "GoogleTranslatorSettingsPanel.instructionsTextArea.text")); // NOI18N
|
||||
instructionsTextArea.setWrapStyleWord(true);
|
||||
instructionsTextArea.setCaretPosition(0);
|
||||
instructionsTextArea.setMaximumSize(new java.awt.Dimension(1000, 200));
|
||||
instructionsTextArea.setPreferredSize(new java.awt.Dimension(164, 78));
|
||||
instructionsScrollPane.setViewportView(instructionsTextArea);
|
||||
@ -405,7 +422,7 @@ public class GoogleTranslatorSettingsPanel extends javax.swing.JPanel {
|
||||
private javax.swing.JButton browseButton;
|
||||
private javax.swing.JTextField credentialsPathField;
|
||||
private javax.swing.JScrollPane instructionsScrollPane;
|
||||
private javax.swing.JTextArea instructionsTextArea;
|
||||
private javax.swing.JTextPane instructionsTextArea;
|
||||
private javax.swing.JLabel resultLabel;
|
||||
private javax.swing.JComboBox<org.sleuthkit.autopsy.texttranslation.translators.LanguageWrapper> targetLanguageComboBox;
|
||||
private javax.swing.JButton testButton;
|
||||
|
@ -94,6 +94,10 @@ public enum FileTypeUtils {
|
||||
ImageIO.scanForPlugins();
|
||||
//add all extension ImageIO claims to support
|
||||
imageExtensions.addAll(Stream.of(ImageIO.getReaderFileSuffixes())
|
||||
// remove any empty extension types provided by ImageIO.getReaderFileSuffixes()
|
||||
// This prevents extensions added by SPI implementations from causing errors
|
||||
// (i.e. 'jai-imageio' utilized with IcePDF)
|
||||
.filter((extension) -> StringUtils.isNotBlank(extension))
|
||||
.map(String::toLowerCase)
|
||||
.collect(Collectors.toList()));
|
||||
//add list of known image extensions
|
||||
@ -144,8 +148,12 @@ public enum FileTypeUtils {
|
||||
* are not images) to show up in Image Gallery.
|
||||
* supportedMimeTypes.addAll(Arrays.asList("application/x-emf"));
|
||||
*/
|
||||
//add list of mimetypes ImageIO claims to support
|
||||
//add list of mimetypes ImageIO claims to support
|
||||
supportedMimeTypes.addAll(Stream.of(ImageIO.getReaderMIMETypes())
|
||||
// remove any empty mime types provided by ImageIO.getReaderMIMETypes()
|
||||
// This prevents mime types added by SPI implementations from causing errors
|
||||
// (i.e. 'jai-imageio' utilized with IcePDF)
|
||||
.filter((mimeType) -> StringUtils.isNotBlank(mimeType))
|
||||
.map(String::toLowerCase)
|
||||
.collect(Collectors.toList()));
|
||||
|
||||
|
@ -190,7 +190,7 @@ public final class DrawableTagsManager {
|
||||
returnTagName = autopsyTagsManager.getDisplayNamesToTagNamesMap().get(displayName);
|
||||
if (returnTagName != null) {
|
||||
return returnTagName;
|
||||
}
|
||||
}
|
||||
throw new TskCoreException("Tag name exists but an error occured in retrieving it", ex);
|
||||
}
|
||||
}
|
||||
|
@ -42,11 +42,12 @@ The following need to be done at least once. They do not need to be repeated for
|
||||
|
||||
Autopsy depends on a specific version of The Sleuth Kit. You need the Java libraries of The Sleuth Kit installed, which is not part of all packages.
|
||||
|
||||
- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc.
|
||||
-- % sudo apt install ./sleuthkit-java_4.7.0-1_amd64.deb
|
||||
- Linux: Install the sleuthkit-java.deb file that you can download from github.com/sleuthkit/sleuthkit/releases. This will install libewf, etc. For example:
|
||||
-- % sudo apt install ./sleuthkit-java_4.8.0-1_amd64.deb
|
||||
|
||||
- OS X: Install The Sleuth Kit from brew.
|
||||
-- % brew install sleuthkit
|
||||
- OS X: Build The Sleuth Kit from source.
|
||||
See https://slo-sleuth.github.io/tools/InstallingAutopsyOnMacOS.html for a comprehensive write-up
|
||||
on building The Sleuth Kit and getting Autopsy to run on Mac OS.
|
||||
|
||||
|
||||
* Install Autopsy *
|
||||
|
@ -13,6 +13,8 @@ Currently, the Drone Analyzer module works on images obtained from the internal
|
||||
- Mavic Pro
|
||||
- Mavic Air
|
||||
|
||||
The module will find DAT files and process them using DatCon (https://datfile.net/DatCon/intro.html).
|
||||
|
||||
\section drone_config Running the Module
|
||||
|
||||
To enable the Drone Analyzer ingest module select the checkbox in the \ref ingest_configure "Ingest Modules configuration screen".
|
||||
@ -27,4 +29,4 @@ GPS results can also be seen in the \ref geolocation_page window and the KML Rep
|
||||
|
||||
\image html geolocation_drone_path.png
|
||||
|
||||
*/
|
||||
*/
|
||||
|
@ -4,7 +4,11 @@ You can configure a machine translation service to use with Autopsy. If one is c
|
||||
|
||||
\section mt_config Configuration
|
||||
|
||||
To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top.
|
||||
To set up a machine translation service, go to Options->Tools and then select the Machine Translation tab. Select the service you want to use from the drop down menu at the top. You will have to set up an account with either Bing or Google and then enter account information.
|
||||
<ul>
|
||||
<li> Bing Translate: <a href="https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup">https://docs.microsoft.com/en-us/azure/cognitive-services/translator/translator-text-how-to-signup</a>
|
||||
<li> Google Translate: <a href="https://cloud.google.com/iam/docs/creating-managing-service-account-keys">https://cloud.google.com/iam/docs/creating-managing-service-account-keys</a>
|
||||
</ul>
|
||||
|
||||
\image html mt_config.png
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user