associatedObjectArtifacts = file.getArtifacts(ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT);
+ if (!associatedObjectArtifacts.isEmpty()) {
+ BlackboardArtifact artifact = associatedObjectArtifacts.get(0);
+ BlackboardAttribute associatedArtifactAttribute = artifact.getAttribute(new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
+ if (associatedArtifactAttribute != null) {
+ long artifactId = associatedArtifactAttribute.getValueLong();
+ BlackboardArtifact associatedArtifact = artifact.getSleuthkitCase().getBlackboardArtifact(artifactId);
+ addDownloadSourceRow(sb, associatedArtifact);
}
}
} catch (TskCoreException ex) {
@@ -292,6 +294,26 @@ public class Metadata extends javax.swing.JPanel implements DataContentViewer {
this.setCursor(null);
}
+ /**
+ * Adds a row for download source from the given associated artifact,
+ * if the associated artifacts specifies a source.
+ *
+ * @param sb string builder.
+ * @param associatedArtifact
+ *
+ * @throws TskCoreException if there is an error
+ */
+ private void addDownloadSourceRow(StringBuilder sb, BlackboardArtifact associatedArtifact ) throws TskCoreException {
+ if (associatedArtifact != null &&
+ ((associatedArtifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID()) ||
+ (associatedArtifact.getArtifactTypeID() == ARTIFACT_TYPE.TSK_WEB_CACHE.getTypeID())) ) {
+ BlackboardAttribute urlAttr = associatedArtifact.getAttribute(new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_URL));
+ if (urlAttr != null) {
+ addRow(sb, NbBundle.getMessage(this.getClass(), "Metadata.tableRowTitle.downloadSource"), urlAttr.getValueString());
+ }
+ }
+ }
+
/**
* Add the acquisition details to the results (if applicable)
*
diff --git a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle_ja.properties
index f139f20a19..8ce5b3ba54 100644
--- a/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/contentviewers/textcontentviewer/Bundle_ja.properties
@@ -1,15 +1,23 @@
-StringsTextViewer.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
-StringsTextViewer.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
-StringsTextViewer.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09
-StringsTextViewer.title=\u30b9\u30c8\u30ea\u30f3\u30b0
-StringsTextViewer.toolTip=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u62bd\u51fa\u3055\u308c\u305fASCII\u304a\u3088\u3073\u30e6\u30cb\u30b3\u30fc\u30c9\u306e\u30b9\u30c8\u30ea\u30f3\u30b0\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
+StringsTextViewer.goToPageTextField.msgDlg=1 \u304b\u3089 {0} \u307e\u3067\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044
+StringsTextViewer.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3067\u3059
+StringsTextViewer.setDataView.errorText=(\u30aa\u30d5\u30bb\u30c3\u30c8 {0}-{1} \u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f)
+StringsTextViewer.setDataView.errorNoText=(\u30aa\u30d5\u30bb\u30c3\u30c8 {0}-{1} \u306b\u306f\u30c6\u30ad\u30b9\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u305b\u3093)
+StringsTextViewer.title=\u6587\u5b57\u5217
+StringsTextViewer.toolTip=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u62bd\u51fa\u3057\u305fASCII\u6587\u5b57\u5217\u3068Unicode\u6587\u5b57\u5217\u3092\u8868\u793a
StringsContentPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
StringsContentPanel.currentPageLabel.text_1=1
StringsContentPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
-StringsContentPanel.ofLabel.text_1=of
+StringsContentPanel.ofLabel.text_1=/
StringsContentPanel.totalPageLabel.text_1=100
-StringsContentPanel.languageLabel.text=\u30b9\u30af\u30ea\u30d7\u30c8\uff1a
-StringsContentPanel.languageCombo.toolTipText=\u30d0\u30a4\u30ca\u30ea\u30b9\u30c8\u30ea\u30f3\u30b0\u306e\u51e6\u7406\uff08\u62bd\u51fa\u304a\u3088\u3073\u30c7\u30b3\u30fc\u30c9\uff09\u306b\u4f7f\u7528\u3059\u308b\u8a00\u8a9e
-StringsContentPanel.goToPageLabel.text=\u6b21\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a
+StringsContentPanel.languageLabel.toolTipText=
+StringsContentPanel.languageLabel.text=\u30b9\u30af\u30ea\u30d7\u30c8:
+StringsContentPanel.languageCombo.toolTipText=\u30d0\u30a4\u30ca\u30ea\u30fc\u30c7\u30fc\u30bf\u306e\u6587\u5b57\u5217\u306e\u89e3\u91c8(\u62bd\u51fa\u304a\u3088\u3073\u30c7\u30b3\u30fc\u30c9)\u4e2d\u306b\u8a66\u3059\u8a00\u8a9e
+StringsContentPanel.goToPageTextField.text=
+StringsContentPanel.goToPageLabel.text=\u30da\u30fc\u30b8\u306b\u79fb\u52d5:
+StringsContentPanel.prevPageButton.text=
StringsContentPanel.pageLabel2.text=\u30da\u30fc\u30b8
-StringsContentPanel.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a
+StringsContentPanel.nextPageButton.text=
+StringsContentPanel.pageLabel.text_1=\u30da\u30fc\u30b8:
+TextContentViewer.title=\u30c6\u30ad\u30b9\u30c8
+TextContentViewer.tooltip=\u9078\u629e\u3057\u305f\u9805\u76ee\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a
+TextContentViewerPanel.defaultName=\u30c6\u30ad\u30b9\u30c8
diff --git a/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties
index 7bd07e089b..3bda55e29c 100644
--- a/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/core/Bundle_ja.properties
@@ -1,30 +1,33 @@
+Installer.closing.confirmationDialog.message=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059\u3002\u7d42\u4e86\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
+Installer.closing.confirmationDialog.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059
+# {0} - \u4f8b\u5916\u30e1\u30c3\u30bb\u30fc\u30b8
+Installer.closing.messageBox.caseCloseExceptionMessage=\u6b21\u306e\u30b1\u30fc\u30b9\u3092\u9589\u3058\u3066\u3044\u308b\u9593\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u30fc
OpenIDE-Module-Long-Description=\
- \u3053\u308c\u304cAutopsy\u306e\u30b3\u30a2\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002\n\n\
- \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u307f\u3067\u5b9f\u884c\u3059\u308b\u306e\u306b\u5fc5\u8981\u306a\u4e3b\u8981\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\uff1aRCP\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3001\u30a6\u30a3\u30f3\u30c9\u30a6\u30a4\u30f3\u30b0GUI\u3001Sleuth Kit\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u3001\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb\uff0f\u30b9\u30c8\u30ec\u30fc\u30b8\u3001\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u3001\u7d50\u679c\u30d3\u30e5\u30fc\u30a2\u3001\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30a2\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u7528\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3001\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u3001\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u7b49\u306e\u4e3b\u8981\u30c4\u30fc\u30eb\u3002\n\n\
- \u30e2\u30b8\u30e5\u30fc\u30eb\u5185\u306e\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3001\u30d3\u30e5\u30fc\u30a2\u3001\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u958b\u767a\u7528\u306eAPI\u304c\u542b\u307e\u308c\u307e\u3059\u3002\
- \u30e2\u30b8\u30e5\u30fc\u30eb\u306fAutopsy\u30d7\u30e9\u30b0\u30a4\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u4f7f\u7528\u3057\u3001\u30d7\u30e9\u30b0\u30a4\u30f3\u3068\u3057\u3066\u5b9f\u88c5\u3067\u304d\u307e\u3059\u3002\n\
- \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044\u3002\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u306a\u3051\u308c\u3070\u3001Autopsy\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002\n\n\
- \u8a73\u7d30\u306f\u3053\u3061\u3089\u3067\u3054\u78ba\u8a8d\u304f\u3060\u3055\u3044\u3002http\://www.sleuthkit.org/autopsy/
-OpenIDE-Module-Name=Autopsy-\u30b3\u30a2
+ \u3053\u308c\u306fAutopsy\u306e\u30b3\u30a2\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002\n\n\
+ \u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u306f\u3001RCP\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3001\u30a6\u30a3\u30f3\u30c9\u30a6\u4f5c\u6210GUI\u3001sleuthkit\u30d0\u30a4\u30f3\u30c7\u30a3\u30f3\u30b0\u3001\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb / \u30b9\u30c8\u30ec\u30fc\u30b8\u3001\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30fc\u3001\u7d50\u679c\u30d3\u30e5\u30fc\u30ef\u30fc\u3001\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30ef\u30fc\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u3001\u30ec\u30dd\u30fc\u30c6\u30a3\u30f3\u30b0\u3001\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u306a\u3069\u306e\u30b3\u30a2\u30c4\u30fc\u30eb\u3068\u3044\u3063\u305f\u3001\u30d9\u30a2\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u5b9f\u884c\u306b\u5fc5\u8981\u306a\u30b3\u30a2\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\n\n\
+ \u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u542b\u307e\u308c\u308b\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af\u306b\u306f\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3001\u30d3\u30e5\u30fc\u30ef\u30fc\u3001\u30ec\u30dd\u30fc\u30c6\u30a3\u30f3\u30b0\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u4f5c\u6210\u7528API\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002 \
+ \u30e2\u30b8\u30e5\u30fc\u30eb\u306fAutopsy\u30d7\u30e9\u30b0\u30a4\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30e9\u30fc\u3092\u7528\u3044\u308b\u30d7\u30e9\u30b0\u30a4\u30f3\u3068\u3057\u3066\u5c55\u958b\u3067\u304d\u307e\u3059\u3002\n\
+ \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30a2\u30f3\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u306a\u3044\u3067\u304f\u3060\u3055\u3044 - \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u306a\u3044\u3068Autopsy\u304c\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002\n\n\
+ \u8a73\u7d30\u306f\u3001http://www.sleuthkit.org/autopsy/ \u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044
+OpenIDE-Module-Name=Autopsy-Core
OpenIDE-Module-Short-Description=Autopsy\u30b3\u30a2\u30e2\u30b8\u30e5\u30fc\u30eb
-org_sleuthkit_autopsy_core_update_center=http\://sleuthkit.org/autopsy/updates_ja.xml
+org_sleuthkit_autopsy_core_update_center=http://sleuthkit.org/autopsy/updates.xml
Services/AutoupdateType/org_sleuthkit_autopsy_core_update_center.settings=Autopsy\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u30bb\u30f3\u30bf\u30fc
-Installer.errorInitJavafx.msg=JavaFX\u521d\u671f\u5316\u30a8\u30e9\u30fc
-ServicesMonitor.failedService.notify.title=\u30b5\u30fc\u30d3\u30b9\u304c\u505c\u6b62\u3057\u3066\u3044\u307e\u3059
-ServicesMonitor.failedService.notify.msg={0}\u3078\u306e\u63a5\u7d9a\u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
-ServicesMonitor.restoredService.notify.title=\u30b5\u30fc\u30d3\u30b9\u304c\u7a3c\u50cd\u4e2d\u3067\u3059
-ServicesMonitor.restoredService.notify.msg={0}\u3078\u306e\u63a5\u7d9a\u304c\u5229\u7528\u3067\u304d\u307e\u3059
-ServicesMonitor.statusChange.notify.title=\u30b5\u30fc\u30d3\u30b9\u30b9\u30c6\u30fc\u30bf\u30b9\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8
-ServicesMonitor.statusChange.notify.msg={0}\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u306f{1}
-ServicesMonitor.nullServiceName.excepton.txt=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30b5\u30fc\u30d3\u30b9\u306f\u30cc\u30eb\u3067\u3059
-ServicesMonitor.unknownServiceName.excepton.txt=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30b5\u30fc\u30d3\u30b9{0}\u306f\u4e0d\u660e\u3067\u3059
-TextConverter.convert.exception.txt=\u30c6\u30ad\u30b9\u30c8{0}\u3092hex\u30c6\u30ad\u30b9\u30c8\u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-TextConverter.convertFromHex.exception.txt=hex\u30c6\u30ad\u30b9\u30c8\u3092\u30c6\u30ad\u30b9\u30c8\u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-ServicesMonitor.KeywordSearchNull=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9\u3092\u898b\u3064\u3051\u308c\u307e\u305b\u3093\u3067\u3057\u305f
-ServicesMonitor.InvalidPortNumber=\u7121\u52b9\u306a\u30dd\u30fc\u30c8\u756a\u53f7
-ServicesMonitor.remoteCaseDatabase.displayName.text=\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30b1\u30fc\u30b9\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b5\u30fc\u30d3\u30b9
-ServicesMonitor.remoteKeywordSearch.displayName.text=\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9
-ServicesMonitor.messaging.displayName.text=\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9
-ServicesMonitor.databaseConnectionInfo.error.msg=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u63a5\u7d9a\u60c5\u5831\u3092\u5165\u624b\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-ServicesMonitor.messagingService.connErr.text=\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u306e\u63a5\u7d9a\u60c5\u5831\u3092\u5165\u624b\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
\ No newline at end of file
+Installer.errorInitJavafx.msg=JavaFX\u306e\u521d\u671f\u5316\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+Installer.errorInitJavafx.details=\ \u4e00\u90e8\u306e\u6a5f\u80fd\u304c\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002 \u9069\u5207\u306aJRE\u304c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u304b\u78ba\u8a8d\u304f\u3060\u3055\u3044(Oracle JRE 1.7.10\u4ee5\u964d)\u3002
+ServicesMonitor.failedService.notify.title=\u30b5\u30fc\u30d3\u30b9\u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
+ServicesMonitor.failedService.notify.msg={0} \u3078\u306e\u63a5\u7d9a\u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
+ServicesMonitor.restoredService.notify.title=\u30b5\u30fc\u30d3\u30b9\u304c\u5b9f\u884c\u4e2d\u3067\u3059
+ServicesMonitor.restoredService.notify.msg={0} \u3078\u306e\u63a5\u7d9a\u304c\u5b9f\u884c\u4e2d\u3067\u3059
+ServicesMonitor.statusChange.notify.title=\u30b5\u30fc\u30d3\u30b9\u30b9\u30c6\u30fc\u30bf\u30b9\u66f4\u65b0
+ServicesMonitor.statusChange.notify.msg={0} \u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u306f {1} \u3067\u3059
+ServicesMonitor.nullServiceName.excepton.txt=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30b5\u30fc\u30d3\u30b9\u540d\u306fnull\u3067\u3059
+ServicesMonitor.unknownServiceName.excepton.txt=\u30ea\u30af\u30a8\u30b9\u30c8\u3055\u308c\u305f\u30b5\u30fc\u30d3\u30b9\u540d {0} \u306f\u4e0d\u660e\u3067\u3059
+ServicesMonitor.KeywordSearchNull=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+ServicesMonitor.InvalidPortNumber=\u7121\u52b9\u306a\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059\u3002
+ServicesMonitor.remoteCaseDatabase.displayName.text=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30b5\u30fc\u30d3\u30b9
+ServicesMonitor.remoteKeywordSearch.displayName.text=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9
+ServicesMonitor.messaging.displayName.text=\u30e1\u30c3\u30bb\u30fc\u30b8\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9
+ServicesMonitor.databaseConnectionInfo.error.msg=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u63a5\u7d9a\u60c5\u5831\u306b\u30a2\u30af\u30bb\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ServicesMonitor.messagingService.connErr.text=\u30e1\u30c3\u30bb\u30fc\u30b8\u30f3\u30b0\u30b5\u30fc\u30d3\u30b9\u63a5\u7d9a\u60c5\u5831\u306b\u30a2\u30af\u30bb\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
index b65d0873fe..409e27f080 100644
--- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
+++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java
@@ -81,6 +81,7 @@ public final class UserPreferences {
private static final String GEO_TILE_OPTION = "GeolocationTileOption";
private static final String GEO_OSM_TILE_ZIP_PATH = "GeolocationOsmZipPath";
private static final String GEO_OSM_SERVER_ADDRESS = "GeolocationOsmServerAddress";
+ private static final String GEO_MBTILES_FILE_PATH = "GeolcoationMBTilesFilePath";
// Prevent instantiation.
private UserPreferences() {
@@ -576,7 +577,7 @@ public final class UserPreferences {
}
/**
- * Sets the address of the OSM tile server.
+ * Sets the address of geolocation window user defined OSM server data source.
*
* @param address
*/
@@ -592,4 +593,22 @@ public final class UserPreferences {
public static String getGeolocationOsmServerAddress() {
return preferences.get(GEO_OSM_SERVER_ADDRESS, "");
}
+
+ /**
+ * Sets the path for Geolocation MBTiles data source file.
+ *
+ * @param absolutePath
+ */
+ public static void setGeolocationMBTilesFilePath(String absolutePath) {
+ preferences.put(GEO_MBTILES_FILE_PATH, absolutePath);
+ }
+
+ /**
+ * Retrieves the path for the Geolocation MBTiles data source file.
+ *
+ * @return Absolute path to MBTiles file or empty string if none was found.
+ */
+ public static String getGeolocationMBTilesFilePath() {
+ return preferences.get(GEO_MBTILES_FILE_PATH, "");
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/core/discoveryWsmode.xml b/Core/src/org/sleuthkit/autopsy/core/discoveryWsmode.xml
new file mode 100644
index 0000000000..ef5da81277
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/core/discoveryWsmode.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/core/layer.xml b/Core/src/org/sleuthkit/autopsy/core/layer.xml
index 630af198a2..e853720824 100644
--- a/Core/src/org/sleuthkit/autopsy/core/layer.xml
+++ b/Core/src/org/sleuthkit/autopsy/core/layer.xml
@@ -448,6 +448,7 @@
+
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties
index a2727c5700..91f27d6210 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponentinterfaces/Bundle_ja.properties
@@ -1,3 +1,3 @@
-OpenIDE-Module-Name=\u4E3B\u8981\u30B3\u30F3\u30DD\u30FC\u30CD\u30F3\u30C8\u30A4\u30F3\u30BF\u30FC\u30D5\u30A7\u30A4\u30B9
-CoreComponentControl.CTL_DirectoryTreeTopComponent=\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u30C4\u30EA\u30FC
-CoreComponentControl.CTL_FavoritesTopComponent=\u304A\u6C17\u306B\u5165\u308A
\ No newline at end of file
+OpenIDE-Module-Name=\u4e3b\u8981\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9
+CoreComponentControl.CTL_DirectoryTreeTopComponent=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc
+CoreComponentControl.CTL_FavoritesTopComponent=\u304a\u6c17\u306b\u5165\u308a
diff --git a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
index 3f1c8c2ac5..6f941632c8 100644
--- a/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/corecomponents/Bundle_ja.properties
@@ -1,117 +1,274 @@
-CTL_DataContentAction=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4
-OptionsCategory_Keywords_General=Autopsy\u30aa\u30d7\u30b7\u30e7\u30f3
-CTL_CustomAboutAction=Autopsy\u306b\u3064\u3044\u3066
+AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidImageSpecified.text=\u7121\u52b9\u306e\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u304c\u6307\u5b9a\u3055\u308c\u307e\u3057\u305f\u3002
+AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.invalidPath.text=\u30d1\u30b9\u306f\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.pathNotSet.text=\u30a8\u30fc\u30b8\u30a7\u30f3\u30b7\u30fc\u30ed\u30b4\u30d1\u30b9\u3092\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+AutopsyOptionsPanel.invalidImageFile.msg=\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30fc\u30b8\u30a7\u30f3\u30b7\u30fc\u30ed\u30b4\u3068\u3057\u3066\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+AutopsyOptionsPanel.invalidImageFile.title=\u7121\u52b9\u306a\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3067\u3059
+AutopsyOptionsPanel.logNumAlert.invalidInput.text=\u3053\u3053\u3067\u306f\u6b63\u306e\u6574\u6570\u304c\u5fc5\u8981\u3067\u3059\u3002
+AutopsyOptionsPanel.memFieldValidationLabel.developerMode.text=\u958b\u767a\u8005\u30e2\u30fc\u30c9\u3067\u5b9f\u884c\u4e2d\u306f\u30e1\u30e2\u30ea\u30fc\u8a2d\u5b9a\u304c\u5229\u7528\u3067\u304d\u307e\u305b\u3093
+AutopsyOptionsPanel.memFieldValidationLabel.invalidCharacters.text=\u7121\u52b9\u306a\u6587\u5b57\u3067\u3059\u3002\u5024\u306f\u6b63\u306e\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+AutopsyOptionsPanel.memFieldValidationLabel.not64BitInstall.text=JVM\u30e1\u30e2\u30ea\u30fc\u8a2d\u5b9a\u306f64\u30d3\u30c3\u30c8\u7248\u306b\u306e\u307f\u6709\u52b9\u3067\u3059
+AutopsyOptionsPanel.memFieldValidationLabel.noValueEntered.text=\u5024\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+# {0} - systemMemory
+AutopsyOptionsPanel.memFieldValidationLabel.overMaxMemory.text=\u5024\u306f\u5408\u8a08\u30b7\u30b9\u30c6\u30e0\u30e1\u30e2\u30ea\u30fc\u306e {0}GB\u4ee5\u4e0b\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+# {0} - minimumMemory
+AutopsyOptionsPanel.memFieldValidationLabel.underMinMemory.text=\u5024\u306f\u5c11\u306a\u304f\u3068\u3082 {0}GB\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+CTL_DataContentAction=DataContent
CTL_DataContentTopComponent=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4
-HINT_DataContentTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
-HINT_NodeTableTopComponent=\u3053\u308c\u306f\u30c7\u30fc\u30bf\u7d50\u679c\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
-OpenIDE-Module-Name=\u4e3b\u8981\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8
-DataContentViewerHex.pageLabel.text_1=\u30da\u30fc\u30b8\uff1a
+CTL_CustomAboutAction=\u6982\u8981
+CTL_OfflineHelpAction=Autopsy\u30aa\u30d5\u30e9\u30a4\u30f3\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
+CTL_OnlineHelpAction=Autopsy\u30aa\u30f3\u30e9\u30a4\u30f3\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
+DataContentViewerArtifact.attrsTableHeader.sources=\u30bd\u30fc\u30b9
+DataContentViewerArtifact.attrsTableHeader.type=\u30bf\u30a4\u30d7
+DataContentViewerArtifact.attrsTableHeader.value=\u5024
+DataContentViewerArtifact.failedToGetAttributes.message=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u4e00\u90e8\u307e\u305f\u306f\u3059\u3079\u3066\u306e\u5c5e\u6027\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+DataContentViewerArtifact.failedToGetSourcePath.message=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+DataContentViewerHex.copyingFile=HxD\u3067\u958b\u304f\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc\u4e2d\u3067\u3059...
+DataContentViewerHex.launchError=HxD\u30a8\u30c7\u30a3\u30bf\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3002[\u30c4\u30fc\u30eb] -> [\u30aa\u30d7\u30b7\u30e7\u30f3] -> [\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc] \u3067HxD\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5834\u6240\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044
+DataResultViewerTable.commentRender.name=C
+DataResultViewerTable.commentRender.toolTip=C(\u30b3\u30e1\u30f3\u30c8)\u306f\u9805\u76ee\u306b\u30b3\u30e1\u30f3\u30c8\u304c\u3042\u308b\u304b\u3069\u3046\u304b\u3092\u793a\u3057\u3066\u3044\u307e\u3059
+DataResultViewerTable.commentRenderer.crAndTagComment.toolTip=\u30b3\u30e1\u30f3\u30c8\u304c\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u3068\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30bf\u30b0\u306e\u4e21\u65b9\u306b\u5b58\u5728\u3057\u307e\u3059
+DataResultViewerTable.commentRenderer.crComment.toolTip=\u30b3\u30e1\u30f3\u30c8\u304c\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306b\u5b58\u5728\u3057\u307e\u3059
+DataResultViewerTable.commentRenderer.noComment.toolTip=\u30b3\u30e1\u30f3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+DataResultViewerTable.commentRenderer.tagComment.toolTip=\u30b3\u30e1\u30f3\u30c8\u304c\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30bf\u30b0\u306b\u5b58\u5728\u3057\u307e\u3059
+DataResultViewerTable.countRender.name=O
+DataResultViewerTable.countRender.toolTip=O(\u767a\u751f)\u306f\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306e\u9805\u76ee\u3092\u542b\u3080\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u6570\u3092\u793a\u3057\u3066\u3044\u307e\u3059
+DataResultViewerTable.exportCSVButtonActionPerformed.empty=\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3059\u308b\u30c7\u30fc\u30bf\u306f\u3042\u308a\u307e\u305b\u3093
+DataResultViewerTable.firstColLbl=\u540d\u524d
+DataResultViewerTable.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3067\u3059
+# {0} - totalPages
+DataResultViewerTable.goToPageTextField.msgDlg=1 \u304b\u3089 {0} \u307e\u3067\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044
+# {0} - currentPage
+# {1} - totalPages
+DataResultViewerTable.pageNumbers.curOfTotal={0} / {1}
+DataResultViewerTable.scoreRender.name=S
+DataResultViewerTable.scoreRender.toolTip=S(\u30b9\u30b3\u30a2)\u306f\u9805\u76ee\u304c\u8208\u5473\u6df1\u3044\u304b\u9855\u8457\u306a\u3082\u306e\u3067\u3042\u308b\u304b\u3069\u3046\u304b\u3092\u793a\u3057\u3066\u3044\u307e\u3059
+DataResultViewerTable.title=\u30c6\u30fc\u30d6\u30eb
+DataResultViewerThumbnail.sortLabel.text=\u6b21\u3067\u30bd\u30fc\u30c8: ---
+# {0} - \u30bd\u30fc\u30c8\u6761\u4ef6
+DataResultViewerThumbnail.sortLabel.textTemplate=\u6b21\u3067\u30bd\u30fc\u30c8: {0}
+DataResultViewerThumbnail.thumbnailSizeComboBox.large=\u5927\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.thumbnailSizeComboBox.medium=\u4e2d\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.thumbnailSizeComboBox.small=\u5c0f\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+OptionsCategory_Name_General=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3
+OptionsCategory_Keywords_General=Autopsy\u30aa\u30d7\u30b7\u30e7\u30f3
+HINT_DataContentTopComponent=\u3053\u308c\u306fDataContent\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
+HINT_NodeTableTopComponent=\u3053\u308c\u306fDataResult\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
+OpenIDE-Module-Name=CoreComponents
+DataContentViewerHex.prevPageButton.text=
+DataContentViewerHex.nextPageButton.text=
+DataContentViewerHex.pageLabel.text_1=\u30da\u30fc\u30b8:
DataContentViewerHex.currentPageLabel.text_1=1
+DataContentViewerHex.ofLabel.text_1=/
DataContentViewerHex.totalPageLabel.text_1=100
DataContentViewerHex.pageLabel2.text=\u30da\u30fc\u30b8
-Format_OperatingSystem_Value={0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3 {2}
+
+# \u88fd\u54c1\u60c5\u5831\u30d1\u30cd\u30eb
+LBL_Description=\n \u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3: {0} ({9}) Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3: {7} Netbeans RCP\u30d3\u30eb\u30c9: {8} Java: {1}; {2} \u30b7\u30b9\u30c6\u30e0: {3}; {4}; {5}Userdir: {6}
+Format_OperatingSystem_Value={2} \u4e0a\u3067 {0} \u30d0\u30fc\u30b8\u30e7\u30f3 {1} \u304c\u5b9f\u884c\u4e2d\u3067\u3059
+LBL_Copyright=Autopsy™ \u306fSleuth Kit&trade\u3068\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u30d9\u30fc\u30b9\u3068\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002
\u8457\u4f5c\u6a29 © 2003-2018.
+SortChooser.dialogTitle=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u9078\u629e
+ThumbnailViewChildren.progress.cancelling=(\u53d6\u308a\u6d88\u3057\u4e2d)
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+ThumbnailViewNode.progressHandle.text={0} \u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u3067\u3059
+URL_ON_IMG=http://www.sleuthkit.org/
+FILE_FOR_LOCAL_HELP=file:///
+INDEX_FOR_LOCAL_HELP=/docs/index.html
LBL_Close=\u9589\u3058\u308b
DataContentViewerHex.copyMenuItem.text=\u30b3\u30d4\u30fc
-DataContentViewerHex.selectAllMenuItem.text=\u5168\u3066\u9078\u629e
+DataContentViewerHex.selectAllMenuItem.text=\u3059\u3079\u3066\u3092\u9078\u629e
DataContentViewerArtifact.totalPageLabel.text=100
+DataContentViewerArtifact.prevPageButton.text=
DataContentViewerArtifact.pageLabel2.text=\u7d50\u679c
+DataContentViewerArtifact.nextPageButton.text=
DataContentViewerArtifact.currentPageLabel.text=1
+DataContentViewerArtifact.ofLabel.text=/
DataContentViewerArtifact.copyMenuItem.text=\u30b3\u30d4\u30fc
-DataContentViewerArtifact.selectAllMenuItem.text=\u5168\u3066\u9078\u629e
-DataContentViewerArtifact.pageLabel.text=\u7d50\u679c\uff1a
+DataContentViewerArtifact.selectAllMenuItem.text=\u3059\u3079\u3066\u3092\u9078\u629e
+DataContentViewerArtifact.pageLabel.text=\u7d50\u679c:
AdvancedConfigurationDialog.applyButton.text=OK
-DataContentViewerHex.goToPageLabel.text=\u6b21\u306e\u30da\u30fc\u30b8\u3078\u79fb\u52d5\uff1a
-DataResultViewerThumbnail.pageLabel.text=\u30da\u30fc\u30b8\uff1a
-DataResultViewerThumbnail.pagesLabel.text=\u30da\u30fc\u30b8\uff1a
-DataResultViewerThumbnail.imagesLabel.text=\u30a4\u30e1\u30fc\u30b8\uff1a
+DataContentViewerHex.goToPageTextField.text=
+DataContentViewerHex.goToPageLabel.text=\u30da\u30fc\u30b8\u306b\u79fb\u52d5:
+DataResultViewerThumbnail.pageLabel.text=\u30da\u30fc\u30b8:
+DataResultViewerThumbnail.pagesLabel.text=\u30da\u30fc\u30b8:
+DataResultViewerThumbnail.pagePrevButton.text=
+DataResultViewerThumbnail.pageNextButton.text=
+DataResultViewerThumbnail.imagesLabel.text=\u30a4\u30e1\u30fc\u30b8:
DataResultViewerThumbnail.imagesRangeLabel.text=-
DataResultViewerThumbnail.pageNumLabel.text=-
-DataResultViewerThumbnail.goToPageLabel.text=\u6b21\u306e\u30da\u30fc\u30b8\u306b\u79fb\u52d5\uff1a
-AdvancedConfigurationDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-DataContentViewerArtifact.waitText=\u30c7\u30fc\u30bf\u3092\u53d6\u8fbc\u307f\u304a\u3088\u3073\u6e96\u5099\u4e2d\u3002\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u4e0b\u3055\u3044...
-DataContentViewerArtifact.errorText=\u7d50\u679c\u3092\u53d6\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+DataResultViewerThumbnail.filePathLabel.text=\ \ \
+DataResultViewerThumbnail.goToPageLabel.text=\u30da\u30fc\u30b8\u306b\u79fb\u52d5:
+DataResultViewerThumbnail.goToPageField.text=
+AdvancedConfigurationDialog.cancelButton.text=\u53d6\u308a\u6d88\u3057
+DataContentViewerArtifact.waitText=\u30c7\u30fc\u30bf\u3092\u691c\u7d22\u3057\u3066\u6e96\u5099\u4e2d\u3067\u3059\u3002\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
+DataContentViewerArtifact.errorText=\u7d50\u679c\u306e\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
DataContentViewerArtifact.title=\u7d50\u679c
-DataContentViewerArtifact.toolTip=\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u9023\u3059\u308b\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059
-DataContentViewerHex.goToPageTextField.msgDlg=\uff11\u304b\u3089 {0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
-DataContentViewerHex.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
-DataContentViewerHex.setDataView.errorText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306f\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\uff09
-DataContentViewerHex.title=HEX
-DataContentViewerHex.toolTip=\u30d0\u30a4\u30ca\u30ea\u30b3\u30f3\u30c6\u30f3\u30c4\u3092HEX\u30d5\u30a1\u30a4\u30eb\u3068\u3057\u3066\u8868\u793a\u3057\u3001ASCII\u3068\u3057\u3066\u8868\u793a\u3067\u304d\u308b\u30d0\u30a4\u30c8\u306f\u53f3\u5074\u306b\u8868\u793a\u3057\u307e\u3059\u3002
-DataResultPanel.pleasewaitNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026
-DataResultViewerTable.firstColLbl=\u540d\u524d
-DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5b9a\u3055\u308c\u305f\u30da\u30a2\u30ec\u30f3\u30c8\u304b\u3089\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u30c1\u30e3\u30a4\u30eb\u30c9\u30ce\u30fc\u30c9\u306f\u901a\u5e38\u306ePropertySet\u3092\u6301\u3063\u3066\u3044\u307e\u305b\u3093\u3002
-DataResultViewerTable.title=\u30c6\u30fc\u30d6\u30eb
-DataResultViewerTable.pleasewaitNodeDisplayName=\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u2026
+DataContentViewerArtifact.toolTip=\u30d5\u30a1\u30a4\u30eb\u3068\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u7d50\u679c\u3092\u8868\u793a
+DataContentViewerHex.goToPageTextField.msgDlg=1 \u304b\u3089 {0} \u307e\u3067\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044
+DataContentViewerHex.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3067\u3059
+DataContentViewerHex.setDataView.errorText=(\u30aa\u30d5\u30bb\u30c3\u30c8 {0}-{1} \u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f)
+DataContentViewerHex.title=16\u9032\u6570
+DataContentViewerHex.toolTip=\u30d5\u30a1\u30a4\u30eb\u306e\u30d0\u30a4\u30ca\u30ea\u30fc\u30b3\u30f3\u30c6\u30f3\u30c4\u309216\u9032\u6570\u3068\u3057\u3066\u8868\u793a\u3057\u307e\u3059\u3002\u53f3\u5074\u306bASCII\u6587\u5b57\u3068\u3057\u3066\u8868\u793a\u53ef\u80fd\u306a\u30d0\u30a4\u30c8\u304c\u793a\u3055\u308c\u307e\u3059\u3002
+DataResultPanel.pleasewaitNodeDisplayName=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
+DataResultViewerTable.illegalArgExc.noChildFromParent=\u6307\u5b9a\u3057\u305f\u89aa\u304b\u3089\u5b50\u30ce\u30fc\u30c9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+DataResultViewerTable.illegalArgExc.childWithoutPropertySet=\u5b50\u30ce\u30fc\u30c9\u306b\u306f\u6b63\u898f\u306ePropertySet\u304c\u3042\u308a\u307e\u305b\u3093\u3002
DataResultViewerThumbnail.title=\u30b5\u30e0\u30cd\u30a4\u30eb
-DataResultViewerThumbnail.goToPageTextField.msgDlg=\uff11\u304b\u3089{0}\u306e\u9593\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u6570\u3092\u5165\u529b\u3057\u3066\u4e0b\u3055\u3044
-DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u6570
-DataResultViewerThumbnail.genThumbs=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u2026
-DataResultViewerThumbnail.pageNumbers.curOfTotal={0}\uff0f{1}\u76ee
+DataResultViewerThumbnail.goToPageTextField.msgDlg=1 \u304b\u3089 {0} \u307e\u3067\u306e\u6709\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044
+DataResultViewerThumbnail.goToPageTextField.err=\u7121\u52b9\u306a\u30da\u30fc\u30b8\u756a\u53f7\u3067\u3059
+DataResultViewerThumbnail.genThumbs=\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u3067\u3059...
+DataResultViewerThumbnail.pageNumbers.curOfTotal={0} / {1}
GeneralOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-LBL_Description=\n \u88fd\u54c1\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {0} ({9}) Sleuth Kit\u30d0\u30fc\u30b8\u30e7\u30f3\uff1a {7} Netbeans RCP\u30d3\u30eb\u30c9\: {8} Java\: {1}; {2} \u30b7\u30b9\u30c6\u30e0\uff1a {3}; {4}; {5}\u30e6\u30fc\u30b6\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u540d {6}
-LBL_Copyright=Autopsy™\u306fSleuth Kit™\u3084\u305d\u306e\u4ed6\u30c4\u30fc\u30eb\u3092\u57fa\u306b\u3057\u305f\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3059\u3002
Copyright © 2003-2013. \u8a73\u7d30\u306f\u4e0b\u8a18\u3092\u3054\u89a7\u4e0b\u3055\u3044\u3002
http\://www.sleuthkit.org .
-ProductInformationPanel.verbLoggingEnabled.text=Verbose\u30ed\u30b0\u304c\u6709\u52b9\u3067\u3059
+GeneralOptionsPanelController.moduleErr.msg=GeneralOptionsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+ProductInformationPanel.verbLoggingEnabled.text=\u8a73\u7d30\u30ed\u30ae\u30f3\u30b0\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059
ProductInformationPanel.propertyUnknown.text=\u4e0d\u660e
ProductInformationPanel.getVMValue.text={0} {1}
TableFilterNode.displayName.text=\u540d\u524d
-DataContentViewerHex.ofLabel.text_1=of
-DataContentViewerArtifact.ofLabel.text=of
-DataContentViewerString.setDataView.errorNoText=\uff08\u30aa\u30d5\u30bb\u30c3\u30c8{0}-{1}\u306b\u306f\u30c6\u30ad\u30b9\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\uff09
-DataResultViewerThumbnail.comboBox.smallThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5c0f\uff09
-DataResultViewerThumbnail.comboBox.mediumThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u4e2d\uff09
-DataResultViewerThumbnail.comboBox.largeThumbnails=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5927\uff09
-DataResultViewerThumbnail.switchPage.done.errMsg=\u30b5\u30e0\u30cd\u30a4\u30eb\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}
-AboutWindowPanel.actVerboseLogging.text=Verbose\u30ed\u30b0\u3092\u30a2\u30af\u30c6\u30a3\u30d9\u30fc\u30c8
-OptionsCategory_Name_Multi_User_Settings=\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc
-OptionsCategory_Keywords_Multi_User_Options=\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc\u30aa\u30d7\u30b7\u30e7\u30f3
+DataResultViewerThumbnail.comboBox.smallThumbnails=\u5c0f\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.comboBox.mediumThumbnails=\u4e2d\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.comboBox.largeThumbnails=\u5927\u30b5\u30a4\u30ba\u306e\u30b5\u30e0\u30cd\u30a4\u30eb
+DataResultViewerThumbnail.switchPage.done.errMsg=\u6b21\u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+AboutWindowPanel.actVerboseLogging.text=\u8a73\u7d30\u30ed\u30ae\u30f3\u30b0\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u5316
+OptionsCategory_Name_Multi_User_Settings=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc
+OptionsCategory_Keywords_Multi_User_Options=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u8a2d\u5b9a
MultiUserSettingsPanel.lbSolrSettings.text=Solr\u8a2d\u5b9a
-MultiUserSettingsPanel.cbEnableMultiUser.text=\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9\u3092\u6709\u52b9\u5316
+MultiUserSettingsPanel.cbEnableMultiUser.text=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9\u3092\u6709\u52b9\u5316
MultiUserSettingsPanel.lbDatabaseSettings.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a
-MultiUserSettingsPanel.validationErrMsg.incomplete=\u5168\u3066\u306e\u30d0\u30ea\u30e5\u30fc\u3092\u5165\u529b
-MultiUserSettingsPanel.nonWindowsOs.msg=Windows\u3067\u3057\u304b\u8907\u6570\u306e\u30e6\u30fc\u30b6\u30fc\u7248\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
-MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=\u7121\u52b9\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30dd\u30fc\u30c8\u756a\u53f7
-MultiUserSettingsPanel.validationErrMsg.invalidMessageServicePort=\u7121\u52b9\u306a\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u30dd\u30fc\u30c8\u756a\u53f7
-MultiUserSettingsPanel.validationErrMsg.invalidIndexingServerPort=\u7121\u52b9\u306aSolr\u30b5\u30fc\u30d0\u30fc\u30dd\u30fc\u30c8\u756a\u53f7
-MultiUserSettingsPanel.validationErrMsg.invalidMessgeServiceURI=\u7121\u52b9\u306a\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u30db\u30b9\u30c8\u3084\u30dd\u30fc\u30c8\u756a\u53f7
+MultiUserSettingsPanel.validationErrMsg.incomplete=\u3059\u3079\u3066\u306e\u5024\u3092\u5165\u529b
+MultiUserSettingsPanel.nonWindowsOs.msg=\u30de\u30eb\u30c1\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9\u306fWindows\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u4e0a\u3067\u306e\u307f\u5229\u7528\u3067\u304d\u307e\u3059
+MultiUserSettingsPanel.validationErrMsg.invalidDatabasePort=\u7121\u52b9\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059
+MultiUserSettingsPanel.validationErrMsg.invalidMessageServicePort=\u7121\u52b9\u306a\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u306e\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059
+MultiUserSettingsPanel.validationErrMsg.invalidIndexingServerPort=\u7121\u52b9\u306aSolr \u30b5\u30fc\u30d0\u30fc\u306e\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059
+MultiUserSettingsPanel.validationErrMsg.invalidMessgeServiceURI=\u6709\u52b9\u3067\u306f\u306a\u3044\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u30db\u30b9\u30c8\u304a\u3088\u3073/\u307e\u305f\u306f\u30dd\u30fc\u30c8\u3067\u3059
DataContentViewerHex.goToOffsetLabel.text=\u30aa\u30d5\u30bb\u30c3\u30c8\u306b\u30b8\u30e3\u30f3\u30d7
-DataContentViewerHex.goToOffsetTextField.msgDlg=\u7121\u52b9\u306a\u30aa\u30d5\u30bb\u30c3\u30c8\uff1a{0}
-DataContentViewerHex.setDataView.invalidOffset.negativeOffsetValue=\u8a08\u7b97\u3055\u308c\u305f\u30aa\u30d5\u30bb\u30c3\u30c8\u306b\u30b8\u30e3\u30f3\u30d7\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+DataContentViewerHex.goToOffsetTextField.text=
+DataContentViewerHex.goToOffsetTextField.msgDlg=\u7121\u52b9\u306a\u30aa\u30d5\u30bb\u30c3\u30c8: {0}
+DataContentViewerHex.setDataView.invalidOffset.negativeOffsetValue=\u7d50\u679c\u3068\u3057\u3066\u751f\u3058\u305f\u30aa\u30d5\u30bb\u30c3\u30c8\u306b\u30b8\u30e3\u30f3\u30d7\u3067\u304d\u307e\u305b\u3093
+MultiUserSettingsPanel.tbOops.text=
+MultiUserSettingsPanel.lbTestDatabase.text=
MultiUserSettingsPanel.bnTestDatabase.text=\u30c6\u30b9\u30c8
MultiUserSettingsPanel.tbDbHostname.toolTipText=\u30db\u30b9\u30c8\u540d\u307e\u305f\u306fIP\u30a2\u30c9\u30ec\u30b9
+MultiUserSettingsPanel.tbDbHostname.text=
MultiUserSettingsPanel.tbDbPort.toolTipText=\u30dd\u30fc\u30c8\u756a\u53f7
-MultiUserSettingsPanel.tbDbUsername.toolTipText=\u30e6\u30fc\u30b6\u30fc\u540d
+MultiUserSettingsPanel.tbDbPort.text=
+MultiUserSettingsPanel.tbDbUsername.toolTipText=\u30e6\u30fc\u30b6\u30fc\u540d
+MultiUserSettingsPanel.tbDbUsername.text=
MultiUserSettingsPanel.tbDbPassword.toolTipText=\u30d1\u30b9\u30ef\u30fc\u30c9
+MultiUserSettingsPanel.tbDbPassword.text=
+MultiUserSettingsPanel.lbTestSolr.text=
MultiUserSettingsPanel.bnTestSolr.text=\u30c6\u30b9\u30c8
MultiUserSettingsPanel.tbSolrHostname.toolTipText=\u30db\u30b9\u30c8\u540d\u307e\u305f\u306fIP\u30a2\u30c9\u30ec\u30b9
MultiUserSettingsPanel.tbSolrPort.toolTipText=\u30dd\u30fc\u30c8\u756a\u53f7
+MultiUserSettingsPanel.lbTestMessageService.text=
MultiUserSettingsPanel.bnTestMessageService.text=\u30c6\u30b9\u30c8
MultiUserSettingsPanel.lbMessageServiceSettings.text=ActiveMQ\u30e1\u30c3\u30bb\u30fc\u30b8\u30b5\u30fc\u30d3\u30b9\u8a2d\u5b9a
MultiUserSettingsPanel.tbMsgPort.toolTipText=\u30dd\u30fc\u30c8\u756a\u53f7
-MultiUserSettingsPanel.tbMsgUsername.toolTipText=\u30e6\u30fc\u30b6\u30fc\u540d\uff08\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\uff09
-MultiUserSettingsPanel.tbMsgPassword.toolTipText=\u30d1\u30b9\u30ef\u30fc\u30c9\uff08\u30aa\u30d7\u30b7\u30e7\u30ca\u30eb\uff09
+MultiUserSettingsPanel.tbMsgPort.text=
+MultiUserSettingsPanel.tbMsgUsername.toolTipText=\u30e6\u30fc\u30b6\u30fc\u540d(\u4efb\u610f)
+MultiUserSettingsPanel.tbMsgUsername.text=
+MultiUserSettingsPanel.tbMsgPassword.toolTipText=\u30d1\u30b9\u30ef\u30fc\u30c9(\u4efb\u610f)
+MultiUserSettingsPanel.tbMsgPassword.text=
MultiUserSettingsPanel.tbMsgHostname.toolTipText=\u30db\u30b9\u30c8\u540d\u307e\u305f\u306fIP\u30a2\u30c9\u30ec\u30b9
-MultiUserSettingsPanel.KeywordSearchNull=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9\u3092\u898b\u3064\u3051\u308c\u3089\u308c\u307e\u305b\u3093
-MultiUserSettingsPanel.InvalidPortNumber=\u7121\u52b9\u306a\u30dd\u30fc\u30c8\u756a\u53f7
-CTL_OfflineHelpAction=\u30aa\u30d5\u30e9\u30a4\u30f3Autopsy\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3
-CTL_OnlineHelpAction=\u30aa\u30f3\u30e9\u30a4\u30f3Autopsy\u30c9\u30ad\u30e5\u30e1\u30f3\u30c6\u30fc\u30b7\u30e7\u30f3
-DataResultViewerThumbnail.thumbnailSizeComboBox.large=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5927\uff09
-DataResultViewerThumbnail.thumbnailSizeComboBox.medium=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u4e2d\uff09
-DataResultViewerThumbnail.thumbnailSizeComboBox.small=\u30b5\u30e0\u30cd\u30a4\u30eb\uff08\u5c0f\uff09
-MediaViewImagePanel.errorLabel.OOMText=\u30d5\u30a1\u30a4\u30eb\u3092\u30e1\u30c7\u30a3\u30a2\u30d3\u30e5\u30fc\u306b\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\uff1a\u30e1\u30e2\u30ea\u4e0d\u8db3\u3002
-MediaViewImagePanel.errorLabel.text=\u30d5\u30a1\u30a4\u30eb\u3092\u30e1\u30c7\u30a3\u30a2\u30d3\u30e5\u30fc\u306b\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-MediaViewImagePanel.externalViewerButton.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u30fc\u3067\u958b\u304f
+MultiUserSettingsPanel.tbMsgHostname.text=
+MultiUserSettingsPanel.lbTestMessageWarning.text=
+MultiUserSettingsPanel.lbTestSolrWarning.text=
+MultiUserSettingsPanel.lbTestDbWarning.text=
+MultiUserSettingsPanel.KeywordSearchNull=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30b5\u30fc\u30d3\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+MultiUserSettingsPanel.InvalidPortNumber=\u7121\u52b9\u306a\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059
+AutopsyOptionsPanel.agencyLogoImageLabel.toolTipText=
+AutopsyOptionsPanel.agencyLogoPathField.text=
+SortChooserDialog.label=\u524a\u9664
+SortChooser.addCriteriaButton.text=\u30bd\u30fc\u30c8\u6761\u4ef6\u3092\u8ffd\u52a0
+DataResultViewerThumbnail.sortButton.text=\u30bd\u30fc\u30c8
+CriterionChooser.ascendingRadio.text=\u25b2 \u6607\u9806\n
+CriterionChooser.removeButton.text=\u524a\u9664
+CriterionChooser.descendingRadio.text=\u25bc \u964d\u9806
+AutopsyOptionsPanel.agencyLogoPathFieldValidationLabel.text=
+AutopsyOptionsPanel.logNumAlert.text=
+AutopsyOptionsPanel.totalMemoryLabel.text=\u5408\u8a08\u30b7\u30b9\u30c6\u30e0\u30e1\u30e2\u30ea\u30fc:
+AutopsyOptionsPanel.maxMemoryLabel.text=\u6700\u5927JVM\u30e1\u30e2\u30ea\u30fc:
+AutopsyOptionsPanel.maxLogFileCount.text=\u6700\u5927\u30ed\u30b0\u30d5\u30a1\u30a4\u30eb\u6570:
+AutopsyOptionsPanel.maxMemoryUnitsLabel.text=GB
+AutopsyOptionsPanel.restartNecessaryWarning.text=\u30e1\u30e2\u30ea\u30fc\u5909\u66f4\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+AutopsyOptionsPanel.browseLogosButton.text=\u53c2\u7167
+AutopsyOptionsPanel.defaultLogoRB.text=\u30c7\u30d5\u30a9\u30eb\u30c8\u3092\u4f7f\u7528
+AutopsyOptionsPanel.specifyLogoRB.text=\u30ed\u30b4\u3092\u6307\u5b9a
+AutopsyOptionsPanel.agencyLogoPreview.text=\u30ed\u30b4\u304c\u3042\u308a\u307e\u305b\u3093 selected
+AutopsyOptionsPanel.logoPanel.border.title=\u30ed\u30b4
+AutopsyOptionsPanel.runtimePanel.border.title=\u30e9\u30f3\u30bf\u30a4\u30e0
DataResultPanel.matchLabel.text=\u7d50\u679c
DataResultPanel.numberOfChildNodesLabel.text=0
-DataResultPanel.descriptionLabel.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30d1\u30b9
+DataResultPanel.descriptionLabel.text=directoryPath
+ViewOptionsController.moduleErr=\u5024\u306e\u5909\u66f4\u3092\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+ViewOptionsController.moduleErr.msg=\u5024\u306e\u5909\u66f4\u306e\u51e6\u7406\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+ViewPreferencesPanel.groupByDataSourceCheckbox.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5225\u306b\u30b0\u30eb\u30fc\u30d7\u5316
+ViewPreferencesPanel.currentCaseSettingsPanel.border.title=\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u8a2d\u5b9a
+OptionsCategory_Name_View=\u8868\u793a
+OptionsCategory_Keywords_View=\u8868\u793a
+ViewPreferencesPanel.currentSessionSettingsPanel.border.title=\u73fe\u5728\u306e\u30bb\u30c3\u30b7\u30e7\u30f3\u8a2d\u5b9a
+ViewPreferencesPanel.hideRejectedResultsCheckbox.text=\u62d2\u5426\u3055\u308c\u305f\u7d50\u679c\u3092\u975e\u8868\u793a\u306b\u3059\u308b
+ViewPreferencesPanel.selectFileLabel.text=\u30d5\u30a1\u30a4\u30eb\u9078\u629e\u6642:
+ViewPreferencesPanel.globalSettingsPanel.border.title=\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a
+ViewPreferencesPanel.translateTextLabel.text=\u30c6\u30ad\u30b9\u30c8\u3092\u7ffb\u8a33:
+ViewPreferencesPanel.hideOtherUsersTagsLabel.text=\u6b21\u306e\u305d\u306e\u4ed6\u306e\u30e6\u30fc\u30b6\u30fc\u306e\u30bf\u30b0\u3092\u975e\u8868\u793a\u306b\u3059\u308b:
+ViewPreferencesPanel.hideOtherUsersTagsCheckbox.text=\u30c4\u30ea\u30fc\u5185\u306e\u30bf\u30b0\u9818\u57df
+ViewPreferencesPanel.useAnotherTimeRadioButton.text=\u5225\u306e\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u4f7f\u7528
ViewPreferencesPanel.useLocalTimeRadioButton.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u4f7f\u7528
-ViewPreferencesPanel.displayTimeLabel.text=\u6642\u9593\u3092\u8868\u793a\u3059\u308b\u5834\u5408\uff1a
-ViewPreferencesPanel.viewsHideKnownCheckbox.text=\u30d3\u30e5\u30fc\u30a8\u30ea\u30a2
-ViewPreferencesPanel.dataSourcesHideKnownCheckbox.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30a8\u30ea\u30a2\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u968e\u5c64\uff09
-ViewPreferencesPanel.hideKnownFilesLabel.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\uff08NIST NSRL\u5185\u306e\uff09\u3092\u6b21\u306b\u96a0\u3059\uff1a
-ViewPreferencesPanel.keepCurrentViewerRadioButton.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u305d\u306e\u307e\u307eHEX\u30d3\u30e5\u30fc\u3092\u4f7f\u7528\u3002
-ViewPreferencesPanel.keepCurrentViewerRadioButton.text=\u305d\u306e\u307e\u307e\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u3092\u4f7f\u7528
-ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=\u4f8b\u3048\u3070\u3001JPEG\u304c\u9078\u629e\u3055\u308c\u305f\u5834\u5408\u306b\u306fHEX\u304b\u3089\u30e1\u30c7\u30a3\u30a2\u306b\u5909\u66f4\u3059\u308b\u3002
-ViewPreferencesPanel.useBestViewerRadioButton.text=\u6700\u3082\u5c02\u9580\u7684\u306a\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u30a2\u306b\u5909\u66f4
-ViewPreferencesPanel.selectFileLabel.text=\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3059\u308b\u5834\u5408\uff1a
+ViewPreferencesPanel.displayTimeLabel.text=\u6642\u523b\u8868\u793a\u6642:
+ViewPreferencesPanel.viewsHideSlackCheckbox.text=\u30d3\u30e5\u30fc\u9818\u57df
+ViewPreferencesPanel.dataSourcesHideSlackCheckbox.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u9818\u57df(\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u968e\u5c64)
+ViewPreferencesPanel.hideSlackFilesLabel.text=\u6b21\u306e\u30b9\u30e9\u30c3\u30af\u30d5\u30a1\u30a4\u30eb\u3092\u975e\u8868\u793a\u306b\u3059\u308b:
+ViewPreferencesPanel.viewsHideKnownCheckbox.text=\u30d3\u30e5\u30fc\u9818\u57df
+ViewPreferencesPanel.dataSourcesHideKnownCheckbox.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u9818\u57df(\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u968e\u5c64)
+ViewPreferencesPanel.hideKnownFilesLabel.text=\u6b21\u306e\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb(NIST NSRL\u5185\u306e\u30d5\u30a1\u30a4\u30eb)\u3092\u975e\u8868\u793a\u306b\u3059\u308b:
+ViewPreferencesPanel.keepCurrentViewerRadioButton.toolTipText=\u305f\u3068\u3048\u3070\u3001JPEG\u9078\u629e\u6642\u306f16\u9032\u30d3\u30e5\u30fc\u306e\u307e\u307e\u306b\u3057\u307e\u3059\u3002
+ViewPreferencesPanel.keepCurrentViewerRadioButton.text=\u540c\u3058\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u306e\u307e\u307e\u306b\u3059\u308b
+ViewPreferencesPanel.useBestViewerRadioButton.toolTipText=\u305f\u3068\u3048\u3070\u3001JPEG\u9078\u629e\u6642\u306f16\u9032\u304b\u3089\u30e1\u30c7\u30a3\u30a2\u306b\u5207\u308a\u66ff\u3048\u307e\u3059\u3002
+ViewPreferencesPanel.useBestViewerRadioButton.text=\u6700\u3082\u56fa\u6709\u306e\u30d5\u30a1\u30a4\u30eb\u30d3\u30e5\u30fc\u306b\u5207\u308a\u66ff\u3048\u308b
+ViewPreferencesPanel.fileNameTranslationColumnCheckbox.text=\u7d50\u679c\u30d3\u30e5\u30fc\u30ef\u30fc\u306b\u30d5\u30a1\u30a4\u30eb\u540d\u7ffb\u8a33\u7528\u5217\u3092\u8ffd\u52a0
+DataContentViewerHex.launchHxDButton.text=HxD\u3067\u8d77\u52d5
+ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
+ExternalViewerGlobalSettingsPanel.newRuleButton1.text=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.newRuleButton.text=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=\u53c2\u7167
+ExternalViewerGlobalSettingsPanel.jLabel2.text=\u8d77\u52d5\u53ef\u80fd\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30ef\u30fc\u306e\u62e1\u5f35\u5b50\u3092\u8a2d\u5b9a
+ExternalViewerGlobalSettingsPanel.jLabel1.text=HxD\u30a8\u30c7\u30a3\u30bf\u30fc\u30d1\u30b9:
+ExternalViewerGlobalSettingsPanel.editRuleButton.text=\u30eb\u30fc\u30eb\u3092\u7de8\u96c6
+ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=\u30eb\u30fc\u30eb\u3092\u524a\u9664
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=\u7279\u5b9a\u306eMIME\u30bf\u30a4\u30d7/\u62e1\u5f35\u5b50\u3092\u3082\u3064\u30d5\u30a1\u30a4\u30eb\u306b\u4f7f\u7528\u3059\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d3\u30e5\u30fc\u30ef\u30fc\u3092\u8a2d\u5b9a:
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0=MIME\u30bf\u30a4\u30d7/\u62e1\u5f35\u5b50
+AddExternalViewerRulePanel.nameLabel.text=MIME\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50
+AddExternalViewerRulePanel.browseButton.text=\u53c2\u7167
+AddExternalViewerRulePanel.exePathTextField.text=
+AddExternalViewerRulePanel.exePathLabel.text=\u3053\u306e\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u4f7f\u7528\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30d1\u30b9
+AddExternalViewerRulePanel.extRadioButton.text=\u62e1\u5f35\u5b50
+AddExternalViewerRulePanel.mimeRadioButton.text=MIME\u30bf\u30a4\u30d7
+AddExternalViewerRulePanel.nameTextField.text=
+ExternalViewerGlobalSettingsPanel.jButton2.text_1=jButton2
+ExternalViewerGlobalSettingsPanel.newRuleButton1.text_1=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.newRuleButton.text_1=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text_1=\u53c2\u7167
+ExternalViewerGlobalSettingsPanel.jLabel2.text_1=\u8d77\u52d5\u53ef\u80fd\u306a\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30ef\u30fc\u306e\u62e1\u5f35\u5b50\u3092\u8a2d\u5b9a
+ExternalViewerGlobalSettingsPanel.jLabel1.text_1=HxD\u30a8\u30c7\u30a3\u30bf\u30fc\u30d1\u30b9:
+ExternalViewerGlobalSettingsPanel.HxDPath.text=C:/Program Files/HxD/HxD.exe
+ExternalViewerGlobalSettingsPanel.editRuleButton.text_1=\u30eb\u30fc\u30eb\u3092\u7de8\u96c6
+ExternalViewerGlobalSettingsPanel.deleteRuleButton.text_1=\u30eb\u30fc\u30eb\u3092\u524a\u9664
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text_1=\u7279\u5b9a\u306eMIME\u30bf\u30a4\u30d7/\u62e1\u5f35\u5b50\u3092\u3082\u3064\u30d5\u30a1\u30a4\u30eb\u306b\u4f7f\u7528\u3059\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d3\u30e5\u30fc\u30ef\u30fc\u3092\u8a2d\u5b9a:
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title1_1=\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title0_1=MIME\u30bf\u30a4\u30d7/\u62e1\u5f35\u5b50
+AutopsyOptionsPanel.maxSolrMemoryLabel.text=\u6700\u5927SolrJVM\u30e1\u30e2\u30ea\u30fc:
+AutopsyOptionsPanel.maxMemoryUnitsLabel2.text=MB
+AutopsyOptionsPanel.solrJVMHeapWarning.text=\u6ce8: \u3053\u308c\u3092\u3042\u307e\u308a\u306b\u3082\u5927\u304d\u304f\u8a2d\u5b9a\u3059\u308b\u3068\u3001\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u5168\u4f53\u306b\u5f71\u97ff\u3059\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
+DataResultViewerTable.gotoPageTextField.text=
+DataResultViewerTable.gotoPageLabel.AccessibleContext.accessibleName=
+DataResultViewerTable.gotoPageLabel.text=\u30da\u30fc\u30b8\u306b\u79fb\u52d5:
+DataResultViewerTable.pageNextButton.text=
+DataResultViewerTable.pagePrevButton.text=
+DataResultViewerTable.pagesLabel.text=\u30da\u30fc\u30b8:
+DataResultViewerTable.pageNumLabel.text=
+DataResultViewerTable.pageLabel.text=\u30da\u30fc\u30b8:
+ViewPreferencesPanel.maxResultsLabel.text=\u30c6\u30fc\u30d6\u30eb\u3067\u8868\u793a\u3059\u308b\u6700\u5927\u7d50\u679c\u6570:
+ViewPreferencesPanel.maxResultsLabel.toolTipText=\n\u3053\u306e\u5024\u30920 \u306b\u8a2d\u5b9a\u3059\u308b\u3068\u3001\u3059\u3079\u3066\u306e\u7d50\u679c\u304c\u7d50\u679c\u30c6\u30fc\u30d6\u30eb\u306b\u8868\u793a\u3055\u308c\u307e\u3059\u3002\n \u3053\u306e\u5024\u30920 \u306b\u8a2d\u5b9a\u3059\u308b\u3068\u3001\u7d50\u679c\u6570\u304c\u591a\u3044\u5834\u5408UI\u306e\u5fdc\u7b54\u6027\u304c\u60aa\u304f\u306a\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059 \u3002\n
+DataResultViewerTable.exportCSVButton.text=\u30c6\u30fc\u30d6\u30eb\u3092CSV\u3068\u3057\u3066\u4fdd\u5b58
+ViewPreferencesPanel.scoColumnsCheckbox.text=S(\u30b9\u30b3\u30a2)\u3001C(\u30b3\u30e1\u30f3\u30c8)\u3001O(\u767a\u751f)
+ViewPreferencesPanel.scoColumnsWrapAroundText.text=\u975e\u8868\u793a\u306b\u3059\u308b\u3068\u8aad\u8fbc\u307f\u304c\u65e9\u304f\u306a\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+ViewPreferencesPanel.scoColumnsLabel.text=\u6b21\u306e\u305f\u3081\u306e\u5217\u3092\u8ffd\u52a0\u3057\u306a\u3044:
diff --git a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties
index 861bb54da9..5f460a7c53 100644
--- a/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/coreutils/Bundle_ja.properties
@@ -1,27 +1,35 @@
-OpenIDE-Module-Name=\u4E3B\u8981\u30E6\u30FC\u30C6\u30A3\u30EA\u30C6\u30A3
-JLNK.noPrefPath.text=\u512A\u5148\u7684\u306B\u4F7F\u7528\u3059\u308B\u30D1\u30B9\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093
-PlatformUtil.nameUnknown=\u4E0D\u660E
-PlatformUtil.verUnknown=\u4E0D\u660E
-PlatformUtil.archUnknown=\u4E0D\u660E
-PlatformUtil.jrePath.jreDir.msg=\u57CB\u3081\u8FBC\u307E\u308C\u305FJRE\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\u304C\u767A\u898B\u3055\u308C\u307E\u3057\u305F\uFF1A{0}
-PlatformUtil.jrePath.usingJavaPath.msg=JAVA\u30D0\u30A4\u30CA\u30EA\u30D1\u30B9\u3092\u4F7F\u7528\uFF1A{0}
-PlatformUtil.getPID.sigarNotInit.msg=PID\u3092\u5165\u624B\u3067\u304D\u307E\u305B\u3093\u3001Sigar\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093
-PlatformUtil.getPID.gen.msg=PID\u3092\u5165\u624B\u3067\u304D\u307E\u305B\u3093\u3001{0}
-PlatformUtil.getJavaPID.sigarNotInit.msg=JAVA\u30D7\u30ED\u30BB\u30B9\u306EPID\u304C\u5165\u624B\u3067\u304D\u307E\u305B\u3093\u3001Sigar\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093
-PlatformUtil.getJavaPID.gen.msg=\u30AF\u30A8\u30EA\u30FC\u306EPID\u304C\u5165\u624B\u3067\u304D\u307E\u305B\u3093\uFF1A{0}, {1}
-PlatformUtil.getJavaPIDs.sigarNotInit=JAVA\u30D7\u30ED\u30BB\u30B9\u306EPID\u304C\u5165\u624B\u3067\u304D\u307E\u305B\u3093\u3001Sigar\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093
-PlatformUtil.getJavaPIDs.gen.msg=\u30AF\u30A8\u30EA\u30FC\u306EPID\u304C\u5165\u624B\u3067\u304D\u307E\u305B\u3093\uFF1A{0}, {1}
-PlatformUtil.killProcess.sigarNotInit.msg=PID\u3092\u4F7F\u7528\u3057\u3066\u30D7\u30ED\u30BB\u30B9\u3092\u5F37\u5236\u7D42\u4E86\u3067\u304D\u307E\u305B\u3093\u3001Sigar\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
-PlatformUtil.killProcess.gen.msg=\u30D7\u30ED\u30BB\u30B9\u3092\u5F37\u5236\u7D42\u4E86\u3067\u304D\u307E\u305B\u3093\uFF1A {0}, {1}
-PlatformUtil.getProcVmUsed.sigarNotInit.msg=\u4F7F\u7528\u4E2D\u306E\u4EEE\u60F3\u30E1\u30E2\u30EA\u91CF\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3001Sigar\u304C\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002
-PlatformUtil.getProcVmUsed.gen.msg=\u4F7F\u7528\u4E2D\u306E\u4EEE\u60F3\u30E1\u30E2\u30EA\u91CF\u3092\u78BA\u8A8D\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3001{0}
-PlatformUtil.getJvmMemInfo.usageText=JVM\u30D2\u30FC\u30D7\u4F7F\u7528\u72B6\u6CC1\uFF1A{0}\u3001JVM\u975E\u30D2\u30FC\u30D7\u4F7F\u7528\u72B6\u6CC1\uFF1A{1}
-PlatformUtil.getPhysicalMemInfo.usageText=\u7269\u7406\u30E1\u30E2\u30EA\u4F7F\u7528\u72B6\u6CC1\uFF08\u6700\u5927\u3001\u5408\u8A08\u3001\u5229\u7528\u53EF\u80FD\uFF09\uFF1A {0}, {1}, {2}
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+GetOrGenerateThumbnailTask.generatingPreviewFor={0} \u306e\u30d7\u30ec\u30d3\u30e5\u30fc\u3092\u751f\u6210\u4e2d\u3067\u3059
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+GetOrGenerateThumbnailTask.loadingThumbnailFor={0} \u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059
+ImageUtils.ffmpegLoadedError.msg=OpenCV FFMpeg\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u304c\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u8a73\u7d30\u306f\u30ed\u30b0\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044
+ImageUtils.ffmpegLoadedError.title=OpenCV FFMpeg
+OpenIDE-Module-Name=CoreUtils
+JLNK.noPrefPath.text=\u63a8\u5968\u30d1\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
+PlatformUtil.nameUnknown=\u4e0d\u660e
+PlatformUtil.verUnknown=\u4e0d\u660e
+PlatformUtil.archUnknown=\u4e0d\u660e
+PlatformUtil.jrePath.jreDir.msg=\u57cb\u3081\u8fbc\u307fjre\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u304c\u691c\u51fa\u3055\u308c\u305f\u5834\u6240: {0}
+PlatformUtil.jrePath.usingJavaPath.msg=\u6b21\u306ejava\u30d0\u30a4\u30ca\u30ea\u30fc\u30d1\u30b9\u3092\u4f7f\u7528\u4e2d\u3067\u3059: {0}
+PlatformUtil.getPID.sigarNotInit.msg=PID\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002Sigar\u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+PlatformUtil.getPID.gen.msg=PID,{0} \u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093
+PlatformUtil.getJavaPID.sigarNotInit.msg=java\u30d7\u30ed\u30bb\u30b9\u306ePID\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002Sigar\u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+PlatformUtil.getJavaPID.gen.msg=\u6b21\u306e\u30af\u30a8\u30ea\u306ePID\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093: {0}\u3001{1}
+PlatformUtil.getJavaPIDs.sigarNotInit=java\u30d7\u30ed\u30bb\u30b9\u306ePID\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002Sigar\u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+PlatformUtil.getJavaPIDs.gen.msg=\u6b21\u306e\u30af\u30a8\u30ea\u306ePID\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093: {0}\u3001{1}
+PlatformUtil.killProcess.sigarNotInit.msg=PID\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u5f37\u5236\u7d42\u4e86\u3067\u304d\u307e\u305b\u3093\u3002Sigar\u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+PlatformUtil.killProcess.gen.msg=\u6b21\u306e\u30d7\u30ed\u30bb\u30b9\u3092\u5f37\u5236\u7d42\u4e86\u3067\u304d\u307e\u305b\u3093: {0}\u3001{1}
+PlatformUtil.getProcVmUsed.sigarNotInit.msg=\u4f7f\u7528\u3057\u3066\u3044\u308b\u4eee\u60f3\u30e1\u30e2\u30ea\u30fc\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002Sigar\u304c\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+PlatformUtil.getProcVmUsed.gen.msg=\u4f7f\u7528\u3057\u3066\u3044\u308b\u4eee\u60f3\u30e1\u30e2\u30ea\u30fc\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3001{0}
+PlatformUtil.getJvmMemInfo.usageText=JVM \u30d2\u30fc\u30d7\u4f7f\u7528\u7387: {0}\u3001\u4f7f\u7528\u3055\u308c\u3066\u3044\u306a\u3044JVM\u30d2\u30fc\u30d7\u9818\u57df: {1}
+PlatformUtil.getPhysicalMemInfo.usageText=\u7269\u7406\u30e1\u30e2\u30ea\u30fc\u4f7f\u7528\u7387\uff08\u6700\u5927\u3001\u5408\u8a08\u3001\u7a7a\u304d\uff09: {0}\u3001{1}\u3001{2}
PlatformUtil.getAllMemUsageInfo.usageText={0}\n\
{1}\n\
-\u30D7\u30ED\u30BB\u30B9\u4EEE\u60F3\u30E1\u30E2\u30EA\uFF1A{2}
-StringExtract.illegalStateException.cannotInit.msg=\u30E6\u30CB\u30B3\u30FC\u30C9\u30C6\u30FC\u30D6\u30EB\u304C\u6B63\u3057\u304F\u521D\u671F\u5316\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3001StringExtract\u3092\u30A4\u30F3\u30B9\u30BF\u30F3\u30B9\u5316\u3067\u304D\u307E\u305B\u3093
-ImageUtils.GetOrGenerateThumbnailTask.loadingThumbnailFor={0}\u306E\u30B5\u30E0\u30CD\u30FC\u30EB\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D
-ImageUtils.GetOrGenerateThumbnailTask.generatingPreviewFor={0}\u306E\u30D7\u30EC\u30D3\u30E5\u30FC\u3092\u4F5C\u6210\u4E2D
-ImageUtils.ReadImageTask.mesage.text={0}\u3092\u8AAD\u307F\u53D6\u308A\u4E2D
-VideoUtils.genVideoThumb.progress.text=\u4E00\u6642\u30D5\u30A1\u30A4\u30EB{0}\u3092\u62BD\u51FA\u4E2D
\ No newline at end of file
+\u6b21\u306e\u4eee\u60f3\u30e1\u30e2\u30ea\u30fc\u3092\u51e6\u7406: {2}
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+ReadImageTask.mesageText=\u6b21\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059: {0}
+StringExtract.illegalStateException.cannotInit.msg=Unicode\u30c6\u30fc\u30d6\u30eb\u304c\u6b63\u3057\u304f\u521d\u671f\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002StringExtract\u3092\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5316\u3067\u304d\u307e\u305b\u3093
+TextConverter.convert.exception.txt=\u30c6\u30ad\u30b9\u30c8 {0} \u309216\u9032\u6570\u30c6\u30ad\u30b9\u30c8\u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093
+TextConverter.convertFromHex.exception.txt=16\u9032\u6570\u30c6\u30ad\u30b9\u30c8\u3092\u30c6\u30ad\u30b9\u30c8\u306b\u5909\u63db\u3067\u304d\u307e\u305b\u3093
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+VideoUtils.genVideoThumb.progress.text=\u4e00\u6642\u30d5\u30a1\u30a4\u30eb {0} \u3092\u62bd\u51fa\u4e2d\u3067\u3059
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED
index 0e0df5a58c..ae4211741a 100755
--- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle.properties-MERGED
@@ -268,10 +268,10 @@ ImageNode.getActions.viewInNewWin.text=View in New Window
ImageNode.createSheet.name.name=Name
ImageNode.createSheet.name.displayName=Name
ImageNode.createSheet.name.desc=no description
-Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null!
-Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""!
-Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed!\n\nDetails: {0}
-Installer.tskLibErr.err=Fatal Error!
+Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI test call returned without error, but version string was null\!
+Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI test call returned without error, but version string was ""\!
+Installer.tskLibErr.msg=Problem with Sleuth Kit JNI. Test call failed\!\n\nDetails: {0}
+Installer.tskLibErr.err=Fatal Error\!
InterestingHits.interestingItems.text=INTERESTING ITEMS
InterestingHits.displayName.text=Interesting Items
InterestingHits.createSheet.name.name=Name
@@ -301,6 +301,15 @@ OpenReportAction.actionPerformed.NoAssociatedEditorMessage=There is no associate
OpenReportAction.actionPerformed.NoOpenInEditorSupportMessage=This platform (operating system) does not support opening a file in an editor this way.
OpenReportAction.actionPerformed.MissingReportFileMessage=The report file no longer exists.
OpenReportAction.actionPerformed.ReportFileOpenPermissionDeniedMessage=Permission to open the report file was denied.
+PoolNode.createSheet.name.desc=no description
+PoolNode.createSheet.name.displayName=Name
+PoolNode.createSheet.name.name=Name
+PoolNode.createSheet.offset.desc=no description
+PoolNode.createSheet.offset.displayName=Starting offset
+PoolNode.createSheet.offset.name=Starting offset
+PoolNode.createSheet.type.desc=no description
+PoolNode.createSheet.type.displayName=Type
+PoolNode.createSheet.type.name=Type
RecentFiles.aut0DayFilter.displayName.text=Final Day
RecentFiles.aut1dayFilter.displayName.text=Final Day - 1
RecentFiles.aut2dayFilter.displayName.text=Final Day - 2
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
index 2f91dfb27a..ee9b6fb4b6 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/Bundle_ja.properties
@@ -1,26 +1,179 @@
-OpenIDE-Module-Name=\u30c7\u30fc\u30bf\u30e2\u30c7\u30eb
-AbstractAbstractFileNode.nameColLbl=\u540d\u524d
-AbstractAbstractFileNode.locationColLbl=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3
-AbstractAbstractFileNode.modifiedTimeColLbl=\u4fee\u6b63\u65e5\u6642
-AbstractAbstractFileNode.changeTimeColLbl=\u5909\u66f4\u65e5\u6642
-AbstractAbstractFileNode.accessTimeColLbl=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-AbstractAbstractFileNode.createdTimeColLbl=\u4f5c\u6210\u65e5\u6642
-AbstractAbstractFileNode.sizeColLbl=\u30b5\u30a4\u30ba
-AbstractAbstractFileNode.modeColLbl=\u30e2\u30fc\u30c9
-AbstractAbstractFileNode.useridColLbl=\u30e6\u30fc\u30b6ID
+AbstractAbstractFileNode.accessTimeColLbl=\u30a2\u30af\u30bb\u30b9\u6642\u523b
+AbstractAbstractFileNode.attrAddrColLbl=\u5c5e\u6027\u30a2\u30c9\u30ec\u30b9
+AbstractAbstractFileNode.changeTimeColLbl=\u6642\u523b\u5909\u66f4
+AbstractAbstractFileNode.createdTimeColLbl=\u4f5c\u6210\u3057\u305f\u6642\u523b
+AbstractAbstractFileNode.createSheet.comment.displayName=C
+AbstractAbstractFileNode.createSheet.comment.name=C
+# {0} - occurrenceCount
+AbstractAbstractFileNode.createSheet.count.description=MD5\u76f8\u95a2\u5024\u304c\u767a\u751f\u3057\u305f {0} \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f
+AbstractAbstractFileNode.createSheet.count.displayName=O
+AbstractAbstractFileNode.createSheet.count.hashLookupNotRun.description=\u5217\u304c\u5165\u529b\u3055\u308c\u305f\u3068\u304d\u306b\u3001\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u4e0a\u3067\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u304c\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f
+AbstractAbstractFileNode.createSheet.count.name=O
+AbstractAbstractFileNode.createSheet.interestingResult.description=\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u8208\u5473\u6df1\u3044\u7d50\u679c\u304c\u3042\u308a\u307e\u3059\u3002
+AbstractAbstractFileNode.createSheet.noScore.description=\u30b9\u30b3\u30a2\u306a\u3057
+AbstractAbstractFileNode.createSheet.notableFile.description=\u9855\u8457\u3068\u8a8d\u8b58\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002
+AbstractAbstractFileNode.createSheet.notableTaggedFile.description=\u9855\u8457\u30bf\u30b0\u3067\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002
+AbstractAbstractFileNode.createSheet.score.displayName=S
+AbstractAbstractFileNode.createSheet.score.name=S
+AbstractAbstractFileNode.createSheet.taggedFile.description=\u30d5\u30a1\u30a4\u30eb\u304c\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u307e\u3057\u305f\u3002
+AbstractAbstractFileNode.extensionColLbl=\u62e1\u5f35\u5b50
+AbstractAbstractFileNode.flagsDirColLbl=\u30d5\u30e9\u30b0(\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc)
+AbstractAbstractFileNode.flagsMetaColLbl=\u30d5\u30e9\u30b0(\u30e1\u30bf)
AbstractAbstractFileNode.groupidColLbl=\u30b0\u30eb\u30fc\u30d7ID
AbstractAbstractFileNode.knownColLbl=\u65e2\u77e5
+AbstractAbstractFileNode.locationColLbl=\u5834\u6240
AbstractAbstractFileNode.md5HashColLbl=MD5\u30cf\u30c3\u30b7\u30e5
-AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305fSleuthkitItem\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3055\u308c\u305f\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0(DisplayableItem)\u306e\u30ce\u30fc\u30c9\u304c\u5b9a\u7fa9\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AbstractAbstractFileNode.metaAddrColLbl=\u30e1\u30bf\u30a2\u30c9\u30ec\u30b9
+AbstractAbstractFileNode.mimeType=MIME\u30bf\u30a4\u30d7
+AbstractAbstractFileNode.modeColLbl=\u30e2\u30fc\u30c9
+AbstractAbstractFileNode.modifiedTimeColLbl=MFT\u5909\u66f4\u6642\u523b
+AbstractAbstractFileNode.nameColLbl=\u540d\u524d
+AbstractAbstractFileNode.objectId=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8ID
+AbstractAbstractFileNode.originalName=\u30aa\u30ea\u30b8\u30ca\u30eb\u540d
+AbstractAbstractFileNode.sizeColLbl=\u30b5\u30a4\u30ba
+AbstractAbstractFileNode.tagsProperty.displayName=\u30bf\u30b0
+AbstractAbstractFileNode.typeDirColLbl=\u30bf\u30a4\u30d7(\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc)
+AbstractAbstractFileNode.typeMetaColLbl=\u30bf\u30a4\u30d7(\u30e1\u30bf)
+AbstractAbstractFileNode.useridColLbl=\u30e6\u30fc\u30b6\u30fcID
+AbstractContentNode.nodescription=\u8aac\u660e\u306a\u3057
+AbstractContentNode.valueLoading=\u5024\u306e\u8aad\u307f\u8fbc\u307f\u4e2d
+AbstractFsContentNode.noDesc.text=\u8aac\u660e\u306a\u3057
+ArtifactStringContent.attrsTableHeader.sources=\u30bd\u30fc\u30b9
+ArtifactStringContent.attrsTableHeader.type=\u30bf\u30a4\u30d7
+ArtifactStringContent.attrsTableHeader.value=\u5024
+ArtifactStringContent.failedToGetAttributes.message=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u4e00\u90e8\u307e\u305f\u306f\u3059\u3079\u3066\u306e\u5c5e\u6027\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+ArtifactStringContent.failedToGetSourcePath.messagee=\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+# {0} - \u30e2\u30fc\u30c9\u540d
+BaseChildFactory.NoSuchEventBusException.message=\u6b21\u306e\u30ce\u30fc\u30c9\u306e\u30a4\u30d9\u30f3\u30c8\u30d0\u30b9\u306f\u3042\u308a\u307e\u305b\u3093: {0}
+BlackboardArtifactNode.createSheet.artifactDetails.displayName=\u7d50\u679c\u8a73\u7d30
+BlackboardArtifactNode.createSheet.artifactDetails.name=\u7d50\u679c\u8a73\u7d30
+BlackboardArtifactNode.createSheet.artifactMD5.displayName=MD5\u30cf\u30c3\u30b7\u30e5
+BlackboardArtifactNode.createSheet.artifactMD5.name=MD5\u30cf\u30c3\u30b7\u30e5
+BlackboardArtifactNode.createSheet.artifactType.displayName=\u7d50\u679c\u30bf\u30a4\u30d7
+BlackboardArtifactNode.createSheet.artifactType.name=\u7d50\u679c\u30bf\u30a4\u30d7
+BlackboardArtifactNode.createSheet.comment.displayName=C
+BlackboardArtifactNode.createSheet.comment.name=C
+# {0} - occurrenceCount
+# {1} - attributeType
+BlackboardArtifactNode.createSheet.count.description=\u30bf\u30a4\u30d7 {1} \u306e\u76f8\u95a2\u5024\u304c\u767a\u751f\u3057\u305f {0} \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f
+BlackboardArtifactNode.createSheet.count.displayName=O
+BlackboardArtifactNode.createSheet.count.name=O
+BlackboardArtifactNode.createSheet.count.noCorrelationAttributes.description=\u76f8\u95a2\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
+BlackboardArtifactNode.createSheet.count.noCorrelationValues.description=\u5229\u7528\u53ef\u80fd\u306a\u76f8\u95a2\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5024\u304c\u5b58\u5728\u3057\u306a\u3044\u305f\u3081\u3001\u305d\u306e\u4ed6\u306e\u767a\u751f\u3092\u691c\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+BlackboardArtifactNode.createSheet.fileSize.displayName=\u30b5\u30a4\u30ba
+BlackboardArtifactNode.createSheet.fileSize.name=\u30b5\u30a4\u30ba
+BlackboardArtifactNode.createSheet.interestingResult.description=\u7d50\u679c\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u8208\u5473\u6df1\u3044\u7d50\u679c\u304c\u3042\u308a\u307e\u3059\u3002
+BlackboardArtifactNode.createSheet.noScore.description=\u30b9\u30b3\u30a2\u306a\u3057
+BlackboardArtifactNode.createSheet.notableTaggedItem.description=\u9855\u8457\u3068\u8a8d\u8b58\u3055\u308c\u305f\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002
+BlackboardArtifactNode.createSheet.notableTaggedItem.description=\u7d50\u679c\u307e\u305f\u306f\u9855\u8457\u3068\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002
+BlackboardArtifactNode.createSheet.path.displayName=\u30d1\u30b9
+BlackboardArtifactNode.createSheet.path.name=\u30d1\u30b9
+BlackboardArtifactNode.createSheet.score.displayName=S
+BlackboardArtifactNode.createSheet.score.name=S
+BlackboardArtifactNode.createSheet.taggedItem.description=\u7d50\u679c\u307e\u305f\u306f\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u30bf\u30b0\u4ed8\u3051\u307e\u3057\u305f\u3002
+BlackboardArtifactNode.createSheet.tags.displayName=\u30bf\u30b0
+# {0} - artifactDisplayName
+BlackboardArtifactNode.displayName.artifact={0} \u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
+BlackboardArtifactNode.getAction.errorTitle=\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+BlackboardArtifactNode.getAction.linkedFileMessage=\u9078\u629e\u3057\u305f\u7d50\u679c\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\u4e2d\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002 [\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a] \u30a2\u30af\u30b7\u30e7\u30f3\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+BlackboardArtifactNode.getAction.resultErrorMessage=\u9078\u629e\u3057\u305f\u7d50\u679c\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\u4e2d\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002 [\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u7d50\u679c\u3092\u8868\u793a] \u30a2\u30af\u30b7\u30e7\u30f3\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+BlackboardArtifactTagNode.createSheet.userName.text=\u30e6\u30fc\u30b6\u30fc\u540d
+BlackboardArtifactTagNode.viewSourceArtifact.text=\u30bd\u30fc\u30b9\u7d50\u679c\u3092\u8868\u793a
+Category.five=CAT-5: \u95a2\u9023\u6027\u306a\u3057
+Category.four=CAT-4: \u4e8b\u4f8b/\u6bd4\u8f03(\u793e\u5185\u4f7f\u7528\u9650\u5b9a)
+Category.one=CAT-1: \u5150\u7ae5\u52b4\u50cd(\u9055\u6cd5)
+Category.three=CAT-3: CGI/\u30a2\u30cb\u30e1\u30fc\u30b7\u30e7\u30f3(\u5150\u7ae5\u52b4\u50cd)
+Category.two=CAT-2: \u5150\u7ae5\u52b4\u50cd(\u9055\u6cd5\u3067\u306f\u306a\u3044/\u96e3\u3057\u3044\u5e74\u9f62)
+Category.zero=CAT-0: \u672a\u5206\u985e
+ContentTagNode.createSheet.artifactMD5.displayName=MD5\u30cf\u30c3\u30b7\u30e5
+ContentTagNode.createSheet.artifactMD5.name=MD5\u30cf\u30c3\u30b7\u30e5
+ContentTagNode.createSheet.userName.text=\u30e6\u30fc\u30b6\u30fc\u540d
+DeletedContent.allDelFilter.text=\u3059\u3079\u3066
+DeletedContent.createSheet.filterType.desc=\u8aac\u660e\u306a\u3057
+DeletedContent.createSheet.filterType.displayName=\u30bf\u30a4\u30d7
+DeletedContent.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+DeletedContent.createSheet.name.displayName=\u540d\u524d
+DeletedContent.deletedContentsNode.name=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+DeletedContent.fsDelFilter.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0
+DeleteReportAction.showConfirmDialog.errorMsg=\u30ec\u30dd\u30fc\u30c8\u306e\u524a\u9664\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+DeleteReportAction.showConfirmDialog.multiple.explanation=\u30c7\u30a3\u30b9\u30af\u4e0a\u306b\u30ec\u30dd\u30fc\u30c8\u304c\u6b8b\u308a\u307e\u3059\u3002
+DeleteReportAction.showConfirmDialog.single.explanation=\u30c7\u30a3\u30b9\u30af\u4e0a\u306b\u30ec\u30dd\u30fc\u30c8\u304c\u6b8b\u308a\u307e\u3059\u3002
+FileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
+FileNode.getActions.searchFilesSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+FileNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+FileNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+FileTypeExtensionFilters.tskDatabaseFilter.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
+FileTypes.bgCounting.placeholder=\ (\u30ab\u30a6\u30f3\u30c8\u4e2d...)
+FileTypes.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+FileTypes.createSheet.name.displayName=\u540d\u524d
+FileTypes.createSheet.name.name=\u540d\u524d
+FileTypes.name.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+FileTypesByMimeType.name.text=MIME\u30bf\u30a4\u30d7\u5225
+FileTypesByMimeTypeNode.createSheet.mediaSubtype.desc=\u8aac\u660e\u306a\u3057
+FileTypesByMimeTypeNode.createSheet.mediaSubtype.displayName=\u30b5\u30d6\u30bf\u30a4\u30d7
+FileTypesByMimeTypeNode.createSheet.mediaSubtype.name=\u30b5\u30d6\u30bf\u30a4\u30d7
+FileTypesByMimeTypeNode.createSheet.mediaType.desc=\u8aac\u660e\u306a\u3057
+FileTypesByMimeTypeNode.createSheet.mediaType.displayName=\u30bf\u30a4\u30d7
+FileTypesByMimeTypeNode.createSheet.mediaType.name=\u30bf\u30a4\u30d7
+GetSCOTask.occurrences.defaultDescription=\u76f8\u95a2\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
+GetSCOTask.occurrences.multipleProperties=\u3053\u306e\u7d50\u679c\u306b\u8907\u6570\u306e\u7570\u306a\u308b\u76f8\u95a2\u30d7\u30ed\u30d1\u30c6\u30a3\u304c\u5b58\u5728\u3057\u307e\u3059
+ImageNode.action.runIngestMods.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
+ImageNode.createSheet.deviceId.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30c7\u30d0\u30a4\u30b9ID
+ImageNode.createSheet.deviceId.displayName=\u30c7\u30d0\u30a4\u30b9ID
+ImageNode.createSheet.deviceId.name=\u30c7\u30d0\u30a4\u30b9ID
+ImageNode.createSheet.sectorSize.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30b9(\u30d0\u30a4\u30c8)\u3067\u3059\u3002
+ImageNode.createSheet.sectorSize.displayName=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30b9(\u30d0\u30a4\u30c8)
+ImageNode.createSheet.sectorSize.name=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30b9(\u30d0\u30a4\u30c8)
+ImageNode.createSheet.size.desc=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)\u3067\u3059\u3002
+ImageNode.createSheet.size.displayName=\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)
+ImageNode.createSheet.size.name=\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)
+ImageNode.createSheet.timezone.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+ImageNode.createSheet.timezone.displayName=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+ImageNode.createSheet.timezone.name=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+ImageNode.createSheet.type.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30bf\u30a4\u30d7\u3067\u3059\u3002
+ImageNode.createSheet.type.displayName=\u30bf\u30a4\u30d7
+ImageNode.createSheet.type.name=\u30bf\u30a4\u30d7
+ImageNode.createSheet.type.text=\u30a4\u30e1\u30fc\u30b8
+ImageNode.getActions.openFileSearchByAttr.text=\u5c5e\u6027\u5225\u306b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f
+KeyValueNode.menuItemText.viewFileInDir=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+KeywordHits.createNodeForKey.accessTime.desc=\u30a2\u30af\u30bb\u30b9\u6642\u523b
+KeywordHits.createNodeForKey.accessTime.displayName=\u30a2\u30af\u30bb\u30b9\u6642\u523b
+KeywordHits.createNodeForKey.accessTime.name=AccessTime
+KeywordHits.createNodeForKey.chgTime.desc=\u6642\u523b\u5909\u66f4
+KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66f4\u6642\u523b
+KeywordHits.createNodeForKey.chgTime.name=ChangeTime
+KeywordHits.createNodeForKey.modTime.desc=MFT\u5909\u66f4\u6642\u523b
+KeywordHits.createNodeForKey.modTime.displayName=MFT\u5909\u66f4\u6642\u523b
+KeywordHits.createNodeForKey.modTime.name=ModifiedTime
+KeywordHits.createSheet.filesWithHits.desc=\u8aac\u660e\u306a\u3057
+KeywordHits.createSheet.filesWithHits.displayName=\u30d2\u30c3\u30c8\u306e\u3042\u308b\u30d5\u30a1\u30a4\u30eb
+KeywordHits.createSheet.filesWithHits.name=\u30d2\u30c3\u30c8\u306e\u3042\u308b\u30d5\u30a1\u30a4\u30eb
+KeywordHits.createSheet.listName.desc=\u8aac\u660e\u306a\u3057
+KeywordHits.createSheet.listName.displayName=\u30ea\u30b9\u30c8\u540d
+KeywordHits.createSheet.listName.name=\u30ea\u30b9\u30c8\u540d
+KeywordHits.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+KeywordHits.createSheet.name.displayName=\u540d\u524d
+KeywordHits.createSheet.name.name=\u540d\u524d
+KeywordHits.createSheet.numChildren.desc=\u8aac\u660e\u306a\u3057
+KeywordHits.createSheet.numChildren.displayName=\u5b50\u306e\u6570
+KeywordHits.createSheet.numChildren.name=\u5b50\u306e\u6570
+KeywordHits.kwHits.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8
+KeywordHits.simpleLiteralSearch.text=\u5358\u72ec\u30ea\u30c6\u30e9\u30eb\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22
+KeywordHits.singleRegexSearch.text=\u5358\u72ec\u6b63\u898f\u8868\u73fe\u691c\u7d22
+LayoutFileNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+OpenIDE-Module-Name=DataModel
+AbstractContentChildren.CreateTSKNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3057\u305fSleuthkitItem\u306b\u5b9a\u7fa9\u3055\u308c\u305f\u30ce\u30fc\u30c9\u306f\u3042\u308a\u307e\u305b\u3093
+AbstractContentChildren.createAutopsyNodeVisitor.exception.noNodeMsg=\u6307\u5b9a\u3057\u305fDisplayableItem\u306b\u5b9a\u7fa9\u3055\u308c\u305f\u30ce\u30fc\u30c9\u306f\u3042\u308a\u307e\u305b\u3093
AbstractContentNode.exception.cannotChangeSysName.msg=\u30b7\u30b9\u30c6\u30e0\u540d\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002
-AbstractFsContentNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
ArtifactStringContent.getStr.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
-ArtifactStringContent.getStr.err=\u30b3\u30f3\u30c6\u30f3\u30c4\u53d6\u5f97\u30a8\u30e9\u30fc
-ArtifactTypeNode.createSheet.artType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-ArtifactTypeNode.createSheet.childCnt.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
-ArtifactTypeNode.createSheet.childCnt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-BlackboardArtifactNode.noDesc.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+ArtifactStringContent.getStr.err=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ArtifactTypeNode.createSheet.artType.name=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
+ArtifactTypeNode.createSheet.artType.displayNamee=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
+ArtifactTypeNode.createSheet.artType.desc=\u8aac\u660e\u306a\u3057
+ArtifactTypeNode.createSheet.childCnt.name=\u5b50\u306e\u30ab\u30a6\u30f3\u30c8
+ArtifactTypeNode.createSheet.childCnt.displayName=\u5b50\u306e\u30ab\u30a6\u30f3\u30c8
+ArtifactTypeNode.createSheet.childCnt.desc=\u8aac\u660e\u306a\u3057
+BlackboardArtifactNode.noDesc.text=\u8aac\u660e\u306a\u3057
BlackboardArtifactNode.createSheet.srcFile.name=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
BlackboardArtifactNode.createSheet.srcFile.displayName=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
BlackboardArtifactNode.createSheet.ext.name=\u62e1\u5f35\u5b50
@@ -32,7 +185,7 @@ BlackboardArtifactNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb
BlackboardArtifactNode.createSheet.dataSrc.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
BlackboardArtifactNode.createSheet.dataSrc.displayName=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
BlackboardArtifactTagNode.createSheet.srcFile.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
-BlackboardArtifactTagNode.createSheet.unavail.text=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
+BlackboardArtifactTagNode.createSheet.unavail.text=\u5229\u7528\u3067\u304d\u307e\u305b\u3093
BlackboardArtifactTagNode.createSheet.srcFilePath.text=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
BlackboardArtifactTagNode.createSheet.resultType.text=\u7d50\u679c\u30bf\u30a4\u30d7
BlackboardArtifactTagNode.createSheet.comment.text=\u30b3\u30e1\u30f3\u30c8
@@ -41,154 +194,145 @@ BlackboardArtifactTagTypeNode.createSheet.name.name=\u540d\u524d
BlackboardArtifactTagTypeNode.createSheet.name.displayName=\u540d\u524d
ContentTagNode.createSheet.file.name=\u30d5\u30a1\u30a4\u30eb
ContentTagNode.createSheet.file.displayName=\u30d5\u30a1\u30a4\u30eb
-ContentTagNode.createSheet.unavail.path=\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093
+ContentTagNode.createSheet.unavail.path=\u5229\u7528\u3067\u304d\u307e\u305b\u3093
ContentTagNode.createSheet.filePath.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
ContentTagNode.createSheet.filePath.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
ContentTagNode.createSheet.comment.name=\u30b3\u30e1\u30f3\u30c8
ContentTagNode.createSheet.comment.displayName=\u30b3\u30e1\u30f3\u30c8
+ContentTagNode.createSheet.fileModifiedTime.nam=MFT\u5909\u66f4\u6642\u523b
+ContentTagNode.createSheet.fileModifiedTime.displayName=MFT\u5909\u66f4\u6642\u523b
+ContentTagNode.createSheet.fileChangedTime.name=\u5909\u66f4\u3055\u308c\u305f\u523b\u523b
+ContentTagNode.createSheet.fileChangedTime.displayName=\u5909\u66f4\u3055\u308c\u305f\u523b\u523b
+ContentTagNode.createSheet.fileAccessedTime.name=\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u6642\u523b
+ContentTagNode.createSheet.fileAccessedTime.displayName=\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u6642\u523b
+ContentTagNode.createSheet.fileCreatedTime.name=\u4f5c\u6210\u3057\u305f\u6642\u523b
+ContentTagNode.createSheet.fileCreatedTime.displayName=\u4f5c\u6210\u3057\u305f\u6642\u523b
+ContentTagNode.createSheet.fileSize.name=\u30b5\u30a4\u30ba
+ContentTagNode.createSheet.fileSize.displayName=\u30b5\u30a4\u30ba
ContentTagTypeNode.displayName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30b0
ContentTagTypeNode.createSheet.name.name=\u540d\u524d
ContentTagTypeNode.createSheet.name.displayName=\u540d\u524d
-ContentUtils.exception.msg={0}\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093
-DataModelActionsFactory.srcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-DataModelActionsFactory.fileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-DataModelActionsFactory.viewNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
-DataModelActionsFactory.openExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u306b\u8868\u793a
+ContentUtils.exception.msg={0} \u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093
+DataModelActionsFactory.srcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataModelActionsFactory.fileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataModelActionsFactory.viewNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+DataModelActionsFactory.openExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
DataSourcesNode.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
DataSourcesNode.group_by_datasource.name=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
DataSourcesNode.createSheet.name.name=\u540d\u524d
DataSourcesNode.createSheet.name.displayName=\u540d\u524d
-DataSourcesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-DeletedContent.fsDelFilter.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0
-DeletedContent.allDelFilter.text=\u3059\u3079\u3066
-DeletedContent.deletedContentsNode.name=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
-DeletedContent.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-DeletedContent.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
-DeletedContent.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
-DeletedContent.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-DeletedContent.createKeys.maxObjects.msg=\u8868\u793a\u53ef\u80fd\u306a\u6570\u3088\u308a\u3082\u591a\u304f\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u6700\u521d\u306e{0}\u306e\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u8868\u793a\u3055\u308c\u307e\u3059\u3002
-DeletedContent.createNodeForKey.typeNotSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
-DirectoryNode.parFolder.text=[\u30da\u30a2\u30ec\u30f3\u30c8\u30d5\u30a9\u30eb\u30c0]
-DirectoryNode.curFolder.text=[\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0]
-DirectoryNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-DirectoryNode.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+DataSourcesNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+DirectoryNode.parFolder.text=[\u89aa\u30d5\u30a9\u30eb\u30c0\u30fc]
+DirectoryNode.curFolder.text=[\u73fe\u5728\u306e\u30d5\u30a9\u30eb\u30c0\u30fc]
+DirectoryNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DirectoryNode.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
EmailExtracted.mailAccount.text=\u30a2\u30ab\u30a6\u30f3\u30c8
-EmailExtracted.mailFolder.text=\u30d5\u30a9\u30eb\u30c0
+EmailExtracted.mailFolder.text=\u30d5\u30a9\u30eb\u30c0\u30fc
EmailExtracted.defaultAcct.text=\u30c7\u30d5\u30a9\u30eb\u30c8
EmailExtracted.defaultFolder.text=\u30c7\u30d5\u30a9\u30eb\u30c8
EmailExtracted.createSheet.name.name=\u540d\u524d
EmailExtracted.createSheet.name.displayName=\u540d\u524d
-EmailExtracted.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+EmailExtracted.createSheet.name.desc=\u8aac\u660e\u306a\u3057
ExtractedContentNode.name.text=\u62bd\u51fa\u3055\u308c\u305f\u30b3\u30f3\u30c6\u30f3\u30c4
ExtractedContentNode.createSheet.name.name=\u540d\u524d
ExtractedContentNode.createSheet.name.displayName=\u540d\u524d
-ExtractedContentNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-FileNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-FileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
-FileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
-FileNode.getActions.searchFilesSameMD5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+ExtractedContentNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+LocalFileNode.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
FileSize.fileSizeRootNode.name=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba
-FileSize.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-FileSize.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
-FileSize.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
-FileSize.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-FileSize.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
-FileTypeChildren.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
-FileTypeExtensionFilters.tskImgFilter.text=\u30a4\u30e1\u30fc\u30b8
-FileTypeExtensionFilters.tskVideoFilter.text=\u30d3\u30c7\u30aa
-FileTypeExtensionFilters.tskAudioFilter.text=\u30aa\u30fc\u30c7\u30a3\u30aa
-FileTypeExtensionFilters.tskArchiveFilter.text=\u30a2\u30fc\u30ab\u30a4\u30d6
-FileTypeExtensionFilters.tskDocumentFilter.text=\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8
-FileTypeExtensionFilters.tskExecFilter.text=\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb
-FileTypeExtensionFilters.autDocHtmlFilter.text=HTML
-FileTypeExtensionFilters.autDocOfficeFilter.text=\u30aa\u30d5\u30a3\u30b9
-FileTypeExtensionFilters.autoDocPdfFilter.text=PDF
-FileTypeExtensionFilters.autDocTxtFilter.text=\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8
-FileTypeExtensionFilters.autDocRtfFilter.text=\u30ea\u30c3\u30c1\u30c6\u30ad\u30b9\u30c8
-FileTypesByExtNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileSize.createSheet.name.name=\u540d\u524d
+FileSize.createSheet.name.displayName=\u540d\u524d
+FileSize.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+FileSize.createSheet.filterType.name=\u30b5\u30a4\u30ba\u7bc4\u56f2
+FileSize.createSheet.filterType.displayName=\u30b5\u30a4\u30ba\u7bc4\u56f2
+FileSize.createSheet.filterType.desc=\u8aac\u660e\u306a\u3057
+FileSize.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u9805\u76ee\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
+FileTypeChildren.exception.notSupported.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u9805\u76ee\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
+FileTypesByExtNode.createSheet.filterType.name=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+FileTypesByExtNode.createSheet.filterType.displayName=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+FileTypesByExtNode.createSheet.filterType.desc=\u8aac\u660e\u306a\u3057
FileTypesByExtNode.createSheet.fileExt.name=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
FileTypesByExtNode.createSheet.fileExt.displayName=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
-FileTypesByExtNode.createSheet.fileExt.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileTypesByExtNode.createSheet.fileExt.desc=\u8aac\u660e\u306a\u3057
+FileTypesByExtNode.fname.text=\u62e1\u5f35\u5b50\u5225
FileTypesByExtNode.createSheet.name.name=\u540d\u524d
FileTypesByExtNode.createSheet.name.displayName=\u540d\u524d
-FileTypesByExtNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+FileTypesByExtNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
HashsetHits.createSheet.name.name=\u540d\u524d
HashsetHits.createSheet.name.displayName=\u540d\u524d
-HashsetHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-ImageNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
-ImageNode.getActions.openFileSearchByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f
+HashsetHits.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+ImageNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
ImageNode.createSheet.name.name=\u540d\u524d
ImageNode.createSheet.name.displayName=\u540d\u524d
-ImageNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-Installer.exception.tskVerStringNull.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f\u30cc\u30eb\u3067\u3057\u305f\uff01
-Installer.tskLibErr.msg=Sleuth Kit JNI\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u304c\u5931\u6557\u3057\u307e\u3057\u305f\uff01\n\n\u8a73\u7d30\uff1a {0}
-Installer.tskLibErr.err=\u81f4\u547d\u7684\u30a8\u30e9\u30fc\uff01
-InterestingHits.interestingItems.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0
-InterestingHits.displayName.text=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0
+ImageNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+Installer.exception.tskVerStringNull.msg=Sleuth Kit\u306eJNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u306a\u3057\u3067\u8fd4\u3055\u308c\u307e\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u6587\u5b57\u5217\u304cnull\u3067\u3057\u305f\!
+Installer.exception.taskVerStringBang.msg=Sleuth Kit\u306eJNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u306a\u3057\u3067\u8fd4\u3055\u308c\u307e\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u6587\u5b57\u5217\u304c""\u3067\u3057\u305f\!
+Installer.tskLibErr.msg=Problem with Sleuth Kit\u306eJNI\u3067\u3059\u3002 Test call failed\!\n\nDetails: {0}
+Installer.tskLibErr.err=\u81f4\u547d\u7684\u306a\u30a8\u30e9\u30fc\u3067\u3059\!
+InterestingHits.interestingItems.text=\u8208\u5473\u6df1\u3044\u9805\u76ee
+InterestingHits.displayName.text=\u8208\u5473\u6df1\u3044\u9805\u76ee
InterestingHits.createSheet.name.name=\u540d\u524d
InterestingHits.createSheet.name.displayName=\u540d\u524d
-InterestingHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+InterestingHits.createSheet.name.desc=\u8aac\u660e\u306a\u3057
KeyValueNode.createSheet.name.name=\u540d\u524d
KeyValueNode.createSheet.name.displayName=\u540d\u524d
-KeyValueNode.createSheet.name.desc=\u8a72\u5f53\u306a\u3057
-KeyValueNode.createSheet.map.desc=\u8a72\u5f53\u306a\u3057
-KeywordHits.kwHits.text=\u30ad\u30fc\u30ef\u30fc\u30c9\u30d2\u30c3\u30c8
-KeywordHits.createSheet.name.name=\u540d\u524d
-KeywordHits.createSheet.name.displayName=\u540d\u524d
-KeywordHits.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-KeywordHits.createSheet.listName.name=\u30ea\u30b9\u30c8\u540d
-KeywordHits.createSheet.listName.displayName=\u30ea\u30b9\u30c8\u540d
-KeywordHits.createSheet.listName.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-KeywordHits.createSheet.numChildren.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-KeywordHits.createSheet.filesWithHits.name=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb
-KeywordHits.createSheet.filesWithHits.displayName=\u30d2\u30c3\u30c8\u3057\u305f\u30d5\u30a1\u30a4\u30eb
-KeywordHits.createSheet.filesWithHits.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-KeywordHits.createNodeForKey.modTime.displayName=\u4fee\u6b63\u65e5\u6642
-KeywordHits.createNodeForKey.modTime.desc=\u4fee\u6b63\u65e5\u6642
-KeywordHits.createNodeForKey.accessTime.displayName=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-KeywordHits.createNodeForKey.accessTime.desc=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-KeywordHits.createNodeForKey.chgTime.displayName=\u5909\u66f4\u65e5\u6642
-KeywordHits.createNodeForKey.chgTime.desc=\u5909\u66f4\u65e5\u6642
-KeywordHits.createNodeForKey.chgTime.name=\u5909\u66f4\u65e5\u6642
-KeywordHits.createNodeForKey.accessTime.name=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-KeywordHits.createNodeForKey.modTime.name=\u4fee\u6b63\u65e5\u6642
-KnownFileFilterNode.selectionContext.dataSources=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
-KnownFileFilterNode.selectionContext.views=\u30d3\u30e5\u30fc
+KeyValueNode.createSheet.name.desc=n/a
+KeyValueNode.createSheet.map.desc=n/a
LayoutFileNode.propertyType.parts=\u30d1\u30fc\u30c4
LayoutFileNode.createSheet.name.name=\u540d\u524d
LayoutFileNode.createSheet.name.displayName=\u540d\u524d
-LayoutFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-LayoutFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-LayoutFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
-LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
+LayoutFileNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+LayoutFileNode.createSheet.noDescr.text=\u8aac\u660e\u306a\u3057
+LayoutFileNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+LayoutFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
LocalFileNode.createSheet.name.name=\u540d\u524d
LocalFileNode.createSheet.name.displayName=\u540d\u524d
-LocalFileNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-LocalFileNode.createSheet.noDescr.text=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-LocalFileNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
-LocalFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
-LocalFileNode.getActions.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+LocalFileNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+LocalFileNode.createSheet.noDescr.text=\u8aac\u660e\u306a\u3057
+LocalFileNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+LocalFileNode.getActions.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
+LocalFileNode.getActions.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+OpenReportAction.actionDisplayName=\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u304f
+OpenReportAction.actionPerformed.MessageBoxTitle=\u30ec\u30dd\u30fc\u30c8\u30aa\u30fc\u30d7\u30f3\u5931\u6557
+OpenReportAction.actionPerformed.NoAssociatedEditorMessage=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u30ec\u30dd\u30fc\u30c8\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a8\u30c7\u30a3\u30bf\u30fc\u304c\u306a\u3044\u304b\u3001\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+OpenReportAction.actionPerformed.NoOpenInEditorSupportMessage=\u3053\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0(\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0)\u306f\u3053\u306e\u65b9\u6cd5\u3067\u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u3053\u3068\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002
+OpenReportAction.actionPerformed.MissingReportFileMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+OpenReportAction.actionPerformed.ReportFileOpenPermissionDeniedMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u8a31\u53ef\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002
RecentFiles.aut0DayFilter.displayName.text=\u6700\u7d42\u65e5
RecentFiles.aut1dayFilter.displayName.text=\u6700\u7d42\u65e5 - 1
-RecentFiles.aut2dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff12
-RecentFiles.aut3dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff13
-RecentFiles.aut4dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff14
-RecentFiles.aut5dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff15
-RecentFiles.aut6dayFilter.displayName.text=\u6700\u7d42\u65e5 - \uff16
-RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u3067\u304d\u308b\u30a2\u30a4\u30c6\u30e0\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff1a{0}
-Installer.exception.taskVerStringBang.msg=Sleuth Kit JNI\u30c6\u30b9\u30c8\u30b3\u30fc\u30eb\u3067\u306f\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u305b\u3093\u3067\u3057\u305f\u304c\u3001\u30d0\u30fc\u30b8\u30e7\u30f3\u30b9\u30c8\u30ea\u30f3\u30b0\u306f""\u3067\u3057\u305f\uff01
+RecentFiles.aut2dayFilter.displayName.text=\u6700\u7d42\u65e5 - 2
+RecentFiles.aut3dayFilter.displayName.text=\u6700\u7d42\u65e5 - 3
+RecentFiles.aut4dayFilter.displayName.text=\u6700\u7d42\u65e5 - 4
+RecentFiles.aut5dayFilter.displayName.text=\u6700\u7d42\u65e5 - 5
+RecentFiles.aut6dayFilter.displayName.text=\u6700\u7d42\u65e5 - 6
+RecentFilesFilterChildren.exception.defaultVisit.msg=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u8868\u793a\u53ef\u80fd\u306a\u9805\u76ee\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093: {0}
RecentFilesFilterNode.createSheet.filterType.name=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
RecentFilesFilterNode.createSheet.filterType.displayName=\u30d5\u30a3\u30eb\u30bf\u30fc\u30bf\u30a4\u30d7
-RecentFilesFilterNode.createSheet.filterType.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+RecentFilesFilterNode.createSheet.filterType.desc=\u8aac\u660e\u306a\u3057
RecentFilesNode.createSheet.name.name=\u540d\u524d
RecentFilesNode.createSheet.name.displayName=\u540d\u524d
-RecentFilesNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-RecentFilesNode.name.text=\u6700\u8fd1\u4f7f\u7528\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
-ResultsNode.name.text=\u7d50\u679c
-ResultsNode.createSheet.name.name=\u540d\u524d
+RecentFilesNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+RecentFilesNode.name.text=\u6700\u8fd1\u306e\u30d5\u30a1\u30a4\u30eb
+ReportNode.sourceModuleNameProperty.name=\u30bd\u30fc\u30b9\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
+ReportNode.sourceModuleNameProperty.displayName=\u30bd\u30fc\u30b9\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
+ReportNode.sourceModuleNameProperty.desc=\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
+ReportNode.createdTimeProperty.name=\u4f5c\u6210\u3057\u305f\u6642\u523b
+ReportNode.createdTimeProperty.displayName=\u4f5c\u6210\u3057\u305f\u6642\u523b
+ReportNode.createdTimeProperty.desc=\u30ec\u30dd\u30fc\u30c8\u304c\u4f5c\u6210\u3055\u308c\u305f\u6642\u523b
+ReportNode.pathProperty.name= \u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ReportNode.pathProperty.displayName= \u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ReportNode.pathProperty.desc=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
+ReportNode.reportNameProperty.name=\u30ec\u30dd\u30fc\u30c8\u540d
+ReportNode.reportNameProperty.displayName=\u30ec\u30dd\u30fc\u30c8\u540d
+ReportNode.reportNameProperty.desc=\u30ec\u30dd\u30fc\u30c8\u540d
+ReportsListNode.displayName=\u30ec\u30dd\u30fc\u30c8
+ResultsNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
ResultsNode.createSheet.name.displayName=\u540d\u524d
-ResultsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-TagNameNode.namePlusTags.text={0}\u30bf\u30b0
+ResultsNode.createSheet.name.name=\u540d\u524d
+ResultsNode.name.text=\u7d50\u679c
+SlackFileNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+SlackFileNode.getActions.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+SpecialDirectoryNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+TagNameNode.namePlusTags.text={0} \u30bf\u30b0
TagNameNode.contentTagTypeNodeKey.text=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0
TagNameNode.bbArtTagTypeNodeKey.text=\u7d50\u679c\u30bf\u30b0
TagNameNode.bookmark.text=\u30d6\u30c3\u30af\u30de\u30fc\u30af
@@ -196,81 +340,62 @@ TagNameNode.createSheet.name.name=\u540d\u524d
TagNameNode.createSheet.name.displayName=\u540d\u524d
TagsNode.displayName.text=\u30bf\u30b0
TagsNode.createSheet.name.name=\u540d\u524d
-AbstractAbstractFileNode.flagsDirColLbl=\u30d5\u30e9\u30b0\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09
-AbstractAbstractFileNode.flagsMetaColLbl=\u30d5\u30e9\u30b0\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09
-AbstractAbstractFileNode.metaAddrColLbl=\u30e1\u30bf\u30c7\u30fc\u30bf\u30a2\u30c9\u30ec\u30b9
-AbstractAbstractFileNode.attrAddrColLbl=\u5c5e\u6027\u30a2\u30c9\u30ec\u30b9
-AbstractAbstractFileNode.typeDirColLbl=\u30bf\u30a4\u30d7\uff08\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\uff09
-AbstractAbstractFileNode.typeMetaColLbl=\u30bf\u30a4\u30d7\uff08\u30e1\u30bf\u30c7\u30fc\u30bf\uff09
-ArtifactTypeNode.createSheet.childCnt.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
TagsNode.createSheet.name.displayName=\u540d\u524d
ViewsNode.name.text=\u30d3\u30e5\u30fc
ViewsNode.createSheet.name.name=\u540d\u524d
ViewsNode.createSheet.name.displayName=\u540d\u524d
-ViewsNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-VirtualDirectoryNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+ViewsNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+ImageNode.createSheet.deviceId.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30c7\u30d0\u30a4\u30b9ID
+VirtualDirectoryNode.createSheet.deviceId.displayName=\u30c7\u30d0\u30a4\u30b9ID
+VirtualDirectoryNode.createSheet.deviceId.name=\u30c7\u30d0\u30a4\u30b9ID
+VirtualDirectoryNode.createSheet.size.desc=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)\u3067\u3059\u3002
+VirtualDirectoryNode.createSheet.size.displayName=\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)
+VirtualDirectoryNode.createSheet.size.name=\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)
+VirtualDirectoryNode.createSheet.timezone.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+VirtualDirectoryNode.createSheet.timezone.displayName=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+VirtualDirectoryNode.createSheet.timezone.name=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+ImageNode.createSheet.type.desc=\u30a4\u30e1\u30fc\u30b8\u306e\u30bf\u30a4\u30d7\u3067\u3059\u3002
+VirtualDirectoryNode.createSheet.type.displayName=\u30bf\u30a4\u30d7
+VirtualDirectoryNode.createSheet.type.name=\u30bf\u30a4\u30d7
+VirtualDirectoryNode.createSheet.type.text=\u8ad6\u7406\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8
+VirtualDirectoryNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
VirtualDirectoryNode.createSheet.name.name=\u540d\u524d
VirtualDirectoryNode.createSheet.name.displayName=\u540d\u524d
-VirtualDirectoryNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-VirtualDirectoryNode.createSheet.noDesc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-VolumeNode.getActions.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
+VirtualDirectoryNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
+VirtualDirectoryNode.createSheet.noDesc=\u8aac\u660e\u306a\u3057
+VolumeNode.getActions.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
VolumeNode.createSheet.name.name=\u540d\u524d
VolumeNode.createSheet.name.displayName=\u540d\u524d
-VolumeNode.createSheet.name.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.name.desc=\u8aac\u660e\u306a\u3057
VolumeNode.createSheet.id.name=ID
VolumeNode.createSheet.id.displayName=ID
-VolumeNode.createSheet.id.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-VolumeNode.createSheet.startSector.name=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc
-VolumeNode.createSheet.startSector.displayName=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc
-VolumeNode.createSheet.startSector.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-VolumeNode.createSheet.lenSectors.name=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055
-VolumeNode.createSheet.lenSectors.displayName=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055
-VolumeNode.createSheet.lenSectors.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.id.desc=\u8aac\u660e\u306a\u3057
+VolumeNode.createSheet.startSector.name=\u30bb\u30af\u30bf\u30fc\u3092\u958b\u59cb\u4e2d\u3067\u3059
+VolumeNode.createSheet.startSector.displayName=\u30bb\u30af\u30bf\u30fc\u3092\u958b\u59cb\u4e2d\u3067\u3059
+VolumeNode.createSheet.startSector.desc=\u8aac\u660e\u306a\u3057
+VolumeNode.createSheet.lenSectors.name=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055:
+VolumeNode.createSheet.lenSectors.displayName=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055:
+VolumeNode.createSheet.lenSectors.desc=\u8aac\u660e\u306a\u3057
VolumeNode.createSheet.description.name=\u8aac\u660e
VolumeNode.createSheet.description.displayName=\u8aac\u660e
-VolumeNode.createSheet.description.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
+VolumeNode.createSheet.description.desc=\u8aac\u660e\u306a\u3057
VolumeNode.createSheet.flags.name=\u30d5\u30e9\u30b0
VolumeNode.createSheet.flags.displayName=\u30d5\u30e9\u30b0
-VolumeNode.createSheet.flags.desc=\u8aac\u660e\u304c\u3042\u308a\u307e\u305b\u3093
-ArtifactTypeNode.createSheet.artType.name=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
-ArtifactTypeNode.createSheet.artType.displayName=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7
-KeywordHits.createSheet.numChildren.name=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
-KeywordHits.createSheet.numChildren.displayName=\u30c1\u30e3\u30a4\u30eb\u30c9\u6570
-KeywordHits.simpleLiteralSearch.text=\u30b7\u30f3\u30b0\u30eb\u30ea\u30c6\u30e9\u30eb\u691c\u7d22
-KeywordHits.singleRegexSearch.text=\u30b7\u30f3\u30b0\u30eb\u6b63\u898f\u8868\u73fe\u691c\u7d22
-AbstractAbstractFileNode.objectId=\u30aa\u30d6\u30b8\u30a7\u30af\u30c8ID
+VolumeNode.createSheet.flags.desc=\u8aac\u660e\u306a\u3057
ArtifactStringContent.getStr.artifactId.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8ID
-OpenReportAction.actionDisplayName=\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u304f
-OpenReportAction.actionPerformed.MessageBoxTitle=\u5931\u6557\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u304f
-OpenReportAction.actionPerformed.MissingReportFileMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306f\u306a\u304f\u306a\u308a\u307e\u3057\u305f\u3002
-OpenReportAction.actionPerformed.NoAssociatedEditorMessage=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u30ec\u30dd\u30fc\u30c8\u306b\u95a2\u9023\u3059\u308b\u30a8\u30c7\u30a3\u30bf\u30fc\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u307e\u305f\u306f\u3001\u95a2\u9023\u3059\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u958b\u59cb\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-OpenReportAction.actionPerformed.NoOpenInEditorSupportMessage=\u3053\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\uff08\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\uff09\u306f\u3053\u306e\u65b9\u6cd5\u3067\u3001\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30c7\u30a3\u30bf\u30fc\u306b\u3066\u958b\u304f\u306e\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002
-OpenReportAction.actionPerformed.ReportFileOpenPermissionDeniedMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002
-ReportNode.createdTimeProperty.desc=\u30bf\u30a4\u30e0\u30ec\u30dd\u30fc\u30c8\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002
-ReportNode.createdTimeProperty.displayName=\u4f5c\u6210\u65e5\u6642
-ReportNode.createdTimeProperty.name=\u4f5c\u6210\u65e5\u6642
-ReportNode.pathProperty.desc=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
-ReportNode.pathProperty.displayName=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u3092\u30ec\u30dd\u30fc\u30c8
-ReportNode.pathProperty.name=\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u3092\u30ec\u30dd\u30fc\u30c8
-ReportNode.sourceModuleNameProperty.desc=\u30ec\u30dd\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
-ReportNode.sourceModuleNameProperty.displayName=\u30bd\u30fc\u30b9\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
-ReportNode.sourceModuleNameProperty.name=\u30bd\u30fc\u30b9\u30e2\u30b8\u30e5\u30fc\u30eb\u540d
-ReportsListNode.displayName=\u30ec\u30dd\u30fc\u30c8
-AbstractAbstractFileNode.mimeType=MIME\u30bf\u30a4\u30d7
-ContentTagNode.createSheet.fileModifiedTime.name=\u4fee\u6b63\u65e5\u6642
-ContentTagNode.createSheet.fileModifiedTime.displayName=\u4fee\u6b63\u65e5\u6642
-ContentTagNode.createSheet.fileChangedTime.name=\u5909\u66f4\u65e5\u6642
-ContentTagNode.createSheet.fileChangedTime.displayName=\u5909\u66f4\u65e5\u6642
-ContentTagNode.createSheet.fileAccessedTime.name=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-ContentTagNode.createSheet.fileAccessedTime.displayName=\u30a2\u30af\u30bb\u30b9\u65e5\u6642
-ContentTagNode.createSheet.fileCreatedTime.name=\u4f5c\u6210\u65e5\u6642
-ContentTagNode.createSheet.fileCreatedTime.displayName=\u4f5c\u6210\u65e5\u6642
-ContentTagNode.createSheet.fileSize.name=\u30b5\u30a4\u30ba
-ContentTagNode.createSheet.fileSize.displayName=\u30b5\u30a4\u30ba
-LocalFileNode.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-ReportNode.reportNameProperty.name=\u30ec\u30dd\u30fc\u30c8\u540d
-ReportNode.reportNameProperty.displayName=\u30ec\u30dd\u30fc\u30c8\u540d
-ReportNode.reportNameProperty.desc=\u30ec\u30dd\u30fc\u30c8\u306e\u540d\u524d
DeleteReportAction.actionDisplayName.singleReport=\u30ec\u30dd\u30fc\u30c8\u3092\u524a\u9664
DeleteReportAction.actionDisplayName.multipleReports=\u30ec\u30dd\u30fc\u30c8\u3092\u524a\u9664
-DeleteReportAction.actionPerformed.showConfirmDialog.title=\u524a\u9664\u3092\u78ba\u5b9a\u3059\u308b
\ No newline at end of file
+DeleteReportAction.actionPerformed.showConfirmDialog.title=\u524a\u9664\u3092\u78ba\u5b9a
+DeleteReportAction.actionPerformed.showConfirmDialog.single.msg=\u30b1\u30fc\u30b9\u304b\u3089\u30ec\u30dd\u30fc\u30c8\u30921\u4ef6\u524a\u9664\u3057\u307e\u3059\u304b?
+DeleteReportAction.actionPerformed.showConfirmDialog.multiple.msg=\u30b1\u30fc\u30b9\u304b\u3089\u30ec\u30dd\u30fc\u30c8\u3092 {0} \u4ef6\u524a\u9664\u3057\u307e\u3059\u304b?
+FileTypeExtensionFilters.tskImgFilter.text=\u30a4\u30e1\u30fc\u30b8
+FileTypeExtensionFilters.tskVideoFilter.text=\u52d5\u753b
+FileTypeExtensionFilters.tskAudioFilter.text=\u30aa\u30fc\u30c7\u30a3\u30aa
+FileTypeExtensionFilters.tskArchiveFilter.text=\u30a2\u30fc\u30ab\u30a4\u30d6
+FileTypeExtensionFilters.tskDocumentFilter.text=\u6587\u66f8
+FileTypeExtensionFilters.tskExecFilter.text=\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb
+FileTypeExtensionFilters.autDocHtmlFilter.text=HTML
+FileTypeExtensionFilters.autDocOfficeFilter.text=Office
+FileTypeExtensionFilters.autoDocPdfFilter.text=PDF
+FileTypeExtensionFilters.autDocTxtFilter.text=\u30d7\u30ec\u30fc\u30f3\u30c6\u30ad\u30b9\u30c8
+FileTypeExtensionFilters.autDocRtfFilter.text=\u30ea\u30c3\u30c1\u30c6\u30ad\u30b9\u30c8
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java
index 2277cb4b56..af7eb3a249 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/ContentNodeVisitor.java
@@ -35,6 +35,8 @@ interface ContentNodeVisitor {
T visit(LocalDirectoryNode ldn);
T visit(VolumeNode vn);
+
+ T visit(PoolNode pn);
T visit(DirectoryNode dn);
@@ -85,6 +87,11 @@ interface ContentNodeVisitor {
public T visit(VolumeNode vn) {
return defaultVisit(vn);
}
+
+ @Override
+ public T visit(PoolNode pn) {
+ return defaultVisit(pn);
+ }
@Override
public T visit(LayoutFileNode lcn) {
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java
index d9ff5fc33b..b5d808153d 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/CreateSleuthkitNodeVisitor.java
@@ -28,6 +28,7 @@ import org.sleuthkit.datamodel.Image;
import org.sleuthkit.datamodel.LayoutFile;
import org.sleuthkit.datamodel.LocalDirectory;
import org.sleuthkit.datamodel.LocalFile;
+import org.sleuthkit.datamodel.Pool;
import org.sleuthkit.datamodel.SlackFile;
import org.sleuthkit.datamodel.SleuthkitItemVisitor;
import org.sleuthkit.datamodel.SleuthkitVisitableItem;
@@ -58,6 +59,11 @@ public class CreateSleuthkitNodeVisitor extends SleuthkitItemVisitor.Default visit(Volume volume) {
return new VolumeNode(volume);
}
+
+ @Override
+ public AbstractContentNode extends Content> visit(Pool pool) {
+ return new PoolNode(pool);
+ }
@Override
public AbstractContentNode extends Content> visit(LayoutFile lf) {
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
index 541cbc38f3..24f437251f 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/DisplayableItemNodeVisitor.java
@@ -59,6 +59,8 @@ public interface DisplayableItemNodeVisitor {
T visit(ImageNode in);
T visit(VolumeNode vn);
+
+ T visit(PoolNode pn);
T visit(SlackFileNode sfn);
@@ -262,6 +264,11 @@ public interface DisplayableItemNodeVisitor {
public T visit(ImageNode in) {
return defaultVisit(in);
}
+
+ @Override
+ public T visit(PoolNode pn) {
+ return defaultVisit(pn);
+ }
@Override
public T visit(VolumeNode vn) {
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
index e52e50c31c..d97e980a8b 100644
--- a/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/ExtractedContent.java
@@ -43,6 +43,7 @@ import org.sleuthkit.datamodel.Blackboard;
import org.sleuthkit.datamodel.BlackboardArtifact;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ACCOUNT;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT;
+import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_DATA_SOURCE_USAGE;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_EMAIL_MSG;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO;
@@ -229,7 +230,7 @@ public class ExtractedContent implements AutopsyVisitableItem {
TypeFactory() {
super();
- // these are shown in other parts of the UI tree
+ // these are shown in other parts of the UI
doNotShow.add(new BlackboardArtifact.Type(TSK_GEN_INFO));
doNotShow.add(new BlackboardArtifact.Type(TSK_EMAIL_MSG));
doNotShow.add(new BlackboardArtifact.Type(TSK_HASHSET_HIT));
@@ -239,6 +240,9 @@ public class ExtractedContent implements AutopsyVisitableItem {
doNotShow.add(new BlackboardArtifact.Type(TSK_ACCOUNT));
doNotShow.add(new BlackboardArtifact.Type(TSK_DATA_SOURCE_USAGE));
doNotShow.add(new BlackboardArtifact.Type(TSK_DOWNLOAD_SOURCE));
+ doNotShow.add(new BlackboardArtifact.Type(TSK_TL_EVENT));
+
+ //This is not meant to be shown in the UI at all. It is more of a meta artifact.
doNotShow.add(new BlackboardArtifact.Type(TSK_ASSOCIATED_OBJECT));
}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/PoolNode.java b/Core/src/org/sleuthkit/autopsy/datamodel/PoolNode.java
new file mode 100644
index 0000000000..9bc7736952
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/PoolNode.java
@@ -0,0 +1,204 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.datamodel;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.Action;
+import org.apache.commons.lang3.tuple.Pair;
+import org.openide.nodes.Sheet;
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.centralrepository.datamodel.CorrelationAttributeInstance;
+import org.sleuthkit.autopsy.corecomponents.DataResultViewerTable;
+import static org.sleuthkit.autopsy.datamodel.AbstractContentNode.NO_DESCR;
+import org.sleuthkit.datamodel.Pool;
+import org.sleuthkit.datamodel.Tag;
+
+/**
+ * This class is used to represent the "Node" for the pool.
+ */
+public class PoolNode extends AbstractContentNode {
+
+ /**
+ * Helper so that the display name and the name used in building the path
+ * are determined the same way.
+ *
+ * @param pool Pool to get the name of
+ *
+ * @return short name for the pool
+ */
+ static String nameForPool(Pool pool) {
+ return pool.getType().getName();
+ }
+
+ /**
+ *
+ * @param pool underlying Content instance
+ */
+ public PoolNode(Pool pool) {
+ super(pool);
+
+ // set name, display name, and icon
+ String poolName = nameForPool(pool);
+ this.setDisplayName(poolName);
+
+ this.setIconBaseWithExtension("org/sleuthkit/autopsy/images/pool-icon.png"); //NON-NLS
+ }
+
+ /**
+ * Right click action for volume node
+ *
+ * @param popup
+ *
+ * @return
+ */
+ @Override
+ public Action[] getActions(boolean popup) {
+ List actionsList = new ArrayList<>();
+
+ for (Action a : super.getActions(true)) {
+ actionsList.add(a);
+ }
+
+ return actionsList.toArray(new Action[actionsList.size()]);
+
+ }
+
+ @NbBundle.Messages({
+ "PoolNode.createSheet.name.name=Name",
+ "PoolNode.createSheet.name.displayName=Name",
+ "PoolNode.createSheet.name.desc=no description",
+ "PoolNode.createSheet.type.name=Type",
+ "PoolNode.createSheet.type.displayName=Type",
+ "PoolNode.createSheet.type.desc=no description",
+ })
+ @Override
+ protected Sheet createSheet() {
+ Sheet sheet = super.createSheet();
+ Sheet.Set sheetSet = sheet.get(Sheet.PROPERTIES);
+ if (sheetSet == null) {
+ sheetSet = Sheet.createPropertiesSet();
+ sheet.put(sheetSet);
+ }
+
+ Pool pool = this.getContent();
+ sheetSet.put(new NodeProperty<>(Bundle.PoolNode_createSheet_name_name(),
+ Bundle.PoolNode_createSheet_name_displayName(),
+ Bundle.PoolNode_createSheet_name_desc(),
+ this.getDisplayName()));
+ sheetSet.put(new NodeProperty<>(Bundle.PoolNode_createSheet_type_name(),
+ Bundle.PoolNode_createSheet_type_displayName(),
+ Bundle.PoolNode_createSheet_type_desc(),
+ pool.getType().getName()));
+
+ return sheet;
+ }
+
+ @Override
+ public T accept(ContentNodeVisitor visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public boolean isLeafTypeNode() {
+ return false;
+ }
+
+ @Override
+ public T accept(DisplayableItemNodeVisitor visitor) {
+ return visitor.visit(this);
+ }
+
+ @Override
+ public String getItemType() {
+ return getClass().getName();
+ }
+
+ /**
+ * Reads and returns a list of all tags associated with this content node.
+ *
+ * Null implementation of an abstract method.
+ *
+ * @return list of tags associated with the node.
+ */
+ @Override
+ protected List getAllTagsFromDatabase() {
+ return new ArrayList<>();
+ }
+
+ /**
+ * Returns correlation attribute instance for the underlying content of the
+ * node.
+ *
+ * Null implementation of an abstract method.
+ *
+ * @return correlation attribute instance for the underlying content of the
+ * node.
+ */
+ @Override
+ protected CorrelationAttributeInstance getCorrelationAttributeInstance() {
+ return null;
+ }
+
+ /**
+ * Returns Score property for the node.
+ *
+ * Null implementation of an abstract method.
+ *
+ * @param tags list of tags.
+ *
+ * @return Score property for the underlying content of the node.
+ */
+ @Override
+ protected Pair getScorePropertyAndDescription(List tags) {
+ return Pair.of(DataResultViewerTable.Score.NO_SCORE, NO_DESCR);
+ }
+
+ /**
+ * Returns comment property for the node.
+ *
+ * Null implementation of an abstract method.
+ *
+ * @param tags list of tags
+ * @param attribute correlation attribute instance
+ *
+ * @return Comment property for the underlying content of the node.
+ */
+ @Override
+ protected DataResultViewerTable.HasCommentStatus getCommentProperty(List tags, CorrelationAttributeInstance attribute) {
+ return DataResultViewerTable.HasCommentStatus.NO_COMMENT;
+ }
+
+ /**
+ * Returns occurrences/count property for the node.
+ *
+ * Null implementation of an abstract method.
+ *
+ * @param attributeType the type of the attribute to count
+ * @param attributeValue the value of the attribute to coun
+ * @param defaultDescription a description to use when none is determined by
+ * the getCountPropertyAndDescription method
+ *
+ * @return count property for the underlying content of the node.
+ */
+ @Override
+ protected Pair getCountPropertyAndDescription(CorrelationAttributeInstance.Type attributeType, String attributeValue, String defaultDescription) {
+ return Pair.of(-1L, NO_DESCR);
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Bundle_ja.properties
new file mode 100644
index 0000000000..1e28a40973
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/accounts/Bundle_ja.properties
@@ -0,0 +1,28 @@
+Accounts.BINNode.accountsProperty.displayName=\u30a2\u30ab\u30a6\u30f3\u30c8
+Accounts.BINNode.bankCityProperty.displayName=\u9280\u884c\u6240\u5728\u5730\u5e02\u753a\u6751\u533a
+Accounts.BINNode.bankCountryProperty.displayName=\u9280\u884c\u6240\u5728\u56fd
+Accounts.BINNode.bankPhoneProperty.displayName=\u9280\u884c\u96fb\u8a71\u756a\u53f7#
+Accounts.BINNode.bankProperty.displayName=\u9280\u884c
+Accounts.BINNode.bankURLProperty.displayName=\u9280\u884cURL
+Accounts.BINNode.binProperty.displayName=\u9280\u884c\u8b58\u5225\u756a\u53f7
+Accounts.BINNode.brandProperty.displayName=\u30d6\u30e9\u30f3\u30c9
+Accounts.BINNode.cardTypeProperty.displayName=\u652f\u6255\u3044\u30ab\u30fc\u30c9\u306e\u7a2e\u985e
+Accounts.BINNode.noDescription=\u8aac\u660e\u306a\u3057
+Accounts.BINNode.schemeProperty.displayName=\u30af\u30ec\u30b8\u30c3\u30c8\u30ab\u30fc\u30c9\u30b9\u30ad\u30fc\u30e0
+# {0} - \u5b50\u306e\u6570
+Accounts.ByBINNode.displayName=BIN\u5225 ({0})
+Accounts.ByBINNode.name=BIN\u5225
+# {0} - \u5b50\u306e\u6570
+Accounts.ByFileNode.displayName=\u30d5\u30a1\u30a4\u30eb\u5225 ({0})
+Accounts.FileWithCCNNode.accountsProperty.displayName=\u30a2\u30ab\u30a6\u30f3\u30c8
+Accounts.FileWithCCNNode.nameProperty.displayName=\u30d5\u30a1\u30a4\u30eb
+Accounts.FileWithCCNNode.noDescription=\u8aac\u660e\u306a\u3057
+Accounts.FileWithCCNNode.statusProperty.displayName=\u30b9\u30c6\u30fc\u30bf\u30b9
+# {0} - \u30ed\u30fc\u30d5\u30a1\u30a4\u30eb\u540d
+# {1} - Solr\u30c1\u30e3\u30f3\u30afID
+Accounts.FileWithCCNNode.unallocatedSpaceFile.displayName={0}_\u30c1\u30e3\u30f3\u30af_{1}
+Accounts.RootNode.displayName=\u30a2\u30ab\u30a6\u30f3\u30c8
+AccountsRootNode.name=\u30a2\u30ab\u30a6\u30f3\u30c8
+ApproveAccountsAction.name=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u627f\u8a8d
+RejectAccountsAction.name=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u62d2\u5426
+ToggleShowRejected.name=\u62d2\u5426\u3055\u308c\u305f\u7d50\u679c\u3092\u8868\u793a
diff --git a/Core/src/org/sleuthkit/autopsy/datamodel/utils/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datamodel/utils/Bundle_ja.properties
new file mode 100644
index 0000000000..b3e4e61e7d
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datamodel/utils/Bundle_ja.properties
@@ -0,0 +1,7 @@
+FileTypeCategory.Audio.displayName=\u30aa\u30fc\u30c7\u30a3\u30aa
+FileTypeCategory.Documents.displayName=\u6587\u66f8
+FileTypeCategory.Executables.displayName=\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb
+FileTypeCategory.Image.displayName=\u30a4\u30e1\u30fc\u30b8
+FileTypeCategory.Media.displayName=\u30e1\u30c7\u30a3\u30a2
+FileTypeCategory.Video.displayName=\u52d5\u753b
+FileTypeCategory.Visual.displayName=\u30d3\u30b8\u30e5\u30a2\u30eb
diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/Bundle_ja.properties
new file mode 100644
index 0000000000..7086b898db
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/Bundle_ja.properties
@@ -0,0 +1,21 @@
+# \u3053\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3] \u3067 [\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc] \u3092\u9078\u629e\u3057\u307e\u3059\u3002
+# \u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30c4\u30fc\u30eb | \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8] \u3092\u9078\u629e\u3057\u3001
+# \u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u958b\u304d\u307e\u3059\u3002
+
+AddRawImageTask.for.device=\u30c7\u30d0\u30a4\u30b9\u7528
+AddRawImageTask.image.critical.error.adding=\u8ffd\u52a0\u4e2d\u306e\u91cd\u5927\u306a\u30a8\u30e9\u30fc
+AddRawImageTask.image.critical.error.adding=\u8ffd\u52a0\u4e2d\u306e\u91cd\u5927\u3067\u306f\u306a\u3044\u30a8\u30e9\u30fc
+AddRawImageTask.image.notExisting=\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+AddRawImageTask.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+AddRawImageTask.progress.add.text=\u6b21\u306e\u30ed\u30fc\u30a4\u30e1\u30fc\u30b8\u3092\u8ffd\u52a0\u4e2d\u3067\u3059:
+RawDSInputPanel.error.text=\u30de\u30eb\u30c1\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u30d1\u30b9\u306f "C:" \u30c9\u30e9\u30a4\u30d6\u306b\u3042\u308a\u307e\u3059
+RawDSInputPanel.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306e\u53d6\u5f97\u4e2d\u306b\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+RawDSInputPanel.pathLabel.text=\u672a\u4f7f\u7528\u9818\u57df\u306e\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3092\u53c2\u7167:
+RawDSInputPanel.errorLabel.text=\u30a8\u30e9\u30fc\u30e9\u30d9\u30eb
+RawDSInputPanel.browseButton.text=\u53c2\u7167
+RawDSInputPanel.pathTextField.text=
+RawDSInputPanel.jBreakFileUpLabel.text=\u6b21\u307e\u3067\u30a4\u30e1\u30fc\u30b8\u3092\u7d30\u5206\u5316:
+RawDSInputPanel.jNoBreakupRadioButton.text=\u7d30\u5206\u5316\u3057\u306a\u3044
+RawDSInputPanel.j2GBBreakupRadioButton.text=2GB\u30c1\u30e3\u30f3\u30af
+RawDSInputPanel.timeZoneLabel.text=\u5165\u529b\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044:
+RawDSProcessor.dataSourceType=\u672a\u4f7f\u7528\u9818\u57df\u306e\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb
diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties
index 05c5199962..54024e1025 100755
--- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties
@@ -1,4 +1,4 @@
XRYDataSourceProcessorConfigPanel.fileBrowserButton.text=Browse
XRYDataSourceProcessorConfigPanel.filePathTextField.text=
-XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text=Select an XRY Folder
+XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text=Select a folder containing exported XRY text files
XRYDataSourceProcessorConfigPanel.errorLabel.text=
diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties-MERGED
index 2084998a0a..c3b75fd3c4 100755
--- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/Bundle.properties-MERGED
@@ -1,16 +1,16 @@
XRYDataSourceProcessor.childNotReadable=Top level path [ %s ] is not readable
-XRYDataSourceProcessor.dataSourceType=XRY Logical Report
+XRYDataSourceProcessor.dataSourceType=XRY Text Export
XRYDataSourceProcessor.fileAdded=Added %s to the case database
-XRYDataSourceProcessor.ioError=I/O error occured trying to test the XRY report folder
+XRYDataSourceProcessor.ioError=I/O error occured trying to test the selected folder
XRYDataSourceProcessor.noCurrentCase=No case is open.
-XRYDataSourceProcessor.noPathSelected=Please select a XRY folder
+XRYDataSourceProcessor.noPathSelected=Please select a folder containing exported XRY text files
XRYDataSourceProcessor.notAFolder=The selected path is not a folder
XRYDataSourceProcessor.notReadable=Selected path is not readable
-XRYDataSourceProcessor.notXRYFolder=Selected folder did not contain any XRY files
+XRYDataSourceProcessor.notXRYFolder=Selected folder did not contain any XRY text files
XRYDataSourceProcessor.preppingFiles=Preparing to add files to the case database
XRYDataSourceProcessor.processingFiles=Processing all XRY files...
XRYDataSourceProcessor.unexpectedError=Internal error occurred while processing XRY report
XRYDataSourceProcessorConfigPanel.fileBrowserButton.text=Browse
XRYDataSourceProcessorConfigPanel.filePathTextField.text=
-XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text=Select an XRY Folder
+XRYDataSourceProcessorConfigPanel.xrySelectFolderLabel.text=Select a folder containing exported XRY text files
XRYDataSourceProcessorConfigPanel.errorLabel.text=
diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java
index 0f890469bd..83ddbc1f5b 100755
--- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java
+++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYDataSourceProcessor.java
@@ -77,7 +77,7 @@ public class XRYDataSourceProcessor implements DataSourceProcessor, AutoIngestDa
@Override
@NbBundle.Messages({
- "XRYDataSourceProcessor.dataSourceType=XRY Logical Report"
+ "XRYDataSourceProcessor.dataSourceType=XRY Text Export"
})
public String getDataSourceType() {
return Bundle.XRYDataSourceProcessor_dataSourceType();
@@ -96,10 +96,10 @@ public class XRYDataSourceProcessor implements DataSourceProcessor, AutoIngestDa
*/
@Override
@NbBundle.Messages({
- "XRYDataSourceProcessor.noPathSelected=Please select a XRY folder",
+ "XRYDataSourceProcessor.noPathSelected=Please select a folder containing exported XRY text files",
"XRYDataSourceProcessor.notReadable=Selected path is not readable",
- "XRYDataSourceProcessor.notXRYFolder=Selected folder did not contain any XRY files",
- "XRYDataSourceProcessor.ioError=I/O error occured trying to test the XRY report folder",
+ "XRYDataSourceProcessor.notXRYFolder=Selected folder did not contain any XRY text files",
+ "XRYDataSourceProcessor.ioError=I/O error occured trying to test the selected folder",
"XRYDataSourceProcessor.childNotReadable=Top level path [ %s ] is not readable",
"XRYDataSourceProcessor.notAFolder=The selected path is not a folder"
})
@@ -306,7 +306,7 @@ public class XRYDataSourceProcessor implements DataSourceProcessor, AutoIngestDa
.collect(Collectors.toList());
LocalFilesDataSource dataSource = fileManager.addLocalFilesDataSource(
uniqueUUID,
- "XRY Report", //Name
+ "XRY Text Export", //Name
"", //Timezone
filePaths,
new ProgressMonitorAdapter(progressMonitor));
diff --git a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYFileReader.java b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYFileReader.java
index bc3c04259b..726c86f170 100755
--- a/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYFileReader.java
+++ b/Core/src/org/sleuthkit/autopsy/datasourceprocessors/xry/XRYFileReader.java
@@ -52,7 +52,11 @@ final class XRYFileReader implements AutoCloseable {
//Assume UTF_16LE
private static final Charset CHARSET = StandardCharsets.UTF_16LE;
- //Assume all XRY reports have the type on the 3rd line.
+ //Assume the header begins with 'xry export'.
+ private static final String START_OF_HEADER = "xry export";
+
+ //Assume all XRY reports have the type on the 3rd line
+ //relative to the start of the header.
private static final int LINE_WITH_REPORT_TYPE = 3;
//Assume all headers are 5 lines in length.
@@ -91,8 +95,12 @@ final class XRYFileReader implements AutoCloseable {
reader = Files.newBufferedReader(xryFile, CHARSET);
xryFilePath = xryFile;
- //Advance the reader to the start of the first XRY entity.
- for (int i = 0; i < HEADER_LENGTH_IN_LINES; i++) {
+ //Advance the reader to the start of the header.
+ advanceToHeader(reader);
+
+ //Advance the reader past the header to the start
+ //of the first XRY entity.
+ for (int i = 1; i < HEADER_LENGTH_IN_LINES; i++) {
reader.readLine();
}
@@ -298,8 +306,11 @@ final class XRYFileReader implements AutoCloseable {
*/
private static Optional getType(Path file) throws IOException {
try (BufferedReader reader = Files.newBufferedReader(file, CHARSET)) {
+ //Header may not start at the beginning of the file.
+ advanceToHeader(reader);
+
//Advance the reader to the line before the report type.
- for (int i = 0; i < LINE_WITH_REPORT_TYPE - 1; i++) {
+ for (int i = 1; i < LINE_WITH_REPORT_TYPE - 1; i++) {
reader.readLine();
}
@@ -310,4 +321,51 @@ final class XRYFileReader implements AutoCloseable {
return Optional.empty();
}
}
+
+ /**
+ * Advances the reader to the start of the header. The XRY Export header may
+ * not be the first n lines of the file. It may be preceded by new lines or
+ * white space.
+ *
+ * This function will consume the first line of the header, which will be
+ * 'XRY Export'.
+ *
+ * @param reader BufferedReader pointing to the xry file
+ * @throws IOException if an I/O error occurs
+ */
+ private static void advanceToHeader(BufferedReader reader) throws IOException {
+ String line;
+ if((line = reader.readLine()) == null) {
+ return;
+ }
+
+ String normalizedLine = line.trim().toLowerCase();
+ if (normalizedLine.equals(START_OF_HEADER)) {
+ return;
+ }
+
+ /**
+ * The first line may have 0xFFFE BOM prepended to it, which will cause
+ * the equality check to fail. This bit a logic will try to remove those
+ * bytes and attempt another check.
+ */
+ byte[] normalizedBytes = normalizedLine.getBytes(CHARSET);
+ if (normalizedBytes.length > 2) {
+ normalizedLine = new String(normalizedBytes, 2,
+ normalizedBytes.length - 2, CHARSET);
+ if (normalizedLine.equals(START_OF_HEADER)) {
+ return;
+ }
+ }
+
+ /**
+ * All other lines will need to match completely.
+ */
+ while ((line = reader.readLine()) != null) {
+ normalizedLine = line.trim().toLowerCase();
+ if (normalizedLine.equals(START_OF_HEADER)) {
+ return;
+ }
+ }
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties
index 860af87697..c21e75e73c 100644
--- a/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/diagnostics/Bundle_ja.properties
@@ -1,22 +1,29 @@
-CTL_PerformancePanelAction=\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u8A3A\u65AD
-PerformancePanel.cpuTest.basemsg=CPU\u30C6\u30B9\u30C8\u5B9F\u884C\u4E2D
-PerformancePanel.cpuTest.cpuLabel.MBHashedPerSec.text=\uFF11\u79D2\u3054\u3068\u306B{0}MB\u30CF\u30C3\u30B7\u30E5\u5B8C\u4E86
-PerformancePanel.cpuTest.cpuLabel.md5AlgNotFound.text=MD5\u30A2\u30EB\u30B4\u30EA\u30BA\u30E0\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3067\u3057\u305F
-PerformancePanel.dbTest.dbLabel.errPerformQuery.text=\u30AF\u30A8\u30EA\u3092\u5B9F\u884C\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-PerformancePanel.dbTest.dbLabel.recordsPerSec.text=\uFF11\u79D2\u3054\u3068\u306B{0}\u30EC\u30B3\u30FC\u30C9
-PerformancePanel.dbTest.status.running=DB\u30C6\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D
-PerformancePanel.done.statusMsg.err.text=\u30A8\u30E9\u30FC\uFF1A{0}
-PerformancePanel.fileReadLabel.errMakeFileReader.text=\u30D5\u30A1\u30A4\u30EB\u30EA\u30FC\u30C0\u30FC\u3092\u4F5C\u6210\u4E2D\u306B\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F
-PerformancePanel.fileReadLabel.imgPathNotExist.text=\u30A4\u30E1\u30FC\u30B8\u30D1\u30B9\u304C\u5B58\u5728\u3057\u307E\u305B\u3093
-PerformancePanel.FileReadTest.fileReadLabel.skipped.text=\u30B9\u30AD\u30C3\u30D7\u3055\u308C\u307E\u3057\u305F
-PerformancePanel.FileReadTest.statusMsg.runningFileReadTest.text=\u30D5\u30A1\u30A4\u30EB\u30EA\u30FC\u30C7\u30A3\u30F3\u30B0\u30C6\u30B9\u30C8\u3092\u5B9F\u884C\u4E2D
-PerformancePanel.imgTest.statusMsg.runningImgReadTest.text=\u30A4\u30E1\u30FC\u30B8\u30EA\u30FC\u30C7\u30A3\u30F3\u30B0\u30C6\u30B9\u30C8\u5B9F\u884C\u4E2D
-PerformancePanel.jLabel1.text=\u30A4\u30E1\u30FC\u30B8\u30EA\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A
-PerformancePanel.jLabel2.text=\u30C7\u30FC\u30BF\u30D9\u30FC\u30B9\u30EA\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A
-PerformancePanel.jLabel3.text=CPU\uFF1A
-PerformancePanel.jLabel4.text=\u30D5\u30A1\u30A4\u30EB\u30EA\u30FC\u30C7\u30A3\u30F3\u30B0\uFF1A
-PerformancePanel.jLabel5.text=\u30B7\u30B9\u30C6\u30E0\u306E\u30DC\u30C8\u30EB\u30CD\u30C3\u30AF\u3092\u7279\u5B9A\u3059\u308B\u4E00\u9023\u306E\u30C6\u30B9\u30C8\u3092\u884C\u3046\u30D1\u30CD\u30EB\u3067\u3059\u3002
-PerformancePanel.label.caseNotOpen.text=\u30B1\u30FC\u30B9\u304C\u958B\u3044\u3066\u3044\u307E\u305B\u3093
-PerformancePanel.label.noImgInCase.text=\u30B1\u30FC\u30B9\u306B\u30A4\u30E1\u30FC\u30B8\u304C\u3042\u308A\u307E\u305B\u3093
-PerformancePanel.startButton.text=\u958B\u59CB
-PerformancePanel.title=\u30D1\u30D5\u30A9\u30FC\u30DE\u30F3\u30B9\u8A3A\u65AD
\ No newline at end of file
+CTL_PerformancePanelAction=\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a3a\u65ad
+PerformancePanel.jLabel1.text=\u30a4\u30e1\u30fc\u30b8\u306e\u8aad\u307f\u8fbc\u307f:
+PerformancePanel.jLabel2.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u8aad\u307f\u8fbc\u307f:
+PerformancePanel.jLabel3.text=CPU:
+PerformancePanel.imgReadLabel.text=\
+PerformancePanel.dbReadLabel.text=\
+PerformancePanel.cpuTimeLabel.text=\
+PerformancePanel.startButton.text=\u958b\u59cb
+PerformancePanel.statusLabel.text=\
+PerformancePanel.jLabel4.text=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f:
+PerformancePanel.fileReadLabel.text=\
+PerformancePanel.jLabel5.text=\u3053\u306e\u30d1\u30cd\u30eb\u306f\u4e00\u9023\u306e\u30c6\u30b9\u30c8\u3092\u5b9f\u65bd\u3059\u308b\u3053\u3068\u3067\u3001\u30b7\u30b9\u30c6\u30e0\u306e\u30dc\u30c8\u30eb\u30cd\u30c3\u30af\u306e\u7279\u5b9a\u3092\u652f\u63f4\u3057\u307e\u3059\u3002
+PerformancePanel.title=\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u8a3a\u65ad
+PerformancePanel.cpuTest.basemsg=CPU\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059
+PerformancePanel.cpuTest.cpuLabel.md5AlgNotFound.text=MD5\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+PerformancePanel.cpuTest.cpuLabel.MBHashedPerSec.text=\u30cf\u30c3\u30b7\u30e5\u6e08\u307f {0} MB / \u79d2
+PerformancePanel.imgTest.statusMsg.runningImgReadTest.text=\u30a4\u30e1\u30fc\u30b8\u8aad\u307f\u8fbc\u307f\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059
+PerformancePanel.label.caseNotOpen.text=\u30b1\u30fc\u30b9\u304c\u958b\u3044\u3066\u3044\u307e\u305b\u3093
+PerformancePanel.label.noImgInCase.text=\u30b1\u30fc\u30b9\u306b\u30a4\u30e1\u30fc\u30b8\u304c\u3042\u308a\u307e\u305b\u3093
+PerformancePanel.ImgTest.imgLabel.MBReadPerSec.text=\u8aad\u307f\u53d6\u308a\u6e08\u307f {0} MB / \u79d2({1})
+PerformancePanel.FileReadTest.fileReadLabel.skipped.text=\u30b9\u30ad\u30c3\u30d7\u3055\u308c\u307e\u3057\u305f
+PerformancePanel.FileReadTest.statusMsg.runningFileReadTest.text=\u30d5\u30a1\u30a4\u30eb\u8aad\u307f\u8fbc\u307f\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059
+PerformancePanel.fileReadLabel.imgPathNotExist.text=\u30a4\u30e1\u30fc\u30b8\u30d1\u30b9\u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+PerformancePanel.fileReadLabel.errMakeFileReader.text=\u30d5\u30a1\u30a4\u30eb\u30ea\u30fc\u30c0\u30fc\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PerformancePanel.ImgTest.fileReadLabel.MBReadPerSec.text=\u8aad\u307f\u53d6\u308a\u6e08\u307f {0} MB / \u79d2({1})
+PerformancePanel.dbTest.status.running=DB\u30c6\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d\u3067\u3059
+PerformancePanel.dbTest.dbLabel.recordsPerSec.text={0} \u30ec\u30b3\u30fc\u30c9 / \u79d2
+PerformancePanel.dbTest.dbLabel.errPerformQuery.text=\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PerformancePanel.done.statusMsg.err.text=\u30a8\u30e9\u30fc: {0}
diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties
index 567e7b1478..1d92def2e4 100644
--- a/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/directorytree/Bundle_ja.properties
@@ -1,8 +1,44 @@
-CTL_DirectoryTreeTopComponent=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc
-HINT_DirectoryTreeTopComponent=\u3053\u308c\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc\u306e\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
-OpenIDE-Module-Name=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc
-FileSystemDetailsPanel.imgOffsetLabel.text=\u30a4\u30e1\u30fc\u30b8\u30aa\u30d5\u30bb\u30c3\u30c8\uff1a
-FileSystemDetailsPanel.fsTypeLabel.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u30bf\u30a4\u30d7\uff1a
+CSVWriter.done.notifyMsg.error=CSV \u30d5\u30a1\u30a4\u30eb\u3078\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - \u51fa\u529b\u30d5\u30a1\u30a4\u30eb
+CSVWriter.done.notifyMsg.success={0} \u306b\u66f8\u304d\u8fbc\u307f\u307e\u3057\u305f
+CSVWriter.progress.cancelling=\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059
+CSVWriter.progress.extracting=CSV \u30d5\u30a1\u30a4\u30eb\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u4e2d\u3067\u3059
+CTL_DirectoryTreeTopComponent=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u30d5\u30a1\u30a4\u30eb
+DataResultFilterNode.viewSourceArtifact.text=\u30bd\u30fc\u30b9\u7d50\u679c\u3092\u8868\u793a
+# {0} - dataSourceCount
+DirectoryTreeTopComponent.componentOpened.groupDataSources.text=\u3053\u306e\u30b1\u30fc\u30b9\u306b\u306f {0} \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5225\u306b\u30b0\u30eb\u30fc\u30d7\u5316\u3057\u3066\u8aad\u307f\u8fbc\u307f\u3092\u65e9\u304f\u3057\u307e\u3059\u304b?
+DirectoryTreeTopComponent.componentOpened.groupDataSources.title=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5225\u306b\u30b0\u30eb\u30fc\u30d7\u5316\u3057\u307e\u3059\u304b?
+DirectoryTreeTopComponent.emptyMimeNode.text=\u30c7\u30fc\u30bf\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u8b58\u5225\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+DirectoryTreeTopComponent.resultsView.title=\u30ea\u30c3\u30b9\u30f3\u4e2d\u3067\u3059
+ExportCSV.saveNodesToCSV.empty=\u30c7\u30fc\u30bf\u306f\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f
+# {0} - \u51fa\u529b\u30d5\u30a1\u30a4\u30eb
+ExportCSV.saveNodesToCSV.fileExists=\u30d5\u30a1\u30a4\u30eb {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+ExportCSV.saveNodesToCSV.noCurrentCase=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093
+ExportCSV.title.text=\u9078\u629e\u3057\u305f\u884c\u3092CSV\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
+ExternalViewerAction.actionPerformed.failure.exe.message=\u30d5\u30a1\u30a4\u30eb\u306f\u5b9f\u884c\u53ef\u80fd\u30d5\u30a1\u30a4\u30eb\u3067\u3042\u308b\u305f\u3081\u958b\u304d\u307e\u305b\u3093\u3002
+ExternalViewerAction.actionPerformed.failure.IO.message=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a8\u30c7\u30a3\u30bf\u30fc\u304c\u306a\u3044\u304b\u3001\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ExternalViewerAction.actionPerformed.failure.missingFile.message=\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+ExternalViewerAction.actionPerformed.failure.open.url=URL\u3092\u958b\u3051\u307e\u305b\u3093
+ExternalViewerAction.actionPerformed.failure.permission.message=\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u8a31\u53ef\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002
+ExternalViewerAction.actionPerformed.failure.support.message=\u3053\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0(\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0)\u306f\u3053\u306e\u65b9\u6cd5\u3067\u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u3053\u3068\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+ExternalViewerAction.actionPerformed.failure.title=\u30d5\u30a1\u30a4\u30eb\u30aa\u30fc\u30d7\u30f3\u5931\u6557 {0}
+ExternalViewerAction.actionPerformed.urlFailure.title=URL\u30aa\u30fc\u30d7\u30f3\u5931\u6557
+ExternalViewerShortcutAction.title.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
+ExtractAction.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+ExtractUnallocAction.imageError=\u30a4\u30e1\u30fc\u30b8\u304b\u3089\u672a\u4f7f\u7528\u9818\u57df\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ExtractUnallocAction.noFiles=\u30dc\u30ea\u30e5\u30fc\u30e0\u306b\u672a\u4f7f\u7528\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+ExtractUnallocAction.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+ExtractUnallocAction.volumeError=\u30dc\u30ea\u30e5\u30fc\u30e0\u304b\u3089\u672a\u4f7f\u7528\u9818\u57df\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - fileName
+ExtractUnallocAction.volumeInProgress=\u672a\u4f7f\u7528\u9818\u57df\u3092\u3059\u3067\u306b {0} \u306b\u62bd\u51fa\u4e2d\u3067\u3059 - \u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059
+FileSystemDetailsAction.title.text=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u8a73\u7d30
+# {0} - dataSourceCount
+GroupDataSourcesDialog.groupDataSources.text=\u3053\u306e\u30b1\u30fc\u30b9\u306b\u306f {0} \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
+HINT_DirectoryTreeTopComponent=\u3053\u308c\u306fDirectoryTree\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u3059
+OpenIDE-Module-Name=DirectoryTree
+FileSystemDetailsPanel.imgOffsetLabel.text=\u30a4\u30e1\u30fc\u30b8\u30aa\u30d5\u30bb\u30c3\u30c8:
+FileSystemDetailsPanel.fsTypeLabel.text=FileSystem\u30bf\u30a4\u30d7:
FileSystemDetailsPanel.jLabel2.text=\u30d0\u30a4\u30c8
FileSystemDetailsPanel.jLabel3.text=\u30d0\u30a4\u30c8
FileSystemDetailsPanel.fsTypeValue.text=...
@@ -13,73 +49,123 @@ FileSystemDetailsPanel.blockCountValue.text=...
FileSystemDetailsPanel.rootInumValue.text=...
FileSystemDetailsPanel.firstInumValue.text=...
FileSystemDetailsPanel.lastInumValue.text=...
-FileSystemDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a
-FileSystemDetailsPanel.blockSizeLabel.text=\u30d6\u30ed\u30c3\u30af\u30b5\u30a4\u30ba\uff1a
-FileSystemDetailsPanel.blockCountLabel.text=\u30d6\u30ed\u30c3\u30af\u6570\uff1a
-FileSystemDetailsPanel.rootInumLabel.text=\u30eb\u30fc\u30c8\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a
-FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521d\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a
-FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5f8c\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u30a8\u30f3\u30c8\u30ea\u30fc\uff1a
+FileSystemDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID:
+FileSystemDetailsPanel.blockSizeLabel.text=\u30d6\u30ed\u30c3\u30af\u30b5\u30a4\u30ba:
+FileSystemDetailsPanel.blockCountLabel.text=\u30d6\u30ed\u30c3\u30af\u30ab\u30a6\u30f3\u30c8:
+FileSystemDetailsPanel.rootInumLabel.text=\u30eb\u30fc\u30c8\u30e1\u30bf\u30c7\u30fc\u30bf\u5165\u529b:
+FileSystemDetailsPanel.firstInumLabel.text=\u6700\u521d\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u5165\u529b:
+FileSystemDetailsPanel.lastInumLabel.text=\u6700\u5f8c\u306e\u30e1\u30bf\u30c7\u30fc\u30bf\u5165\u529b:
FileSystemDetailsPanel.OKButton.text=OK
-VolumeDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID\uff1a
+SelectionContext.dataSourceFiles=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+SelectionContext.dataSources=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+SelectionContext.views=\u30d3\u30e5\u30fc
+ViewContextAction.errorMessage.cannotFindDirectory=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u898b\u3064\u3051\u3089\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ViewContextAction.errorMessage.cannotFindNode=\u30c4\u30ea\u30fc\u5185\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30ce\u30fc\u30c9\u3092\u898b\u3064\u3051\u3089\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ViewContextAction.errorMessage.cannotSelectDirectory=\u30c4\u30ea\u30fc\u5185\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+VolumeDetailsPanel.volumeIDLabel.text=\u30dc\u30ea\u30e5\u30fc\u30e0ID:
VolumeDetailsPanel.volumeIDValue.text=...
VolumeDetailsPanel.startValue.text=...
VolumeDetailsPanel.lengthValue.text=...
VolumeDetailsPanel.descValue.text=...
VolumeDetailsPanel.flagsValue.text=...
-VolumeDetailsPanel.startLabel.text=\u6700\u521d\u306e\u30bb\u30af\u30bf\u30fc\uff1a
-VolumeDetailsPanel.lengthLabel.text=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055\uff1a
-VolumeDetailsPanel.descLabel.text=\u8aac\u660e\uff1a
-VolumeDetailsPanel.flagsLabel.text=\u30d5\u30e9\u30b0\uff1a
-VolumeDetailsPanel.jLabel1.text=\u30dc\u30ea\u30e5\u30fc\u30e0\u4e00\u822c\u60c5\u5831
+VolumeDetailsPanel.startLabel.text=\u30bb\u30af\u30bf\u30fc\u3092\u958b\u59cb\u4e2d\u3067\u3059:
+VolumeDetailsPanel.lengthLabel.text=\u30bb\u30af\u30bf\u30fc\u306e\u9577\u3055:
+VolumeDetailsPanel.descLabel.text=\u8a18\u8ff0:
+VolumeDetailsPanel.flagsLabel.text=\u30d5\u30e9\u30b0:
+VolumeDetailsPanel.jLabel1.text=\u30dc\u30ea\u30e5\u30fc\u30e0\u60c5\u5831\u5168\u822c
VolumeDetailsPanel.OKButton.text=OK
ImageDetailsPanel.imageInfoLabel.text=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831
-ImageDetailsPanel.imgNameLabel.text=\u540d\u524d\uff1a
+ImageDetailsPanel.imgNameLabel.text=\u540d\u524d:
ImageDetailsPanel.imgNameValue.text=...
-ImageDetailsPanel.imgTypeLabel.text=\u30bf\u30a4\u30d7\uff1a
+ImageDetailsPanel.imgTypeLabel.text=\u30bf\u30a4\u30d7:
ImageDetailsPanel.imgTypeValue.text=...
ImageDetailsPanel.OKButton.text=OK
-ImageDetailsPanel.imgSectorSizeLabel.text=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30ba\uff1a
+ImageDetailsPanel.imgSectorSizeLabel.text=\u30bb\u30af\u30bf\u30fc\u30b5\u30a4\u30ba:
ImageDetailsPanel.imgSectorSizeValue.text=...
+DirectoryTreeTopComponent.backButton.text=
+DirectoryTreeTopComponent.forwardButton.text=
ImageDetailsPanel.imgTotalSizeValue.text=...
-ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8a08\u30b5\u30a4\u30ba\uff1a
+ImageDetailsPanel.imgTotalSizeLabel.text=\u5408\u8a08\u30b5\u30a4\u30ba:
ImageDetailsPanel.imgHashValue.text=...
-ImageDetailsPanel.imgHashLabel.text=\u30cf\u30c3\u30b7\u30e5\u5024\uff1a
-DataResultFilterNode.action.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-DataResultFilterNode.action.viewSrcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
-DataResultFilterNode.action.viewInNewWin.text=\u65b0\u898f\u30a6\u30a3\u30f3\u30c9\u30a6\u306b\u8868\u793a
-DataResultFilterNode.action.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30a2\u3067\u958b\u304f
-DataResultFilterNode.action.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
-DataResultFilterNode.action.viewInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306b\u8868\u793a
-DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f
+ImageDetailsPanel.imgHashLabel.text=\u30cf\u30c3\u30b7\u30e5\u5024:
+DataResultFilterNode.action.viewFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataResultFilterNode.action.viewSrcFileInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u5185\u306e\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a
+DataResultFilterNode.action.viewInNewWin.text=\u65b0\u3057\u3044\u30a6\u30a3\u30f3\u30c9\u30a6\u3067\u8868\u793a
+DataResultFilterNode.action.openInExtViewer.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u958b\u304f Ctrl+E
+DataResultFilterNode.action.searchFilesSameMd5.text=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+DataResultFilterNode.action.viewInDir.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3067\u8868\u793a
+DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u3092\u6298\u308a\u305f\u305f\u3080
+DirectoryTreeFilterNode.action.openFileSrcByAttr.text=\u5c5e\u6027\u5225\u306b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u3092\u958b\u304f
DirectoryTreeFilterNode.action.runIngestMods.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
-DirectoryTreeTopComponent.action.viewArtContent.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u8868\u793a
+DirectoryTreeTopComponent.action.viewArtContent.text=\u904e\u53bb\u306e\u691c\u7d22\u7d50\u679c\u306e\u5185\u5bb9\u3092\u8868\u793a
ExplorerNodeActionVisitor.action.imgDetails.title=\u30a4\u30e1\u30fc\u30b8\u8a73\u7d30
-ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa
+ExplorerNodeActionVisitor.action.extUnallocToSingleFiles=\u672a\u4f7f\u7528\u9818\u57df\u3092\u5358\u4e00\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa
ExplorerNodeActionVisitor.action.fileSystemDetails.title=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0\u8a73\u7d30
ExplorerNodeActionVisitor.action.volumeDetails.title=\u30dc\u30ea\u30e5\u30fc\u30e0\u8a73\u7d30
-ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u5185\u306e\u30c7\u30fc\u30bf\u3092\u30b7\u30f3\u30b0\u30eb\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa
-ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30a8\u30e9\u30fc\uff1a\u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-ExplorerNodeActionVisitor.exception.probGetParent.text={0}\: {1}\u304b\u3089\u30da\u30a2\u30ec\u30f3\u30c8\u3092\u53d6\u5f97\u3059\u308b\u969b\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ExplorerNodeActionVisitor.action.extUnallocToSingleFile=\u672a\u4f7f\u7528\u9818\u57df\u3092\u5358\u4e00\u30d5\u30a1\u30a4\u30eb\u306b\u62bd\u51fa
+ExplorerNodeActionVisitor.volDetail.noVolMatchErr=\u30a8\u30e9\u30fc: \u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ExplorerNodeActionVisitor.imgDetail.noVolMatchesErr=\u30a8\u30e9\u30fc: \u4e00\u81f4\u3059\u308b\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ExplorerNodeActionVisitor.exception.probGetParent.text={0} \u304b\u3089\u6b21\u306e\u89aa\u3092\u53d6\u5f97\u4e2d\u306b\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {1}
ExtractAction.title.extractFiles.text=\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa
-ExtractAction.extractFiles.cantCreateFolderErr.msg=\u6307\u5b9a\u3055\u308c\u305f\u30d5\u30a9\u30eb\u30c0\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-ExtractAction.confDlg.destFileExist.msg=\u4fdd\u5b58\u5148\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3001\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b\uff1f
+ExtractAction.extractFiles.cantCreateFolderErr.msg=\u9078\u629e\u3057\u305f\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ExtractAction.confDlg.destFileExist.msg=\u5b9b\u5148\u30d5\u30a1\u30a4\u30eb {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b?
ExtractAction.confDlg.destFileExist.title=\u30d5\u30a1\u30a4\u30eb\u304c\u5b58\u5728\u3057\u307e\u3059
-ExtractAction.msgDlg.cantOverwriteFile.msg=\u65e2\u5b58\u30d5\u30a1\u30a4\u30eb{0}\u3092\u4e0a\u66f8\u304d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-ExtractAction.notifyDlg.noFileToExtr.msg=\u62bd\u51fa\u3067\u304d\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-ExtractAction.progress.extracting=\u62bd\u51fa\u4e2d
-ExtractAction.progress.cancellingExtraction={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
+ExtractAction.msgDlg.cantOverwriteFile.msg=\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb {0} \u3092\u4e0a\u66f8\u304d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+ExtractAction.notifyDlg.noFileToExtr.msg=\u62bd\u51fa\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+ExtractAction.progress.extracting=\u62bd\u51fa\u4e2d\u3067\u3059
+ExtractAction.progress.cancellingExtraction={0} (\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...)
ExtractAction.done.notifyMsg.fileExtr.text=\u30d5\u30a1\u30a4\u30eb\u304c\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
-ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u3053\u306e\u30a4\u30e1\u30fc\u30b8\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u306f\u65e2\u306b\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u5225\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002
-ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30d5\u30a9\u30eb\u30c0\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u7d9a\u884c\u3059\u308b\u524d\u306b\u6709\u52b9\u306a\u30d5\u30a9\u30eb\u30c0\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044\u3002
-ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4fdd\u5b58\u5148\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u9078\u629e\u3057\u3066\u4e0b\u3055\u3044
-ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30d5\u30a1\u30a4\u30eb{0}\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b\uff1f
-ExtractUnallocAction.progress.extractUnalloc.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d
-ExtractUnallocAction.progress.displayName.cancelling.text=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u30c7\u30fc\u30bf\u3092\u62bd\u51fa\u4e2d\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
-ExtractUnallocAction.processing.counter.msg={0}\uff0f{1} MBs\u3092\u51e6\u7406\u4e2d
-ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u62bd\u51fa\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002
-ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30d5\u30a1\u30a4\u30eb\u306f{0}\u3078\u62bd\u51fa\u3055\u308c\u307e\u3057\u305f
-ExtractUnallocAction.done.errMsg.title=\u62bd\u51fa\u30a8\u30e9\u30fc
-ExtractUnallocAction.done.errMsg.msg=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a{0}
-DirectoryTreeFilterNode.action.collapseAll.text=\u3059\u3079\u3066\u30b3\u30e9\u30d7\u30b9
-ExtractAction.done.notifyMsg.extractErr=\u4e0b\u8a18\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}
+ExtractUnallocAction.notifyMsg.unallocAlreadyBeingExtr.msg=\u672a\u4f7f\u7528\u9818\u57df\u306f\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u4e0a\u3067\u3059\u3067\u306b\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u5225\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ExtractUnallocAction.msgDlg.folderDoesntExist.msg=\u30d5\u30a9\u30eb\u30c0\u30fc\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u6709\u52b9\u306a\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u9078\u629e\u3057\u3066\u7d9a\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ExtractUnallocAction.dlgTitle.selectDirToSaveTo.msg=\u4fdd\u5b58\u5148\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u9078\u629e
+ExtractUnallocAction.confDlg.unallocFileAlreadyExist.msg=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306eUnalloc\u30d5\u30a1\u30a4\u30eb {0} \u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u7f6e\u304d\u63db\u3048\u307e\u3059\u304b?
+ExtractUnallocAction.progress.extractUnalloc.title=\u672a\u4f7f\u7528\u9818\u57df\u3092\u62bd\u51fa\u4e2d\u3067\u3059
+ExtractUnallocAction.progress.displayName.cancelling.text=\u672a\u4f7f\u7528\u9818\u57df\u3092\u62bd\u51fa\u4e2d\u3067\u3059(\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...)
+ExtractUnallocAction.processing.counter.msg=\u30e1\u30e2\u30ea\u30fc {1} MB\u306e {0} \u3092\u51e6\u7406\u4e2d\u3067\u3059
+ExtractUnallocAction.done.notifyMsg.completedExtract.title=\u672a\u4f7f\u7528\u9818\u57df\u306e\u62bd\u51fa\u3092\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002
+ExtractUnallocAction.done.notifyMsg.completedExtract.msg=\u30d5\u30a1\u30a4\u30eb\u3092 {0} \u306b\u62bd\u51fa\u3057\u307e\u3057\u305f
+ExtractUnallocAction.done.errMsg.title=\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ExtractUnallocAction.done.errMsg.msg=\u6b21\u306e\u672a\u4f7f\u7528\u9818\u57df\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+ExtractAction.done.notifyMsg.extractErr=\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u62bd\u51fa\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+OptionsCategory_Name_ExternalViewer=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc
+OptionsCategory_Keywords_ExternalViewer=ExternalViewer
+ExternalViewerGlobalSettingsPanel.exePathLabel.MIME.text=\u3053\u306eMIME\u30bf\u30a4\u30d7\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0
+ExternalViewerGlobalSettingsPanel.exePathLabel.EXT.text=\u3053\u306e\u62e1\u5f35\u5b50\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0
+ExternalViewerGlobalSettingsPanel.exePathLabel.empty.text=MIME\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AddExternalViewerRuleDialog.saveButton.title=\u4fdd\u5b58
+AddExternalViewerRuleDialog.cancelButton.title=\u53d6\u308a\u6d88\u3057
+AddExternalViewerRuleDialog.title=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidMime.message=MIME \u30bf\u30a4\u30d7\u304c\u7121\u52b9\u3067\u3059\u3002[\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u30aa\u30d7\u30b7\u30e7\u30f3] \u30d1\u30cd\u30eb\u306b\u30ab\u30b9\u30bf\u30e0\u30bf\u30a4\u30d7\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidMime.title=\u7121\u52b9\u306aMIME\u30bf\u30a4\u30d7
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidExt.message=\u62e1\u5f35\u5b50\u304c\u7121\u52b9\u3067\u3059\u3002
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidExt.title=\u7121\u52b9\u306a\u62e1\u5f35\u5b50
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidExePath.message=\u5b9f\u884c\u53ef\u80fd\u306a\u30d7\u30ed\u30b0\u30e9\u30e0\u3078\u306e\u30d1\u30b9\u304c\u7121\u52b9\u3067\u3059
+ExternalViewerGlobalSettingsPanel.JOptionPane.invalidExePath.title=\u7121\u52b9\u306a\u30d1\u30b9
+ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.message=\u3053\u306eMIME\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50\u306e\u30eb\u30fc\u30eb\u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u3066\u3044\u307e\u3059\u3002\u305d\u306e\u30eb\u30fc\u30eb\u3092\u7de8\u96c6\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ExternalViewerGlobalSettingsPanel.JOptionPane.ruleAlreadyExists.title=\u30eb\u30fc\u30eb\u306f\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AddExternalViewerRulePanel.mimeRadioButton.text=MIME\u30bf\u30a4\u30d7
+AddExternalViewerRulePanel.nameTextField.text=
+AddExternalViewerRulePanel.nameLabel.text=MIME\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50
+AddExternalViewerRulePanel.browseButton.text=\u53c2\u7167
+AddExternalViewerRulePanel.exePathTextField.text=
+AddExternalViewerRulePanel.exePathLabel.text=\u3053\u306e\u30bf\u30a4\u30d7\u307e\u305f\u306f\u62e1\u5f35\u5b50\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u4f7f\u7528\u3059\u308b\u30d7\u30ed\u30b0\u30e9\u30e0\u306e\u30d1\u30b9
+AddExternalViewerRulePanel.extRadioButton.text=\u62e1\u5f35\u5b50
+GroupDataSourcesDialog.dataSourceCountLabel.text=jLabel1
+GroupDataSourcesDialog.queryLabel.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5225\u306b\u30b0\u30eb\u30fc\u30d7\u5316\u3057\u3066\u8aad\u307f\u8fbc\u307f\u3092\u65e9\u304f\u3057\u307e\u3059\u304b?
+GroupDataSourcesDialog.yesButton.text=\u306f\u3044
+GroupDataSourcesDialog.noButton.text=\u3044\u3044\u3048
+GroupDataSourcesDialog.title=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5225\u306b\u30b0\u30eb\u30fc\u30d7\u5316\u3057\u307e\u3059\u304b?
+DirectoryTreeTopComponent.openViewPreferencesButton.text=
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title3=\u30bf\u30a4\u30c8\u30eb4
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title2=\u30bf\u30a4\u30c8\u30eb3
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title3_1=\u30bf\u30a4\u30c8\u30eb4
+ExternalViewerGlobalSettingsPanel.jTable1.columnModel.title2_1=\u30bf\u30a4\u30c8\u30eb3
+ExternalViewerGlobalSettingsPanel.newRuleButton1.text=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.editRuleButton.text=\u30eb\u30fc\u30eb\u3092\u7de8\u96c6
+ExternalViewerGlobalSettingsPanel.deleteRuleButton.text=\u30eb\u30fc\u30eb\u3092\u524a\u9664
+ExternalViewerGlobalSettingsPanel.externalViewerTitleLabel.text=\u5916\u90e8\u30d3\u30e5\u30fc\u30ef\u30fc\u306e\u30ab\u30b9\u30bf\u30e0\u30eb\u30fc\u30eb\u3092\u8ffd\u52a0:
+ExternalViewerGlobalSettingsPanel.newRuleButton.text=\u65b0\u898f\u30eb\u30fc\u30eb
+ExternalViewerGlobalSettingsPanel.jButton2.text=jButton2
+ExternalViewerGlobalSettingsPanel.browseHxDDirectory.text=\u53c2\u7167
+ExternalViewerGlobalSettingsPanel.HxDLabel.text=HxD\u30a8\u30c7\u30a3\u30bf\u30fc\u30d1\u30b9:
+ExternalViewerGlobalSettingsPanel.ContentViewerExtensionLabel.text=\u30b3\u30f3\u30c6\u30f3\u30c4\u30d3\u30e5\u30fc\u30ef\u30fc\u306e\u62e1\u5f35\u5b50\u3092\u8ffd\u52a0:
diff --git a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java
index 11d61460a6..548fb881be 100644
--- a/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java
+++ b/Core/src/org/sleuthkit/autopsy/directorytree/DataResultFilterNode.java
@@ -291,6 +291,9 @@ public class DataResultFilterNode extends FilterNode {
for (Action a : ban.getActions(true)) {
actionsList.add(a);
}
+
+ //Add seperator between the decorated actions and the actions from the node itself.
+ actionsList.add(null);
BlackboardArtifact ba = ban.getLookup().lookup(BlackboardArtifact.class);
final int artifactTypeID = ba.getArtifactTypeID();
diff --git a/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties
index ec61e857ea..e00b218ce5 100644
--- a/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/events/Bundle_ja.properties
@@ -1,10 +1,10 @@
-MessageServiceConnectionInfo.ConnectionCheck.Everything=\u30DB\u30B9\u30C8\u540D\u3001\u30DD\u30FC\u30C8\u756A\u53F7\u3001\u30E6\u30FC\u30B6\u30FC\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u7121\u52B9\u3067\u3059
-MessageServiceConnectionInfo.ConnectionCheck.Hostname=\u7121\u52B9\u306A\u30DB\u30B9\u30C8\u540D
-MessageServiceConnectionInfo.ConnectionCheck.Port=\u7121\u52B9\u306A\u30DD\u30FC\u30C8\u756A\u53F7
-MessageServiceConnectionInfo.ConnectionCheck.Username=\u7121\u52B9\u306A\u30E6\u30FC\u30B6\u30FC\u540D
-MessageServiceConnectionInfo.ConnectionCheck.Password=\u7121\u52B9\u306A\u30D1\u30B9\u30EF\u30FC\u30C9
-MessageServiceConnectionInfo.ConnectionCheck.UsernameAndPassword=\u7121\u52B9\u306A\u30E6\u30FC\u30B6\u30FC\u540D\u307E\u305F\u306F\u30D1\u30B9\u30EF\u30FC\u30C9
-MessageServiceConnectionInfo.ConnectionCheck.HostnameOrPort=\u7121\u52B9\u306A\u30DB\u30B9\u30C8\u540D\u307E\u305F\u306F\u30DD\u30FC\u30C8\u756A\u53F7
-MessageServiceConnectionInfo.MissingHostname=\u30DB\u30B9\u30C8\u540D\u304C\u5FC5\u8981\u3067\u3059\u3002
-MessageServiceConnectionInfo.MissingUsername=\u30E6\u30FC\u30B6\u30FC\u540D\u304C\u5FC5\u8981\u3067\u3059\u3002
-MessageServiceConnectionInfo.MissingPassword=\u30D1\u30B9\u30EF\u30FC\u30C9\u304C\u5FC5\u8981\u3067\u3059\u3002
\ No newline at end of file
+MessageServiceConnectionInfo.ConnectionCheck.Everything=\u7121\u52b9\u306a\u30db\u30b9\u30c8\u540d\u3001\u30dd\u30fc\u30c8\u756a\u53f7\u3001\u30e6\u30fc\u30b6\u30fc\u540d\u3001\u304a\u3088\u3073/\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.Hostname=\u7121\u52b9\u306a\u30db\u30b9\u30c8\u540d\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.Port=\u7121\u52b9\u306a\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.Username=\u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u540d\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.Password=\u7121\u52b9\u306a\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.UsernameAndPassword=\u7121\u52b9\u306a\u30db\u30b9\u30c8\u540d\u304a\u3088\u3073/\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002
+MessageServiceConnectionInfo.ConnectionCheck.HostnameOrPort=\u7121\u52b9\u306a\u30db\u30b9\u30c8\u540d\u304a\u3088\u3073/\u307e\u305f\u306f\u30dd\u30fc\u30c8\u756a\u53f7\u3067\u3059\u3002
+MessageServiceConnectionInfo.MissingHostname=\u30db\u30b9\u30c8\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+MessageServiceConnectionInfo.MissingUsername=\u30e6\u30fc\u30b6\u30fc\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
+MessageServiceConnectionInfo.MissingPassword=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/examples/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/examples/Bundle_ja.properties
new file mode 100644
index 0000000000..8fc0db1332
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/examples/Bundle_ja.properties
@@ -0,0 +1,6 @@
+SampleContentViewer.jLabel1.text=jLabel1
+SampleIngestModuleFactory.moduleName=\u30b5\u30f3\u30d7\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
+SampleIngestModuleFactory.moduleDescription=\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u958b\u767a\u8005\u306e\u30b5\u30f3\u30d7\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002
+SampleIngestModuleIngestJobSettingsPanel.skipKnownFilesCheckBox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb(NSRL)\u3092\u30b9\u30ad\u30c3\u30d7
+SampleIngestModuleFactory.moduleName=\u30b5\u30f3\u30d7\u30eb\u5b9f\u884c\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
+SampleExecutableIngestModuleFactory.moduleDescription=\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u958b\u767a\u8005\u306e\u30b5\u30f3\u30d7\u30eb\u5b9f\u884c\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u3057\u3066\u6a5f\u80fd\u3057\u307e\u3059\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties
index b4f11c01de..9a408d5c24 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties
@@ -15,26 +15,22 @@ FileSearchDialog.orderAttrRadioButton.text=Attribute
FileSearchDialog.orderSizeRadioButton.text=Group Size
FileSearchDialog.jLabel5.text=Order files by:
FileSearchDialog.parentCheckBox.text=Parent
-ResultsDialog.exitButton.text=Exit
-ResultsDialog.searchButton.text=Run another search
-FileSearchPanel.sortingPanel.border.title=Sorting
+FileSearchPanel.sortingPanel.border.title=Grouping
FileSearchPanel.searchButton.text=Show
FileSearchPanel.addButton.text=Add
FileSearchPanel.substringRadioButton.text=Substring
FileSearchPanel.fullRadioButton.text=Full
-FileSearchPanel.parentCheckbox.text=Parent:
+FileSearchPanel.parentCheckbox.text=Parent Folder:
FileSearchPanel.keywordCheckbox.text=Keyword:
-FileSearchPanel.crFrequencyCheckbox.text=CR Frequency:
-FileSearchPanel.dataSourceCheckbox.text=Data source:
-FileSearchPanel.groupSizeRadioButton.text=Group size
-FileSearchPanel.sizeCheckbox.text=Size:
-FileSearchPanel.attributeRadioButton.text=Attribute
-FileSearchPanel.orderGroupsByLabel.text=Order groups by:
+FileSearchPanel.crFrequencyCheckbox.text=Past Occurrences:
+FileSearchPanel.dataSourceCheckbox.text=Data Source:
+FileSearchPanel.sizeCheckbox.text=File Size:
+FileSearchPanel.orderGroupsByLabel.text=Order Groups By:
FileSearchPanel.filtersScrollPane.border.title=Filters
FileSearchPanel.parentLabel.text=(All will be used)
FileSearchPanel.deleteButton.text=Delete
-FileSearchPanel.orderByLabel.text=Order by:
-FileSearchPanel.groupByLabel.text=Group by:
+FileSearchPanel.orderByLabel.text=Order Within Groups By:
+FileSearchPanel.groupByLabel.text=Group By:
FileSearchDialog.searchButton.text=Search
FileSearchDialog.hashCheckBox.text=Hash Set
FileSearchDialog.intCheckBox.text=Interesting Items
@@ -45,16 +41,16 @@ FileSearchDialog.notableCheckBox.text=Must have been tagged as notable
FileSearchDialog.scoreCheckBox.text=Has score
FileSearchPanel.cancelButton.text=Cancel
FileSearchPanel.hashSetCheckbox.text=Hash Set:
-FileSearchPanel.tagsCheckbox.text=Tags:
-FileSearchPanel.interestingItemsCheckbox.text=Interesting Items:
+FileSearchPanel.tagsCheckbox.text=Tag:
+FileSearchPanel.interestingItemsCheckbox.text=Interesting Item:
FileSearchPanel.scoreCheckbox.text=Has Score:
FileSearchPanel.exifCheckbox.text=Possibly User Created
FileSearchPanel.notableCheckbox.text=Must have been tagged as notable
-FileSearchPanel.objectsCheckbox.text=Objects:
+FileSearchPanel.objectsCheckbox.text=Object Detected:
ResultsPanel.currentPageLabel.text=Page: -
ResultsPanel.pageControlsLabel.text=Pages:
ResultsPanel.gotoPageLabel.text=Go to Page:
-ResultsPanel.pageSizeLabel.text=Page size:
+ResultsPanel.pageSizeLabel.text=Page Size:
ResultsPanel.instancesList.border.title=Instances
DiscoveryExtractAction.title.extractFiles.text=Extract File
FileSearchPanel.includeRadioButton.text=Include
@@ -64,3 +60,7 @@ FileSearchPanel.knownFilesCheckbox.text=Hide known files
GroupListPanel.groupKeyList.border.title=Groups
DiscoveryTopComponent.imagesButton.text=Images
DiscoveryTopComponent.videosButton.text=Videos
+ResultsPanel.resultsSplitPane.toolTipText=
+FileSearchPanel.stepTwoLabel.text=Step 2: Filter which images to show
+FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
+DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED
index 49e1c98f21..a36a61b825 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/filequery/Bundle.properties-MERGED
@@ -1,5 +1,13 @@
-CTL_FileDiscoveryTestAction=Test file discovery
+CTL_OpenFileDiscoveryAction=File Discovery
+# {0} - dataSourceName
+DataSourceModuleWrapper.exifModule.text=Exif Parser module was not run on data source: {0}\n
+# {0} - dataSourceName
+DataSourceModuleWrapper.fileTypeModule.text=File Type Identification module was not run on data source: {0}\n
+# {0} - dataSourceName
+DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n
DiscoveryTopComponent.name=\ File Discovery
+FileGroup.groupSortingAlgorithm.groupName.text=Group Name
+FileGroup.groupSortingAlgorithm.groupSize.text=Group Size
# {0} - Data source name
# {1} - Data source ID
FileSearch.DataSourceGroupKey.datasourceAndID={0}(ID: {1})
@@ -8,51 +16,49 @@ FileSearch.DataSourceGroupKey.idOnly=Data source (ID: {0})
FileSearch.FileTagGroupKey.noSets=None
# {0} - file name
FileSearch.genVideoThumb.progress.text=extracting temporary file {0}
-FileSearch.GroupingAttributeType.datasource.displayName=Data source
-FileSearch.GroupingAttributeType.fileType.displayName=File type
-FileSearch.GroupingAttributeType.frequency.displayName=Past occurrences
-FileSearch.GroupingAttributeType.hash.displayName=Hash set
-FileSearch.GroupingAttributeType.interestingItem.displayName=Interesting item set
-FileSearch.GroupingAttributeType.keywordList.displayName=Keyword list names
+FileSearch.GroupingAttributeType.datasource.displayName=Data Source
+FileSearch.GroupingAttributeType.fileType.displayName=File Type
+FileSearch.GroupingAttributeType.frequency.displayName=Past Occurrences
+FileSearch.GroupingAttributeType.hash.displayName=Hash Set
+FileSearch.GroupingAttributeType.interestingItem.displayName=Interesting Item
+FileSearch.GroupingAttributeType.keywordList.displayName=Keyword
FileSearch.GroupingAttributeType.none.displayName=None
-FileSearch.GroupingAttributeType.object.displayName=Object detected
-FileSearch.GroupingAttributeType.parent.displayName=Parent folder
-FileSearch.GroupingAttributeType.size.displayName=Size
-FileSearch.GroupingAttributeType.tag.displayName=File tag
+FileSearch.GroupingAttributeType.object.displayName=Object Detected
+FileSearch.GroupingAttributeType.parent.displayName=Parent Folder
+FileSearch.GroupingAttributeType.size.displayName=File Size
+FileSearch.GroupingAttributeType.tag.displayName=Tag
FileSearch.HashHitsGroupKey.noHashHits=None
FileSearch.InterestingItemGroupKey.noSets=None
FileSearch.KeywordListGroupKey.noKeywords=None
FileSearch.NoGroupingGroupKey.allFiles=All Files
FileSearch.ObjectDetectedGroupKey.noSets=None
-FileSearchData.FileSize.OVER_100KB.displayName=100 KB - 1 MB
-FileSearchData.FileSize.OVER_10GB.displayName=10 GB+
-FileSearchData.FileSize.OVER_16KB.displayName=16 KB - 100 KB
-FileSearchData.FileSize.OVER_1GB_IMAGE.displayName=1 GB+
-FileSearchData.FileSize.OVER_1GB_VIDEO.displayName=1 - 5 GB
-FileSearchData.FileSize.OVER_1MB.displayName=1 - 50 MB
-FileSearchData.FileSize.OVER_200MB.displayName=200 MB - 1 GB
-FileSearchData.FileSize.OVER_50MB.displayName=50 - 200 MB
-FileSearchData.FileSize.OVER_5GB.displayName=5 - 10 GB
-FileSearchData.FileSize.UNDER_100KB.displayName=Under 100 KB
-FileSearchData.FileSize.UNDER_16KB.displayName=Under 16 KB
+FileSearchData.FileSize.LARGE_IMAGE.displayName=Large: 1-50MB
+FileSearchData.FileSize.LARGE_VIDEO.displayName=Large: 1-5GB
+FileSearchData.FileSize.MEDIUM_IMAGE.displayName=Medium: 100KB-1MB
+FileSearchData.FileSize.MEDIUM_VIDEO.displayName=Medium: 100MB-1GB
+FileSearchData.FileSize.SMALL_IMAGE.displayName=Small: 16-100KB
+FileSearchData.FileSize.SMALL_VIDEO.displayName=Small: 500KB-100MB
+FileSearchData.FileSize.XLARGE_IMAGE.displayName=XLarge: 50-200MB
+FileSearchData.FileSize.XLARGE_VIDEO.displayName=XLarge: 5-10GB
+FileSearchData.FileSize.XSMALL_IMAGE.displayName=XSmall: 0-16KB
+FileSearchData.FileSize.XSMALL_VIDEO.displayName=XSmall: 0-500KB
+FileSearchData.FileSize.XXLARGE_IMAGE.displayName=XXLarge: 200MB+
+FileSearchData.FileSize.XXLARGE_VIDEO.displayName=XXLarge: 10GB+
FileSearchData.FileType.Audio.displayName=Audio
FileSearchData.FileType.Documents.displayName=Documents
FileSearchData.FileType.Executables.displayName=Executables
FileSearchData.FileType.Image.displayName=Image
FileSearchData.FileType.Other.displayName=Other/Unknown
FileSearchData.FileType.Video.displayName=Video
-FileSearchData.Frequency.common.displayName=Common
-FileSearchData.Frequency.count_10.displayName=6 - 10
-FileSearchData.Frequency.count_100.displayName=51 - 100
-FileSearchData.Frequency.count_20.displayName=11 - 20
-FileSearchData.Frequency.count_50.displayName=21 - 50
-FileSearchData.Frequency.rare.displayName=Rare (2-5)
+FileSearchData.Frequency.common.displayName=Common (11 - 100)
+FileSearchData.Frequency.known.displayName=Known (NSRL)
+FileSearchData.Frequency.rare.displayName=Rare (2-10)
FileSearchData.Frequency.unique.displayName=Unique (1)
FileSearchData.Frequency.unknown.displayName=Unknown
+FileSearchData.Frequency.verycommon.displayName=Very Common (100+)
FileSearchData.Score.interesting.displayName=Interesting
FileSearchData.Score.notable.displayName=Notable
FileSearchData.Score.unknown.displayName=Unknown
-FileSearchDialog.dialogTitle.text=Test file search
FileSearchDialog.jLabel1.text=File Type
FileSearchDialog.dsCheckBox.text=Data source
FileSearchDialog.cancelButton.text=Cancel
@@ -115,43 +121,22 @@ FileSearchFiltering.SizeFilter.range=({0} to {1})
FileSearchFiltering.TagsFilter.desc=Files that have been tagged {0}
FileSearchFiltering.TagsFilter.or=\ or
FileSearchPanel.dialogTitle.text=Test file search
-FileSorter.SortingMethod.datasource.displayName=By data source
-FileSorter.SortingMethod.filename.displayName=By file name
-FileSorter.SortingMethod.filesize.displayName=By file size
-FileSorter.SortingMethod.filetype.displayName=By file type
-FileSorter.SortingMethod.frequency.displayName=By central repo frequency
-FileSorter.SortingMethod.fullPath.displayName=By full path
-FileSorter.SortingMethod.keywordlist.displayName=By keyword list names
-# {0} - numberOfInstances
-ImageThumbnailPanel.countLabel.text=Number of Instances: {0}
-ImageThumbnailPanel.isDeleted.text=All instances of file are deleted.
-# {0} - fileSize
-ImageThumbnailPanel.sizeLabel.text=Size: {0} bytes
-ResultFile.score.interestingResult.description=At least one instance of the file has an interesting result associated with it.
-ResultFile.score.notableFile.description=At least one instance of the file was recognized as notable.
-ResultFile.score.notableTaggedFile.description=At least one instance of the file is tagged with a notable tag.
-ResultFile.score.taggedFile.description=At least one instance of the file has been tagged.
-ResultsDialog.dialogTitle.text=File search results
-ResultsDialog.exitButton.text=Exit
-ResultsDialog.searchButton.text=Run another search
-FileSearchPanel.sortingPanel.border.title=Sorting
+FileSearchPanel.sortingPanel.border.title=Grouping
FileSearchPanel.searchButton.text=Show
FileSearchPanel.addButton.text=Add
FileSearchPanel.substringRadioButton.text=Substring
FileSearchPanel.fullRadioButton.text=Full
-FileSearchPanel.parentCheckbox.text=Parent:
+FileSearchPanel.parentCheckbox.text=Parent Folder:
FileSearchPanel.keywordCheckbox.text=Keyword:
-FileSearchPanel.crFrequencyCheckbox.text=CR Frequency:
-FileSearchPanel.dataSourceCheckbox.text=Data source:
-FileSearchPanel.groupSizeRadioButton.text=Group size
-FileSearchPanel.sizeCheckbox.text=Size:
-FileSearchPanel.attributeRadioButton.text=Attribute
-FileSearchPanel.orderGroupsByLabel.text=Order groups by:
+FileSearchPanel.crFrequencyCheckbox.text=Past Occurrences:
+FileSearchPanel.dataSourceCheckbox.text=Data Source:
+FileSearchPanel.sizeCheckbox.text=File Size:
+FileSearchPanel.orderGroupsByLabel.text=Order Groups By:
FileSearchPanel.filtersScrollPane.border.title=Filters
FileSearchPanel.parentLabel.text=(All will be used)
FileSearchPanel.deleteButton.text=Delete
-FileSearchPanel.orderByLabel.text=Order by:
-FileSearchPanel.groupByLabel.text=Group by:
+FileSearchPanel.orderByLabel.text=Order Within Groups By:
+FileSearchPanel.groupByLabel.text=Group By:
FileSearchDialog.searchButton.text=Search
FileSearchDialog.hashCheckBox.text=Hash Set
FileSearchDialog.intCheckBox.text=Interesting Items
@@ -162,12 +147,37 @@ FileSearchDialog.notableCheckBox.text=Must have been tagged as notable
FileSearchDialog.scoreCheckBox.text=Has score
FileSearchPanel.cancelButton.text=Cancel
FileSearchPanel.hashSetCheckbox.text=Hash Set:
-FileSearchPanel.tagsCheckbox.text=Tags:
-FileSearchPanel.interestingItemsCheckbox.text=Interesting Items:
+FileSearchPanel.tagsCheckbox.text=Tag:
+FileSearchPanel.interestingItemsCheckbox.text=Interesting Item:
FileSearchPanel.scoreCheckbox.text=Has Score:
FileSearchPanel.exifCheckbox.text=Possibly User Created
FileSearchPanel.notableCheckbox.text=Must have been tagged as notable
-FileSearchPanel.objectsCheckbox.text=Objects:
+FileSearchPanel.objectsCheckbox.text=Object Detected:
+FileSorter.SortingMethod.datasource.displayName=Data Source
+FileSorter.SortingMethod.filename.displayName=File Name
+FileSorter.SortingMethod.filesize.displayName=File Size
+FileSorter.SortingMethod.filetype.displayName=File Type
+FileSorter.SortingMethod.frequency.displayName=Central Repo Frequency
+FileSorter.SortingMethod.fullPath.displayName=Full Path
+FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names
+GroupsListPanel.noResults.message.text=No results were found for the selected filters.
+GroupsListPanel.noResults.title.text=No results found
+ImageThumbnailPanel.bytes.text=bytes
+# {0} - numberOfInstances
+ImageThumbnailPanel.countLabel.text=Number of Instances: {0}
+ImageThumbnailPanel.gigaBytes.text=GB
+ImageThumbnailPanel.isDeleted.text=All instances of file are deleted.
+ImageThumbnailPanel.kiloBytes.text=KB
+ImageThumbnailPanel.megaBytes.text=MB
+# {0} - fileSize
+# {1} - units
+ImageThumbnailPanel.sizeLabel.text=Size: {0} {1}
+ImageThumbnailPanel.terraBytes.text=TB
+OpenFileDiscoveryAction.resultsIncomplete.text=Results may be incomplete
+ResultFile.score.interestingResult.description=At least one instance of the file has an interesting result associated with it.
+ResultFile.score.notableFile.description=At least one instance of the file was recognized as notable.
+ResultFile.score.notableTaggedFile.description=At least one instance of the file is tagged with a notable tag.
+ResultFile.score.taggedFile.description=At least one instance of the file has been tagged.
# {0} - currentPage
# {1} - totalPages
ResultsPanel.currentPage.displayValue=Page: {0} of {1}
@@ -179,7 +189,7 @@ ResultsPanel.invalidPageNumber.title=Invalid Page Number
ResultsPanel.openInExternalViewer.name=Open in External Viewer
ResultsPanel.pageControlsLabel.text=Pages:
ResultsPanel.gotoPageLabel.text=Go to Page:
-ResultsPanel.pageSizeLabel.text=Page size:
+ResultsPanel.pageSizeLabel.text=Page Size:
ResultsPanel.instancesList.border.title=Instances
DiscoveryExtractAction.title.extractFiles.text=Extract File
FileSearchPanel.includeRadioButton.text=Include
@@ -189,10 +199,19 @@ FileSearchPanel.knownFilesCheckbox.text=Hide known files
GroupListPanel.groupKeyList.border.title=Groups
DiscoveryTopComponent.imagesButton.text=Images
DiscoveryTopComponent.videosButton.text=Videos
+ResultsPanel.resultsSplitPane.toolTipText=
+FileSearchPanel.stepTwoLabel.text=Step 2: Filter which images to show
+FileSearchPanel.stepThreeLabel.text=Step 3: Choose display settings
+DiscoveryTopComponent.stepOneLabel.text=Step 1: Pick File Type
ResultsPanel.viewFileInDir.name=View File in Directory
-SearchNode.getName.text=Search Result
+VideoThumbnailPanel.bytes.text=bytes
# {0} - numberOfInstances
VideoThumbnailPanel.countLabel.text=Number of Instances: {0}
VideoThumbnailPanel.deleted.text=All instances of file are deleted.
+VideoThumbnailPanel.gigaBytes.text=GB
+VideoThumbnailPanel.kiloBytes.text=KB
+VideoThumbnailPanel.megaBytes.text=MB
# {0} - fileSize
-VideoThumbnailPanel.sizeLabel.text=Size: {0} bytes
+# {1} - units
+VideoThumbnailPanel.sizeLabel.text=Size: {0} {1}
+VideoThumbnailPanel.terraBytes.text=TB
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DataSourceModulesWrapper.java b/Core/src/org/sleuthkit/autopsy/filequery/DataSourceModulesWrapper.java
new file mode 100644
index 0000000000..53cabedfb3
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/filequery/DataSourceModulesWrapper.java
@@ -0,0 +1,125 @@
+/*
+ * Autopsy
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.filequery;
+
+import org.openide.util.NbBundle.Messages;
+import org.sleuthkit.autopsy.modules.exif.ExifParserModuleFactory;
+import org.sleuthkit.autopsy.modules.filetypeid.FileTypeIdModuleFactory;
+import org.sleuthkit.autopsy.modules.hashdatabase.HashLookupModuleFactory;
+import org.sleuthkit.datamodel.IngestJobInfo;
+import org.sleuthkit.datamodel.IngestModuleInfo;
+
+/**
+ * Wrapper class to keep track of which modules were run on each data source.
+ */
+class DataSourceModulesWrapper {
+
+ private boolean hashModuleRun = false;
+ private boolean fileTypeModuleRun = false;
+ private boolean exifModuleRun = false;
+ private final String dataSourceName;
+
+ /**
+ * Create a new DataSourceModulesWrapper object
+ *
+ * @param dsName The name of the data source being kept track of.
+ */
+ DataSourceModulesWrapper(String dsName) {
+ dataSourceName = dsName;
+ }
+
+ @Messages({"# {0} - dataSourceName",
+ "DataSourceModuleWrapper.hashModule.text=Hash Lookup module was not run on data source: {0}\n",
+ "# {0} - dataSourceName",
+ "DataSourceModuleWrapper.fileTypeModule.text=File Type Identification module was not run on data source: {0}\n",
+ "# {0} - dataSourceName",
+ "DataSourceModuleWrapper.exifModule.text=Exif Parser module was not run on data source: {0}\n"
+ })
+ /**
+ * Get the message which indicates which modules were not run on this data
+ * source.
+ */
+ String getMessage() {
+ String message = "";
+ if (!hashModuleRun) {
+ message += Bundle.DataSourceModuleWrapper_hashModule_text(dataSourceName);
+ }
+ if (!fileTypeModuleRun) {
+ message += Bundle.DataSourceModuleWrapper_fileTypeModule_text(dataSourceName);
+ }
+ if (!exifModuleRun) {
+ message += Bundle.DataSourceModuleWrapper_exifModule_text(dataSourceName);
+ }
+ return message;
+ }
+
+ /**
+ * Update which modules were run for this data source based on the specified
+ * ingest job.
+ *
+ * @param jobInfo The IngestJobInfo for the job which was run on this data
+ * source.
+ */
+ void updateModulesRun(IngestJobInfo jobInfo) {
+ for (IngestModuleInfo moduleInfo : jobInfo.getIngestModuleInfo()) {
+ if (hashModuleRun && fileTypeModuleRun && exifModuleRun) {
+ return;
+ }
+ updateHashModuleStatus(moduleInfo);
+ updateFileTypeStatus(moduleInfo);
+ updateExifStatus(moduleInfo);
+ }
+ }
+
+ /**
+ * Update whether the Hash Lookup module was run for this data source.
+ *
+ * @param moduleInfo Information regarding a module which was run on this
+ * data source.
+ */
+ private void updateHashModuleStatus(IngestModuleInfo moduleInfo) {
+ if (!hashModuleRun && moduleInfo.getDisplayName().equals(HashLookupModuleFactory.getModuleName())) {
+ hashModuleRun = true;
+ }
+ }
+
+ /**
+ * Update whether the File Type ID module was run for this data source.
+ *
+ * @param moduleInfo Information regarding a module which was run on this
+ * data source.
+ */
+ private void updateFileTypeStatus(IngestModuleInfo moduleInfo) {
+ if (!fileTypeModuleRun && moduleInfo.getDisplayName().equals(FileTypeIdModuleFactory.getModuleName())) {
+ fileTypeModuleRun = true;
+ }
+ }
+
+ /**
+ * Update whether the Exif module was run for this data source.
+ *
+ * @param moduleInfo Information regarding a module which was run on this
+ * data source.
+ */
+ private void updateExifStatus(IngestModuleInfo moduleInfo) {
+ if (!exifModuleRun && moduleInfo.getDisplayName().equals(ExifParserModuleFactory.getModuleName())) {
+ exifModuleRun = true;
+ }
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEventUtils.java
similarity index 99%
rename from Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java
rename to Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEventUtils.java
index d3dad4b24f..f73cf4171e 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEvents.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryEventUtils.java
@@ -28,7 +28,7 @@ import org.sleuthkit.autopsy.filequery.FileSearchData.FileType;
/**
* Class to handle event bus and events for file discovery tool.
*/
-final class DiscoveryEvents {
+final class DiscoveryEventUtils {
private final static EventBus discoveryEventBus = new EventBus();
@@ -41,7 +41,7 @@ final class DiscoveryEvents {
return discoveryEventBus;
}
- private DiscoveryEvents() {
+ private DiscoveryEventUtils() {
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form
index c3ad04da7d..b8486b8ae6 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form
+++ b/Core/src/org/sleuthkit/autopsy/filequery/DiscoveryTopComponent.form
@@ -3,7 +3,7 @@
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java
index 0346916d1c..d751911379 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSearchPanel.java
@@ -39,6 +39,7 @@ import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDb;
import org.sleuthkit.autopsy.centralrepository.datamodel.EamDbException;
import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.filequery.FileGroup.GroupSortingAlgorithm;
import org.sleuthkit.autopsy.filequery.FileSearch.GroupingAttributeType;
import org.sleuthkit.autopsy.filequery.FileSearchData.FileType;
import org.sleuthkit.autopsy.filequery.FileSearchData.FileSize;
@@ -58,7 +59,7 @@ import org.sleuthkit.datamodel.TagName;
final class FileSearchPanel extends javax.swing.JPanel implements ActionListener {
private static final long serialVersionUID = 1L;
- private static final String[] DEFAULT_IGNORED_PATHS = {"Windows", "Program Files"};
+ private static final String[] DEFAULT_IGNORED_PATHS = {"/Windows/", "/Program Files/"}; //NON-NLS
private final static Logger logger = Logger.getLogger(FileSearchPanel.class.getName());
private FileType fileType = FileType.IMAGE;
private DefaultListModel parentListModel;
@@ -70,6 +71,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
@NbBundle.Messages({"FileSearchPanel.dialogTitle.text=Test file search"})
FileSearchPanel() {
initComponents();
+ for (GroupSortingAlgorithm groupSortAlgorithm : GroupSortingAlgorithm.values()) {
+ groupSortingComboBox.addItem(groupSortAlgorithm);
+ }
parentListModel = (DefaultListModel) parentList.getModel();
for (String ignorePath : DEFAULT_IGNORED_PATHS) {
parentListModel.add(parentListModel.size(), new ParentSearchTerm(ignorePath, false, false));
@@ -79,15 +83,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the data source filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void dataSourceFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
dataSourceCheckbox.setVisible(visible);
@@ -110,15 +114,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the file size filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void sizeFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
sizeCheckbox.setVisible(visible);
@@ -141,15 +145,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the central repository frequency filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void crFrequencyFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
crFrequencyCheckbox.setVisible(visible);
@@ -172,22 +176,23 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the objects filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void objectsFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
objectsCheckbox.setVisible(visible);
objectsScrollPane.setVisible(visible);
objectsList.setVisible(visible);
- objectsCheckbox.setEnabled(enabled);
- objectsCheckbox.setSelected(selected);
+ boolean hasObjects = objectsList.getModel().getSize() > 0;
+ objectsCheckbox.setEnabled(enabled && hasObjects);
+ objectsCheckbox.setSelected(selected && hasObjects);
if (objectsCheckbox.isEnabled() && objectsCheckbox.isSelected()) {
objectsScrollPane.setEnabled(true);
objectsList.setEnabled(true);
@@ -203,22 +208,23 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the hash set filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void hashSetFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
hashSetCheckbox.setVisible(visible);
hashSetScrollPane.setVisible(visible);
hashSetList.setVisible(visible);
- hashSetCheckbox.setEnabled(enabled);
- hashSetCheckbox.setSelected(selected);
+ boolean hasHashSets = hashSetList.getModel().getSize() > 0;
+ hashSetCheckbox.setEnabled(enabled && hasHashSets);
+ hashSetCheckbox.setSelected(selected && hasHashSets);
if (hashSetCheckbox.isEnabled() && hashSetCheckbox.isSelected()) {
hashSetScrollPane.setEnabled(true);
hashSetList.setEnabled(true);
@@ -234,22 +240,23 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the interesting items filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void interestingItemsFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
interestingItemsCheckbox.setVisible(visible);
interestingItemsScrollPane.setVisible(visible);
interestingItemsList.setVisible(visible);
- interestingItemsCheckbox.setEnabled(enabled);
- interestingItemsCheckbox.setSelected(selected);
+ boolean hasInterestingItems = interestingItemsList.getModel().getSize() > 0;
+ interestingItemsCheckbox.setEnabled(enabled && hasInterestingItems);
+ interestingItemsCheckbox.setSelected(selected && hasInterestingItems);
if (interestingItemsCheckbox.isEnabled() && interestingItemsCheckbox.isSelected()) {
interestingItemsScrollPane.setEnabled(true);
interestingItemsList.setEnabled(true);
@@ -265,15 +272,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the score filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void scoreFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
scoreCheckbox.setVisible(visible);
@@ -296,15 +303,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
/**
* Setup the parent path filter settings.
*
- * @param visible Boolean indicating if the filter should be
- * visible.
- * @param enabled Boolean indicating if the filter should be
- * enabled.
- * @param selected Boolean indicating if the filter should be
- * selected.
+ * @param visible Boolean indicating if the filter should be
+ * visible.
+ * @param enabled Boolean indicating if the filter should be
+ * enabled.
+ * @param selected Boolean indicating if the filter should be
+ * selected.
* @param indicesSelected Array of integers indicating which list items are
- * selected, null to indicate leaving selected items
- * unchanged.
+ * selected, null to indicate leaving selected items
+ * unchanged.
*/
private void parentFilterSettings(boolean visible, boolean enabled, boolean selected, int[] indicesSelected) {
parentCheckbox.setVisible(visible);
@@ -321,6 +328,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
addButton.setEnabled(true);
deleteButton.setEnabled(!parentListModel.isEmpty());
parentList.setEnabled(true);
+ parentTextField.setEnabled(true);
if (indicesSelected != null) {
parentList.setSelectedIndices(indicesSelected);
}
@@ -333,7 +341,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
substringRadioButton.setEnabled(false);
addButton.setEnabled(false);
deleteButton.setEnabled(false);
-
+ parentTextField.setEnabled(false);
}
}
@@ -450,7 +458,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
*/
private void imagesSelected(boolean enabled, boolean resetSelected) {
dataSourceFilterSettings(true, enabled, !resetSelected && dataSourceCheckbox.isSelected(), null);
- int[] selectedSizeIndices = {1, 2, 3, 4, 5, 6};
+ int[] selectedSizeIndices = {1, 2, 3, 4, 5};
sizeFilterSettings(true, enabled, resetSelected || sizeCheckbox.isSelected(), resetSelected == true ? selectedSizeIndices : null);
int[] selectedFrequencyIndices;
if (!EamDb.isEnabled()) {
@@ -463,7 +471,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
objectsFilterSettings(true, enabled, !resetSelected && objectsCheckbox.isSelected(), null);
hashSetFilterSettings(true, enabled, !resetSelected && hashSetCheckbox.isSelected(), null);
interestingItemsFilterSettings(true, enabled, !resetSelected && interestingItemsCheckbox.isSelected(), null);
- parentFilterSettings(true, true, false, null);
+ parentFilterSettings(true, enabled, !resetSelected && parentCheckbox.isSelected(), null);
scoreFilterSettings(false, false, false, null);
tagsFilterSettings(false, false, false, null);
keywordFilterSettings(false, false, false, null);
@@ -495,7 +503,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
objectsFilterSettings(true, enabled, !resetSelected && objectsCheckbox.isSelected(), null);
hashSetFilterSettings(true, enabled, !resetSelected && hashSetCheckbox.isSelected(), null);
interestingItemsFilterSettings(true, enabled, !resetSelected && interestingItemsCheckbox.isSelected(), null);
- parentFilterSettings(true, true, false, null);
+ parentFilterSettings(true, enabled, !resetSelected && parentCheckbox.isSelected(), null);
scoreFilterSettings(false, false, false, null);
tagsFilterSettings(false, false, false, null);
keywordFilterSettings(false, false, false, null);
@@ -519,10 +527,10 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
validateFields();
}
- FileType getSelectedType(){
+ FileType getSelectedType() {
return fileType;
}
-
+
/**
* Reset the panel to its initial configuration.
*/
@@ -545,10 +553,14 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
groupByCombobox.removeAllItems();
// Set up the grouping attributes
for (FileSearch.GroupingAttributeType type : FileSearch.GroupingAttributeType.getOptionsForGrouping()) {
- if (type != GroupingAttributeType.FREQUENCY || EamDb.isEnabled()) {
+ if ((type != GroupingAttributeType.FREQUENCY || EamDb.isEnabled())
+ && (type != GroupingAttributeType.OBJECT_DETECTED || objectsList.getModel().getSize() > 0)
+ && (type != GroupingAttributeType.INTERESTING_ITEM_SET || interestingItemsList.getModel().getSize() > 0)
+ && (type != GroupingAttributeType.HASH_LIST_NAME || hashSetList.getModel().getSize() > 0)) {
groupByCombobox.addItem(type);
}
}
+
orderByCombobox.removeAllItems();
// Set up the file order list
for (FileSorter.SortingMethod method : FileSorter.SortingMethod.getOptionsForOrdering()) {
@@ -556,6 +568,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
orderByCombobox.addItem(method);
}
}
+
+ groupSortingComboBox.setSelectedIndex(0);
setSelectedType(FileType.IMAGE);
validateFields();
}
@@ -613,7 +627,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
for (FileSearchData.Frequency freq : FileSearchData.Frequency.getOptionsForFilteringWithoutCr()) {
frequencyListModel.add(count, freq);
}
-
} else {
for (FileSearchData.Frequency freq : FileSearchData.Frequency.getOptionsForFilteringWithCr()) {
frequencyListModel.add(count, freq);
@@ -921,8 +934,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
* @return the grouping attribute
*/
FileSearch.AttributeType getGroupingAttribute() {
- FileSearch.GroupingAttributeType groupingAttrType = (FileSearch.GroupingAttributeType) groupByCombobox.getSelectedItem();
- return groupingAttrType.getAttributeType();
+ return groupByCombobox.getItemAt(groupByCombobox.getSelectedIndex()).getAttributeType();
}
/**
@@ -931,10 +943,8 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
* @return the selected sorting method
*/
FileGroup.GroupSortingAlgorithm getGroupSortingMethod() {
- if (attributeRadioButton.isSelected()) {
- return FileGroup.GroupSortingAlgorithm.BY_GROUP_KEY;
- }
- return FileGroup.GroupSortingAlgorithm.BY_GROUP_SIZE;
+ return groupSortingComboBox.getItemAt(groupSortingComboBox.getSelectedIndex());
+
}
/**
@@ -1064,10 +1074,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
java.awt.GridBagConstraints gridBagConstraints;
javax.swing.ButtonGroup parentPathButtonGroup = new javax.swing.ButtonGroup();
- orderGroupsByButtonGroup = new javax.swing.ButtonGroup();
javax.swing.ButtonGroup parentIncludeButtonGroup = new javax.swing.ButtonGroup();
- filtersScrollPane = new javax.swing.JScrollPane();
- filtersPanel = new javax.swing.JPanel();
+ javax.swing.JScrollPane filtersScrollPane = new javax.swing.JScrollPane();
+ javax.swing.JPanel filtersPanel = new javax.swing.JPanel();
sizeCheckbox = new javax.swing.JCheckBox();
dataSourceCheckbox = new javax.swing.JCheckBox();
crFrequencyCheckbox = new javax.swing.JCheckBox();
@@ -1075,9 +1084,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
parentCheckbox = new javax.swing.JCheckBox();
dataSourceScrollPane = new javax.swing.JScrollPane();
dataSourceList = new javax.swing.JList<>();
- fullRadioButton = new javax.swing.JRadioButton();
substringRadioButton = new javax.swing.JRadioButton();
- parentTextField = new javax.swing.JTextField();
addButton = new javax.swing.JButton();
deleteButton = new javax.swing.JButton();
sizeScrollPane = new javax.swing.JScrollPane();
@@ -1086,7 +1093,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
crFrequencyList = new javax.swing.JList<>();
keywordScrollPane = new javax.swing.JScrollPane();
keywordList = new javax.swing.JList<>();
- parentLabel = new javax.swing.JLabel();
+ javax.swing.JLabel parentLabel = new javax.swing.JLabel();
parentScrollPane = new javax.swing.JScrollPane();
parentList = new javax.swing.JList<>();
hashSetCheckbox = new javax.swing.JCheckBox();
@@ -1106,27 +1113,36 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
interestingItemsList = new javax.swing.JList<>();
scoreScrollPane = new javax.swing.JScrollPane();
scoreList = new javax.swing.JList<>();
- includeRadioButton = new javax.swing.JRadioButton();
excludeRadioButton = new javax.swing.JRadioButton();
knownFilesCheckbox = new javax.swing.JCheckBox();
+ javax.swing.JPanel fullRadioPanel = new javax.swing.JPanel();
+ fullRadioButton = new javax.swing.JRadioButton();
+ javax.swing.JPanel includeRadioPanel = new javax.swing.JPanel();
+ javax.swing.Box.Filler filler2 = new javax.swing.Box.Filler(new java.awt.Dimension(0, 0), new java.awt.Dimension(0, 0), new java.awt.Dimension(32767, 32767));
+ includeRadioButton = new javax.swing.JRadioButton();
+ javax.swing.JPanel parentTextPanel = new javax.swing.JPanel();
+ parentTextField = new javax.swing.JTextField();
searchButton = new javax.swing.JButton();
- sortingPanel = new javax.swing.JPanel();
+ javax.swing.JPanel sortingPanel = new javax.swing.JPanel();
groupByCombobox = new javax.swing.JComboBox<>();
orderByCombobox = new javax.swing.JComboBox<>();
- orderGroupsByLabel = new javax.swing.JLabel();
- attributeRadioButton = new javax.swing.JRadioButton();
- groupSizeRadioButton = new javax.swing.JRadioButton();
- orderByLabel = new javax.swing.JLabel();
- groupByLabel = new javax.swing.JLabel();
+ javax.swing.JLabel orderGroupsByLabel = new javax.swing.JLabel();
+ javax.swing.JLabel orderByLabel = new javax.swing.JLabel();
+ javax.swing.JLabel groupByLabel = new javax.swing.JLabel();
+ groupSortingComboBox = new javax.swing.JComboBox<>();
errorLabel = new javax.swing.JLabel();
cancelButton = new javax.swing.JButton();
+ javax.swing.JLabel stepTwoLabel = new javax.swing.JLabel();
+ javax.swing.JLabel stepThreeLabel = new javax.swing.JLabel();
- setMinimumSize(new java.awt.Dimension(424, 0));
- setPreferredSize(new java.awt.Dimension(424, 533));
+ setMinimumSize(new java.awt.Dimension(10, 0));
+ setPreferredSize(new java.awt.Dimension(321, 400));
filtersScrollPane.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.filtersScrollPane.border.title"))); // NOI18N
- filtersScrollPane.setPreferredSize(new java.awt.Dimension(416, 338));
+ filtersScrollPane.setPreferredSize(new java.awt.Dimension(309, 400));
+ filtersPanel.setMinimumSize(new java.awt.Dimension(280, 500));
+ filtersPanel.setPreferredSize(new java.awt.Dimension(280, 540));
filtersPanel.setLayout(new java.awt.GridBagLayout());
org.openide.awt.Mnemonics.setLocalizedText(sizeCheckbox, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.sizeCheckbox.text")); // NOI18N
@@ -1210,17 +1226,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(dataSourceScrollPane, gridBagConstraints);
- parentPathButtonGroup.add(fullRadioButton);
- fullRadioButton.setSelected(true);
- org.openide.awt.Mnemonics.setLocalizedText(fullRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.fullRadioButton.text")); // NOI18N
- fullRadioButton.setEnabled(false);
- gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 9;
- gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
- filtersPanel.add(fullRadioButton, gridBagConstraints);
-
parentPathButtonGroup.add(substringRadioButton);
org.openide.awt.Mnemonics.setLocalizedText(substringRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.substringRadioButton.text")); // NOI18N
substringRadioButton.setEnabled(false);
@@ -1228,21 +1233,10 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 9;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.weightx = 0.5;
+ gridBagConstraints.weightx = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
filtersPanel.add(substringRadioButton, gridBagConstraints);
- parentTextField.setEnabled(false);
- gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 11;
- gridBagConstraints.gridwidth = 2;
- gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
- gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.weightx = 0.5;
- gridBagConstraints.insets = new java.awt.Insets(0, 4, 6, 0);
- filtersPanel.add(parentTextField, gridBagConstraints);
-
org.openide.awt.Mnemonics.setLocalizedText(addButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.addButton.text")); // NOI18N
addButton.setEnabled(false);
addButton.setMaximumSize(new java.awt.Dimension(70, 23));
@@ -1289,12 +1283,13 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
+ gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(6, 4, 4, 6);
filtersPanel.add(sizeScrollPane, gridBagConstraints);
crFrequencyList.setModel(new DefaultListModel());
crFrequencyList.setEnabled(false);
- crFrequencyList.setVisibleRowCount(3);
+ crFrequencyList.setVisibleRowCount(5);
crFrequencyScrollPane.setViewportView(crFrequencyList);
gridBagConstraints = new java.awt.GridBagConstraints();
@@ -1304,6 +1299,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
+ gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(crFrequencyScrollPane, gridBagConstraints);
@@ -1319,7 +1315,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(keywordScrollPane, gridBagConstraints);
@@ -1328,13 +1323,15 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 4, 0);
filtersPanel.add(parentLabel, gridBagConstraints);
parentList.setModel(new DefaultListModel());
parentList.setEnabled(false);
- parentList.setVisibleRowCount(3);
+ parentList.setMaximumSize(null);
+ parentList.setMinimumSize(new java.awt.Dimension(0, 30));
+ parentList.setPreferredSize(new java.awt.Dimension(0, 30));
+ parentList.setVisibleRowCount(4);
parentList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
public void valueChanged(javax.swing.event.ListSelectionEvent evt) {
parentListValueChanged(evt);
@@ -1350,7 +1347,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
+ gridBagConstraints.weighty = 0.05;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(parentScrollPane, gridBagConstraints);
@@ -1362,24 +1359,26 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 5;
+ gridBagConstraints.gridy = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 4, 0);
filtersPanel.add(hashSetCheckbox, gridBagConstraints);
hashSetList.setModel(new DefaultListModel());
hashSetList.setEnabled(false);
+ hashSetList.setMinimumSize(new java.awt.Dimension(0, 30));
+ hashSetList.setPreferredSize(new java.awt.Dimension(0, 30));
hashSetList.setVisibleRowCount(3);
hashSetScrollPane.setViewportView(hashSetList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 5;
+ gridBagConstraints.gridy = 4;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
+ gridBagConstraints.weighty = 0.05;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(hashSetScrollPane, gridBagConstraints);
@@ -1391,7 +1390,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 4;
+ gridBagConstraints.gridy = 6;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 4, 0);
filtersPanel.add(objectsCheckbox, gridBagConstraints);
@@ -1417,7 +1416,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 6;
+ gridBagConstraints.gridy = 5;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.insets = new java.awt.Insets(0, 6, 4, 0);
filtersPanel.add(interestingItemsCheckbox, gridBagConstraints);
@@ -1455,17 +1454,19 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
objectsList.setModel(new DefaultListModel());
objectsList.setEnabled(false);
- objectsList.setVisibleRowCount(3);
+ objectsList.setMinimumSize(new java.awt.Dimension(0, 30));
+ objectsList.setPreferredSize(new java.awt.Dimension(0, 30));
+ objectsList.setVisibleRowCount(2);
objectsScrollPane.setViewportView(objectsList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 4;
+ gridBagConstraints.gridy = 6;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
+ gridBagConstraints.weighty = 0.05;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(objectsScrollPane, gridBagConstraints);
@@ -1481,23 +1482,24 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(tagsScrollPane, gridBagConstraints);
interestingItemsList.setModel(new DefaultListModel());
interestingItemsList.setEnabled(false);
- interestingItemsList.setVisibleRowCount(3);
+ interestingItemsList.setMinimumSize(new java.awt.Dimension(0, 30));
+ interestingItemsList.setPreferredSize(new java.awt.Dimension(0, 30));
+ interestingItemsList.setVisibleRowCount(2);
interestingItemsScrollPane.setViewportView(interestingItemsList);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 6;
+ gridBagConstraints.gridy = 5;
gridBagConstraints.gridwidth = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
gridBagConstraints.weightx = 0.5;
- gridBagConstraints.weighty = 0.1;
+ gridBagConstraints.weighty = 0.05;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(interestingItemsScrollPane, gridBagConstraints);
@@ -1516,17 +1518,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 6);
filtersPanel.add(scoreScrollPane, gridBagConstraints);
- parentIncludeButtonGroup.add(includeRadioButton);
- includeRadioButton.setSelected(true);
- org.openide.awt.Mnemonics.setLocalizedText(includeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.includeRadioButton.text")); // NOI18N
- includeRadioButton.setEnabled(false);
- gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 10;
- gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
- filtersPanel.add(includeRadioButton, gridBagConstraints);
-
parentIncludeButtonGroup.add(excludeRadioButton);
org.openide.awt.Mnemonics.setLocalizedText(excludeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.excludeRadioButton.text")); // NOI18N
excludeRadioButton.setEnabled(false);
@@ -1534,7 +1525,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 10;
gridBagConstraints.anchor = java.awt.GridBagConstraints.FIRST_LINE_START;
- gridBagConstraints.weightx = 0.5;
+ gridBagConstraints.weightx = 0.1;
gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
filtersPanel.add(excludeRadioButton, gridBagConstraints);
@@ -1548,6 +1539,87 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
gridBagConstraints.insets = new java.awt.Insets(0, 6, 4, 6);
filtersPanel.add(knownFilesCheckbox, gridBagConstraints);
+ parentPathButtonGroup.add(fullRadioButton);
+ fullRadioButton.setSelected(true);
+ org.openide.awt.Mnemonics.setLocalizedText(fullRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.fullRadioButton.text")); // NOI18N
+ fullRadioButton.setEnabled(false);
+
+ javax.swing.GroupLayout fullRadioPanelLayout = new javax.swing.GroupLayout(fullRadioPanel);
+ fullRadioPanel.setLayout(fullRadioPanelLayout);
+ fullRadioPanelLayout.setHorizontalGroup(
+ fullRadioPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, fullRadioPanelLayout.createSequentialGroup()
+ .addContainerGap(58, Short.MAX_VALUE)
+ .addComponent(fullRadioButton)
+ .addGap(20, 20, 20))
+ );
+ fullRadioPanelLayout.setVerticalGroup(
+ fullRadioPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(fullRadioPanelLayout.createSequentialGroup()
+ .addComponent(fullRadioButton)
+ .addGap(0, 4, Short.MAX_VALUE))
+ );
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 9;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ gridBagConstraints.weightx = 1.0;
+ filtersPanel.add(fullRadioPanel, gridBagConstraints);
+
+ parentIncludeButtonGroup.add(includeRadioButton);
+ includeRadioButton.setSelected(true);
+ org.openide.awt.Mnemonics.setLocalizedText(includeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.includeRadioButton.text")); // NOI18N
+ includeRadioButton.setEnabled(false);
+
+ javax.swing.GroupLayout includeRadioPanelLayout = new javax.swing.GroupLayout(includeRadioPanel);
+ includeRadioPanel.setLayout(includeRadioPanelLayout);
+ includeRadioPanelLayout.setHorizontalGroup(
+ includeRadioPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(includeRadioPanelLayout.createSequentialGroup()
+ .addComponent(filler2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 58, Short.MAX_VALUE)
+ .addComponent(includeRadioButton))
+ );
+ includeRadioPanelLayout.setVerticalGroup(
+ includeRadioPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(filler2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(includeRadioButton)
+ );
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 10;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ gridBagConstraints.weightx = 1.0;
+ filtersPanel.add(includeRadioPanel, gridBagConstraints);
+
+ parentTextField.setEnabled(false);
+
+ javax.swing.GroupLayout parentTextPanelLayout = new javax.swing.GroupLayout(parentTextPanel);
+ parentTextPanel.setLayout(parentTextPanelLayout);
+ parentTextPanelLayout.setHorizontalGroup(
+ parentTextPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, parentTextPanelLayout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addComponent(parentTextField, javax.swing.GroupLayout.DEFAULT_SIZE, 71, Short.MAX_VALUE))
+ );
+ parentTextPanelLayout.setVerticalGroup(
+ parentTextPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(parentTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ );
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 11;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.weightx = 1.5;
+ gridBagConstraints.insets = new java.awt.Insets(0, 4, 4, 0);
+ filtersPanel.add(parentTextPanel, gridBagConstraints);
+
filtersScrollPane.setViewportView(filtersPanel);
org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.searchButton.text")); // NOI18N
@@ -1558,16 +1630,10 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
});
sortingPanel.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.sortingPanel.border.title"))); // NOI18N
+ sortingPanel.setPreferredSize(new java.awt.Dimension(345, 112));
org.openide.awt.Mnemonics.setLocalizedText(orderGroupsByLabel, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.orderGroupsByLabel.text")); // NOI18N
- orderGroupsByButtonGroup.add(attributeRadioButton);
- attributeRadioButton.setSelected(true);
- org.openide.awt.Mnemonics.setLocalizedText(attributeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.attributeRadioButton.text")); // NOI18N
-
- orderGroupsByButtonGroup.add(groupSizeRadioButton);
- org.openide.awt.Mnemonics.setLocalizedText(groupSizeRadioButton, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.groupSizeRadioButton.text")); // NOI18N
-
org.openide.awt.Mnemonics.setLocalizedText(orderByLabel, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.orderByLabel.text")); // NOI18N
org.openide.awt.Mnemonics.setLocalizedText(groupByLabel, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.groupByLabel.text")); // NOI18N
@@ -1577,50 +1643,35 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
sortingPanelLayout.setHorizontalGroup(
sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(sortingPanelLayout.createSequentialGroup()
+ .addContainerGap()
.addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
+ .addComponent(orderGroupsByLabel)
.addGroup(sortingPanelLayout.createSequentialGroup()
.addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addGap(47, 47, 47)
- .addComponent(attributeRadioButton))
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(orderByLabel))
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addContainerGap()
- .addComponent(groupByLabel)))
+ .addComponent(groupByLabel)
+ .addComponent(orderByLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(groupByCombobox, 0, 280, Short.MAX_VALUE)
- .addComponent(orderByCombobox, 0, 1, Short.MAX_VALUE)))
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addGap(27, 27, 27)
- .addComponent(orderGroupsByLabel))
- .addGroup(sortingPanelLayout.createSequentialGroup()
- .addGap(47, 47, 47)
- .addComponent(groupSizeRadioButton)))
- .addGap(0, 0, Short.MAX_VALUE)))
+ .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addComponent(groupSortingComboBox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(orderByCombobox, javax.swing.GroupLayout.Alignment.LEADING, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(groupByCombobox, 0, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))))
.addContainerGap())
);
sortingPanelLayout.setVerticalGroup(
sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(sortingPanelLayout.createSequentialGroup()
- .addGap(8, 8, 8)
- .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(orderByCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(orderByLabel))
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
+ .addGap(6, 6, 6)
.addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(groupByCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(groupByLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(orderGroupsByLabel)
+ .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(groupSortingComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(orderGroupsByLabel))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(attributeRadioButton)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(groupSizeRadioButton)
+ .addGroup(sortingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
+ .addComponent(orderByCombobox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(orderByLabel))
.addContainerGap())
);
@@ -1634,26 +1685,32 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
}
});
+ org.openide.awt.Mnemonics.setLocalizedText(stepTwoLabel, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.stepTwoLabel.text")); // NOI18N
+
+ org.openide.awt.Mnemonics.setLocalizedText(stepThreeLabel, org.openide.util.NbBundle.getMessage(FileSearchPanel.class, "FileSearchPanel.stepThreeLabel.text")); // NOI18N
+
javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
this.setLayout(layout);
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(layout.createSequentialGroup()
+ .addGap(6, 6, 6)
.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, 268, Short.MAX_VALUE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(cancelButton)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(searchButton))
- .addGroup(layout.createSequentialGroup()
- .addGap(6, 6, 6)
- .addComponent(filtersScrollPane, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE))
- .addGroup(layout.createSequentialGroup()
- .addGap(6, 6, 6)
- .addComponent(sortingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
- .addGap(6, 6, 6))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addComponent(stepTwoLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addContainerGap())
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
+ .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
+ .addGroup(javax.swing.GroupLayout.Alignment.LEADING, layout.createSequentialGroup()
+ .addComponent(errorLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(cancelButton)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(searchButton))
+ .addComponent(stepThreeLabel, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(filtersScrollPane, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
+ .addComponent(sortingPanel, javax.swing.GroupLayout.DEFAULT_SIZE, 309, Short.MAX_VALUE))
+ .addGap(6, 6, 6))))
);
layout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {cancelButton, searchButton});
@@ -1662,7 +1719,11 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addGap(6, 6, 6)
- .addComponent(filtersScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 326, Short.MAX_VALUE)
+ .addComponent(stepTwoLabel)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(filtersScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 201, Short.MAX_VALUE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(stepThreeLabel)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(sortingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
@@ -1679,7 +1740,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
// Get the selected filters
List filters = getFilters();
enableSearch(false);
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchStartedEvent(fileType));
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchStartedEvent(fileType));
// Get the grouping attribute and group sorting method
FileSearch.AttributeType groupingAttr = getGroupingAttribute();
@@ -1722,8 +1783,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
cancelButton.setEnabled(!enabled);
orderByCombobox.setEnabled(enabled);
groupByCombobox.setEnabled(enabled);
- attributeRadioButton.setEnabled(enabled);
- groupSizeRadioButton.setEnabled(enabled);
+ groupSortingComboBox.setEnabled(enabled);
}
/**
@@ -1732,7 +1792,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
* @param searchCancelledEvent The SearchCancelledEvent which was received.
*/
@Subscribe
- void handleSearchCancelledEvent(DiscoveryEvents.SearchCancelledEvent searchCancelledEvent) {
+ void handleSearchCancelledEvent(DiscoveryEventUtils.SearchCancelledEvent searchCancelledEvent) {
SwingUtilities.invokeLater(() -> {
enableSearch(true);
});
@@ -1744,7 +1804,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
* @param searchCompleteEvent The SearchCompleteEvent which was received.
*/
@Subscribe
- void handleSearchCompleteEvent(DiscoveryEvents.SearchCompleteEvent searchCompleteEvent) {
+ void handleSearchCompleteEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompleteEvent) {
SwingUtilities.invokeLater(() -> {
enableSearch(true);
});
@@ -1832,7 +1892,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JButton addButton;
- private javax.swing.JRadioButton attributeRadioButton;
private javax.swing.JButton cancelButton;
private javax.swing.JCheckBox crFrequencyCheckbox;
private javax.swing.JList crFrequencyList;
@@ -1844,12 +1903,9 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
private javax.swing.JLabel errorLabel;
private javax.swing.JRadioButton excludeRadioButton;
private javax.swing.JCheckBox exifCheckbox;
- private javax.swing.JPanel filtersPanel;
- private javax.swing.JScrollPane filtersScrollPane;
private javax.swing.JRadioButton fullRadioButton;
private javax.swing.JComboBox groupByCombobox;
- private javax.swing.JLabel groupByLabel;
- private javax.swing.JRadioButton groupSizeRadioButton;
+ private javax.swing.JComboBox groupSortingComboBox;
private javax.swing.JCheckBox hashSetCheckbox;
private javax.swing.JList hashSetList;
private javax.swing.JScrollPane hashSetScrollPane;
@@ -1866,11 +1922,7 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
private javax.swing.JList objectsList;
private javax.swing.JScrollPane objectsScrollPane;
private javax.swing.JComboBox orderByCombobox;
- private javax.swing.JLabel orderByLabel;
- private javax.swing.ButtonGroup orderGroupsByButtonGroup;
- private javax.swing.JLabel orderGroupsByLabel;
private javax.swing.JCheckBox parentCheckbox;
- private javax.swing.JLabel parentLabel;
private javax.swing.JList parentList;
private javax.swing.JScrollPane parentScrollPane;
private javax.swing.JTextField parentTextField;
@@ -1881,7 +1933,6 @@ final class FileSearchPanel extends javax.swing.JPanel implements ActionListener
private javax.swing.JCheckBox sizeCheckbox;
private javax.swing.JList sizeList;
private javax.swing.JScrollPane sizeScrollPane;
- private javax.swing.JPanel sortingPanel;
private javax.swing.JRadioButton substringRadioButton;
private javax.swing.JCheckBox tagsCheckbox;
private javax.swing.JList tagsList;
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/FileSorter.java b/Core/src/org/sleuthkit/autopsy/filequery/FileSorter.java
index 604daf2067..6d73c20b01 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/FileSorter.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/FileSorter.java
@@ -240,13 +240,13 @@ class FileSorter implements Comparator {
* Enum for selecting the primary method for sorting result files.
*/
@NbBundle.Messages({
- "FileSorter.SortingMethod.datasource.displayName=By data source",
- "FileSorter.SortingMethod.filename.displayName=By file name",
- "FileSorter.SortingMethod.filesize.displayName=By file size",
- "FileSorter.SortingMethod.filetype.displayName=By file type",
- "FileSorter.SortingMethod.frequency.displayName=By central repo frequency",
- "FileSorter.SortingMethod.keywordlist.displayName=By keyword list names",
- "FileSorter.SortingMethod.fullPath.displayName=By full path"})
+ "FileSorter.SortingMethod.datasource.displayName=Data Source",
+ "FileSorter.SortingMethod.filename.displayName=File Name",
+ "FileSorter.SortingMethod.filesize.displayName=File Size",
+ "FileSorter.SortingMethod.filetype.displayName=File Type",
+ "FileSorter.SortingMethod.frequency.displayName=Central Repo Frequency",
+ "FileSorter.SortingMethod.keywordlist.displayName=Keyword List Names",
+ "FileSorter.SortingMethod.fullPath.displayName=Full Path"})
enum SortingMethod {
BY_FILE_NAME(new ArrayList<>(),
Bundle.FileSorter_SortingMethod_filename_displayName()), // Sort alphabetically by file name
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form
index e774a0fac7..9df241e5ab 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.form
@@ -34,6 +34,8 @@
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java
index bcdb3d661f..374c079590 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/GroupListPanel.java
@@ -24,6 +24,8 @@ import java.util.Map;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
+import javax.swing.JOptionPane;
+import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.filequery.FileSearch.GroupKey;
import org.sleuthkit.autopsy.filequery.FileSearchData.FileType;
@@ -54,19 +56,21 @@ class GroupListPanel extends javax.swing.JPanel {
* @param searchStartedEvent the SearchStartedEvent which was received
*/
@Subscribe
- void handleSearchStartedEvent(DiscoveryEvents.SearchStartedEvent searchStartedEvent) {
+ void handleSearchStartedEvent(DiscoveryEventUtils.SearchStartedEvent searchStartedEvent) {
resultType = searchStartedEvent.getType();
groupKeyList.setListData(new GroupKey[0]);
}
+ @Messages({"GroupsListPanel.noResults.message.text=No results were found for the selected filters.",
+ "GroupsListPanel.noResults.title.text=No results found"})
/**
* Subscribe to and update list of groups in response to
* SearchCompleteEvents
*
- * @param searchCompleteEvent the SearchCompleteEvent which was recieved
+ * @param searchCompleteEvent the SearchCompleteEvent which was received
*/
@Subscribe
- void handleSearchCompleteEvent(DiscoveryEvents.SearchCompleteEvent searchCompleteEvent) {
+ void handleSearchCompleteEvent(DiscoveryEventUtils.SearchCompleteEvent searchCompleteEvent) {
groupMap = searchCompleteEvent.getGroupMap();
searchfilters = searchCompleteEvent.getFilters();
groupingAttribute = searchCompleteEvent.getGroupingAttr();
@@ -75,6 +79,11 @@ class GroupListPanel extends javax.swing.JPanel {
groupKeyList.setListData(groupMap.keySet().toArray(new GroupKey[groupMap.keySet().size()]));
if (groupKeyList.getModel().getSize() > 0) {
groupKeyList.setSelectedIndex(0);
+ } else {
+ JOptionPane.showMessageDialog(DiscoveryTopComponent.getTopComponent(),
+ Bundle.GroupsListPanel_noResults_message_text(),
+ Bundle.GroupsListPanel_noResults_title_text(),
+ JOptionPane.INFORMATION_MESSAGE);
}
}
@@ -87,7 +96,7 @@ class GroupListPanel extends javax.swing.JPanel {
// //GEN-BEGIN:initComponents
private void initComponents() {
- groupListScrollPane = new javax.swing.JScrollPane();
+ javax.swing.JScrollPane groupListScrollPane = new javax.swing.JScrollPane();
groupKeyList = new javax.swing.JList<>();
groupKeyList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(GroupListPanel.class, "GroupListPanel.groupKeyList.border.title"))); // NOI18N
@@ -136,20 +145,19 @@ class GroupListPanel extends javax.swing.JPanel {
for (GroupKey groupKey : groupMap.keySet()) {
if (selectedGroup.equals(groupKey)) {
selectedGroupKey = groupKey;
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.GroupSelectedEvent(
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.GroupSelectedEvent(
searchfilters, groupingAttribute, groupSort, fileSortMethod, selectedGroupKey, groupMap.get(selectedGroupKey), resultType));
break;
}
}
} else {
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.NoResultsEvent());
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.NoResultsEvent());
}
}
}//GEN-LAST:event_groupSelected
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JList groupKeyList;
- private javax.swing.JScrollPane groupListScrollPane;
// End of variables declaration//GEN-END:variables
/**
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java
index 2c4a1f4e9b..a1d04c9621 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailPanel.java
@@ -37,6 +37,7 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR
private static final long serialVersionUID = 1L;
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
+ private static final int BYTE_UNIT_CONVERSION = 1000;
private static final int ICON_SIZE = 16;
private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png";
private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png";
@@ -136,14 +137,13 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR
private javax.swing.JLabel thumbnailLabel;
// End of variables declaration//GEN-END:variables
- @NbBundle.Messages({"# {0} - fileSize",
- "ImageThumbnailPanel.sizeLabel.text=Size: {0} bytes",
+ @NbBundle.Messages({
"# {0} - numberOfInstances",
"ImageThumbnailPanel.countLabel.text=Number of Instances: {0}",
"ImageThumbnailPanel.isDeleted.text=All instances of file are deleted."})
@Override
public Component getListCellRendererComponent(JList extends ImageThumbnailWrapper> list, ImageThumbnailWrapper value, int index, boolean isSelected, boolean cellHasFocus) {
- fileSizeLabel.setText(Bundle.ImageThumbnailPanel_sizeLabel_text(value.getResultFile().getFirstInstance().getSize()));
+ fileSizeLabel.setText(getFileSizeString(value.getResultFile().getFirstInstance().getSize()));
countLabel.setText(Bundle.ImageThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size()));
thumbnailLabel.setIcon(new ImageIcon(value.getThumbnail()));
if (value.getResultFile().isDeleted()) {
@@ -160,7 +160,7 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR
case INTERESTING_SCORE:
scoreLabel.setIcon(INTERESTING_SCORE_ICON);
break;
- case NO_SCORE:
+ case NO_SCORE: // empty case - this is interpreted as an intentional fall-through
default:
scoreLabel.setIcon(null);
break;
@@ -171,6 +171,50 @@ public class ImageThumbnailPanel extends javax.swing.JPanel implements ListCellR
return this;
}
+ @NbBundle.Messages({"# {0} - fileSize",
+ "# {1} - units",
+ "ImageThumbnailPanel.sizeLabel.text=Size: {0} {1}",
+ "ImageThumbnailPanel.bytes.text=bytes",
+ "ImageThumbnailPanel.kiloBytes.text=KB",
+ "ImageThumbnailPanel.megaBytes.text=MB",
+ "ImageThumbnailPanel.gigaBytes.text=GB",
+ "ImageThumbnailPanel.terraBytes.text=TB"})
+ /**
+ * Convert a size in bytes to a string with representing the size in the
+ * largest units which represent the value as being greater than or equal to
+ * one. Result will be rounded down to the nearest whole number of those
+ * units.
+ *
+ * @param bytes Size in bytes.
+ */
+ private String getFileSizeString(long bytes) {
+ long size = bytes;
+ int unitsSwitchValue = 0;
+ while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) {
+ size /= BYTE_UNIT_CONVERSION;
+ unitsSwitchValue++;
+ }
+ String units;
+ switch (unitsSwitchValue) {
+ case 1:
+ units = Bundle.ImageThumbnailPanel_kiloBytes_text();
+ break;
+ case 2:
+ units = Bundle.ImageThumbnailPanel_megaBytes_text();
+ break;
+ case 3:
+ units = Bundle.ImageThumbnailPanel_gigaBytes_text();
+ break;
+ case 4:
+ units = Bundle.ImageThumbnailPanel_terraBytes_text();
+ break;
+ default:
+ units = Bundle.ImageThumbnailPanel_bytes_text();
+ break;
+ }
+ return Bundle.ImageThumbnailPanel_sizeLabel_text(size, units);
+ }
+
@Override
public String getToolTipText(MouseEvent event) {
if (event != null) {
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.form b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.form
index 4b96bac8ae..4d065c3bf9 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.form
+++ b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.form
@@ -18,8 +18,6 @@
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.java
index 542a7480a8..e2688359c9 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/ImageThumbnailViewer.java
@@ -51,7 +51,7 @@ public class ImageThumbnailViewer extends javax.swing.JPanel {
// //GEN-BEGIN:initComponents
private void initComponents() {
- javax.swing.JScrollPane thumbnailListScrollPane = new javax.swing.JScrollPane();
+ thumbnailListScrollPane = new javax.swing.JScrollPane();
thumbnailList = new javax.swing.JList<>();
setLayout(new java.awt.BorderLayout());
@@ -69,6 +69,7 @@ public class ImageThumbnailViewer extends javax.swing.JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JList thumbnailList;
+ private javax.swing.JScrollPane thumbnailListScrollPane;
// End of variables declaration//GEN-END:variables
/**
@@ -103,6 +104,7 @@ public class ImageThumbnailViewer extends javax.swing.JPanel {
void clearViewer() {
synchronized (this) {
thumbnailListModel.removeAllElements();
+ thumbnailListScrollPane.getVerticalScrollBar().setValue(0);
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/OpenFileDiscoveryAction.java b/Core/src/org/sleuthkit/autopsy/filequery/OpenFileDiscoveryAction.java
new file mode 100644
index 0000000000..d315b85956
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/filequery/OpenFileDiscoveryAction.java
@@ -0,0 +1,159 @@
+/*
+ * Autopsy
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.filequery;
+
+import java.awt.Component;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.awt.ActionReferences;
+import org.openide.awt.ActionRegistration;
+import org.openide.util.HelpCtx;
+import org.openide.util.NbBundle;
+import org.openide.util.actions.CallableSystemAction;
+import org.openide.util.actions.Presenter;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.casemodule.NoCurrentCaseException;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.datamodel.DataSource;
+import org.sleuthkit.datamodel.IngestJobInfo;
+import org.sleuthkit.datamodel.SleuthkitCase;
+import org.sleuthkit.datamodel.TskCoreException;
+
+/**
+ * Class to open the File Discovery top component. Allows the user to run
+ * searches and see results.
+ */
+@ActionID(category = "Tools", id = "org.sleuthkit.autopsy.newpackage.OpenFileDiscoveryAction")
+@ActionReferences(value = {
+ @ActionReference(path = "Menu/Tools", position = 103)
+ ,
+ @ActionReference(path = "Toolbars/Case", position = 104)})
+@ActionRegistration(displayName = "#CTL_OpenFileDiscoveryAction", lazy = false)
+@NbBundle.Messages({"CTL_OpenFileDiscoveryAction=File Discovery"})
+public final class OpenFileDiscoveryAction extends CallableSystemAction implements Presenter.Toolbar {
+
+ private static final Logger logger = Logger.getLogger(OpenFileDiscoveryAction.class.getName());
+
+ private static final String DISPLAY_NAME = Bundle.CTL_OpenFileDiscoveryAction();
+ private static final long serialVersionUID = 1L;
+ private final JButton toolbarButton = new JButton();
+
+ public OpenFileDiscoveryAction() {
+ toolbarButton.addActionListener(OpenFileDiscoveryAction.this::actionPerformed);
+ this.setEnabled(false);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return Case.isCaseOpen();
+ }
+
+ @NbBundle.Messages({"OpenFileDiscoveryAction.resultsIncomplete.text=Results may be incomplete"})
+
+ @Override
+ @SuppressWarnings("fallthrough")
+ public void performAction() {
+ final DiscoveryTopComponent tc = DiscoveryTopComponent.getTopComponent();
+ if (tc != null) {
+ if (tc.isOpened() == false) {
+ tc.open();
+ tc.updateSearchSettings();
+ displayErrorMessage(tc);
+ }
+ tc.toFront();
+ tc.requestActive();
+
+ }
+ }
+
+ /**
+ * Private helper method to display an error message when the results of the
+ * File Discovery Top component may be incomplete.
+ *
+ * @param tc The File Discovery Top component.
+ */
+ private void displayErrorMessage(DiscoveryTopComponent tc) {
+ //check if modules run and assemble message
+ try {
+ SleuthkitCase skCase = Case.getCurrentCaseThrows().getSleuthkitCase();
+ Map dataSourceIngestModules = new HashMap<>();
+ for (DataSource dataSource : skCase.getDataSources()) {
+ dataSourceIngestModules.put(dataSource.getId(), new DataSourceModulesWrapper(dataSource.getName()));
+ }
+
+ for (IngestJobInfo jobInfo : skCase.getIngestJobs()) {
+ dataSourceIngestModules.get(jobInfo.getObjectId()).updateModulesRun(jobInfo);
+ }
+ String message = "";
+ for (DataSourceModulesWrapper dsmodulesWrapper : dataSourceIngestModules.values()) {
+ message += dsmodulesWrapper.getMessage();
+ }
+ if (!message.isEmpty()) {
+ JOptionPane.showMessageDialog(tc, message, Bundle.OpenFileDiscoveryAction_resultsIncomplete_text(), JOptionPane.INFORMATION_MESSAGE);
+ }
+ } catch (NoCurrentCaseException | TskCoreException ex) {
+ logger.log(Level.WARNING, "Exception while determining which modules have been run for File Discovery", ex);
+ }
+ }
+
+ /**
+ * Returns the toolbar component of this action.
+ *
+ * @return The toolbar button
+ */
+ @Override
+ public Component getToolbarPresenter() {
+ ImageIcon icon = new ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/images/discovery-icon-24.png")); //NON-NLS
+ toolbarButton.setIcon(icon);
+ toolbarButton.setText(this.getName());
+ return toolbarButton;
+ }
+
+ /**
+ * Set this action to be enabled/disabled
+ *
+ * @param value whether to enable this action or not
+ */
+ @Override
+ public void setEnabled(boolean value) {
+ super.setEnabled(value);
+ toolbarButton.setEnabled(value);
+ }
+
+ @Override
+ public String getName() {
+ return DISPLAY_NAME;
+ }
+
+ @Override
+ public HelpCtx getHelpCtx() {
+ return HelpCtx.DEFAULT_HELP;
+ }
+
+ @Override
+ public boolean asynchronous() {
+ return false; // run on edt
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java
index 348e4c5947..f90d11bd32 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/PageWorker.java
@@ -96,7 +96,7 @@ final class PageWorker extends SwingWorker {
protected void done() {
if (!isCancelled()) {
int currentPage = startingEntry / pageSize; //integer division should round down to get page number correctly
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.PageRetrievedEvent(resultType, currentPage, results));
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.PageRetrievedEvent(resultType, currentPage, results));
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.form b/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.form
deleted file mode 100644
index 2d7cb9661f..0000000000
--- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.form
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.java
deleted file mode 100644
index c1d3fa5cdd..0000000000
--- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsDialog.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2019 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * 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.
- */
-package org.sleuthkit.autopsy.filequery;
-
-import javax.swing.JFrame;
-import org.openide.util.NbBundle;
-import org.openide.windows.WindowManager;
-
-/**
- * Temporary dialog to display the search results
- */
-class ResultsDialog extends javax.swing.JDialog {
-
- boolean runAnotherSearch;
-
- /**
- * Creates new form ResultsDialog
- *
- * @param parent
- * @param modal
- * @param textToPrint
- */
- @NbBundle.Messages({
- "ResultsDialog.dialogTitle.text=File search results",
- })
- ResultsDialog(java.awt.Frame parent, boolean modal, String textToPrint) {
- super((JFrame) WindowManager.getDefault().getMainWindow(), Bundle.ResultsDialog_dialogTitle_text(), modal);
- initComponents();
-
- setResults(textToPrint);
- }
-
- /**
- * Put the text into the dialog
- *
- * @param textToPrint
- */
- private void setResults(String textToPrint) {
- resultsTextArea.setText(textToPrint);
- }
-
- /**
- * Display the dialog
- */
- void display() {
- this.setLocationRelativeTo(WindowManager.getDefault().getMainWindow());
- runAnotherSearch = false;
- setVisible(true);
- }
-
- /**
- * Returns whether the user chose to run another search or exit.
- *
- * @return true if the user wants to run another search, false otherwise
- */
- boolean shouldRunAnotherSearch() {
- return runAnotherSearch;
- }
-
- /**
- * This method is called from within the constructor to initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is always
- * regenerated by the Form Editor.
- */
- @SuppressWarnings("unchecked")
- // //GEN-BEGIN:initComponents
- private void initComponents() {
-
- exitButton = new javax.swing.JButton();
- searchButton = new javax.swing.JButton();
- jScrollPane3 = new javax.swing.JScrollPane();
- resultsTextArea = new javax.swing.JTextArea();
-
- setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
-
- org.openide.awt.Mnemonics.setLocalizedText(exitButton, org.openide.util.NbBundle.getMessage(ResultsDialog.class, "ResultsDialog.exitButton.text")); // NOI18N
- exitButton.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- exitButtonActionPerformed(evt);
- }
- });
-
- org.openide.awt.Mnemonics.setLocalizedText(searchButton, org.openide.util.NbBundle.getMessage(ResultsDialog.class, "ResultsDialog.searchButton.text")); // NOI18N
- searchButton.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- searchButtonActionPerformed(evt);
- }
- });
-
- resultsTextArea.setColumns(20);
- resultsTextArea.setRows(5);
- jScrollPane3.setViewportView(resultsTextArea);
-
- javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
- getContentPane().setLayout(layout);
- layout.setHorizontalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(layout.createSequentialGroup()
- .addContainerGap()
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
- .addGap(0, 450, Short.MAX_VALUE)
- .addComponent(searchButton)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addComponent(exitButton))
- .addComponent(jScrollPane3))
- .addContainerGap())
- );
- layout.setVerticalGroup(
- layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
- .addContainerGap()
- .addComponent(jScrollPane3, javax.swing.GroupLayout.DEFAULT_SIZE, 403, Short.MAX_VALUE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
- .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(exitButton)
- .addComponent(searchButton))
- .addContainerGap())
- );
-
- pack();
- }// //GEN-END:initComponents
-
- private void exitButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitButtonActionPerformed
- runAnotherSearch = false;
- setVisible(false);
- dispose();
- }//GEN-LAST:event_exitButtonActionPerformed
-
- private void searchButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_searchButtonActionPerformed
- runAnotherSearch = true;
- setVisible(false);
- dispose();
- }//GEN-LAST:event_searchButtonActionPerformed
-
-
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JButton exitButton;
- private javax.swing.JScrollPane jScrollPane3;
- private javax.swing.JTextArea resultsTextArea;
- private javax.swing.JButton searchButton;
- // End of variables declaration//GEN-END:variables
-}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form
index 97080a329a..c21dca33e5 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.form
@@ -1,6 +1,11 @@
+
+
+
+
+
@@ -25,7 +30,7 @@
-
+
@@ -40,6 +45,10 @@
+
+
+
+
@@ -59,8 +68,8 @@
-
-
+
+
@@ -77,10 +86,10 @@
-
+
@@ -147,18 +156,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
@@ -227,15 +224,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
-
+
@@ -246,6 +264,11 @@
+
+
+
+
+
@@ -261,21 +284,29 @@
-
+
-
+
-
+
+
+
+
+
+
+
+
+
@@ -300,6 +331,10 @@
+
+
+
+
@@ -310,6 +345,11 @@
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java
index 2ebc0b0b70..27086c731c 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/ResultsPanel.java
@@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.filequery;
import com.google.common.eventbus.Subscribe;
import java.awt.Component;
import java.awt.Image;
+import java.awt.event.ItemEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
@@ -28,12 +29,12 @@ import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
+import javax.swing.DefaultComboBoxModel;
import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPopupMenu;
-import javax.swing.JSpinner;
import javax.swing.SwingUtilities;
import javax.swing.SwingWorker;
import javax.swing.event.ListSelectionListener;
@@ -123,8 +124,6 @@ public class ResultsPanel extends javax.swing.JPanel {
}
});
- // Disable manual editing of page size spinner
- ((JSpinner.DefaultEditor) pageSizeSpinner.getEditor()).getTextField().setEditable(false);
}
/**
@@ -191,7 +190,7 @@ public class ResultsPanel extends javax.swing.JPanel {
* @param pageRetrievedEvent The PageRetrievedEvent received.
*/
@Subscribe
- void handlePageRetrievedEvent(DiscoveryEvents.PageRetrievedEvent pageRetrievedEvent) {
+ void handlePageRetrievedEvent(DiscoveryEventUtils.PageRetrievedEvent pageRetrievedEvent) {
SwingUtilities.invokeLater(() -> {
populateInstancesList();
currentPage = pageRetrievedEvent.getPageNumber();
@@ -217,7 +216,6 @@ public class ResultsPanel extends javax.swing.JPanel {
synchronized void resetResultViewer() {
resultsViewerPanel.remove(imageThumbnailViewer);
resultsViewerPanel.remove(videoThumbnailViewer);
-
//cancel any unfished thumb workers
for (SwingWorker thumbWorker : thumbnailWorkers) {
if (!thumbWorker.isDone()) {
@@ -266,7 +264,7 @@ public class ResultsPanel extends javax.swing.JPanel {
* @param groupSelectedEvent The GroupSelectedEvent received.
*/
@Subscribe
- void handleGroupSelectedEvent(DiscoveryEvents.GroupSelectedEvent groupSelectedEvent) {
+ void handleGroupSelectedEvent(DiscoveryEventUtils.GroupSelectedEvent groupSelectedEvent) {
SwingUtilities.invokeLater(() -> {
searchFilters = groupSelectedEvent.getFilters();
groupingAttribute = groupSelectedEvent.getGroupingAttr();
@@ -286,7 +284,7 @@ public class ResultsPanel extends javax.swing.JPanel {
* @param noResultsEvent the NoResultsEvent received.
*/
@Subscribe
- void handleNoResultsEvent(DiscoveryEvents.NoResultsEvent noResultsEvent) {
+ void handleNoResultsEvent(DiscoveryEventUtils.NoResultsEvent noResultsEvent) {
SwingUtilities.invokeLater(() -> {
groupSize = 0;
currentPage = 0;
@@ -305,7 +303,7 @@ public class ResultsPanel extends javax.swing.JPanel {
* in this page.
*/
private synchronized void setPage(int startingEntry) {
- int pageSize = (int) pageSizeSpinner.getValue();
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
synchronized (this) {
if (pageWorker != null && !pageWorker.isDone()) {
pageWorker.cancel(true);
@@ -331,15 +329,15 @@ public class ResultsPanel extends javax.swing.JPanel {
"# {1} - totalPages",
"ResultsPanel.currentPage.displayValue=Page: {0} of {1}"})
private void updateControls() {
- previousPageSize = (int) pageSizeSpinner.getValue();
- int pageSize = (int) pageSizeSpinner.getValue();
+ previousPageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
//handle edge case where group size is 0 and we want the empty results to be labeled paged 1 of 1 not page 1 of 0
double maxPageDouble = groupSize == 0 ? 1 : Math.ceil((double) groupSize / pageSize);
currentPageLabel.setText(Bundle.ResultsPanel_currentPage_displayValue(currentPage + 1, maxPageDouble));
previousPageButton.setEnabled(currentPage != 0);
nextPageButton.setEnabled(groupSize > ((currentPage + 1) * pageSize));
gotoPageField.setEnabled(groupSize > pageSize);
- pageSizeSpinner.setEnabled(true);
+ pageSizeComboBox.setEnabled(true);
}
/**
@@ -351,21 +349,23 @@ public class ResultsPanel extends javax.swing.JPanel {
// //GEN-BEGIN:initComponents
private void initComponents() {
- pagingPanel = new javax.swing.JPanel();
+ javax.swing.JPanel pagingPanel = new javax.swing.JPanel();
previousPageButton = new javax.swing.JButton();
currentPageLabel = new javax.swing.JLabel();
nextPageButton = new javax.swing.JButton();
- pageSizeSpinner = new javax.swing.JSpinner();
javax.swing.JLabel pageControlsLabel = new javax.swing.JLabel();
javax.swing.JLabel gotoPageLabel = new javax.swing.JLabel();
gotoPageField = new javax.swing.JTextField();
javax.swing.JLabel pageSizeLabel = new javax.swing.JLabel();
+ pageSizeComboBox = new javax.swing.JComboBox<>();
javax.swing.JSplitPane resultsSplitPane = new javax.swing.JSplitPane();
javax.swing.JPanel instancesPanel = new javax.swing.JPanel();
javax.swing.JScrollPane instancesScrollPane = new javax.swing.JScrollPane();
instancesList = new javax.swing.JList<>();
resultsViewerPanel = new javax.swing.JPanel();
+ setPreferredSize(new java.awt.Dimension(777, 475));
+
pagingPanel.setBorder(javax.swing.BorderFactory.createEtchedBorder());
previousPageButton.setIcon(new javax.swing.ImageIcon(getClass().getResource("/org/sleuthkit/autopsy/corecomponents/btn_step_back.png"))); // NOI18N
@@ -397,11 +397,6 @@ public class ResultsPanel extends javax.swing.JPanel {
}
});
- pageSizeSpinner.setModel(new javax.swing.SpinnerNumberModel(10, 10, 200, 10));
- pageSizeSpinner.setEditor(new javax.swing.JSpinner.NumberEditor(pageSizeSpinner, ""));
- pageSizeSpinner.setEnabled(false);
- pageSizeSpinner.setFocusable(false);
-
org.openide.awt.Mnemonics.setLocalizedText(pageControlsLabel, org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.pageControlsLabel.text")); // NOI18N
pageControlsLabel.setMaximumSize(new java.awt.Dimension(33, 23));
pageControlsLabel.setMinimumSize(new java.awt.Dimension(33, 23));
@@ -424,6 +419,14 @@ public class ResultsPanel extends javax.swing.JPanel {
pageSizeLabel.setMinimumSize(new java.awt.Dimension(60, 23));
pageSizeLabel.setPreferredSize(new java.awt.Dimension(60, 23));
+ pageSizeComboBox.setModel(new DefaultComboBoxModel(new Integer[] {25,50,75,100,125,150,175,200}));
+ pageSizeComboBox.setSelectedIndex(3);
+ pageSizeComboBox.addItemListener(new java.awt.event.ItemListener() {
+ public void itemStateChanged(java.awt.event.ItemEvent evt) {
+ pageSizeChanged(evt);
+ }
+ });
+
javax.swing.GroupLayout pagingPanelLayout = new javax.swing.GroupLayout(pagingPanel);
pagingPanel.setLayout(pagingPanelLayout);
pagingPanelLayout.setHorizontalGroup(
@@ -443,8 +446,8 @@ public class ResultsPanel extends javax.swing.JPanel {
.addComponent(gotoPageField, javax.swing.GroupLayout.PREFERRED_SIZE, 64, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(18, 18, 18)
.addComponent(pageSizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 52, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
- .addComponent(pageSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
+ .addComponent(pageSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
pagingPanelLayout.setVerticalGroup(
@@ -458,22 +461,31 @@ public class ResultsPanel extends javax.swing.JPanel {
.addComponent(currentPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(pageControlsLabel, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, pagingPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
- .addComponent(pageSizeSpinner, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(gotoPageLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(gotoPageField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
- .addComponent(pageSizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
+ .addComponent(pageSizeLabel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
+ .addComponent(pageSizeComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(4, 4, 4))
);
- resultsSplitPane.setDividerLocation(250);
+ resultsSplitPane.setDividerLocation(380);
resultsSplitPane.setOrientation(javax.swing.JSplitPane.VERTICAL_SPLIT);
- resultsSplitPane.setResizeWeight(0.9);
- resultsSplitPane.setPreferredSize(new java.awt.Dimension(777, 125));
+ resultsSplitPane.setResizeWeight(1.0);
+ resultsSplitPane.setToolTipText(org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.resultsSplitPane.toolTipText")); // NOI18N
+ resultsSplitPane.setLastDividerLocation(180);
+ resultsSplitPane.setOpaque(false);
+ resultsSplitPane.setPreferredSize(new java.awt.Dimension(777, 440));
+
+ instancesPanel.setPreferredSize(new java.awt.Dimension(775, 68));
+
+ instancesScrollPane.setPreferredSize(new java.awt.Dimension(775, 60));
instancesList.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(ResultsPanel.class, "ResultsPanel.instancesList.border.title"))); // NOI18N
instancesList.setModel(instancesListModel);
instancesList.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
instancesList.setCellRenderer(new InstancesCellRenderer());
+ instancesList.setPreferredSize(new java.awt.Dimension(0, 50));
+ instancesList.setVisibleRowCount(2);
instancesScrollPane.setViewportView(instancesList);
javax.swing.GroupLayout instancesPanelLayout = new javax.swing.GroupLayout(instancesPanel);
@@ -482,17 +494,20 @@ public class ResultsPanel extends javax.swing.JPanel {
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 775, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 775, Short.MAX_VALUE))
+ .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
instancesPanelLayout.setVerticalGroup(
instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addGap(0, 52, Short.MAX_VALUE)
+ .addGap(0, 221, Short.MAX_VALUE)
.addGroup(instancesPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
- .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 52, Short.MAX_VALUE))
+ .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, instancesPanelLayout.createSequentialGroup()
+ .addGap(0, 0, 0)
+ .addComponent(instancesScrollPane, javax.swing.GroupLayout.DEFAULT_SIZE, 221, Short.MAX_VALUE)))
);
resultsSplitPane.setRightComponent(instancesPanel);
+ resultsViewerPanel.setPreferredSize(new java.awt.Dimension(0, 380));
resultsViewerPanel.setLayout(new java.awt.BorderLayout());
resultsSplitPane.setLeftComponent(resultsViewerPanel);
@@ -508,7 +523,7 @@ public class ResultsPanel extends javax.swing.JPanel {
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addComponent(pagingPanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, 0)
- .addComponent(resultsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, 199, Short.MAX_VALUE)
+ .addComponent(resultsSplitPane, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGap(0, 0, 0))
);
}// //GEN-END:initComponents
@@ -522,10 +537,7 @@ public class ResultsPanel extends javax.swing.JPanel {
if (currentPage > 0) {
disablePagingControls();
int previousPage = currentPage - 1;
- int pageSize = (int) pageSizeSpinner.getValue();
- if (previousPageSize != pageSize) {
- previousPage = 0;
- }
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
setPage(previousPage * pageSize);
}
}//GEN-LAST:event_previousPageButtonActionPerformed
@@ -538,10 +550,7 @@ public class ResultsPanel extends javax.swing.JPanel {
private void nextPageButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_nextPageButtonActionPerformed
disablePagingControls();
int nextPage = currentPage + 1;
- int pageSize = (int) pageSizeSpinner.getValue();
- if (previousPageSize != pageSize) {
- nextPage = 0;
- }
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
setPage(nextPage * pageSize);
}//GEN-LAST:event_nextPageButtonActionPerformed
@@ -562,7 +571,7 @@ public class ResultsPanel extends javax.swing.JPanel {
//ignore input
return;
}
- int pageSize = (int) pageSizeSpinner.getValue();
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
if ((newPage - 1) < 0 || groupSize <= ((newPage - 1) * pageSize)) {
JOptionPane.showMessageDialog(this,
Bundle.ResultsPanel_invalidPageNumber_message(newPage, Math.ceil((double) groupSize / pageSize)),
@@ -574,6 +583,18 @@ public class ResultsPanel extends javax.swing.JPanel {
setPage((newPage - 1) * pageSize);
}//GEN-LAST:event_gotoPageFieldActionPerformed
+ private void pageSizeChanged(java.awt.event.ItemEvent evt) {//GEN-FIRST:event_pageSizeChanged
+ if (evt.getStateChange() == ItemEvent.SELECTED) {
+ disablePagingControls();
+ int previousPage = currentPage - 1;
+ int pageSize = pageSizeComboBox.getItemAt(pageSizeComboBox.getSelectedIndex());
+ if (previousPageSize != pageSize) {
+ previousPage = 0;
+ }
+ setPage(previousPage * pageSize);
+ }
+ }//GEN-LAST:event_pageSizeChanged
+
/**
* Disable all the paging controls.
*/
@@ -581,7 +602,7 @@ public class ResultsPanel extends javax.swing.JPanel {
nextPageButton.setEnabled(false);
previousPageButton.setEnabled(false);
gotoPageField.setEnabled(false);
- pageSizeSpinner.setEnabled(false);
+ pageSizeComboBox.setEnabled(false);
}
// Variables declaration - do not modify//GEN-BEGIN:variables
@@ -589,8 +610,7 @@ public class ResultsPanel extends javax.swing.JPanel {
private javax.swing.JTextField gotoPageField;
private javax.swing.JList instancesList;
private javax.swing.JButton nextPageButton;
- private javax.swing.JSpinner pageSizeSpinner;
- private javax.swing.JPanel pagingPanel;
+ private javax.swing.JComboBox pageSizeComboBox;
private javax.swing.JButton previousPageButton;
private javax.swing.JPanel resultsViewerPanel;
// End of variables declaration//GEN-END:variables
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchChildren.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchChildren.java
deleted file mode 100644
index a6053a30f2..0000000000
--- a/Core/src/org/sleuthkit/autopsy/filequery/SearchChildren.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2019 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * 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.
- */
-package org.sleuthkit.autopsy.filequery;
-
-import java.util.List;
-import org.openide.nodes.Children;
-import org.openide.nodes.Node;
-import org.sleuthkit.autopsy.datamodel.DirectoryNode;
-import org.sleuthkit.autopsy.datamodel.FileNode;
-import org.sleuthkit.autopsy.directorytree.DataResultFilterNode;
-import org.sleuthkit.autopsy.directorytree.DirectoryTreeTopComponent;
-import org.sleuthkit.datamodel.AbstractFile;
-
-/**
- * Makes nodes for search results.
- */
-class SearchChildren extends Children.Keys {
-
- SearchChildren(boolean lazy, List fileList) {
- super(lazy);
- this.setKeys(fileList);
- }
-
- @Override
- protected Node[] createNodes(AbstractFile t) {
- Node[] node = new Node[1];
- if (t.isDir()) {
- node[0] = new DataResultFilterNode(new DirectoryNode(t, false), DirectoryTreeTopComponent.findInstance().getExplorerManager());
-
- //node[0] = new DirectoryNode((Directory)t);
- return node;
- } else {
- node[0] = new DataResultFilterNode(new FileNode(t, false), DirectoryTreeTopComponent.findInstance().getExplorerManager());
- //node[0] = new FileNode((File)t);
- return node;
- }
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchNode.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchNode.java
deleted file mode 100644
index 727affb00a..0000000000
--- a/Core/src/org/sleuthkit/autopsy/filequery/SearchNode.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2019 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * 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.
- */
-package org.sleuthkit.autopsy.filequery;
-
-import java.util.List;
-import org.openide.nodes.AbstractNode;
-import org.openide.util.NbBundle;
-import org.sleuthkit.datamodel.AbstractFile;
-
-class SearchNode extends AbstractNode {
-
- SearchNode(List keys) {
- super(new SearchChildren(true, keys));
- }
-
- @NbBundle.Messages({"SearchNode.getName.text=Search Result"})
- @Override
- public String getName() {
- return NbBundle.getMessage(this.getClass(), "SearchNode.getName.text");
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchResults.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchResults.java
index 1c8311cdca..7cc9b8a596 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/SearchResults.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchResults.java
@@ -31,42 +31,45 @@ import org.sleuthkit.autopsy.filequery.FileSearch.GroupKey;
* Class to hold the results of the filtering/grouping/sorting operations
*/
class SearchResults {
-
+
private final FileGroup.GroupSortingAlgorithm groupSortingType;
private final FileSearch.AttributeType attrType;
private final FileSorter fileSorter;
-
+
private final Map groupMap = new HashMap<>();
private List groupList = new ArrayList<>();
-
- private final long MAX_OUTPUT_FILES = 2000; // For debug UI - maximum number of lines to print
-
+
+ private static final long MAX_OUTPUT_FILES = 2000; // For debug UI - maximum number of lines to print
+
/**
* Create an empty SearchResults object
- *
- * @param groupSortingType The method that should be used to sortGroupsAndFiles the groups
+ *
+ * @param groupSortingType The method that should be used to
+ * sortGroupsAndFiles the groups
* @param attrType The attribute type to use for grouping
- * @param fileSortingMethod The method that should be used to sortGroupsAndFiles the files in each group
+ * @param fileSortingMethod The method that should be used to
+ * sortGroupsAndFiles the files in each group
*/
- SearchResults(FileGroup.GroupSortingAlgorithm groupSortingType, FileSearch.AttributeType attrType,
+ SearchResults(FileGroup.GroupSortingAlgorithm groupSortingType, FileSearch.AttributeType attrType,
FileSorter.SortingMethod fileSortingMethod) {
this.groupSortingType = groupSortingType;
this.attrType = attrType;
this.fileSorter = new FileSorter(fileSortingMethod);
}
-
+
/**
- * Create an dummy SearchResults object that can be used in the UI before the search is finished.
+ * Create an dummy SearchResults object that can be used in the UI before
+ * the search is finished.
*/
SearchResults() {
- this.groupSortingType = FileGroup.GroupSortingAlgorithm.BY_GROUP_KEY;
+ this.groupSortingType = FileGroup.GroupSortingAlgorithm.BY_GROUP_NAME;
this.attrType = new FileSearch.FileSizeAttribute();
this.fileSorter = new FileSorter(FileSorter.SortingMethod.BY_FILE_NAME);
- }
-
+ }
+
/**
* Add a list of ResultFile to the results
- *
+ *
* @param files the ResultFiles
*/
void add(List files) {
@@ -74,40 +77,41 @@ class SearchResults {
// Add the file to the appropriate group, creating it if necessary
FileSearch.GroupKey groupKey = attrType.getGroupKey(file);
- if ( ! groupMap.containsKey(groupKey)) {
- groupMap.put(groupKey, new FileGroup(groupSortingType, groupKey));
+ if (!groupMap.containsKey(groupKey)) {
+ groupMap.put(groupKey, new FileGroup(groupSortingType, groupKey));
}
groupMap.get(groupKey).addFile(file);
}
}
-
+
/**
- * Run after all files have been added to sortGroupsAndFiles the groups and files.
+ * Run after all files have been added to sortGroupsAndFiles the groups and
+ * files.
*/
void sortGroupsAndFiles() {
-
+
// First sortGroupsAndFiles the files
for (FileGroup group : groupMap.values()) {
group.sortFiles(fileSorter);
}
-
+
// Now put the groups in a list and sortGroupsAndFiles them
groupList = new ArrayList<>(groupMap.values());
Collections.sort(groupList);
}
-
+
@Override
public String toString() {
String result = "";
if (groupList == null) {
return result;
}
-
+
long count = 0;
for (FileGroup group : groupList) {
result += group.getDisplayName() + "\n";
-
- for (ResultFile file : group.getResultFiles()) {
+
+ for (ResultFile file : group.getFiles()) {
result += " " + file.toString() + "\n";
count++;
if (count > MAX_OUTPUT_FILES) {
@@ -118,50 +122,51 @@ class SearchResults {
}
return result;
}
-
+
/**
* Get the names of the groups with counts
- *
+ *
* @return the group names
*/
List getGroupNamesWithCounts() {
- return groupList.stream().map(p -> p.getDisplayName() + " (" + p.getResultFiles().size() + ")").collect(Collectors.toList());
+ return groupList.stream().map(p -> p.getDisplayName() + " (" + p.getFiles().size() + ")").collect(Collectors.toList());
}
-
+
/**
- * Get the abstract files for the selected group
- *
+ * Get the result files for the selected group
+ *
* @param groupName The name of the group. Can have the size appended.
- * @return the list of abstract files
+ *
+ * @return the list of result files
*/
- List getAbstractFilesInGroup(String groupName) {
+ List getResultFilesInGroup(String groupName) {
if (groupName != null) {
final String modifiedGroupName = groupName.replaceAll(" \\([0-9]+\\)$", "");
java.util.Optional fileGroup = groupList.stream().filter(p -> p.getDisplayName().equals(modifiedGroupName)).findFirst();
if (fileGroup.isPresent()) {
- return fileGroup.get().getAbstractFiles();
+ return fileGroup.get().getFiles();
}
}
- return new ArrayList<>();
+ return new ArrayList<>();
}
-
+
/**
- * Transform the results into a LinkedHashMap with abstract files.
- *
+ * Transform the results into a LinkedHashMap with result files.
+ *
* @return the grouped and sorted results
*/
Map> toLinkedHashMap() throws FileSearchException {
Map> map = new LinkedHashMap<>();
-
+
// Sort the groups and files
sortGroupsAndFiles();
-
+
// groupList is sorted and a LinkedHashMap will preserve that order.
for (FileGroup group : groupList) {
- map.put(group.getGroupKey(), group.getAbstractFiles());
+ map.put(group.getGroupKey(), group.getFiles());
}
-
+
return map;
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java
index be9d7a56a0..279a470f3a 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/SearchWorker.java
@@ -78,9 +78,9 @@ final class SearchWorker extends SwingWorker {
@Override
protected void done() {
if (isCancelled()) {
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCancelledEvent());
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchCancelledEvent());
} else {
- DiscoveryEvents.getDiscoveryEventBus().post(new DiscoveryEvents.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
+ DiscoveryEventUtils.getDiscoveryEventBus().post(new DiscoveryEventUtils.SearchCompleteEvent(results, filters, groupingAttr, groupSortAlgorithm, fileSort));
}
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java
index 048fe1b8d5..72296f7ce8 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailPanel.java
@@ -41,6 +41,7 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
private static final int GAP_SIZE = 4;
private static final Color SELECTION_COLOR = new Color(0, 120, 215);
+ private static final int BYTE_UNIT_CONVERSION = 1000;
private static final int ICON_SIZE = 16;
private static final String RED_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/red-circle-exclamation.png";
private static final String YELLOW_CIRCLE_ICON_PATH = "org/sleuthkit/autopsy/images/yellow-circle-yield.png";
@@ -168,14 +169,13 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
private javax.swing.JLabel scoreLabel;
// End of variables declaration//GEN-END:variables
- @Messages({"# {0} - fileSize",
- "VideoThumbnailPanel.sizeLabel.text=Size: {0} bytes",
+ @Messages({
"# {0} - numberOfInstances",
"VideoThumbnailPanel.countLabel.text=Number of Instances: {0}",
"VideoThumbnailPanel.deleted.text=All instances of file are deleted."})
@Override
public Component getListCellRendererComponent(JList extends VideoThumbnailsWrapper> list, VideoThumbnailsWrapper value, int index, boolean isSelected, boolean cellHasFocus) {
- fileSizeLabel.setText(Bundle.VideoThumbnailPanel_sizeLabel_text(value.getResultFile().getFirstInstance().getSize()));
+ fileSizeLabel.setText(getFileSizeString(value.getResultFile().getFirstInstance().getSize()));
countLabel.setText(Bundle.VideoThumbnailPanel_countLabel_text(value.getResultFile().getAllInstances().size()));
addThumbnails(value);
imagePanel.setBackground(isSelected ? SELECTION_COLOR : list.getBackground());
@@ -193,7 +193,7 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
case INTERESTING_SCORE:
scoreLabel.setIcon(INTERESTING_SCORE_ICON);
break;
- case NO_SCORE:
+ case NO_SCORE: // empty case - this is interpreted as an intentional fall-through
default:
scoreLabel.setIcon(null);
break;
@@ -203,6 +203,50 @@ final class VideoThumbnailPanel extends javax.swing.JPanel implements ListCellRe
return this;
}
+ @Messages({"# {0} - fileSize",
+ "# {1} - units",
+ "VideoThumbnailPanel.sizeLabel.text=Size: {0} {1}",
+ "VideoThumbnailPanel.bytes.text=bytes",
+ "VideoThumbnailPanel.kiloBytes.text=KB",
+ "VideoThumbnailPanel.megaBytes.text=MB",
+ "VideoThumbnailPanel.gigaBytes.text=GB",
+ "VideoThumbnailPanel.terraBytes.text=TB"})
+ /**
+ * Convert a size in bytes to a string with representing the size in the
+ * largest units which represent the value as being greater than or equal to
+ * one. Result will be rounded down to the nearest whole number of those
+ * units.
+ *
+ * @param bytes Size in bytes.
+ */
+ private String getFileSizeString(long bytes) {
+ long size = bytes;
+ int unitsSwitchValue = 0;
+ while (size > BYTE_UNIT_CONVERSION && unitsSwitchValue < 4) {
+ size /= BYTE_UNIT_CONVERSION;
+ unitsSwitchValue++;
+ }
+ String units;
+ switch (unitsSwitchValue) {
+ case 1:
+ units = Bundle.VideoThumbnailPanel_kiloBytes_text();
+ break;
+ case 2:
+ units = Bundle.VideoThumbnailPanel_megaBytes_text();
+ break;
+ case 3:
+ units = Bundle.VideoThumbnailPanel_gigaBytes_text();
+ break;
+ case 4:
+ units = Bundle.VideoThumbnailPanel_terraBytes_text();
+ break;
+ default:
+ units = Bundle.VideoThumbnailPanel_bytes_text();
+ break;
+ }
+ return Bundle.VideoThumbnailPanel_sizeLabel_text(size, units);
+ }
+
@Override
public String getToolTipText(MouseEvent event) {
if (event != null) {
diff --git a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailViewer.java b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailViewer.java
index 9994506a0e..a1dc742eab 100644
--- a/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailViewer.java
+++ b/Core/src/org/sleuthkit/autopsy/filequery/VideoThumbnailViewer.java
@@ -53,8 +53,8 @@ public class VideoThumbnailViewer extends javax.swing.JPanel {
* Get the list of AbstractFiles which are represented by the selected Video
* thumbnails.
*
- * @return The list of AbstractFiles which are represented by the selected Video
- * thumbnails.
+ * @return The list of AbstractFiles which are represented by the selected
+ * Video thumbnails.
*/
List getInstancesForSelected() {
synchronized (this) {
@@ -72,6 +72,7 @@ public class VideoThumbnailViewer extends javax.swing.JPanel {
void clearViewer() {
synchronized (this) {
thumbnailListModel.removeAllElements();
+ thumbnailListScrollPane.getVerticalScrollBar().setValue(0);
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties
index 401f521568..9da6f45334 100644
--- a/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/filesearch/Bundle_ja.properties
@@ -1,50 +1,74 @@
-OpenIDE-Module-Name=\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-KnownStatusSearchPanel.knownCheckBox.text=\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9\uff1a
-KnownStatusSearchPanel.knownBadOptionCheckBox.text=\u65e2\u77e5\u306e\u60aa\u8cea
-KnownStatusSearchPanel.knownOptionCheckBox.text=\u65e2\u77e5\uff08NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6\uff09
+DataSourceFilter.errorMessage.emptyDataSource=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+DateSearchFilter.errorMessage.endDateBeforeStartDate=\u7d42\u4e86\u65e5\u306f\u958b\u59cb\u65e5\u3088\u308a\u5f8c\u306e\u65e5\u4ed8\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+DataSourceFilter.errorMessage.emptyDataSource=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FileSearchPanel.emptyNode.display.text=\u8a72\u5f53\u3059\u308b\u7d50\u679c\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+HashSearchFilter.errorMessage.emptyHash=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u304c\u7a7a(\u672a\u5165\u529b)\u3067\u3059\u3002
+HashSearchFilter.errorMessage.wrongCharacter=MD5\u306b\u7121\u52b9\u306a16\u9032\u6570\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
+# {0} - \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u9577
+HashSearchFilter.errorMessage.wrongLength=\u5165\u529b\u306e\u9577\u3055({0}) \u304cMD5\u306e\u9577\u3055(32)\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002
+KnownStatusSearchFilter.errorMessage.noKnownStatusCheckboxSelected=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u65e2\u77e5\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+MimeTypeFilter.errorMessage.emptyMimeType=\u5c11\u306a\u304f\u3068\u30821\u3064\u306eMIME\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+NameSearchFilter.errorMessage.emtpyName=\u691c\u7d22\u3059\u308b\u540d\u524d\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+OpenIDE-Module-Name=FileSearch
+KnownStatusSearchPanel.knownCheckBox.text=\u65e2\u77e5\u306e\u30b9\u30c6\u30fc\u30bf\u30b9:
+KnownStatusSearchPanel.knownBadOptionCheckBox.text=\u9855\u8457
+KnownStatusSearchPanel.knownOptionCheckBox.text=\u65e2\u77e5(NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6)
KnownStatusSearchPanel.unknownOptionCheckBox.text=\u4e0d\u660e
-DateSearchFilter.noneSelectedMsg.text=\u6700\u4f4e\u4e00\u3064\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff01
-DateSearchPanel.dateCheckBox.text=\u65e5\u4ed8\uff1a
-DateSearchPanel.jLabel4.text=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\uff1a
-DateSearchPanel.jLabel3.text=*\u65e5\u4ed8\u306e\u5f62\u5f0f\u306fmm/dd/yyyy
-DateSearchPanel.jLabel2.text=*\u7a7a\u767d\u306e\u9805\u76ee\u306f\u300c\u5236\u9650\u306a\u3057\u300d\u3068\u3044\u3046\u610f\u5473\u3067\u3059
+DateSearchFilter.noneSelectedMsg.text=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093!
+DateSearchPanel.dateCheckBox.text=\u65e5\u4ed8:
+DateSearchPanel.jLabel4.text=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3:
+DateSearchPanel.jLabel3.text=*\u65e5\u4ed8\u5f62\u5f0f\u306fmm/dd/yyyy\u3067\u3059
+DateSearchPanel.jLabel2.text=*\u7a7a(\u672a\u5165\u529b)\u306e\u30d5\u30a3\u30fc\u30c9\u306f\u300c\u5236\u9650\u306a\u3057\u300d\u3092\u610f\u5473\u3057\u307e\u3059
DateSearchPanel.createdCheckBox.text=\u4f5c\u6210\u6e08\u307f
DateSearchPanel.accessedCheckBox.text=\u30a2\u30af\u30bb\u30b9\u6e08\u307f
DateSearchPanel.changedCheckBox.text=\u5909\u66f4\u6e08\u307f
DateSearchPanel.modifiedCheckBox.text=\u4fee\u6b63\u6e08\u307f
-DateSearchPanel.jLabel1.text=to
-NameSearchPanel.nameCheckBox.text=\u540d\u524d\uff1a
-NameSearchPanel.noteNameLabel.text=*\u6ce8\u610f\uff1a\u540d\u524d\u30de\u30c3\u30c1\u306f\u5927\u6587\u5b57\u3068\u5c0f\u6587\u5b57\u3092\u533a\u5225\u3057\u307e\u3059\u3002\u307e\u305f\u3001 \u30d5\u30a1\u30a4\u30eb\u540d\u306e\u3044\u304b\u306a\u308b\u90e8\u5206\u3082\u30de\u30c3\u30c1\u3057\u307e\u3059\u3002\u6b63\u898f\u8868\u73fe\u306f \u73fe\u5728\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
-SizeSearchPanel.sizeCheckBox.text=\u30b5\u30a4\u30ba\uff1a
-NameSearchPanel.cutMenuItem.text=\u30ab\u30c3\u30c8
+DateSearchPanel.jLabel1.text=\u5b9b\u5148
+NameSearchPanel.nameCheckBox.text=\u540d\u524d:
+NameSearchPanel.noteNameLabel.text=*\u6ce8: \u540d\u524d\u7167\u5408\u306f\u5927\u6587\u5b57\u5c0f\u6587\u5b57\u3092\u533a\u5225\u305b\u305a\u306b\u3001\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u4e00\u90e8\u3068\u7167\u5408\u3057\u307e\u3059\u3002\u6b63\u898f\u8868\u73fe\u306f\u73fe\u5728\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+NameSearchPanel.searchTextField.text=
+SizeSearchFilter.errorMessage.nonNegativeNumber=\u5165\u529b\u30b5\u30a4\u30ba\u30c7\u30fc\u30bf\u306f\u8ca0\u306e\u6570\u3067\u3059\u3002
+SizeSearchFilter.errorMessage.notANumber=\u5165\u529b\u30b5\u30a4\u30ba\u30c7\u30fc\u30bf\u306f\u6570\u5b57\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+SizeSearchPanel.sizeCheckBox.text=\u30b5\u30a4\u30ba:
+NameSearchPanel.cutMenuItem.text=\u5207\u308a\u53d6\u308a
NameSearchPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
NameSearchPanel.pasteMenuItem.text=\u8cbc\u308a\u4ed8\u3051
NameSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
SizeSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
SizeSearchPanel.pasteMenuItem.text=\u8cbc\u308a\u4ed8\u3051
SizeSearchPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
-SizeSearchPanel.cutMenuItem.text=\u30ab\u30c3\u30c8
-DateSearchPanel.cutMenuItem.text=\u30ab\u30c3\u30c8
+SizeSearchPanel.cutMenuItem.text=\u5207\u308a\u53d6\u308a
+DateSearchPanel.cutMenuItem.text=\u5207\u308a\u53d6\u308a
DateSearchPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
DateSearchPanel.pasteMenuItem.text=\u8cbc\u308a\u4ed8\u3051
DateSearchPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
-FileSearchAction.getName.text=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-FileSearchDialog.frame.title=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-FileSearchDialog.frame.msg=\u5c5e\u6027\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-FileSearchPanel.custComp.label.text=\u6b21\u306e\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\uff1a
+FileSearchAction.getName.text=\u5c5e\u6027\u5225\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+FileSearchDialog.frame.title=\u5c5e\u6027\u5225\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+FileSearchDialog.frame.msg=\u5c5e\u6027\u5225\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22
+FileSearchPanel.custComp.label.text=\u6b21\u306e\u6761\u4ef6\u306b\u4e00\u81f4\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22:
FileSearchPanel.filterTitle.name=\u540d\u524d
FileSearchPanel.filterTitle.metadata=\u30e1\u30bf\u30c7\u30fc\u30bf
-FileSearchPanel.filterTitle.knownStatus=\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9
-FileSearchPanel.search.results.title=\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u7d50\u679c{0}
-FileSearchPanel.search.results.pathText=\u30d5\u30a1\u30a4\u30eb\u540d\u691c\u7d22\u7d50\u679c\uff1a
-FileSearchPanel.search.results.msg=\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\uff1a{0}\u500b\u306e\u30de\u30c3\u30c1\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f
-FileSearchPanel.search.results.details=\u591a\u304f\u306e\u30de\u30c3\u30c1\u304c\u3042\u308b\u5834\u5408\u3001\u4e00\u90e8\u306e\u51e6\u7406\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u5f71\u97ff\u3092\u4e0e\u3048\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093
-FileSearchPanel.search.exception.noFilterSelected.msg=\u6700\u4f4e\uff11\u500b\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-FileSearchPanel.search.validationErr.msg=\u30d0\u30ea\u30c7\u30fc\u30b7\u30e7\u30f3\u30a8\u30e9\u30fc\uff1a{0}
-FileSearchPanel.emptyWhereClause.text=\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002\u8868\u793a\u3059\u308b\u3082\u306e\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-KnownStatusSearchFilter.noneSelectedMsg.text=\u6700\u4f4e\uff11\u500b\u306e\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\uff01
-NameSearchFilter.emptyNameMsg.text=\u540d\u524d\u691c\u7d22\u306b\u4f55\u304b\u8a18\u5165\u3057\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002
+FileSearchPanel.filterTitle.knownStatus=\u65e2\u77e5\u306e\u30b9\u30c6\u30fc\u30bf\u30b9
+FileSearchPanel.search.results.title=\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u7d50\u679c {0}
+FileSearchPanel.search.results.pathText=\u30d5\u30a1\u30a4\u30eb\u540d\u691c\u7d22\u7d50\u679c:
+FileSearchPanel.search.results.msg=\u30d5\u30a1\u30a4\u30eb\u691c\u7d22: \u4e00\u81f4\u3059\u308b\u7d50\u679c\u304c {0} \u4ef6\u898b\u3064\u304b\u308a\u307e\u3057\u305f
+FileSearchPanel.search.results.details=\u4e00\u81f4\u3059\u308b\u7d50\u679c\u6570\u304c\u591a\u3044\u3068\u3001\u4e00\u90e8\u306e\u64cd\u4f5c\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u306b\u5f71\u97ff\u3059\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
+FileSearchPanel.search.exception.noFilterSelected.msg=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FileSearchPanel.search.validationErr.msg=\u691c\u8a3c\u30a8\u30e9\u30fc: {0}
+FileSearchPanel.emptyWhereClause.text=\u7121\u52b9\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3067\u3059\u3002\u8868\u793a\u3059\u308b\u3082\u306e\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+KnownStatusSearchFilter.noneSelectedMsg.text=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u65e2\u77e5\u306e\u30b9\u30c6\u30fc\u30bf\u30b9\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093!
+NameSearchFilter.emptyNameMsg.text=\u540d\u524d\u691c\u7d22\u306b\u4f55\u304b\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
SearchNode.getName.text=\u691c\u7d22\u7d50\u679c
-SizeSearchPanel.sizeCompareComboBox.equalTo=\u4e0b\u8a18\u3068\u7b49\u3057\u3044
-SizeSearchPanel.sizeCompareComboBox.greaterThan=\u4e0b\u8a18\u3088\u308a\u5927\u304d\u3044
-SizeSearchPanel.sizeCompareComboBox.lessThan=\u4e0b\u8a18\u3088\u308a\u5c0f\u3055\u3044
+SizeSearchPanel.sizeCompareComboBox.equalTo=\u76f8\u5f53
+SizeSearchPanel.sizeCompareComboBox.greaterThan=\u4ee5\u4e0a
+SizeSearchPanel.sizeCompareComboBox.lessThan=\u4ee5\u4e0b
+MimeTypePanel.jLabel1.text=*\u6ce8: \u8907\u6570\u306eMIME\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3067\u304d\u307e\u3059
+FileSearchPanel.searchButton.text=\u691c\u7d22
+MimeTypePanel.mimeTypeCheckBox.text=MIME\u30bf\u30a4\u30d7:
+HashSearchPanel.md5CheckBox.text=MD5:
+HashSearchPanel.emptyHashMsg.text=\u30cf\u30c3\u30b7\u30e5\u691c\u7d22\u306b\u4f55\u304b\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+FileSearchPanel.errorLabel.text=\
+DataSourcePanel.dataSourceCheckBox.label=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9:
+DataSourcePanel.dataSourceCheckBox.actionCommand=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9:
+DataSourcePanel.dataSourceCheckBox.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9:
+DataSourcePanel.dataSourceNoteLabel.text=*\u6ce8: \u8907\u6570\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u9078\u629e\u3067\u304d\u307e\u3059
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties b/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties
index 84d4ab700c..5525fed84c 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties
@@ -4,7 +4,6 @@ CTL_GeolocationTopComponent=Geolocation
RefreshPanel.refreshLabel.text=The geolocation data has been updated, the visualization may be out of date.
RefreshPanel.refreshButton.text=Refresh View
RefreshPanel.closeButton.text=
-MapPanel.cordLabel.text=
WaypointDetailPanel.closeButton.text=
WaypointDetailPanel.imageLabel.text=
GeoFilterPanel.waypointSettings.border.title=
@@ -19,14 +18,21 @@ CheckBoxListPanel.uncheckButton.text=Uncheck All
GeoFilterPanel.optionsLabel.text=Waypoints
OptionsCategory_Name_Geolocation=Geolocation
OptionsCategory_Keywords_Geolocation=Geolocation Settings
-GeolocationSettingsPanel.tilePane.border.title=Map Tile Source
+GeolocationSettingsPanel.tilePane.border.title=Map Tile Data Source
OptionsCategory_Keywords_Geolocation=Geolocation
-OptionsCategory_Name_Geolocation=Geolocation
-GeolocationSettingsPanel.defaultButton.text=Default online tile server (bing.com/maps)
-GeolocationSettingsPanel.tileServerButton.text=OpenStreetMap tile server
-GeolocationSettingsPanel.tileServerFiled.text=
-GeolocationSettingsPanel.osmZipButton.text=OpenStreeMap Tile Zip File
-GeolocationSettingsPanel.osmZipFileField.text=
-GeolocationSettingsPanel.osmZipFileBrowseButton.text=Browse
-GeolocationSettingsPanel.serverTestButton.text=Test
-GeolocationSettingsPanel.osmZipButton.actionCommand=OpenStreeMap tile ZIP file
+GeolocationSettingsPanel.mbtileFileField.toolTipText=
+GeolocationSettingsPanel.mbtileFileField.text=
+GeolocationSettingsPanel.defaultDataSource.text=Default online tile server (bing.com/maps)
+GeolocationSettingsPanel.osmServerRBnt.text=OpenStreetMap server
+GeolocationSettingsPanel.zipFileRBnt.text=OpenStreeMap zip file
+GeolocationSettingsPanel.zipFileRBnt.actionCommand=OpenStreeMap tile ZIP file
+GeolocationSettingsPanel.mbtilesRBtn.text=MBTiles file
+GeolocationSettingsPanel.osmServerAddressField.text=
+GeolocationSettingsPanel.zipFilePathField.text=
+GeolocationSettingsPanel.serverTestBtn.text=Test
+GeolocationSettingsPanel.mbtilesBrowseBtn.text=Browse
+GeolocationSettingsPanel.zipFileBrowseBnt.text=Browse
+GeolocationSettingsPanel.mbtileTestBtn.text=Test
+GeolocationTopComponent.reportButton.text=KML Report
+GeolocationTopComponent.coordLabel.text=
+
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties-MERGED
index c69264acae..19ce2c9a59 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/Bundle.properties-MERGED
@@ -3,6 +3,14 @@ CTL_GeolocationTopComponentAction=GeolocationTopComponent
CTL_GeolocationTopComponent=Geolocation
GeoFilterPanel_DataSource_List_Title=Data Sources
GeoFilterPanel_empty_dataSource=Data Source list is empty.
+GeolocationSettings_mbtile_does_not_exist_message=The file supplied does not exist.\nPlease verify that the file exists and try again.
+GeolocationSettings_mbtile_does_not_exist_title=File Not Found
+GeolocationSettings_mbtile_not_valid_message=The supplied file is not a raster tile file.
+GeolocationSettings_mbtile_not_valid_title=File Not Valid
+GeolocationSettings_mbtile_test_success_message=The supplied file is a valid mbtile raster file.
+GeolocationSettings_mbtile_test_success_title=Success
+GeolocationSettings_path_not_valid_message=The supplied file path is empty.\nPlease supply a valid file path.
+GeolocationSettings_path_not_valid_title=File Not Valid
GeolocationSettingsPanel_malformed_url_message=The supplies OSM tile server address is invalid.\nPlease supply a well formed url prefixed with http://
GeolocationSettingsPanel_malformed_url_message_tile=Malformed URL
GeolocationSettingsPanel_osm_server_test_fail_message=OSM tile server test failed.\nUnable to connect to server.
@@ -11,6 +19,9 @@ GeolocationSettingsPanel_osm_server_test_success_message=The provide OSM tile se
GeolocationSettingsPanel_osm_server_test_success_message_title=Success
GeolocationTC_connection_failure_message=Failed to connect to map title source.\nPlease review map source in Options dialog.
GeolocationTC_connection_failure_message_title=Connection Failure
+GeolocationTC_empty_waypoint_message=Unable to generate KML report due to a lack of waypoints.\nPlease make sure there are waypoints visible before generating the KML report
+GeolocationTC_KML_report_title=KML Report
+GeolocationTC_report_progress_title=KML Report Progress
GeoTopComponent_filer_data_invalid_msg=Unable to run waypoint filter.\nPlease select one or more data sources.
GeoTopComponent_filer_data_invalid_Title=Filter Failure
GeoTopComponent_filter_exception_msg=Exception occured during waypoint filtering.
@@ -28,7 +39,6 @@ OpenGeolocationAction_name=Geolocation
RefreshPanel.refreshLabel.text=The geolocation data has been updated, the visualization may be out of date.
RefreshPanel.refreshButton.text=Refresh View
RefreshPanel.closeButton.text=
-MapPanel.cordLabel.text=
WaypointDetailPanel.closeButton.text=
WaypointDetailPanel.imageLabel.text=
GeoFilterPanel.waypointSettings.border.title=
@@ -43,15 +53,22 @@ CheckBoxListPanel.uncheckButton.text=Uncheck All
GeoFilterPanel.optionsLabel.text=Waypoints
OptionsCategory_Name_Geolocation=Geolocation
OptionsCategory_Keywords_Geolocation=Geolocation Settings
-GeolocationSettingsPanel.tilePane.border.title=Map Tile Source
+GeolocationSettingsPanel.tilePane.border.title=Map Tile Data Source
OptionsCategory_Keywords_Geolocation=Geolocation
-OptionsCategory_Name_Geolocation=Geolocation
-GeolocationSettingsPanel.defaultButton.text=Default online tile server (bing.com/maps)
-GeolocationSettingsPanel.tileServerButton.text=OpenStreetMap tile server
-GeolocationSettingsPanel.tileServerFiled.text=
-GeolocationSettingsPanel.osmZipButton.text=OpenStreeMap Tile Zip File
-GeolocationSettingsPanel.osmZipFileField.text=
-GeolocationSettingsPanel.osmZipFileBrowseButton.text=Browse
-GeolocationSettingsPanel.serverTestButton.text=Test
-GeolocationSettingsPanel.osmZipButton.actionCommand=OpenStreeMap tile ZIP file
+GeolocationSettingsPanel.mbtileFileField.toolTipText=
+GeolocationSettingsPanel.mbtileFileField.text=
+GeolocationSettingsPanel.defaultDataSource.text=Default online tile server (bing.com/maps)
+GeolocationSettingsPanel.osmServerRBnt.text=OpenStreetMap server
+GeolocationSettingsPanel.zipFileRBnt.text=OpenStreeMap zip file
+GeolocationSettingsPanel.zipFileRBnt.actionCommand=OpenStreeMap tile ZIP file
+GeolocationSettingsPanel.mbtilesRBtn.text=MBTiles file
+GeolocationSettingsPanel.osmServerAddressField.text=
+GeolocationSettingsPanel.zipFilePathField.text=
+GeolocationSettingsPanel.serverTestBtn.text=Test
+GeolocationSettingsPanel.mbtilesBrowseBtn.text=Browse
+GeolocationSettingsPanel.zipFileBrowseBnt.text=Browse
+GeolocationSettingsPanel.mbtileTestBtn.text=Test
+GeolocationTopComponent.reportButton.text=KML Report
+GeolocationTopComponent.coordLabel.text=
+
WaypointExtractAction_label=Extract Files(s)
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxJList.java b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxJList.java
index 52276b6046..2f4247f3e6 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxJList.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxJList.java
@@ -68,7 +68,7 @@ final class CheckBoxJList extends JLis
CheckBoxJList() {
initalize();
}
-
+
/**
* Do all of the UI initialization.
*/
@@ -103,6 +103,7 @@ final class CheckBoxJList extends JLis
setBackground(list.getBackground());
setSelected(value.isChecked());
setText(value.getDisplayName());
+ setEnabled(list.isEnabled());
return this;
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.form b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.form
index 112b734f1e..75fb1d4c62 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.form
@@ -37,10 +37,6 @@
-
-
-
-
@@ -56,10 +52,6 @@
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.java
index 37dea163f5..0942a9e528 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/CheckBoxListPanel.java
@@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.geolocation;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
+import java.util.Objects;
import javax.swing.DefaultListModel;
import javax.swing.Icon;
@@ -52,7 +53,11 @@ final class CheckBoxListPanel extends javax.swing.JPanel {
* @param obj Object that the checkbox represents
*/
void addElement(String displayName, T obj) {
- model.addElement(new ObjectCheckBox<>(displayName, true, obj));
+ ObjectCheckBox newCheckBox = new ObjectCheckBox<>(displayName, true, obj);
+
+ if(!model.contains(newCheckBox)) {
+ model.addElement(newCheckBox);
+ }
}
/**
@@ -61,6 +66,14 @@ final class CheckBoxListPanel extends javax.swing.JPanel {
void clearList() {
model.removeAllElements();
}
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ checkboxList.setEnabled(enabled);
+ checkButton.setEnabled(enabled);
+ uncheckButton.setEnabled(enabled);
+ checkboxList.setEnabled(enabled);
+ }
/**
* Returns a list of all of the selected elements.
@@ -126,8 +139,8 @@ final class CheckBoxListPanel extends javax.swing.JPanel {
java.awt.GridBagConstraints gridBagConstraints;
titleLabel = new javax.swing.JLabel();
- javax.swing.JButton uncheckButton = new javax.swing.JButton();
- javax.swing.JButton checkButton = new javax.swing.JButton();
+ uncheckButton = new javax.swing.JButton();
+ checkButton = new javax.swing.JButton();
scrollPane = new javax.swing.JScrollPane();
setLayout(new java.awt.GridBagLayout());
@@ -186,8 +199,10 @@ final class CheckBoxListPanel extends javax.swing.JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton checkButton;
private javax.swing.JScrollPane scrollPane;
private javax.swing.JLabel titleLabel;
+ private javax.swing.JButton uncheckButton;
// End of variables declaration//GEN-END:variables
/**
@@ -234,6 +249,21 @@ final class CheckBoxListPanel extends javax.swing.JPanel {
public String getDisplayName() {
return displayName;
}
+
+ @Override
+ public boolean equals(Object obj) {
+ if(obj instanceof ObjectCheckBox) {
+ return object.equals(((ObjectCheckBox)obj).object);
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode() {
+ int hash = 7;
+ hash = 31 * hash + Objects.hashCode(this.object);
+ return hash;
+ }
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.form b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.form
index 79a852b4d4..1b80568453 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.form
@@ -115,10 +115,6 @@
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java
index 9e009d1245..51238a033e 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeoFilterPanel.java
@@ -74,6 +74,20 @@ class GeoFilterPanel extends javax.swing.JPanel {
add(checkboxPanel, gridBagConstraints);
}
+ @Override
+ public void setEnabled(boolean enabled) {
+ applyButton.setEnabled(enabled);
+ mostRecentButton.setEnabled(enabled);
+ allButton.setEnabled(enabled);
+ showWaypointsWOTSCheckBox.setEnabled(enabled && mostRecentButton.isSelected());
+ checkboxPanel.setEnabled(enabled);
+ daysLabel.setEnabled(enabled);
+ daysSpinner.setEnabled(enabled);
+ }
+
+ /**
+ * Update the data source list with the current data sources
+ */
void updateDataSourceList() {
try {
initCheckboxList();
@@ -81,6 +95,13 @@ class GeoFilterPanel extends javax.swing.JPanel {
logger.log(Level.WARNING, "Failed to initialize the CheckboxListPane", ex); //NON-NLS
}
}
+
+ /**
+ * Clears the data source list.
+ */
+ void clearDataSourceList() {
+ checkboxPanel.clearList();
+ }
/**
* Adds an actionListener to listen for the filter apply action
@@ -120,8 +141,6 @@ class GeoFilterPanel extends javax.swing.JPanel {
*/
private void initCheckboxList() throws TskCoreException {
final SleuthkitCase sleuthkitCase = Case.getCurrentCase().getSleuthkitCase();
-
- checkboxPanel.clearList();
for (DataSource dataSource : sleuthkitCase.getDataSources()) {
String dsName = sleuthkitCase.getContentById(dataSource.getId()).getName();
@@ -155,7 +174,7 @@ class GeoFilterPanel extends javax.swing.JPanel {
mostRecentButton = new javax.swing.JRadioButton();
showWaypointsWOTSCheckBox = new javax.swing.JCheckBox();
daysSpinner = new javax.swing.JSpinner(numberModel);
- javax.swing.JLabel daysLabel = new javax.swing.JLabel();
+ daysLabel = new javax.swing.JLabel();
javax.swing.JPanel buttonPanel = new javax.swing.JPanel();
applyButton = new javax.swing.JButton();
javax.swing.JLabel optionsLabel = new javax.swing.JLabel();
@@ -272,6 +291,7 @@ class GeoFilterPanel extends javax.swing.JPanel {
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JRadioButton allButton;
private javax.swing.JButton applyButton;
+ private javax.swing.JLabel daysLabel;
private javax.swing.JSpinner daysSpinner;
private javax.swing.JRadioButton mostRecentButton;
private javax.swing.JCheckBox showWaypointsWOTSCheckBox;
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.form b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.form
index 0fd5461656..e2121d0772 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.form
@@ -28,7 +28,7 @@
-
+
@@ -46,72 +46,36 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -119,10 +83,46 @@
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -134,33 +134,99 @@
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.java
index 9be1f08927..f66d05c08d 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationSettingsPanel.java
@@ -20,7 +20,9 @@ package org.sleuthkit.autopsy.geolocation;
import java.awt.Color;
import java.io.File;
+import java.sql.SQLException;
import java.util.Arrays;
+import java.util.logging.Level;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import org.apache.commons.validator.routines.UrlValidator;
@@ -32,6 +34,7 @@ import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.casemodule.GeneralFilter;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
+import org.sleuthkit.autopsy.coreutils.Logger;
/**
* A panel to allow the user to set the custom properties of the geolocation
@@ -41,6 +44,8 @@ import org.sleuthkit.autopsy.corecomponents.OptionsPanel;
final class GeolocationSettingsPanel extends javax.swing.JPanel implements OptionsPanel {
private static final long serialVersionUID = 1L;
+
+ private static final Logger logger = Logger.getLogger(GeolocationSettingsPanel.class.getName());
/**
* Creates new GeolocationSettingsPanel
@@ -52,24 +57,29 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
@Override
public void store() {
- UserPreferences.setGeolocationTileOption(getServerOption().getValue());
- UserPreferences.setGeolocationOsmZipPath(osmZipFileField.getText());
- UserPreferences.setGeolocationOsmServerAddress(tileServerFiled.getText());
+ UserPreferences.setGeolocationTileOption(getDataSourceOption().getValue());
+ UserPreferences.setGeolocationOsmZipPath(zipFilePathField.getText());
+ UserPreferences.setGeolocationOsmServerAddress(osmServerAddressField.getText());
+ UserPreferences.setGeolocationMBTilesFilePath(mbtileFileField.getText());
}
@Override
public void load() {
- tileServerFiled.setText(UserPreferences.getGeolocationOsmServerAddress());
- osmZipFileField.setText(UserPreferences.getGeolocationOsmZipPath());
- switch (GeolocationTileOption.getOptionForValue(UserPreferences.getGeolocationtTileOption())) {
+ osmServerAddressField.setText(UserPreferences.getGeolocationOsmServerAddress());
+ zipFilePathField.setText(UserPreferences.getGeolocationOsmZipPath());
+ mbtileFileField.setText(UserPreferences.getGeolocationMBTilesFilePath());
+ switch (GeolocationDataSourceType.getOptionForValue(UserPreferences.getGeolocationtTileOption())) {
case ONLINE_USER_DEFINED_OSM_SERVER:
- tileServerButton.setSelected(true);
+ osmServerRBnt.setSelected(true);
break;
case OFFLINE_OSM_ZIP:
- osmZipButton.setSelected(true);
+ zipFileRBnt.setSelected(true);
+ break;
+ case OFFILE_MBTILES_FILE:
+ mbtilesRBtn.setSelected(true);
break;
default:
- defaultButton.setSelected(true);
+ defaultDataSource.setSelected(true);
break;
}
@@ -81,10 +91,13 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
* selection state.
*/
private void updateControlState() {
- tileServerFiled.setEnabled(tileServerButton.isSelected());
- serverTestButton.setEnabled(tileServerButton.isSelected());
- osmZipFileField.setEnabled(osmZipButton.isSelected());
- osmZipFileBrowseButton.setEnabled(osmZipButton.isSelected());
+ osmServerAddressField.setEnabled(osmServerRBnt.isSelected());
+ serverTestBtn.setEnabled(osmServerRBnt.isSelected());
+ zipFilePathField.setEnabled(zipFileRBnt.isSelected());
+ zipFileBrowseBnt.setEnabled(zipFileRBnt.isSelected());
+ mbtileFileField.setEnabled(mbtilesRBtn.isSelected());
+ mbtilesBrowseBtn.setEnabled(mbtilesRBtn.isSelected());
+ mbtileTestBtn.setEnabled(mbtilesRBtn.isSelected());
}
/**
@@ -93,13 +106,15 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
*
* @return Current GEOLOCATION_TILE_OPTION
*/
- private GeolocationTileOption getServerOption() {
- if (tileServerButton.isSelected()) {
- return GeolocationTileOption.ONLINE_USER_DEFINED_OSM_SERVER;
- } else if (osmZipButton.isSelected()) {
- return GeolocationTileOption.OFFLINE_OSM_ZIP;
+ private GeolocationDataSourceType getDataSourceOption() {
+ if (osmServerRBnt.isSelected()) {
+ return GeolocationDataSourceType.ONLINE_USER_DEFINED_OSM_SERVER;
+ } else if (zipFileRBnt.isSelected()) {
+ return GeolocationDataSourceType.OFFLINE_OSM_ZIP;
+ } else if (mbtilesRBtn.isSelected()) {
+ return GeolocationDataSourceType.OFFILE_MBTILES_FILE;
}
- return GeolocationTileOption.ONLINE_DEFAULT_SERVER;
+ return GeolocationDataSourceType.ONLINE_DEFAULT_SERVER;
}
/**
@@ -135,105 +150,159 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
javax.swing.ButtonGroup buttonGroup = new javax.swing.ButtonGroup();
javax.swing.JPanel tilePane = new javax.swing.JPanel();
- defaultButton = new javax.swing.JRadioButton();
- tileServerButton = new javax.swing.JRadioButton();
- tileServerFiled = new javax.swing.JTextField();
- osmZipButton = new javax.swing.JRadioButton();
- osmZipFileField = new javax.swing.JTextField();
- osmZipFileBrowseButton = new javax.swing.JButton();
- serverTestButton = new javax.swing.JButton();
+ defaultDataSource = new javax.swing.JRadioButton();
+ osmServerRBnt = new javax.swing.JRadioButton();
+ osmServerAddressField = new javax.swing.JTextField();
+ zipFileRBnt = new javax.swing.JRadioButton();
+ zipFilePathField = new javax.swing.JTextField();
+ zipFileBrowseBnt = new javax.swing.JButton();
+ serverTestBtn = new javax.swing.JButton();
+ mbtilesRBtn = new javax.swing.JRadioButton();
+ mbtileFileField = new javax.swing.JTextField();
+ mbtilesBrowseBtn = new javax.swing.JButton();
+ mbtileTestBtn = new javax.swing.JButton();
setLayout(new java.awt.GridBagLayout());
tilePane.setBorder(javax.swing.BorderFactory.createTitledBorder(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.tilePane.border.title"))); // NOI18N
tilePane.setLayout(new java.awt.GridBagLayout());
- buttonGroup.add(defaultButton);
- defaultButton.setSelected(true);
- org.openide.awt.Mnemonics.setLocalizedText(defaultButton, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.defaultButton.text")); // NOI18N
- defaultButton.addActionListener(new java.awt.event.ActionListener() {
+ buttonGroup.add(defaultDataSource);
+ defaultDataSource.setSelected(true);
+ org.openide.awt.Mnemonics.setLocalizedText(defaultDataSource, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.defaultDataSource.text")); // NOI18N
+ defaultDataSource.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- defaultButtonActionPerformed(evt);
+ defaultDataSourceActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
- gridBagConstraints.gridwidth = 3;
+ gridBagConstraints.gridwidth = 4;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.weightx = 1.0;
- gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
- tilePane.add(defaultButton, gridBagConstraints);
+ gridBagConstraints.insets = new java.awt.Insets(9, 0, 9, 0);
+ tilePane.add(defaultDataSource, gridBagConstraints);
- buttonGroup.add(tileServerButton);
- org.openide.awt.Mnemonics.setLocalizedText(tileServerButton, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.tileServerButton.text")); // NOI18N
- tileServerButton.addActionListener(new java.awt.event.ActionListener() {
+ buttonGroup.add(osmServerRBnt);
+ org.openide.awt.Mnemonics.setLocalizedText(osmServerRBnt, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmServerRBnt.text")); // NOI18N
+ osmServerRBnt.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- tileServerButtonActionPerformed(evt);
- }
- });
- gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 0;
- gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
- gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
- tilePane.add(tileServerButton, gridBagConstraints);
-
- tileServerFiled.setText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.tileServerFiled.text")); // NOI18N
- tileServerFiled.setPreferredSize(new java.awt.Dimension(300, 26));
- gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 1;
- gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
- tilePane.add(tileServerFiled, gridBagConstraints);
-
- buttonGroup.add(osmZipButton);
- org.openide.awt.Mnemonics.setLocalizedText(osmZipButton, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmZipButton.text")); // NOI18N
- osmZipButton.setActionCommand(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmZipButton.actionCommand")); // NOI18N
- osmZipButton.addActionListener(new java.awt.event.ActionListener() {
- public void actionPerformed(java.awt.event.ActionEvent evt) {
- osmZipButtonActionPerformed(evt);
+ osmServerRBntActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
- tilePane.add(osmZipButton, gridBagConstraints);
+ tilePane.add(osmServerRBnt, gridBagConstraints);
- osmZipFileField.setText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmZipFileField.text")); // NOI18N
- osmZipFileField.setPreferredSize(new java.awt.Dimension(300, 26));
+ osmServerAddressField.setText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmServerAddressField.text")); // NOI18N
+ osmServerAddressField.setPreferredSize(new java.awt.Dimension(300, 26));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
+ tilePane.add(osmServerAddressField, gridBagConstraints);
+
+ buttonGroup.add(zipFileRBnt);
+ org.openide.awt.Mnemonics.setLocalizedText(zipFileRBnt, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.zipFileRBnt.text")); // NOI18N
+ zipFileRBnt.setActionCommand(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.zipFileRBnt.actionCommand")); // NOI18N
+ zipFileRBnt.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ zipFileRBntActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
+ tilePane.add(zipFileRBnt, gridBagConstraints);
+
+ zipFilePathField.setText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.zipFilePathField.text")); // NOI18N
+ zipFilePathField.setPreferredSize(new java.awt.Dimension(300, 26));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
- tilePane.add(osmZipFileField, gridBagConstraints);
+ tilePane.add(zipFilePathField, gridBagConstraints);
- org.openide.awt.Mnemonics.setLocalizedText(osmZipFileBrowseButton, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.osmZipFileBrowseButton.text")); // NOI18N
- osmZipFileBrowseButton.addActionListener(new java.awt.event.ActionListener() {
+ org.openide.awt.Mnemonics.setLocalizedText(zipFileBrowseBnt, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.zipFileBrowseBnt.text")); // NOI18N
+ zipFileBrowseBnt.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- osmZipFileBrowseButtonActionPerformed(evt);
+ zipFileBrowseBntActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
- gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 9, 9, 9);
- tilePane.add(osmZipFileBrowseButton, gridBagConstraints);
+ tilePane.add(zipFileBrowseBnt, gridBagConstraints);
- org.openide.awt.Mnemonics.setLocalizedText(serverTestButton, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.serverTestButton.text")); // NOI18N
- serverTestButton.addActionListener(new java.awt.event.ActionListener() {
+ org.openide.awt.Mnemonics.setLocalizedText(serverTestBtn, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.serverTestBtn.text")); // NOI18N
+ serverTestBtn.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent evt) {
- serverTestButtonActionPerformed(evt);
+ serverTestBtnActionPerformed(evt);
}
});
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
gridBagConstraints.gridy = 1;
+ gridBagConstraints.ipadx = 20;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
gridBagConstraints.insets = new java.awt.Insets(0, 9, 9, 9);
- tilePane.add(serverTestButton, gridBagConstraints);
+ tilePane.add(serverTestBtn, gridBagConstraints);
+
+ buttonGroup.add(mbtilesRBtn);
+ org.openide.awt.Mnemonics.setLocalizedText(mbtilesRBtn, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.mbtilesRBtn.text")); // NOI18N
+ mbtilesRBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ mbtilesRBtnActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
+ tilePane.add(mbtilesRBtn, gridBagConstraints);
+
+ mbtileFileField.setText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.mbtileFileField.text")); // NOI18N
+ mbtileFileField.setToolTipText(org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.mbtileFileField.toolTipText")); // NOI18N
+ mbtileFileField.setPreferredSize(new java.awt.Dimension(300, 26));
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.insets = new java.awt.Insets(0, 0, 9, 0);
+ tilePane.add(mbtileFileField, gridBagConstraints);
+
+ org.openide.awt.Mnemonics.setLocalizedText(mbtilesBrowseBtn, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.mbtilesBrowseBtn.text")); // NOI18N
+ mbtilesBrowseBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ mbtilesBrowseBtnActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
+ gridBagConstraints.insets = new java.awt.Insets(0, 9, 9, 9);
+ tilePane.add(mbtilesBrowseBtn, gridBagConstraints);
+
+ org.openide.awt.Mnemonics.setLocalizedText(mbtileTestBtn, org.openide.util.NbBundle.getMessage(GeolocationSettingsPanel.class, "GeolocationSettingsPanel.mbtileTestBtn.text")); // NOI18N
+ mbtileTestBtn.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ mbtileTestBtnActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 3;
+ gridBagConstraints.gridy = 3;
+ gridBagConstraints.ipadx = 20;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
+ gridBagConstraints.weightx = 1.0;
+ tilePane.add(mbtileTestBtn, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
@@ -243,7 +312,7 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
add(tilePane, gridBagConstraints);
}// //GEN-END:initComponents
- private void osmZipFileBrowseButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_osmZipFileBrowseButtonActionPerformed
+ private void zipFileBrowseBntActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zipFileBrowseBntActionPerformed
JFileChooser fileWindow = new JFileChooser();
fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
GeneralFilter fileFilter = new GeneralFilter(Arrays.asList(".zip"), "Zips (*.zip)"); //NON-NLS
@@ -253,26 +322,26 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
int returnVal = fileWindow.showSaveDialog(this);
if (returnVal == JFileChooser.APPROVE_OPTION) {
File zipFile = fileWindow.getSelectedFile();
- osmZipFileField.setForeground(Color.BLACK);
- osmZipFileField.setText(zipFile.getAbsolutePath());
+ zipFilePathField.setForeground(Color.BLACK);
+ zipFilePathField.setText(zipFile.getAbsolutePath());
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
}
- }//GEN-LAST:event_osmZipFileBrowseButtonActionPerformed
+ }//GEN-LAST:event_zipFileBrowseBntActionPerformed
- private void defaultButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_defaultButtonActionPerformed
+ private void defaultDataSourceActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_defaultDataSourceActionPerformed
updateControlState();
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
- }//GEN-LAST:event_defaultButtonActionPerformed
+ }//GEN-LAST:event_defaultDataSourceActionPerformed
- private void tileServerButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_tileServerButtonActionPerformed
+ private void osmServerRBntActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_osmServerRBntActionPerformed
updateControlState();
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
- }//GEN-LAST:event_tileServerButtonActionPerformed
+ }//GEN-LAST:event_osmServerRBntActionPerformed
- private void osmZipButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_osmZipButtonActionPerformed
+ private void zipFileRBntActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_zipFileRBntActionPerformed
updateControlState();
firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
- }//GEN-LAST:event_osmZipButtonActionPerformed
+ }//GEN-LAST:event_zipFileRBntActionPerformed
@Messages({
"GeolocationSettingsPanel_malformed_url_message=The supplies OSM tile server address is invalid.\nPlease supply a well formed url prefixed with http://",
@@ -281,8 +350,8 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
"GeolocationSettingsPanel_osm_server_test_fail_message_title=Error",
"GeolocationSettingsPanel_osm_server_test_success_message=The provide OSM tile server address is valid.",
"GeolocationSettingsPanel_osm_server_test_success_message_title=Success",})
- private void serverTestButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_serverTestButtonActionPerformed
- String address = tileServerFiled.getText();
+ private void serverTestBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_serverTestBtnActionPerformed
+ String address = osmServerAddressField.getText();
String message = Bundle.GeolocationSettingsPanel_osm_server_test_fail_message();
String title = Bundle.GeolocationSettingsPanel_osm_server_test_fail_message_title();
@@ -297,31 +366,95 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
}
JOptionPane.showMessageDialog(this, message, title, JOptionPane.INFORMATION_MESSAGE);
- }//GEN-LAST:event_serverTestButtonActionPerformed
+ }//GEN-LAST:event_serverTestBtnActionPerformed
+
+ private void mbtilesRBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mbtilesRBtnActionPerformed
+ updateControlState();
+ firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
+ }//GEN-LAST:event_mbtilesRBtnActionPerformed
+
+ private void mbtilesBrowseBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mbtilesBrowseBtnActionPerformed
+ JFileChooser fileWindow = new JFileChooser();
+ fileWindow.setFileSelectionMode(JFileChooser.FILES_ONLY);
+ GeneralFilter fileFilter = new GeneralFilter(Arrays.asList(".mbtiles"), "MBTiles (*.mbtiles)"); //NON-NLS
+ fileWindow.setDragEnabled(false);
+ fileWindow.setFileFilter(fileFilter);
+ fileWindow.setMultiSelectionEnabled(false);
+ int returnVal = fileWindow.showSaveDialog(this);
+ if (returnVal == JFileChooser.APPROVE_OPTION) {
+ File zipFile = fileWindow.getSelectedFile();
+ mbtileFileField.setForeground(Color.BLACK);
+ mbtileFileField.setText(zipFile.getAbsolutePath());
+ firePropertyChange(OptionsPanelController.PROP_CHANGED, null, null);
+ }
+ }//GEN-LAST:event_mbtilesBrowseBtnActionPerformed
+
+ @Messages({
+ "GeolocationSettings_mbtile_does_not_exist_message=The file supplied does not exist.\nPlease verify that the file exists and try again.",
+ "GeolocationSettings_mbtile_does_not_exist_title=File Not Found",
+ "GeolocationSettings_mbtile_not_valid_message=The supplied file is not a raster tile file.",
+ "GeolocationSettings_mbtile_not_valid_title=File Not Valid",
+ "GeolocationSettings_path_not_valid_message=The supplied file path is empty.\nPlease supply a valid file path.",
+ "GeolocationSettings_path_not_valid_title=File Not Valid",
+ "GeolocationSettings_mbtile_test_success_message=The supplied file is a valid mbtile raster file.",
+ "GeolocationSettings_mbtile_test_success_title=Success",
+ })
+ private void mbtileTestBtnActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_mbtileTestBtnActionPerformed
+ String mbtilePath = mbtileFileField.getText();
+
+ if(mbtilePath.isEmpty()) {
+ JOptionPane.showMessageDialog(this, Bundle.GeolocationSettings_path_not_valid_message(), Bundle.GeolocationSettings_path_not_valid_title(), JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ File file = new File(mbtilePath);
+ if(!file.exists()) {
+ JOptionPane.showMessageDialog(this, Bundle.GeolocationSettings_mbtile_does_not_exist_message(), Bundle.GeolocationSettings_mbtile_does_not_exist_title(), JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+
+ try {
+ if(!MBTilesFileConnector.isValidMBTileRasterFile(mbtilePath)) {
+ JOptionPane.showMessageDialog(this, Bundle.GeolocationSettings_mbtile_not_valid_message(), Bundle.GeolocationSettings_mbtile_not_valid_title(), JOptionPane.ERROR_MESSAGE);
+ return;
+ }
+ } catch (SQLException ex) {
+ JOptionPane.showMessageDialog(this, Bundle.GeolocationSettings_mbtile_not_valid_message(), Bundle.GeolocationSettings_mbtile_not_valid_title(), JOptionPane.ERROR_MESSAGE);
+ logger.log(Level.WARNING, String.format("Exception thrown while testing mbtile file %s", mbtilePath), ex);
+ return;
+ }
+
+ JOptionPane.showMessageDialog(this, Bundle.GeolocationSettings_mbtile_test_success_message(), Bundle.GeolocationSettings_mbtile_test_success_title(), JOptionPane.INFORMATION_MESSAGE);
+ }//GEN-LAST:event_mbtileTestBtnActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JRadioButton defaultButton;
- private javax.swing.JRadioButton osmZipButton;
- private javax.swing.JButton osmZipFileBrowseButton;
- private javax.swing.JTextField osmZipFileField;
- private javax.swing.JButton serverTestButton;
- private javax.swing.JRadioButton tileServerButton;
- private javax.swing.JTextField tileServerFiled;
+ private javax.swing.JRadioButton defaultDataSource;
+ private javax.swing.JTextField mbtileFileField;
+ private javax.swing.JButton mbtileTestBtn;
+ private javax.swing.JButton mbtilesBrowseBtn;
+ private javax.swing.JRadioButton mbtilesRBtn;
+ private javax.swing.JTextField osmServerAddressField;
+ private javax.swing.JRadioButton osmServerRBnt;
+ private javax.swing.JButton serverTestBtn;
+ private javax.swing.JButton zipFileBrowseBnt;
+ private javax.swing.JTextField zipFilePathField;
+ private javax.swing.JRadioButton zipFileRBnt;
// End of variables declaration//GEN-END:variables
/**
* Tile server option enum. The enum was given values to simplify the
* storing of the user preference for a particular option.
*/
- enum GeolocationTileOption{
+ enum GeolocationDataSourceType{
ONLINE_DEFAULT_SERVER(0),
ONLINE_USER_DEFINED_OSM_SERVER(1),
- OFFLINE_OSM_ZIP(2);
+ OFFLINE_OSM_ZIP(2),
+ OFFILE_MBTILES_FILE(3);
private final int value;
- GeolocationTileOption(int value) {
+ GeolocationDataSourceType(int value) {
this.value = value;
}
@@ -329,8 +462,8 @@ final class GeolocationSettingsPanel extends javax.swing.JPanel implements Optio
return value;
}
- static GeolocationTileOption getOptionForValue(int value) {
- for (GeolocationTileOption option : GeolocationTileOption.values()) {
+ static GeolocationDataSourceType getOptionForValue(int value) {
+ for (GeolocationDataSourceType option : GeolocationDataSourceType.values()) {
if (option.getValue() == value) {
return option;
}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.form b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.form
index 16cd5368a6..c51c8d496e 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.form
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.form
@@ -16,6 +16,63 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -24,17 +81,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.java b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.java
index a653979bb6..b1dee1cbb4 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/GeolocationTopComponent.java
@@ -21,13 +21,23 @@ package org.sleuthkit.autopsy.geolocation;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.io.IOException;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
import java.util.EnumSet;
import java.util.List;
+import java.util.Locale;
import java.util.Set;
import java.util.logging.Level;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
+import javax.swing.SwingWorker;
+import org.openide.filesystems.FileUtil;
import org.openide.util.NbBundle.Messages;
import org.openide.windows.RetainLocation;
import org.openide.windows.TopComponent;
@@ -45,6 +55,8 @@ import org.sleuthkit.autopsy.geolocation.datamodel.WaypointBuilder.WaypointFilte
import org.sleuthkit.autopsy.ingest.IngestManager;
import static org.sleuthkit.autopsy.ingest.IngestManager.IngestModuleEvent.DATA_ADDED;
import org.sleuthkit.autopsy.ingest.ModuleDataEvent;
+import org.sleuthkit.autopsy.report.ReportProgressPanel;
+import org.sleuthkit.autopsy.report.modules.kml.KMLReport;
import org.sleuthkit.datamodel.BlackboardArtifact;
/**
@@ -64,10 +76,16 @@ public final class GeolocationTopComponent extends TopComponent {
private static final Set INGEST_MODULE_EVENTS_OF_INTEREST = EnumSet.of(DATA_ADDED);
private final PropertyChangeListener ingestListener;
+ private final PropertyChangeListener caseEventListener;
private final GeoFilterPanel geoFilterPanel;
final RefreshPanel refreshPanel = new RefreshPanel();
+ private static final String REPORT_PATH_FMT_STR = "%s" + File.separator + "%s %s %s" + File.separator;
+
+ // This is the hardcoded report name from KMLReport.java
+ private static final String REPORT_KML = "ReportKML.kml";
+
@Messages({
"GLTopComponent_name=Geolocation",
"GLTopComponent_initilzation_error=An error occurred during waypoint initilization. Geolocation data maybe incomplete."
@@ -79,7 +97,7 @@ public final class GeolocationTopComponent extends TopComponent {
@ThreadConfined(type = ThreadConfined.ThreadType.AWT)
public GeolocationTopComponent() {
initComponents();
-
+
setName(Bundle.GLTopComponent_name());
this.ingestListener = pce -> {
@@ -99,6 +117,13 @@ public final class GeolocationTopComponent extends TopComponent {
}
}
};
+
+ this.caseEventListener = pce -> {
+ mapPanel.clearWaypoints();
+ if (pce.getNewValue() != null) {
+ updateWaypoints();
+ }
+ };
refreshPanel.addCloseActionListener(new ActionListener() {
@Override
@@ -110,6 +135,7 @@ public final class GeolocationTopComponent extends TopComponent {
refreshPanel.addRefreshActionListner(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
+ geoFilterPanel.updateDataSourceList();
mapPanel.clearWaypoints();
updateWaypoints();
showRefreshPanel(false);
@@ -120,36 +146,47 @@ public final class GeolocationTopComponent extends TopComponent {
filterPane.setPanel(geoFilterPanel);
geoFilterPanel.addActionListener(new ActionListener() {
@Override
- public void actionPerformed(ActionEvent e) {
+ public void actionPerformed(ActionEvent e) {
updateWaypoints();
}
});
+
+ mapPanel.addPropertyChangeListener(MapPanel.CURRENT_MOUSE_GEOPOSITION, new PropertyChangeListener() {
+ @Override
+ public void propertyChange(PropertyChangeEvent evt) {
+ String label = "";
+ Object newValue = evt.getNewValue();
+ if (newValue != null) {
+ label = newValue.toString();
+ }
+
+ coordLabel.setText(label);
+ }
+
+ });
}
@Override
public void addNotify() {
super.addNotify();
IngestManager.getInstance().addIngestModuleEventListener(INGEST_MODULE_EVENTS_OF_INTEREST, ingestListener);
- Case.addEventTypeSubscriber(EnumSet.of(CURRENT_CASE), evt -> {
- mapPanel.clearWaypoints();
- if (evt.getNewValue() != null) {
- updateWaypoints();
- }
- });
+ Case.addEventTypeSubscriber(EnumSet.of(CURRENT_CASE), caseEventListener);
}
@Override
public void removeNotify() {
super.removeNotify();
IngestManager.getInstance().removeIngestModuleEventListener(ingestListener);
+ Case.removeEventTypeSubscriber(EnumSet.of(CURRENT_CASE), caseEventListener);
}
@Override
public void componentOpened() {
super.componentOpened();
WindowManager.getDefault().setTopComponentFloating(this, true);
+
}
-
+
@Messages({
"GeolocationTC_connection_failure_message=Failed to connect to map title source.\nPlease review map source in Options dialog.",
"GeolocationTC_connection_failure_message_title=Connection Failure"
@@ -157,20 +194,22 @@ public final class GeolocationTopComponent extends TopComponent {
@Override
public void open() {
super.open();
+ geoFilterPanel.clearDataSourceList();
geoFilterPanel.updateDataSourceList();
try {
mapPanel.initMap();
} catch (GeoLocationDataException ex) {
- JOptionPane.showMessageDialog(this,
- Bundle.GeolocationTC_connection_failure_message(),
- Bundle.GeolocationTC_connection_failure_message_title(),
- JOptionPane.ERROR_MESSAGE);
- MessageNotifyUtil.Notify.error(
- Bundle.GeolocationTC_connection_failure_message_title(),
- Bundle.GeolocationTC_connection_failure_message());
- logger.log(Level.SEVERE, ex.getMessage(), ex);
- return; // Doen't set the waypoints.
+ JOptionPane.showMessageDialog(this,
+ Bundle.GeolocationTC_connection_failure_message(),
+ Bundle.GeolocationTC_connection_failure_message_title(),
+ JOptionPane.ERROR_MESSAGE);
+ MessageNotifyUtil.Notify.error(
+ Bundle.GeolocationTC_connection_failure_message_title(),
+ Bundle.GeolocationTC_connection_failure_message());
+ logger.log(Level.SEVERE, ex.getMessage(), ex);
+ return; // Doen't set the waypoints.
}
+ mapPanel.setWaypoints(new ArrayList<>());
updateWaypoints();
}
@@ -207,42 +246,56 @@ public final class GeolocationTopComponent extends TopComponent {
try {
filters = geoFilterPanel.getFilterState();
} catch (GeoLocationUIException ex) {
- JOptionPane.showMessageDialog(this,
- Bundle.GeoTopComponent_filer_data_invalid_msg(),
- Bundle.GeoTopComponent_filer_data_invalid_Title(),
- JOptionPane.INFORMATION_MESSAGE);
+ JOptionPane.showMessageDialog(this,
+ Bundle.GeoTopComponent_filer_data_invalid_msg(),
+ Bundle.GeoTopComponent_filer_data_invalid_Title(),
+ JOptionPane.INFORMATION_MESSAGE);
return;
}
- SwingUtilities.invokeLater(new Runnable() {
- public void run() {
- Case currentCase = Case.getCurrentCase();
- try {
- WaypointBuilder.getAllWaypoints(currentCase.getSleuthkitCase(), filters.getDataSources(), filters.showAllWaypoints(), filters.getMostRecentNumDays(), filters.showWaypointsWithoutTimeStamp(), new WaypointFilterQueryCallBack() {
- @Override
- public void process(List waypoints) {
- // If the list is empty, tell the user and do not change
- // the visible waypoints.
- if (waypoints == null || waypoints.isEmpty()) {
- JOptionPane.showMessageDialog(GeolocationTopComponent.this,
- Bundle.GeoTopComponent_no_waypoints_returned_Title(),
- Bundle.GeoTopComponent_no_waypoints_returned_mgs(),
- JOptionPane.INFORMATION_MESSAGE);
-
- return;
- }
- mapPanel.setWaypoints(MapWaypoint.getWaypoints(waypoints));
- }
- });
- } catch (GeoLocationDataException ex) {
- logger.log(Level.SEVERE, "Failed to filter waypoints.", ex);
- JOptionPane.showMessageDialog(GeolocationTopComponent.this,
- Bundle.GeoTopComponent_filter_exception_Title(),
- Bundle.GeoTopComponent_filter_exception_msg(),
- JOptionPane.ERROR_MESSAGE);
- }
- }
- });
+ setWaypointLoading(true);
+ geoFilterPanel.setEnabled(false);
+
+ Thread thread = new Thread(new WaypointRunner(filters));
+ thread.start();
+ }
+
+ /**
+ * Show or hide the waypoint loading progress bar.
+ *
+ * @param loading
+ */
+ void setWaypointLoading(boolean loading) {
+ progressBar.setEnabled(true);
+ progressBar.setVisible(loading);
+ progressBar.setString("Loading Waypoints");
+ }
+
+ /**
+ * Create the directory path for the KML report.
+ *
+ * This is a modified version of the similar private function from
+ * KMLReport.
+ *
+ * @return Path for the report
+ *
+ * @throws IOException
+ */
+ private static String createReportDirectory() throws IOException {
+ Case currentCase = Case.getCurrentCase();
+
+ // Create the root reports directory path of the form: /Reports/ /
+ DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy-HH-mm-ss", Locale.US);
+ Date date = new Date();
+ String dateNoTime = dateFormat.format(date);
+ String reportPath = String.format(REPORT_PATH_FMT_STR, currentCase.getReportDirectory(), currentCase.getDisplayName(), "Goggle Earth KML", dateNoTime);
+ // Create the root reports directory.
+ try {
+ FileUtil.createFolder(new File(reportPath));
+ } catch (IOException ex) {
+ throw new IOException("Failed to make report folder, unable to generate reports.", ex);
+ }
+ return reportPath;
}
/**
@@ -253,20 +306,165 @@ public final class GeolocationTopComponent extends TopComponent {
@SuppressWarnings("unchecked")
// //GEN-BEGIN:initComponents
private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
- mapPanel = new org.sleuthkit.autopsy.geolocation.MapPanel();
filterPane = new org.sleuthkit.autopsy.geolocation.HidingPane();
+ statusBar = new javax.swing.JPanel();
+ reportButton = new javax.swing.JButton();
+ progressBar = new javax.swing.JProgressBar();
+ coordLabel = new javax.swing.JLabel();
+ mapPanel = new org.sleuthkit.autopsy.geolocation.MapPanel();
setLayout(new java.awt.BorderLayout());
+ add(filterPane, java.awt.BorderLayout.WEST);
- mapPanel.add(filterPane, java.awt.BorderLayout.LINE_START);
+ statusBar.setLayout(new java.awt.GridBagLayout());
+ org.openide.awt.Mnemonics.setLocalizedText(reportButton, org.openide.util.NbBundle.getMessage(GeolocationTopComponent.class, "GeolocationTopComponent.reportButton.text")); // NOI18N
+ reportButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ reportButtonActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
+ statusBar.add(reportButton, gridBagConstraints);
+
+ progressBar.setIndeterminate(true);
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ statusBar.add(progressBar, gridBagConstraints);
+
+ org.openide.awt.Mnemonics.setLocalizedText(coordLabel, org.openide.util.NbBundle.getMessage(GeolocationTopComponent.class, "GeolocationTopComponent.coordLabel.text")); // NOI18N
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.weightx = 1.0;
+ gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 0);
+ statusBar.add(coordLabel, gridBagConstraints);
+
+ add(statusBar, java.awt.BorderLayout.SOUTH);
add(mapPanel, java.awt.BorderLayout.CENTER);
}// //GEN-END:initComponents
+ @Messages({
+ "GeolocationTC_empty_waypoint_message=Unable to generate KML report due to a lack of waypoints.\nPlease make sure there are waypoints visible before generating the KML report",
+ "GeolocationTC_KML_report_title=KML Report",
+ "GeolocationTC_report_progress_title=KML Report Progress"
+ })
+ private void reportButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_reportButtonActionPerformed
+ List visiblePoints = mapPanel.getVisibleWaypoints();
+ if (visiblePoints.isEmpty()) {
+ JOptionPane.showConfirmDialog(this, Bundle.GeolocationTC_empty_waypoint_message(), Bundle.GeolocationTC_KML_report_title(), JOptionPane.OK_OPTION, JOptionPane.INFORMATION_MESSAGE);
+ return;
+ }
+
+ try {
+ ReportProgressPanel progressPanel = new ReportProgressPanel();
+ String reportBaseDir = createReportDirectory();
+
+ progressPanel.setLabels(REPORT_KML, reportBaseDir);
+
+ SwingWorker worker = new SwingWorker() {
+ @Override
+ protected Void doInBackground() throws Exception {
+ KMLReport.getDefault().generateReport(reportBaseDir, progressPanel, MapWaypoint.getDataModelWaypoints(visiblePoints));
+ return null;
+ }
+ };
+ worker.execute();
+ JOptionPane.showConfirmDialog(this, progressPanel, Bundle.GeolocationTC_report_progress_title(), JOptionPane.CLOSED_OPTION, JOptionPane.PLAIN_MESSAGE);
+ } catch (IOException ex) {
+ logger.log(Level.WARNING, "Unable to create KML report", ex);
+ }
+ }//GEN-LAST:event_reportButtonActionPerformed
+
// Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JLabel coordLabel;
private org.sleuthkit.autopsy.geolocation.HidingPane filterPane;
private org.sleuthkit.autopsy.geolocation.MapPanel mapPanel;
+ private javax.swing.JProgressBar progressBar;
+ private javax.swing.JButton reportButton;
+ private javax.swing.JPanel statusBar;
// End of variables declaration//GEN-END:variables
+
+ /**
+ * A runnable class for getting waypoints based on the current filters.
+ */
+ private class WaypointRunner implements Runnable {
+
+ private final GeoFilter filters;
+
+ /**
+ * Constructs the Waypoint Runner
+ *
+ * @param filters
+ */
+ WaypointRunner(GeoFilter filters) {
+ this.filters = filters;
+ }
+
+ @Override
+ public void run() {
+ Case currentCase = Case.getCurrentCase();
+ try {
+ WaypointBuilder.getAllWaypoints(currentCase.getSleuthkitCase(),
+ filters.getDataSources(),
+ filters.showAllWaypoints(),
+ filters.getMostRecentNumDays(),
+ filters.showWaypointsWithoutTimeStamp(),
+ new WaypointCallBack());
+
+ } catch (GeoLocationDataException ex) {
+ logger.log(Level.SEVERE, "Failed to filter waypoints.", ex);
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ JOptionPane.showMessageDialog(GeolocationTopComponent.this,
+ Bundle.GeoTopComponent_filter_exception_Title(),
+ Bundle.GeoTopComponent_filter_exception_msg(),
+ JOptionPane.ERROR_MESSAGE);
+ }
+ });
+ }
+ }
+
+ }
+
+ /**
+ * Callback for getting waypoints.
+ */
+ private class WaypointCallBack implements WaypointFilterQueryCallBack {
+
+ @Override
+ public void process(List waypoints) {
+ // Make sure that the waypoints are added to the map panel in
+ // the correct thread.
+ SwingUtilities.invokeLater(new Runnable() {
+ @Override
+ public void run() {
+ // If the list is empty, tell the user and do not change
+ // the visible waypoints.
+ if (waypoints == null || waypoints.isEmpty()) {
+ JOptionPane.showMessageDialog(GeolocationTopComponent.this,
+ Bundle.GeoTopComponent_no_waypoints_returned_Title(),
+ Bundle.GeoTopComponent_no_waypoints_returned_mgs(),
+ JOptionPane.INFORMATION_MESSAGE);
+
+ return;
+ }
+ mapPanel.setWaypoints(MapWaypoint.getWaypoints(waypoints));
+ setWaypointLoading(false);
+ geoFilterPanel.setEnabled(true);
+ }
+ });
+ }
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesFileConnector.java b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesFileConnector.java
new file mode 100755
index 0000000000..7990b09a29
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesFileConnector.java
@@ -0,0 +1,138 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.geolocation;
+
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import org.jxmapviewer.OSMTileFactoryInfo;
+import org.jxmapviewer.viewer.TileFactoryInfo;
+import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
+
+/**
+ * Wraps the connection to the MBTiles file\sqlite db.
+ */
+final class MBTilesFileConnector {
+
+ private final static String DB_URL = "jdbc:sqlite:%s";
+ private final static String TILE_QUERY = "SELECT tile_data FROM images WHERE tile_id = '%s'";
+ private final static String FORMAT_QUERY = "SELECT value FROM metadata WHERE name='format'";
+ private final TileFactoryInfo factoryInfo;
+ private final String connectionString;
+
+ /**
+ * Returns whether or not the file at the given path is a mbtiles file.
+ *
+ * @param filePath Absolute path the the file.
+ *
+ * @return True if the file is an mbtiles file
+ *
+ * @throws SQLException
+ */
+ static boolean isValidMBTileRasterFile(String filePath) throws SQLException {
+ Path p = Paths.get(filePath);
+ if (!p.toFile().exists()) {
+ return false;
+ }
+
+ String path = filePath.replaceAll("\\\\", "/");
+ String url = String.format(DB_URL, path);
+
+ try (Connection connection = DriverManager.getConnection(url)) {
+ try (Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(FORMAT_QUERY)) {
+ if (resultSet.next()) {
+ String format = resultSet.getString(1);
+ return format.equals("jpg");
+ }
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Construct a new connection to the MBTile file.
+ *
+ * @param tileFilePath MBTiles file absolute path
+ *
+ * @throws GeoLocationDataException
+ */
+ MBTilesFileConnector(String tileFilePath) throws GeoLocationDataException {
+ String path = tileFilePath.replaceAll("\\\\", "/");
+ connectionString = String.format(DB_URL, path);
+ factoryInfo = new MBTilesInfo();
+ }
+
+ /**
+ * Returns the TileFacortyInfo object for the MBTile file.
+ *
+ * @return TileFactoryInfo object or null if the connection has been closed.
+ */
+ TileFactoryInfo getInfo() {
+ return factoryInfo;
+ }
+
+ /**
+ * Get the tile for the given tileID.
+ *
+ * @param tileID String tile ID in the format of zoom/x/y
+ *
+ * @return The tile image byte array or an empty array if the tile was not
+ * found.
+ *
+ * @throws GeoLocationDataException
+ */
+ byte[] getTileBytes(String tileID) throws GeoLocationDataException {
+ String query = String.format(TILE_QUERY, tileID);
+
+ try (Connection connection = DriverManager.getConnection(connectionString)) {
+ try (Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery(query)) {
+ if (resultSet.next()) {
+ return resultSet.getBytes(1);
+ }
+ }
+ } catch (SQLException ex) {
+ throw new GeoLocationDataException(String.format("Failed to get tile %s", tileID), ex);
+ }
+ return new byte[0];
+ }
+
+ /**
+ * Overload the existing OSMTileFacotyInfo to return a "url" specific to
+ * MBTiles.
+ */
+ private final class MBTilesInfo extends OSMTileFactoryInfo {
+
+ MBTilesInfo() {
+ super("MBTilesFile", "");
+ }
+
+ @Override
+ public String getTileUrl(int x, int y, int zoom) {
+ // OSM zoom levels are reversed from how the TileFactory deals with
+ // them.
+ int osmZoom = getTotalMapZoom() - zoom;
+ return String.format("%d/%d/%d", osmZoom, x, y);
+ }
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTile.java b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTile.java
new file mode 100755
index 0000000000..848f31511c
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTile.java
@@ -0,0 +1,122 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.geolocation;
+
+import java.awt.image.BufferedImage;
+import java.lang.ref.SoftReference;
+
+import org.jxmapviewer.viewer.Tile;
+
+/**
+ * Provides a MBTile specific implementation of Tile.
+ *
+ * This class borrows functionality from Tile.
+ */
+final class MBTilesTile extends Tile {
+
+ private SoftReference image = new SoftReference<>(null);
+ private Priority priority = Priority.High;
+ private boolean loaded = false;
+ private final String tileID;
+
+ /**
+ * Construct an empty tile.
+ *
+ * @param x
+ * @param y
+ * @param zoom
+ */
+ MBTilesTile(int x, int y, int zoom) {
+ super(x, y, zoom);
+ tileID = null;
+ }
+
+ /**
+ * Construct a new tile.
+ *
+ * @param x Tile row
+ * @param y Tile column
+ * @param zoom Tile Zoom level
+ * @param tileID Tile identifier
+ * @param priority Priority for loading the tile
+ */
+ MBTilesTile(int x, int y, int zoom, String tileID, Priority priority) {
+ super(x, y, zoom);
+ this.priority = priority;
+ this.tileID = tileID;
+ }
+
+ /**
+ * Sets the image for this Tile.
+ *
+ * @param image
+ */
+ void setImage(BufferedImage image) {
+ this.image = new SoftReference<>(image);
+ setLoaded(true);
+ }
+
+ /**
+ * Indicates if this tile's underlying image has been successfully loaded
+ * yet.
+ *
+ * @return true if the Tile has been loaded
+ */
+ @Override
+ public synchronized boolean isLoaded() {
+ return loaded;
+ }
+
+ synchronized void setLoaded(boolean loaded) {
+ boolean old = isLoaded();
+ this.loaded = loaded;
+ firePropertyChange("loaded", old, isLoaded());
+ }
+
+ @Override
+ public BufferedImage getImage() {
+ BufferedImage img = image.get();
+ if (img == null) {
+ setLoaded(false);
+ }
+ return img;
+ }
+
+ @Override
+ public Priority getPriority() {
+ return priority;
+ }
+
+ @Override
+ public void setPriority(Priority priority) {
+ this.priority = priority;
+ }
+
+ /**
+ * Overloading the original version of this function to return the tileID
+ * for this tile.
+ *
+ * @return tileID or null if none was set
+ */
+ @Override
+ public String getURL() {
+ return tileID;
+ }
+
+}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTileFactory.java b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTileFactory.java
new file mode 100755
index 0000000000..372d2e1561
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MBTilesTileFactory.java
@@ -0,0 +1,351 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.geolocation;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.PriorityBlockingQueue;
+import java.util.concurrent.ThreadFactory;
+import java.util.logging.Level;
+
+import javax.imageio.ImageIO;
+import javax.swing.SwingUtilities;
+
+import org.jxmapviewer.viewer.Tile;
+import org.jxmapviewer.viewer.TileCache;
+import org.jxmapviewer.viewer.TileFactory;
+import org.jxmapviewer.viewer.util.GeoUtil;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
+
+/**
+ * This TileFactory class borrows from org.jxmapviewer.viewer.AbstractTileFactory, changing to support
+ * the getting the tiles from a database instead the web.
+ *
+ * @see AbstractTileFactory
+ *
+ */
+final class MBTilesTileFactory extends TileFactory {
+
+ private static final Logger logger = Logger.getLogger(MBTilesTileFactory.class.getName());
+
+ private volatile int pendingTiles = 0;
+ private static final int THREAD_POOL_SIZE = 4;
+ private ExecutorService service;
+
+ private final Map tileMap;
+
+ private final TileCache cache;
+
+ private MBTilesFileConnector connector;
+
+ /**
+ * Construct a new TileFactory for the MBTiles file at the given location.
+ *
+ * @param filePath
+ *
+ * @throws GeoLocationDataException
+ */
+ MBTilesTileFactory(String filePath) throws GeoLocationDataException {
+ this(new MBTilesFileConnector(filePath));
+ }
+
+ /**
+ * Construct a new TileFacotry.
+ *
+ * @param connector
+ */
+ private MBTilesTileFactory(MBTilesFileConnector connector) {
+ super(connector.getInfo());
+ this.connector = connector;
+ cache = new TileCache();
+ tileMap = new HashMap<>();
+ }
+
+ /**
+ * Returns the tile that is located at the given tile point for this zoom.
+ *
+ * @param x Tile column
+ * @param y Tile row
+ * @param zoom Current zoom level
+ *
+ * @return A new Tile object
+ *
+ */
+ @Override
+ public Tile getTile(int x, int y, int zoom) {
+ return getTile(x, y, zoom, true);
+ }
+
+ /**
+ * Returns the tile object for the given location.
+ *
+ * @param tpx
+ * @param tpy
+ * @param zoom
+ * @param eagerLoad
+ *
+ * @return
+ */
+ private Tile getTile(int tpx, int tpy, int zoom, boolean eagerLoad) {
+ // wrap the tiles horizontally --> mod the X with the max width
+ // and use that
+ int tileX = tpx;// tilePoint.getX();
+ int numTilesWide = (int) getMapSize(zoom).getWidth();
+ if (tileX < 0) {
+ tileX = numTilesWide - (Math.abs(tileX) % numTilesWide);
+ }
+
+ tileX %= numTilesWide;
+ int tileY = tpy;
+
+ String url = getInfo().getTileUrl(tileX, tileY, zoom);
+
+ Tile.Priority pri = Tile.Priority.High;
+ if (!eagerLoad) {
+ pri = Tile.Priority.Low;
+ }
+ Tile tile;
+ if (!tileMap.containsKey(url)) {
+ // If its not a valid tile location return an empty tile.
+ if (!GeoUtil.isValidTile(tileX, tileY, zoom, getInfo())) {
+ tile = new MBTilesTile(tileX, tileY, zoom);
+ } else {
+ tile = new MBTilesTile(tileX, tileY, zoom, url, pri);
+ startLoading(tile);
+ }
+ tileMap.put(url, tile);
+ } else {
+ tile = tileMap.get(url);
+ // If the tile is in the tileMap, but the image is not loaded yet,
+ // bump the priority.
+ if (tile.getPriority() == Tile.Priority.Low && eagerLoad && !tile.isLoaded()) {
+ promote(tile);
+ }
+ }
+
+ return tile;
+ }
+
+ /**
+ * Returns the TileCache.
+ *
+ * @return the tile cache
+ */
+ TileCache getTileCache() {
+ return cache;
+ }
+
+ /**
+ * ==== Threaded Tile loading code ===
+ */
+ /**
+ * Thread pool for loading the tiles
+ */
+ private final BlockingQueue tileQueue = new PriorityBlockingQueue<>(5, new Comparator() {
+ @Override
+ public int compare(Tile o1, Tile o2) {
+ if (o1.getPriority() == Tile.Priority.Low && o2.getPriority() == Tile.Priority.High) {
+ return 1;
+ }
+ if (o1.getPriority() == Tile.Priority.High && o2.getPriority() == Tile.Priority.Low) {
+ return -1;
+ }
+ return 0;
+
+ }
+ });
+
+ /**
+ * Subclasses may override this method to provide their own executor
+ * services. This method will be called each time a tile needs to be loaded.
+ * Implementations should cache the ExecutorService when possible.
+ *
+ * @return ExecutorService to load tiles with
+ */
+ synchronized ExecutorService getService() {
+ if (service == null) {
+ // System.out.println("creating an executor service with a threadpool of size " + threadPoolSize);
+ service = Executors.newFixedThreadPool(THREAD_POOL_SIZE, new ThreadFactory() {
+ private int count = 0;
+
+ @Override
+ public Thread newThread(Runnable r) {
+ Thread t = new Thread(r, "tile-pool-" + count++);
+ t.setPriority(Thread.MIN_PRIORITY);
+ t.setDaemon(true);
+ return t;
+ }
+ });
+ }
+ return service;
+ }
+
+ @Override
+ public void dispose() {
+ if (service != null) {
+ service.shutdown();
+ service = null;
+ }
+ }
+
+ @Override
+ protected synchronized void startLoading(Tile tile) {
+ if (tile.isLoading()) {
+ return;
+ }
+ pendingTiles++;
+ tile.setLoading(true);
+ try {
+ tileQueue.put(tile);
+ getService().submit(new TileRunner());
+ } catch (InterruptedException ex) {
+
+ }
+ }
+
+ /**
+ * Increase the priority of this tile so it will be loaded sooner.
+ *
+ * @param tile the tile
+ */
+ synchronized void promote(Tile tile) {
+ if (tileQueue.contains(tile)) {
+ try {
+ tileQueue.remove(tile);
+ tile.setPriority(Tile.Priority.High);
+ tileQueue.put(tile);
+ } catch (InterruptedException ex) {
+
+ }
+ }
+ }
+
+ /**
+ * @return the number of pending (loading or queues) tiles
+ */
+ int getPendingTiles() {
+ return pendingTiles;
+ }
+
+ /**
+ * An inner class which actually loads the tiles. Used by the thread queue.
+ * Subclasses can override this via {@link #createTileRunner(Tile)} if
+ * necessary.
+ */
+ private class TileRunner implements Runnable {
+
+ /**
+ * Gets the full URI of a tile.
+ *
+ * @param tile the tile
+ *
+ * @throws URISyntaxException if the URI is invalid
+ * @return a URI for the tile
+ */
+ protected URI getURI(Tile tile) throws URISyntaxException {
+ if (tile.getURL() == null) {
+ return null;
+ }
+ return new URI(tile.getURL());
+ }
+
+ @Override
+ public void run() {
+ /*
+ * Attempt to load the tile from . If loading fails, retry two more
+ * times. If all attempts fail, nothing else is done. This way, if
+ * there is some kind of failure, the pooled thread can try to load
+ * other tiles.
+ */
+ final Tile tile = tileQueue.remove();
+
+ int remainingAttempts = 3;
+ while (!tile.isLoaded() && remainingAttempts > 0) {
+ remainingAttempts--;
+ try {
+ URI uri = getURI(tile);
+ BufferedImage img = cache.get(uri);
+ if (img == null) {
+ img = getImage(uri);
+ }
+ if (img != null) {
+ addImageToTile(tile, img);
+ }
+ } catch (OutOfMemoryError memErr) {
+ cache.needMoreMemory();
+ } catch (IOException | GeoLocationDataException | InterruptedException | InvocationTargetException | URISyntaxException ex) {
+ if (remainingAttempts == 0) {
+ logger.log(Level.SEVERE, String.format("Failed to load a tile at URL: %s, stopping", tile.getURL()), ex);
+ } else {
+ logger.log(Level.WARNING, "Failed to load a tile at URL: " + tile.getURL() + ", retrying", ex);
+ }
+ }
+ }
+ tile.setLoading(false);
+ }
+ }
+
+ /**
+ *
+ * @param uri
+ * @return
+ * @throws IOException
+ * @throws GeoLocationDataException
+ */
+ private BufferedImage getImage(URI uri ) throws IOException, GeoLocationDataException{
+ BufferedImage img = null;
+ byte[] bimg = connector.getTileBytes(uri.toString());
+ if (bimg != null && bimg.length > 0) {
+ img = ImageIO.read(new ByteArrayInputStream(bimg));
+ cache.put(uri, bimg, img);
+ }
+ return img;
+ }
+
+ /**
+ *
+ * @param tile
+ * @param image
+ * @throws InterruptedException
+ * @throws InvocationTargetException
+ */
+ private void addImageToTile(Tile tile, BufferedImage image) throws InterruptedException, InvocationTargetException {
+ SwingUtilities.invokeAndWait(new Runnable() {
+ @Override
+ public void run() {
+ if (tile instanceof MBTilesTile) {
+ ((MBTilesTile) tile).setImage(image);
+ }
+ pendingTiles--;
+ fireTileLoadedEvent(tile);
+ }
+ });
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.form b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.form
index 454008c062..bea654be40 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.form
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.form
@@ -91,28 +91,5 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java
index fb5cdc23e5..7be6ac25a8 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapPanel.java
@@ -19,19 +19,24 @@
package org.sleuthkit.autopsy.geolocation;
import java.awt.Dimension;
+import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
+import java.awt.event.MouseEvent;
import java.awt.geom.Point2D;
+import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
import java.util.Collection;
-import java.util.HashSet;
import java.util.Iterator;
+import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
@@ -45,6 +50,7 @@ import javax.swing.Popup;
import javax.swing.PopupFactory;
import javax.swing.Timer;
import javax.swing.event.MouseInputListener;
+import org.jxmapviewer.JXMapViewer;
import org.jxmapviewer.OSMTileFactoryInfo;
import org.jxmapviewer.VirtualEarthTileFactoryInfo;
import org.jxmapviewer.input.CenterMapListener;
@@ -56,19 +62,22 @@ import org.jxmapviewer.viewer.TileFactory;
import org.jxmapviewer.viewer.TileFactoryInfo;
import org.jxmapviewer.viewer.Waypoint;
import org.jxmapviewer.viewer.WaypointPainter;
-import org.jxmapviewer.viewer.util.GeoUtil;
+import org.jxmapviewer.viewer.WaypointRenderer;
import org.openide.util.NbBundle.Messages;
import org.sleuthkit.autopsy.core.UserPreferences;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
import org.sleuthkit.autopsy.geolocation.datamodel.GeoLocationDataException;
import org.sleuthkit.datamodel.TskCoreException;
+import javax.imageio.ImageIO;
+import org.jxmapviewer.viewer.DefaultWaypointRenderer;
/**
* The map panel. This panel contains the jxmapviewer MapViewer
*/
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;
@@ -113,7 +122,10 @@ final public class MapPanel extends javax.swing.JPanel {
@Override
public void preferenceChange(PreferenceChangeEvent evt) {
try {
- mapViewer.setTileFactory(new DefaultTileFactory(getTileFactoryInfo()));
+ // Tell the old factory to cleanup
+ mapViewer.getTileFactory().dispose();
+
+ mapViewer.setTileFactory(getTileFactory());
initializeZoomSlider();
} catch (GeoLocationDataException ex) {
logger.log(Level.SEVERE, "Failed to connect to new geolocation tile server.", ex); //NON-NLS
@@ -122,20 +134,40 @@ final public class MapPanel extends javax.swing.JPanel {
Bundle.MapPanel_connection_failure_message_title(),
JOptionPane.ERROR_MESSAGE);
MessageNotifyUtil.Notify.error(
- Bundle.MapPanel_connection_failure_message_title(),
- Bundle.MapPanel_connection_failure_message());
+ Bundle.MapPanel_connection_failure_message_title(),
+ Bundle.MapPanel_connection_failure_message());
}
}
});
}
+ /**
+ * Get a list of the waypoints that are currently visible in the viewport.
+ *
+ * @return A list of waypoints or empty list if none were found.
+ */
+ List getVisibleWaypoints() {
+
+ Rectangle viewport = mapViewer.getViewportBounds();
+ List waypoints = new ArrayList<>();
+
+ Iterator iterator = waypointTree.iterator();
+ while (iterator.hasNext()) {
+ MapWaypoint waypoint = iterator.next();
+ if (viewport.contains(mapViewer.getTileFactory().geoToPixel(waypoint.getPosition(), mapViewer.getZoom()))) {
+ waypoints.add(waypoint);
+ }
+ }
+
+ return waypoints;
+ }
+
/**
* Initialize the map.
*/
void initMap() throws GeoLocationDataException {
- TileFactoryInfo info = getTileFactoryInfo();
- DefaultTileFactory tileFactory = new DefaultTileFactory(info);
+ TileFactory tileFactory = getTileFactory();
mapViewer.setTileFactory(tileFactory);
// Add Mouse interactions
@@ -158,23 +190,40 @@ final public class MapPanel extends javax.swing.JPanel {
zoomSlider.setMaximum(tileFactory.getInfo().getMaximumZoomLevel());
setZoom(tileFactory.getInfo().getMaximumZoomLevel() - 1);
-
- mapViewer.setCenterPosition(new GeoPosition(0,0));
+
+ mapViewer.setCenterPosition(new GeoPosition(0, 0));
// Basic painters for the way points.
WaypointPainter waypointPainter = new WaypointPainter() {
@Override
public Set getWaypoints() {
- Set set = new HashSet<>();
+ //To assure that the currentlySelectedWaypoint is visible it needs
+ // to be painted last. LinkedHashSet has a predicable ordering.
+ Set set = new LinkedHashSet<>();
if (waypointTree != null) {
Iterator iterator = waypointTree.iterator();
while (iterator.hasNext()) {
- set.add(iterator.next());
+ MapWaypoint point = iterator.next();
+ if (point != currentlySelectedWaypoint) {
+ set.add(point);
+ }
+ }
+ // Add the currentlySelectedWaypoint to the end so that
+ // it will be painted last.
+ if (currentlySelectedWaypoint != null) {
+ set.add(currentlySelectedWaypoint);
}
}
return set;
}
};
+
+ try {
+ waypointPainter.setRenderer(new MapWaypointRenderer());
+ } catch (IOException ex) {
+ logger.log(Level.WARNING, "Failed to load waypoint image resource, using DefaultWaypointRenderer", ex);
+ waypointPainter.setRenderer(new DefaultWaypointRenderer());
+ }
mapViewer.setOverlayPainter(waypointPainter);
}
@@ -192,50 +241,49 @@ final public class MapPanel extends javax.swing.JPanel {
}
/**
- * Create the TileFactoryInfo object based on the user preference.
+ * Create the TileFactory object based on the user preference.
*
* @return
*/
- TileFactoryInfo getTileFactoryInfo() throws GeoLocationDataException {
- switch (GeolocationSettingsPanel.GeolocationTileOption.getOptionForValue(UserPreferences.getGeolocationtTileOption())) {
+ private TileFactory getTileFactory() throws GeoLocationDataException {
+ switch (GeolocationSettingsPanel.GeolocationDataSourceType.getOptionForValue(UserPreferences.getGeolocationtTileOption())) {
case ONLINE_USER_DEFINED_OSM_SERVER:
- return createOnlineOSMFactory(UserPreferences.getGeolocationOsmServerAddress());
+ return new DefaultTileFactory(createOnlineOSMFactory(UserPreferences.getGeolocationOsmServerAddress()));
case OFFLINE_OSM_ZIP:
- return createOSMZipFactory(UserPreferences.getGeolocationOsmZipPath());
+ return new DefaultTileFactory(createOSMZipFactory(UserPreferences.getGeolocationOsmZipPath()));
+ case OFFILE_MBTILES_FILE:
+ return new MBTilesTileFactory(UserPreferences.getGeolocationMBTilesFilePath());
default:
- return new VirtualEarthTileFactoryInfo(VirtualEarthTileFactoryInfo.MAP);
+ return new DefaultTileFactory(new VirtualEarthTileFactoryInfo(VirtualEarthTileFactoryInfo.MAP));
}
}
-
+
/**
* Create the TileFactoryInfo for an online OSM tile server.
- *
- * @param address Tile server address
- *
+ *
+ * @param address Tile server address
+ *
* @return TileFactoryInfo object for server address.
- *
- * @throws GeoLocationDataException
+ *
+ * @throws GeoLocationDataException
*/
private TileFactoryInfo createOnlineOSMFactory(String address) throws GeoLocationDataException {
if (address.isEmpty()) {
throw new GeoLocationDataException("Invalid user preference for OSM user define tile server. Address is an empty string.");
} else {
TileFactoryInfo info = new OSMTileFactoryInfo("User Defined Server", address);
- if (!GeoUtil.isValidTile(1, 1, 1, info)) {
- throw new GeoLocationDataException(String.format("Invalid OSM user define tile server: %s", address));
- }
return info;
}
}
-
+
/**
* Create the TileFactoryInfo for OSM zip File
- *
+ *
* @param zipPath Path to zip file.
- *
+ *
* @return TileFactoryInfo for zip file.
- *
- * @throws GeoLocationDataException
+ *
+ * @throws GeoLocationDataException
*/
private TileFactoryInfo createOSMZipFactory(String path) throws GeoLocationDataException {
if (path.isEmpty()) {
@@ -300,7 +348,10 @@ final public class MapPanel extends javax.swing.JPanel {
// it the popup is currently visible
if (waypoint != null && !waypoint.equals(currentlySelectedWaypoint)) {
currentlySelectedWaypoint = waypoint;
- showDetailsPopup();
+ if(currentPopup != null) {
+ showDetailsPopup();
+ }
+ mapViewer.repaint();
}
} catch (TskCoreException ex) {
logger.log(Level.WARNING, "Failed to show popup for waypoint", ex);
@@ -328,7 +379,7 @@ final public class MapPanel extends javax.swing.JPanel {
popupMenu.add(new JSeparator());
}
}
- popupMenu.show(this, point.x, point.y);
+ popupMenu.show(mapViewer, point.x, point.y);
}
/**
@@ -358,6 +409,8 @@ final public class MapPanel extends javax.swing.JPanel {
currentPopup = popupFactory.getPopup(this, detailPane, popupLocation.x, popupLocation.y);
currentPopup.show();
+
+ mapViewer.repaint();
}
}
@@ -484,8 +537,6 @@ final public class MapPanel extends javax.swing.JPanel {
mapViewer = new org.jxmapviewer.JXMapViewer();
zoomPanel = new javax.swing.JPanel();
zoomSlider = new javax.swing.JSlider();
- infoPanel = new javax.swing.JPanel();
- cordLabel = new javax.swing.JLabel();
setFocusable(false);
setLayout(new java.awt.BorderLayout());
@@ -552,13 +603,6 @@ final public class MapPanel extends javax.swing.JPanel {
mapViewer.add(zoomPanel, gridBagConstraints);
add(mapViewer, java.awt.BorderLayout.CENTER);
-
- infoPanel.setLayout(new java.awt.BorderLayout());
-
- org.openide.awt.Mnemonics.setLocalizedText(cordLabel, org.openide.util.NbBundle.getMessage(MapPanel.class, "MapPanel.cordLabel.text")); // NOI18N
- infoPanel.add(cordLabel, java.awt.BorderLayout.EAST);
-
- add(infoPanel, java.awt.BorderLayout.SOUTH);
}// //GEN-END:initComponents
private void zoomSliderStateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_zoomSliderStateChanged
@@ -581,20 +625,51 @@ final public class MapPanel extends javax.swing.JPanel {
private void mapViewerMouseMoved(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseMoved
GeoPosition geopos = mapViewer.getTileFactory().pixelToGeo(evt.getPoint(), mapViewer.getZoom());
- cordLabel.setText(geopos.toString());
+ firePropertyChange(CURRENT_MOUSE_GEOPOSITION, null, geopos);
}//GEN-LAST:event_mapViewerMouseMoved
private void mapViewerMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_mapViewerMouseClicked
- currentlySelectedWaypoint = findClosestWaypoint(evt.getPoint());
- showDetailsPopup();
+ if(!evt.isPopupTrigger() && (evt.getButton() == MouseEvent.BUTTON1)) {
+ currentlySelectedWaypoint = findClosestWaypoint(evt.getPoint());
+ showDetailsPopup();
+ }
}//GEN-LAST:event_mapViewerMouseClicked
// Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JLabel cordLabel;
- private javax.swing.JPanel infoPanel;
private org.jxmapviewer.JXMapViewer mapViewer;
private javax.swing.JPanel zoomPanel;
private javax.swing.JSlider zoomSlider;
// End of variables declaration//GEN-END:variables
+
+ /**
+ * Renderer for the map waypoints.
+ */
+ private class MapWaypointRenderer implements WaypointRenderer {
+ private final BufferedImage defaultWaypointImage;
+ private final BufferedImage selectedWaypointImage;
+
+ /**
+ * Construct a WaypointRenederer
+ *
+ * @throws IOException
+ */
+ MapWaypointRenderer() throws IOException {
+ defaultWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_teal.png"));
+ selectedWaypointImage = ImageIO.read(getClass().getResource("/org/sleuthkit/autopsy/images/waypoint_yellow.png"));
+ }
+
+ @Override
+ public void paintWaypoint(Graphics2D gd, JXMapViewer jxmv, Waypoint waypoint) {
+ Point2D point = jxmv.getTileFactory().geoToPixel(waypoint.getPosition(), jxmv.getZoom());
+
+ int x = (int)point.getX();
+ int y = (int)point.getY();
+
+ BufferedImage image = (waypoint == currentlySelectedWaypoint ? selectedWaypointImage: defaultWaypointImage);
+
+ (gd.create()).drawImage(image, x -image.getWidth() / 2, y -image.getHeight(), null);
+ }
+
+ }
}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java b/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java
index 7a28f49737..61b4800d7a 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/MapWaypoint.java
@@ -95,21 +95,21 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
return mapPoints;
}
-
+
/**
- * Returns a list of of MapWaypoint objects for the given list of
+ * Returns a list of of MapWaypoint objects for the given list of
* datamodel.Waypoint objects.
- *
+ *
* @param dmWaypoints
- *
- * @return List of MapWaypoint objects. List will be empty if dmWaypoints was
- * empty or null.
+ *
+ * @return List of MapWaypoint objects. List will be empty if dmWaypoints
+ * was empty or null.
*/
static List getWaypoints(List dmWaypoints) {
List mapPoints = new ArrayList<>();
if (dmWaypoints != null) {
-
+
for (Waypoint point : dmWaypoints) {
mapPoints.add(new MapWaypoint(point));
}
@@ -118,6 +118,27 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
return mapPoints;
}
+ /**
+ * Helper function to get a list of data model waypoints from a list of
+ * MapWaypoints.
+ *
+ * @param mapWaypoints
+ *
+ * @return A list of Waypoint objects, or empty list if mapWaypoints was
+ * null or empty.
+ */
+ static List getDataModelWaypoints(List mapWaypoints) {
+ List waypoints = new ArrayList<>();
+
+ if (mapWaypoints != null) {
+ for (MapWaypoint point : mapWaypoints) {
+ waypoints.add(point.dataModelWaypoint);
+ }
+ }
+
+ return waypoints;
+ }
+
/**
* Returns a MapWaypoint without a reference to the datamodel waypoint.
*
@@ -271,20 +292,20 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
}
return menuItems;
}
-
- /**
+
+ /**
* Get the nicely formatted details for the given waypoint.
- *
- * @param point Waypoint object
+ *
+ * @param point Waypoint object
* @param header String details header
- *
- * @return HTML formatted String of details for given waypoint
+ *
+ * @return HTML formatted String of details for given waypoint
*/
private String getFormattedDetails(Waypoint point) {
StringBuilder result = new StringBuilder(); //NON-NLS
-
+
result.append("").append(formatAttribute("Name", point.getLabel()));
-
+
Long timestamp = point.getTimestamp();
if (timestamp != null) {
result.append(formatAttribute("Timestamp", getTimeStamp(timestamp)));
@@ -292,19 +313,19 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
result.append(formatAttribute("Latitude", point.getLatitude().toString()))
.append(formatAttribute("Longitude", point.getLongitude().toString()));
-
+
if (point.getAltitude() != null) {
result.append(formatAttribute("Altitude", point.getAltitude().toString()));
}
List list = point.getOtherProperties();
- for(Waypoint.Property prop: list) {
+ for (Waypoint.Property prop : list) {
String value = prop.getValue();
- if(value != null && !value.isEmpty()) {
+ if (value != null && !value.isEmpty()) {
result.append(formatAttribute(prop.getDisplayName(), value));
}
}
-
+
result.append("");
return result.toString();
@@ -312,16 +333,16 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
/**
* Format a title value pair.
- *
+ *
* @param title Title of the property
* @param value Value of the property
- *
- * @return Formatted string with the title and value
+ *
+ * @return Formatted string with the title and value
*/
private String formatAttribute(String title, String value) {
return String.format(HTML_PROP_FORMAT, title, value);
}
-
+
/**
* Format a point time stamp (in seconds) to the report format.
*
@@ -333,7 +354,6 @@ final class MapWaypoint extends KdTree.XYZPoint implements org.jxmapviewer.viewe
return DATE_FORMAT.format(new java.util.Date(timeStamp * 1000));
}
-
/**
* An action class for Extracting artifact files.
*/
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/BookmarkWaypoint.java b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/BookmarkWaypoint.java
new file mode 100755
index 0000000000..08fdfeccb6
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/BookmarkWaypoint.java
@@ -0,0 +1,78 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2019 Basis Technology Corp.
+ * contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.geolocation.datamodel;
+
+import java.util.Map;
+import org.sleuthkit.datamodel.BlackboardArtifact;
+import org.sleuthkit.datamodel.BlackboardAttribute;
+
+/**
+ * Class to represent TSK_GPS_BOOKMARK waypoints
+ *
+ */
+final class BookmarkWaypoint extends Waypoint {
+
+ /**
+ * Constructs a new BookmarkWaypoint from the given artifact.
+ *
+ * @param artifact BlackboardArtifact for this waypoint
+ *
+ * @throws GeoLocationDataException
+ */
+ BookmarkWaypoint(BlackboardArtifact artifact) throws GeoLocationDataException {
+ this(artifact, getAttributesFromArtifactAsMap(artifact));
+ }
+
+ /**
+ * Constructs a new BookmarkWaypoint.
+ *
+ * @param artifact BlackboardArtifact for this waypoint
+ * @param attributeMap A Map of the BlackboardAttributes for the given
+ * artifact.
+ *
+ * @throws GeoLocationDataException
+ */
+ private BookmarkWaypoint(BlackboardArtifact artifact, Map attributeMap) throws GeoLocationDataException {
+ super(artifact,
+ getLabelFromArtifact(attributeMap),
+ attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME).getValueLong() : null,
+ attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE).getValueDouble() : null,
+ attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE).getValueDouble() : null,
+ attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE).getValueDouble() : null,
+ null, attributeMap, null);
+ }
+
+ /**
+ * Gets the label for this waypoint.
+ *
+ * @param artifact BlackboardArtifact for waypoint
+ *
+ * @return Returns a label for the waypoint, or empty string if no label was
+ * found.
+ */
+ private static String getLabelFromArtifact(Map attributeMap) {
+ BlackboardAttribute attribute = attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME);
+ if (attribute != null) {
+ return attribute.getDisplayString();
+ }
+
+ return "";
+ }
+
+}
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/Waypoint.java b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/Waypoint.java
index 27e5da0dbd..8cc35555eb 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/Waypoint.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/Waypoint.java
@@ -50,10 +50,10 @@ public class Waypoint {
final private List immutablePropertiesList;
/**
- * This is a list of attributes that are already being handled by the
- * by getter functions.
+ * This is a list of attributes that are already being handled by the by
+ * getter functions.
*/
- static private BlackboardAttribute.ATTRIBUTE_TYPE[] ALREADY_HANDLED_ATTRIBUTES = {
+ static final private BlackboardAttribute.ATTRIBUTE_TYPE[] ALREADY_HANDLED_ATTRIBUTES = {
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_NAME,
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE,
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE,
@@ -65,19 +65,6 @@ public class Waypoint {
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE_END,
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE_END,};
- /**
- * Construct a waypoint with the given artifact.
- *
- * @param artifact BlackboardArtifact for this waypoint
- *
- * @throws GeoLocationDataException Exception will be thrown if artifact did
- * not have a valid longitude and latitude.
- */
- Waypoint(BlackboardArtifact artifact) throws GeoLocationDataException {
- this(artifact,
- getAttributesFromArtifactAsMap(artifact));
- }
-
/**
* Constructor that initializes all of the member variables.
*
@@ -110,25 +97,6 @@ public class Waypoint {
immutablePropertiesList = Collections.unmodifiableList(createGeolocationProperties(attributeMap));
}
- /**
- * Constructs a new ArtifactWaypoint.
- *
- * @param artifact BlackboardArtifact for this waypoint
- * @param attributeMap A Map of the BlackboardAttributes for the given
- * artifact.
- *
- * @throws GeoLocationDataException
- */
- private Waypoint(BlackboardArtifact artifact, Map attributeMap) throws GeoLocationDataException {
- this(artifact,
- getLabelFromArtifact(attributeMap),
- attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME).getValueLong() : null,
- attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LATITUDE).getValueDouble() : null,
- attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_LONGITUDE).getValueDouble() : null,
- attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE) != null ? attributeMap.get(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_GEO_ALTITUDE).getValueDouble() : null,
- null, attributeMap, null);
- }
-
/**
* Get the BlackboardArtifact that this waypoint represents.
*
@@ -205,11 +173,12 @@ public class Waypoint {
public List getOtherProperties() {
return immutablePropertiesList;
}
-
+
/**
* Returns the route that this waypoint is apart of .
- *
- * @return The waypoint route or null if the waypoint is not apart of a route.
+ *
+ * @return The waypoint route or null if the waypoint is not apart of a
+ * route.
*/
public Route getRoute() {
return route;
diff --git a/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/WaypointBuilder.java b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/WaypointBuilder.java
index 7189302809..86539412be 100755
--- a/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/WaypointBuilder.java
+++ b/Core/src/org/sleuthkit/autopsy/geolocation/datamodel/WaypointBuilder.java
@@ -45,7 +45,7 @@ public final class WaypointBuilder {
= "SELECT artifact_id, artifact_type_id "
+ "FROM blackboard_attributes "
+ "WHERE attribute_type_id IN (%d, %d) "; //NON-NLS
-
+
// SELECT statement to get only artifact_ids
final static String GEO_ARTIFACT_QUERY_ID_ONLY
= "SELECT artifact_id "
@@ -70,8 +70,8 @@ public final class WaypointBuilder {
+ " )";
// Returns a list of artifacts with no time stamp
- final static String SELECT_WO_TIMESTAMP =
- "SELECT DISTINCT artifact_id, artifact_type_id "
+ final static String SELECT_WO_TIMESTAMP
+ = "SELECT DISTINCT artifact_id, artifact_type_id "
+ "FROM blackboard_attributes "
+ "WHERE artifact_id NOT IN (%s) "
+ "AND artifact_id IN (%s)"; //NON-NLS
@@ -121,6 +121,25 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of routes from the given list of waypoints.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of routes or an empty list if none were found.
+ */
+ public static List getRoutes(List waypoints) {
+ List routeList = new ArrayList<>();
+ for (Waypoint point : waypoints) {
+ Route route = point.getRoute();
+ if (route != null && !routeList.contains(route)) {
+ routeList.add(route);
+ }
+ }
+
+ return routeList;
+ }
+
/**
* Gets a list of Waypoints for TSK_GPS_TRACKPOINT artifacts.
*
@@ -150,6 +169,25 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of waypoints that come from TSK_GEO_TRACKPOINT artifacts.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of trackpoint waypoints or empty list if none were found.
+ */
+ public static List getTrackpointWaypoints(List waypoints) {
+ List specificPoints = new ArrayList<>();
+
+ for (Waypoint point : waypoints) {
+ if (point instanceof TrackpointWaypoint) {
+ specificPoints.add(point);
+ }
+ }
+
+ return specificPoints;
+ }
+
/**
* Gets a list of Waypoints for TSK_METADATA_EXIF artifacts.
*
@@ -183,6 +221,25 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of waypoints that come from TSK_METADATA_EXIF artifacts.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of trackpoint waypoints or empty list if none were found.
+ */
+ public static List getEXIFWaypoints(List waypoints) {
+ List specificPoints = new ArrayList<>();
+
+ for (Waypoint point : waypoints) {
+ if (point instanceof EXIFWaypoint) {
+ specificPoints.add(point);
+ }
+ }
+
+ return specificPoints;
+ }
+
/**
* Gets a list of Waypoints for TSK_GPS_SEARCH artifacts.
*
@@ -214,6 +271,25 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of waypoints that come from TSK_GPS_SEARCH artifacts.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of trackpoint waypoints or empty list if none were found.
+ */
+ public static List getSearchWaypoints(List waypoints) {
+ List specificPoints = new ArrayList<>();
+
+ for (Waypoint point : waypoints) {
+ if (point instanceof SearchWaypoint) {
+ specificPoints.add(point);
+ }
+ }
+
+ return specificPoints;
+ }
+
/**
* Gets a list of Waypoints for TSK_GPS_LAST_KNOWN_LOCATION artifacts.
*
@@ -245,6 +321,26 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of waypoints that come from TSK_GPS_LAST_KNOWN_LOCATION
+ * artifacts.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of trackpoint waypoints or empty list if none were found.
+ */
+ public static List getLastKnownWaypoints(List waypoints) {
+ List specificPoints = new ArrayList<>();
+
+ for (Waypoint point : waypoints) {
+ if (point instanceof LastKnownWaypoint) {
+ specificPoints.add(point);
+ }
+ }
+
+ return specificPoints;
+ }
+
/**
* Gets a list of Waypoints for TSK_GPS_BOOKMARK artifacts.
*
@@ -266,7 +362,7 @@ public final class WaypointBuilder {
if (artifacts != null) {
for (BlackboardArtifact artifact : artifacts) {
try {
- Waypoint point = new Waypoint(artifact);
+ Waypoint point = new BookmarkWaypoint(artifact);
points.add(point);
} catch (GeoLocationDataException ex) {
logger.log(Level.WARNING, String.format("No longitude or latitude available for TSK_GPS_BOOKMARK artifactID: %d", artifact.getArtifactID()), ex);//NON-NLS
@@ -276,6 +372,26 @@ public final class WaypointBuilder {
return points;
}
+ /**
+ * Returns a list of waypoints that come from TSK_GPS_LAST_KNOWN_LOCATION
+ * artifacts.
+ *
+ * @param waypoints A list of waypoints
+ *
+ * @return A list of trackpoint waypoints or empty list if none were found.
+ */
+ public static List getBookmarkWaypoints(List waypoints) {
+ List specificPoints = new ArrayList<>();
+
+ for (Waypoint point : waypoints) {
+ if (point instanceof BookmarkWaypoint) {
+ specificPoints.add(point);
+ }
+ }
+
+ return specificPoints;
+ }
+
/**
* Get a filtered list of waypoints.
*
@@ -386,7 +502,7 @@ public final class WaypointBuilder {
String mostRecentQuery = "";
if (!showAll && cntDaysFromRecent > 0) {
- mostRecentQuery = String.format("AND value_int64 > (%s)", //NON-NLS
+ mostRecentQuery = String.format("AND value_int64 > (%s)", //NON-NLS
String.format(MOST_RECENT_TIME,
cntDaysFromRecent,
BlackboardAttribute.ATTRIBUTE_TYPE.TSK_DATETIME.getTypeID(),
@@ -464,7 +580,7 @@ public final class WaypointBuilder {
waypoints.add(new EXIFWaypoint(artifact));
break;
case TSK_GPS_BOOKMARK:
- waypoints.add(new Waypoint(artifact));
+ waypoints.add(new BookmarkWaypoint(artifact));
break;
case TSK_GPS_TRACKPOINT:
waypoints.add(new TrackpointWaypoint(artifact));
@@ -477,8 +593,7 @@ public final class WaypointBuilder {
waypoints.addAll(route.getRoute());
break;
default:
- waypoints.add(new Waypoint(artifact));
- break;
+ throw new GeoLocationDataException(String.format("Unable to create waypoint for artifact of type %s", type.toString()));
}
return waypoints;
diff --git a/Core/src/org/sleuthkit/autopsy/guiutils/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/guiutils/Bundle_ja.properties
new file mode 100644
index 0000000000..20895b6374
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/guiutils/Bundle_ja.properties
@@ -0,0 +1,3 @@
+StatusIconCellRenderer.tooltiptext.error=\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+StatusIconCellRenderer.tooltiptext.ok=OK
+StatusIconCellRenderer.tooltiptext.warning=\u8b66\u544a\u304c\u767a\u751f\u3057\u307e\u3057\u305f
diff --git a/Core/src/org/sleuthkit/autopsy/healthmonitor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/healthmonitor/Bundle_ja.properties
new file mode 100644
index 0000000000..ec245205c5
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/healthmonitor/Bundle_ja.properties
@@ -0,0 +1,28 @@
+HealthMonitorDashboard.createAdminPanel.disableButton=\u30e2\u30cb\u30bf\u30fc\u3092\u7121\u52b9\u5316
+HealthMonitorDashboard.createAdminPanel.enableButton=\u30e2\u30cb\u30bf\u30fc\u3092\u6709\u52b9\u5316
+HealthMonitorDashboard.createTimingControlPanel.filterByHost=\u30db\u30b9\u30c8\u5225\u306b\u30d5\u30a3\u30eb\u30bf\u30fc
+HealthMonitorDashboard.createTimingControlPanel.maxDays=\u6700\u5927\u8868\u793a\u65e5\u6570
+HealthMonitorDashboard.createTimingControlPanel.showTrendLine=\u30c8\u30ec\u30f3\u30c9\u30e9\u30a4\u30f3\u3092\u8868\u793a
+HealthMonitorDashboard.createTimingControlPanel.skipOutliers=\u5916\u308c\u5024\u3092\u30d7\u30ed\u30c3\u30c8\u3057\u306a\u3044
+HealthMonitorDashboard.createTimingPanel.noData=\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093 - \u30e2\u30cb\u30bf\u30fc\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+HealthMonitorDashboard.createTimingPanel.timingMetricsTitle=\u30bf\u30a4\u30df\u30f3\u30b0\u6307\u6a19
+HealthMonitorDashboard.createUserControlPanel.maxDays=\u6700\u5927\u8868\u793a\u65e5\u6570
+HealthMonitorDashboard.createUserPanel.noData=\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093 - \u30e2\u30cb\u30bf\u30fc\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+HealthMonitorDashboard.createUserPanel.userMetricsTitle=\u30e6\u30fc\u30b6\u30fc\u6307\u6a19
+HealthMonitorDashboard.DateRange.oneDay=1\u65e5
+HealthMonitorDashboard.DateRange.oneMonth=1\u30f5\u6708
+HealthMonitorDashboard.DateRange.oneWeek=1\u9031\u9593
+HealthMonitorDashboard.DateRange.twoWeeks=2\u9031\u9593
+HealthMonitorDashboard.display.dashboardTitle=\u6b63\u5e38\u6027\u30e2\u30cb\u30bf\u30fc
+HealthMonitorDashboard.display.errorCreatingDashboard=\u6b63\u5e38\u6027\u30e2\u30cb\u30bf\u30fc\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HealthMonitorDashboard.updateTimingMetricGraphs.noData=\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093
+HealthMonitorDashboard.updateUserMetricGraphs.noData=\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093
+TimeZonePanel.title=\u6b21\u306e\u5358\u4f4d\u3067\u6642\u523b\u3092\u8868\u793a:
+TimingMetricGraphPanel.paintComponent.hours=\u6642
+TimingMetricGraphPanel.paintComponent.microseconds=\u30de\u30a4\u30af\u30ed\u79d2
+TimingMetricGraphPanel.paintComponent.milliseconds=\u30df\u30ea\u79d2
+TimingMetricGraphPanel.paintComponent.minutes=\u5206
+TimingMetricGraphPanel.paintComponent.nanoseconds=\u30ca\u30ce\u79d2
+TimingMetricGraphPanel.paintComponent.seconds=\u79d2
+UserMetricGraphPanel.constructor.casesOpen=\u30b1\u30fc\u30b9\u304c\u958b\u3044\u3066\u3044\u307e\u3059
+UserMetricGraphPanel.constructor.loggedIn=Users logged in - \u8abf\u67fb\u54e1\u30ce\u30fc\u30c9\u306f\u9752\u8272\u3067\u3001\u81ea\u52d5\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30ce\u30fc\u30c9\u306f\u7dd1\u8272\u3067\u3059
diff --git a/Core/src/org/sleuthkit/autopsy/images/discovery-icon-24.png b/Core/src/org/sleuthkit/autopsy/images/discovery-icon-24.png
new file mode 100644
index 0000000000..6ae4e602dc
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/discovery-icon-24.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/images/pool-icon.png b/Core/src/org/sleuthkit/autopsy/images/pool-icon.png
new file mode 100644
index 0000000000..7300066c2d
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/pool-icon.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/images/waypoint_teal.png b/Core/src/org/sleuthkit/autopsy/images/waypoint_teal.png
new file mode 100755
index 0000000000..3860d1973c
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/waypoint_teal.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/images/waypoint_yellow.png b/Core/src/org/sleuthkit/autopsy/images/waypoint_yellow.png
new file mode 100755
index 0000000000..1cd715c101
Binary files /dev/null and b/Core/src/org/sleuthkit/autopsy/images/waypoint_yellow.png differ
diff --git a/Core/src/org/sleuthkit/autopsy/imagewriter/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/imagewriter/Bundle_ja.properties
new file mode 100644
index 0000000000..2a979c7f04
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/imagewriter/Bundle_ja.properties
@@ -0,0 +1,10 @@
+# \u3053\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3] \u3067 [\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc] \u3092\u9078\u629e\u3057\u307e\u3059\u3002
+# \u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30c4\u30fc\u30eb | \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8] \u3092\u9078\u629e\u3057\u3001
+# \u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u958b\u304d\u307e\u3059\u3002
+
+# {0} - \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u540d
+ImageWriter.progressBar.message=Finishing acquisition of {0} \u306e\u53d6\u5f97\u3092\u5b8c\u4e86\u4e2d\u3067\u3059(\u53d6\u308a\u6d88\u3059\u306b\u306f\u30c7\u30d0\u30a4\u30b9\u306e\u96fb\u6e90\u30d7\u30e9\u30b0\u3092\u629c\u304d\u307e\u3059)
+ImageWriterService.serviceName=\u30a4\u30e1\u30fc\u30b8\u30e9\u30a4\u30bf\u30fc
+ImageWriterService.waitingForVHDs=VHD\u304c\u5b8c\u4e86\u3059\u308b\u306e\u3092\u5f85\u3063\u3066\u3044\u307e\u3059
+ImageWriterService.shouldWait=\u9032\u884c\u4e2d\u306eVHD\u304c\u5b8c\u4e86\u3059\u308b\u306e\u3092\u5f85\u3063\u3066\u3044\u307e\u3059
+ImageWriterService.localDisk=\u30ed\u30fc\u30ab\u30eb\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u30b3\u30d4\u30fc
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties
index 2fc82d0dd9..215b536e3d 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/ingest/Bundle_ja.properties
@@ -1,117 +1,157 @@
+CTL_RunIngestAction=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c
+IngestJobSettingsPanel.IngestModulesTableRenderer.info.message=\u4ee5\u524d\u306b\u3053\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u4e0a\u3067\u3053\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u65e7\u30d0\u30fc\u30b8\u30e7\u30f3\u304c\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\u3002
+IngestJobSettingsPanel.IngestModulesTableRenderer.warning.message=\u4ee5\u524d\u306b\u3053\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u4e0a\u3067\u3053\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\u3002
+IngestJobSettingsPanel.noPerRunSettings=\u9078\u629e\u3055\u308c\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u306f\u5b9f\u884c\u3054\u3068\u306e\u8a2d\u5b9a\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+IngestJobSettingsPanel.pastJobsButton.action.frame.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5c65\u6b74
+IngestManager.startupErr.dlgErrorList=\u30a8\u30e9\u30fc:
+IngestManager.startupErr.dlgMsg=1\u3064\u4ee5\u4e0a\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f\u3002
+IngestManager.startupErr.dlgSolution=\u5931\u6557\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u306b\u3059\u308b\u304b\u3001\u30a8\u30e9\u30fc\u3092\u4fee\u6b63\u3057\u3066\u304b\u3089\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+IngestManager.startupErr.dlgTitle=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u8d77\u52d5\u5931\u6557
+IngestOptionsPanel.fileFiltersTab.text=\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc
+IngestOptionsPanel.fileFiltersTab.toolTipText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u4f5c\u6210\u304a\u3088\u3073\u7de8\u96c6\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u3067\u3059\u3002
+IngestOptionsPanel.profilesTab.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb
+IngestOptionsPanel.profilesTab.toolTipText=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u304a\u3088\u3073\u7de8\u96c6\u3059\u308b\u305f\u3081\u306e\u8a2d\u5b9a\u3067\u3059\u3002
+IngestOptionsPanel.settingsTab.text=\u8a2d\u5b9a
+IngestOptionsPanel.settingsTab.toolTipText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u63d0\u4f9b\u53ef\u80fd\u306a\u30ea\u30bd\u30fc\u30b9\u306b\u95a2\u3059\u308b\u8a2d\u5b9a\u3067\u3059\u3002
+OpenIDE-Module-Name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
+Menu/Tools/RunIngestModules=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
CTL_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8
HINT_IngestMessageTopComponent=\u30e1\u30c3\u30bb\u30fc\u30b8\u30a6\u30a3\u30f3\u30c9\u30a6
-IngestDialog.closeButton.title=\u9589\u3058\u308b
-IngestDialog.startButton.title=\u958b\u59cb
-IngestJob.progress.cancelling=\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026
-IngestJob.progress.dataSourceIngest.displayName={1}\u306e{0}
-IngestJob.progress.fileIngest.displayName={0}\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u4e2d
-IngestManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-IngestManager.moduleErr.errListenToUpdates.msg=Ingest Manager\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-IngestManager.StartIngestJobsTask.run.cancelling={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
-IngestManager.StartIngestJobsTask.run.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u958b\u59cb\u4e2d
-IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30bd\u30fc\u30b9\u3001\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u3001\u8a73\u7d30\u304a\u3088\u3073\u30c7\u30fc\u30bf\u306f\u30cc\u30eb\u3067\u306f\u3044\u3051\u307e\u305b\u3093
-IngestMessage.exception.srcSubjNotNull.msg=\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u306f\u3044\u3051\u307e\u305b\u3093
-IngestMessage.exception.typeSrcSubjNotNull.msg=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u3001\u30bd\u30fc\u30b9\u304a\u3088\u3073\u30b5\u30d6\u30b8\u30a7\u30af\u30c8\u306f\u30cc\u30eb\u3067\u306f\u3044\u3051\u307e\u305b\u3093
-IngestMessage.toString.data.text=\ \u30c7\u30fc\u30bf\uff1a{0}
-IngestMessage.toString.date.text=\ \u65e5\u4ed8\uff1a{0}
-IngestMessage.toString.details.text=\ \u8a73\u7d30\uff1a{0}
-IngestMessage.toString.subject.text=\ \u30b5\u30d6\u30b8\u30a7\u30af\u30c8\uff1a{0}
-IngestMessage.toString.type.text=\u30bf\u30a4\u30d7\uff1a{0}
+IngestMessageDetailsPanel.backButton.text=
+IngestMessageDetailsPanel.viewArtifactButton.text=\u7d50\u679c\u306b\u79fb\u52d5
+IngestMessageDetailsPanel.viewContentButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306b\u79fb\u52d5
+IngestMessagePanel.sortByLabel.text=\u6b21\u3067\u30bd\u30fc\u30c8:
+IngestMessagePanel.sortByComboBox.toolTipText=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u6642\u9593(\u6642\u7cfb\u5217\u9806)\u307e\u305f\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u512a\u5148\u5ea6\u3067\u30bd\u30fc\u30c8
+IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30c6\u30ad\u30b9\u30c8/html
+IngestMessageDetailsPanel.messageDetailsPane.toolTipText=
+IngestMessagesToolbar.toolTipText=
IngestMessageDetailsPanel.copyMenuItem.text=\u30b3\u30d4\u30fc
-IngestMessageDetailsPanel.messageDetailsPane.contentType=\u30c6\u30ad\u30b9\u30c8\uff0fhtml
-IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u9078\u629e
-IngestMessageDetailsPanel.viewArtifactButton.text=\u7d50\u679c\u3078\u79fb\u52d5
-IngestMessageDetailsPanel.viewContentButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3078\u79fb\u52d5
-IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30d6\u30fc\u30eb\u5024\u3067\u306f\u306a\u3044\u3082\u306e\u306bBooleanRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u3002
-IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65e5\u4ed8\u3067\u306f\u306a\u3044\u3082\u306e\u306bDateRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u3057\u307e\u3057\u305f\u3002
-IngestMessagePanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-IngestMessagePanel.MsgTableMod.colNames.module=\u30e2\u30b8\u30e5\u30fc\u30eb
-IngestMessagePanel.MsgTableMod.colNames.new=\u65b0\u898f\uff1f
-IngestMessagePanel.MsgTableMod.colNames.num=\u756a\u53f7
-IngestMessagePanel.MsgTableMod.colNames.subject=\u30b5\u30d6\u30b8\u30a7\u30af\u30c8
-IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
-IngestMessagePanel.sortByComboBox.model.priority=\u512a\u5148\u5ea6
-IngestMessagePanel.sortByComboBox.model.time=\u6642\u9593
-IngestMessagePanel.sortByComboBox.toolTipText=\u6642\u9593\u9806\uff08\u6642\u7cfb\u5217\uff09\u307e\u305f\u306f\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u512a\u5148\u5ea6\u3067\u30bd\u30fc\u30c8
-IngestMessagePanel.sortByLabel.text=\u6b21\u3067\u30bd\u30fc\u30c8\uff1a
-IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8a08\uff1a
+IngestMessageDetailsPanel.selectAllMenuItem.text=\u3059\u3079\u3066\u3092\u9078\u629e
+IngestMessageTopComponent.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30dc\u30c3\u30af\u30b9
+IngestMessagePanel.totalMessagesNameLabel.text=\u5408\u8a08:
IngestMessagePanel.totalMessagesNameVal.text=-
-IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u30e6\u30cb\u30fc\u30af\uff1a
+IngestMessagePanel.totalUniqueMessagesNameLabel.text=\u4e00\u610f:
IngestMessagePanel.totalUniqueMessagesNameVal.text=-
-IngestMessagesToolbar.customizeButton.toolTipText=\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
-IngestMessageTopComponent.displayName=\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
-IngestMessageTopComponent.displayReport.option.GenRpt=\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210
+IngestJob.progress.dataSourceIngest.initialDisplayName={0} \u3092\u89e3\u6790\u4e2d\u3067\u3059
+IngestJob.progress.dataSourceIngest.displayName={1} \u306e {0}
+IngestJob.progress.fileIngest.displayName={0} \u304b\u3089\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u4e2d\u3067\u3059
+IngestJob.progress.cancelling=\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...
+IngestJob.cancellationDialog.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u53d6\u308a\u6d88\u3059
+IngestDialog.startButton.title=\u958b\u59cb
+IngestDialog.closeButton.title=\u7d42\u4e86
+IngestManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+IngestManager.moduleErr.errListenToUpdates.msg=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u30fc\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+IngestMessage.toString.type.text=\u30bf\u30a4\u30d7: {0}
+IngestMessage.toString.date.text=\ \u65e5\u4ed8: {0}
+IngestMessage.toString.subject.text=\ \u4ef6\u540d: {0}
+IngestMessage.toString.details.text=\ \u8a73\u7d30: {0}
+IngestMessage.toString.date.text=\ \u30c7\u30fc\u30bf: {0}
+IngestMessage.exception.typeSrcSubjNotNull.msg=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7\u3001\u30bd\u30fc\u30b9\u304a\u3088\u3073\u4ef6\u540d\u3092null\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+IngestMessage.exception.srcSubjNotNull.msg=\u30bd\u30fc\u30b9\u3068\u4ef6\u540d\u3092null\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+IngestMessage.exception.srcSubjDetailsDataNotNull.msg=\u30bd\u30fc\u30b9\u3001\u4ef6\u540d\u3001\u8a73\u7d30\u304a\u3088\u3073\u30c7\u30fc\u30bf\u3092null\u306b\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093
+IngestMessagePanel.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+IngestMessagePanel.moduleErr.errListenUpdates.text=IngestMessagePanel\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+IngestMessagePanel.MsgTableMod.colNames.module=\u30e2\u30b8\u30e5\u30fc\u30eb
+IngestMessagePanel.MsgTableMod.colNames.num=\u6570\u5b57
+IngestMessagePanel.MsgTableMod.colNames.new=\u65b0\u898f?
+IngestMessagePanel.MsgTableMod.colNames.subject=\u4ef6\u540d
+IngestMessagePanel.MsgTableMod.colNames.timestamp=\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
+IngestMessagePanel.BooleanRenderer.exception.nonBoolVal.msg=\u30d6\u30fc\u30eb\u5024\u4ee5\u5916\u306e\u5024\u3067BooleanRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u8a66\u307f\u307e\u3057\u305f\u3002
+IngestMessagePanel.DateRenderer.exception.nonDateVal.text=\u65e5\u4ed8\u5024\u4ee5\u5916\u306e\u5024\u3067DateRenderer\u3092\u4f7f\u7528\u3057\u3088\u3046\u3068\u8a66\u307f\u307e\u3057\u305f\u3002
IngestMessageTopComponent.displayReport.option.OK=OK
-IngestMessageTopComponent.initComponents.name=\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
-IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30ec\u30dd\u30fc\u30c8\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
-IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30c7\u30a3\u30b9\u30af{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3\u306e\u305f\u3081\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u4e2d\u6b62\u3057\u307e\u3059\u3002\n\u30b1\u30fc\u30b9\u30c9\u30e9\u30a4\u30d6\u306b\u6700\u4f4e1GB\u306e\u7a7a\u304d\u9818\u57df\u304c\u3042\u308b\u306e\u3092\u78ba\u8a8d\u3057\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u5b9f\u884c\u3057\u3066\u4e0b\u3055\u3044\u3002
-IngestMonitor.mgrErrMsg.lowDiskSpace.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u4e2d\u6b62\u3055\u308c\u307e\u3057\u305f\u30fc{0}\u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u4e0d\u8db3
-OpenIDE-Module-Name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
-IngestManager.StartIngestJobsTask.run.startupErr.dlgErrorList=\n\u30a8\u30e9\u30fc\uff1a\n{0}
-IngestManager.StartIngestJobsTask.run.startupErr.dlgMsg=\u5358\u6570\u307e\u305f\u306f\u8907\u6570\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30b9\u30bf\u30fc\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u306f\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002
-IngestManager.StartIngestJobsTask.run.startupErr.dlgSolution=\u5931\u6557\u3057\u305f\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u5316\u3059\u308b\u304b\u30a8\u30e9\u30fc\u3092\u89e3\u6c7a\u3057\u3001\u305d\u306e\u5f8c\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3092\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3001\n\u300c\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u5b9f\u884c\u300d\u3092\u9078\u629e\u3057\u3066\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u5b9f\u884c\u3057\u3066\u4e0b\u3055\u3044\u3002
-IngestManager.StartIngestJobsTask.run.startupErr.dlgTitle=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5931\u6557
-IngestJobSettings.createModuleSettingsFolder.warning=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\u30d5\u30a9\u30eb\u30c0\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3002
-IngestJob.progress.dataSourceIngest.initialDisplayName={0}\u3092\u89e3\u6790\u4e2d
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.dataSource=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.elapsedTime=\u7d4c\u904e\u6642\u9593\uff08\u6642\uff1a\u5206\uff1a\u79d2\uff09
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.file=\u30d5\u30a1\u30a4\u30eb
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.startTime=\u958b\u59cb\u6642\u9593
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.threadID=\u30b9\u30ec\u30c3\u30c9ID
-IngestManager.IngestMessage.ErrorMessageLimitReached.msg=\u6700\u5927\u6570({0})\u306e\u30a8\u30e9\u30fc\u304a\u3088\u3073\u307e\u305f\u306f\u8b66\u544a\u30e1\u30c3\u30bb\u30fc\u30b8\u304c\u63b2\u8f09\u3055\u308c\u307e\u3057\u305f\u3002\u3055\u3089\u306a\u308b\u30a8\u30e9\u30fc\uff0f\u8b66\u544a\u306f\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\uff08\u30d8\u30eb\u30d7->\u30ed\u30b0\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u958b\u304f\uff09
-IngestManager.IngestMessage.ErrorMessageLimitReached.subject=\u6700\u5927\u6570\u306e\u30a8\u30e9\u30fc\u304c\u63b2\u8f09\u3055\u308c\u307e\u3057\u305f
-IngestManager.IngestMessage.ErrorMessageLimitReached.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30de\u30cd\u30b8\u30e3\u30fc
-IngestManager.IngestThreadActivitySnapshot.idleThread=\u30a2\u30a4\u30c9\u30eb
-IngestProgressSnapshotDialog.title.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d7\u30ed\u30b0\u30ec\u30b9\u30fb\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8
-IngestProgressSnapshotPanel.closeButton.text=\u9589\u3058\u308b
-IngestProgressSnapshotPanel.refreshButton.text=\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.activity=\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
-ModuleTableModel.colName.duration=\u6240\u8981\u6642\u9593
-IngestJob.cancellationDialog.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb
-IngestJobSettings.missingModule.warning=\u4ee5\u524d\u306b\u8aad\u307f\u8fbc\u3093\u3060{0}\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-DataSourceIngestCancellationPanel.cancelAllModulesRadioButton.text=\u5168\u3066\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30ad\u30e3\u30f3\u30bb\u30eb
-DataSourceIngestCancellationPanel.cancelCurrentModuleRadioButton.text=\u73fe\u5728\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u307f\u30ad\u30e3\u30f3\u30bb\u30eb
-FileIngestCancellationPanel.cancelFileIngestRadioButton.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u307f\u30ad\u30e3\u30f3\u30bb\u30eb
-FileIngestCancellationPanel.cancelIngestJobRadioButton.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304a\u3088\u3073\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u30ad\u30e3\u30f3\u30bb\u30eb
-IngestJobSettings.moduleSettingsLoad.warning={1}\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e{0}\u30e2\u30b8\u30e5\u30fc\u30eb\u7528\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3092\u4f7f\u7528\u3057\u3066\u3044\u307e\u3059\u3002
-IngestJobSettings.save.warning={0}\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-IngestJobTableModel.colName.dataSource=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
-IngestJobTableModel.colName.dirQueued=\u30ad\u30e5\u30fc\u3055\u308c\u305f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea
-IngestJobTableModel.colName.filesPerSec=\u30d5\u30a1\u30a4\u30eb\uff0f\u79d2
-IngestJobTableModel.colName.filesQueued=\u30ad\u30e5\u30fc\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
-IngestJobTableModel.colName.inProgress=\u51e6\u7406\u4e2d
-IngestJobTableModel.colName.jobID=\u30b8\u30e7\u30d6ID
-IngestJobTableModel.colName.numProcessed=\u51e6\u7406\u3055\u308c\u305f\u6570
-IngestJobTableModel.colName.rootQueued=\u30ad\u30e5\u30fc\u3055\u308c\u305f\u30eb\u30fc\u30c8
-IngestJobTableModel.colName.start=\u30b9\u30bf\u30fc\u30c8
-IngestModuleFactoryLoader.errorMessages.duplicateDisplayName=\u5225\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u540d\u524d\u3092\u91cd\u8907\u3059\u308b\u3001{0}\u306e\u540d\u524d\u3092\u6301\u3064\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u4f7f\u7528\u3057\u307e\u305b\u3093\u3002
-IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.jobID=\u30b8\u30e7\u30d6ID
-ModuleTableModel.colName.module=\u30e2\u30b8\u30e5\u30fc\u30eb
-
-Menu/Tools/RunIngestModules=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
-IngestManager.OpenEventChannel.Fail.ErrMsg=\u3053\u306e\u30b1\u30fc\u30b9\u3067\u4f7f\u308f\u308c\u3066\u3044\u308b\u304b\u3082\u3057\u308c\u306a\u3044\u4ed6\u306e\u30ce\u30fc\u30c9\u306b\u89e3\u6790\u30d7\u30ed\u30bb\u30b9\u304c\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+IngestMessageTopComponent.displayReport.option.GenRpt=\u30ec\u30dd\u30fc\u30c8\u751f\u6210
+IngestMessageTopComponent.msgDlg.ingestRpt.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30ec\u30dd\u30fc\u30c8
+IngestMonitor.mgrErrMsg.lowDiskSpace.title=Ingest stopped - {0} \u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u5c11\u306a\u304f\u306a\u3063\u3066\u3044\u307e\u3059
+IngestMonitor.mgrErrMsg.lowDiskSpace.msg=\u30c7\u30a3\u30b9\u30af {0} \u306e\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u5c11\u306a\u304f\u306a\u3063\u3066\u3044\u308b\u305f\u3081\u3001\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u4e2d\u6b62\u3057\u307e\u3057\u305f\u3002\n\u30b1\u30fc\u30b9\u306e\u30c9\u30e9\u30a4\u30d6\u306e\u7a7a\u304d\u9818\u57df\u304c\u5c11\u306a\u304f\u30681GB\u3042\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+IngestManager.StartIngestJobsTask.run.displayName=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u8d77\u52d5\u4e2d\u3067\u3059
+IngestManager.StartIngestJobsTask.run.cancelling={0} (\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...)
+IngestMessagePanel.sortByComboBox.model.time=\u6642\u523b
+IngestMessagePanel.sortByComboBox.model.priority=\u512a\u5148\u5ea6
+IngestMessagesToolbar.customizeButton.toolTipText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8
+IngestMessageTopComponent.initComponents.name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30dc\u30c3\u30af\u30b9
+IngestManager.OpenEventChannel.Fail.ErrMsg=\u30b1\u30fc\u30b9\u3067\u9023\u643a\u3057\u3066\u3044\u308b\u53ef\u80fd\u6027\u306e\u3042\u308b\u305d\u306e\u4ed6\u306e\u30ce\u30fc\u30c9\u306b\u63a5\u7d9a\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
IngestManager.OpenEventChannel.Fail.Title=\u63a5\u7d9a\u5931\u6557
-IngestJobSettings.moduleSettingsSave.warning={1}\u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e{0}\u30e2\u30b8\u30e5\u30fc\u30eb\u7528\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-IngestJobTableModel.colName.dsQueued=\u30ad\u30e5\u30fc\u3055\u308c\u305fDS
-IngestJobSettingsPanel.jButtonSelectAll.text=\u5168\u3066\u9078\u629e
-IngestJobSettingsPanel.jButtonDeselectAll.text=\u5168\u3066\u9078\u629e\u89e3\u9664
-IngestManager.cancellingIngest.msgDlg.text=\u73fe\u5728\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d
-IngestManager.serviceIsDown.msgDlg.text={0}\u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
-RunIngestSubMenu.menuItem.empty=\u30fc\u7a7a\u767d\u30fc
+IngestJobSettings.createModuleSettingsFolder.warning=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3002
+IngestJobSettings.missingModule.warning=\u4ee5\u524d\u306b\u8aad\u307f\u8fbc\u3093\u3060 {0} \u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+IngestJobSettings.save.warning={0} \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+IngestJobSettings.moduleSettingsLoad.warning=\u30c7\u30d5\u30a9\u30eb\u30c8\u8a2d\u5b9a\u3067\u3001{1} \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e {0} \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+IngestJobSettings.moduleSettingsSave.warning={1} \u30b3\u30f3\u30c6\u30ad\u30b9\u30c8\u306e {0} \u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u8a2d\u5b9a\u3092\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+IngestProgressSnapshotDialog.title.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u9032\u6357\u72b6\u6cc1\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8
+IngestProgressSnapshotPanel.refreshButton.text=\u66f4\u65b0
+IngestProgressSnapshotPanel.closeButton.text=\u7d42\u4e86
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.threadID=\u30b9\u30ec\u30c3\u30c9ID
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.dataSource=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.activity=\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.file=\u30d5\u30a1\u30a4\u30eb
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.startTime=\u958b\u59cb\u6642\u523b
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.elapsedTime=\u7d4c\u904e\u6642\u9593(H:M:S)
+IngestManager.IngestThreadActivitySnapshot.idleThread=\u30a2\u30a4\u30c9\u30eb\u4e2d
+IngestManager.IngestMessage.ErrorMessageLimitReached.subject=\u63d0\u793a\u3055\u308c\u305f\u6700\u5927\u30a8\u30e9\u30fc\u6570
+IngestManager.IngestMessage.ErrorMessageLimitReached.msg=\u63d0\u793a\u3055\u308c\u305f\u30a8\u30e9\u30fc\u304a\u3088\u3073/\u307e\u305f\u306f\u8b66\u544a\u30e1\u30c3\u30bb\u30fc\u30b8\u306e\u6700\u5927\u6570 ({0}) \u3067\u3059\u3002\u305d\u306e\u4ed6\u306e\u30a8\u30e9\u30fc/\u8b66\u544a\u306f\u3001\u30ed\u30b0\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044([\u30d8\u30eb\u30d7] -> [\u30ed\u30b0\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u958b\u304f])\u3002
+IngestManager.IngestMessage.ErrorMessageLimitReached.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30de\u30cd\u30fc\u30b8\u30e3\u30fc
+IngestModuleFactoryLoader.errorMessages.duplicateDisplayName={0} \u306e\u540d\u524d\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u5225\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u540d\u3068\u91cd\u8907\u3057\u3066\u3044\u308b\u5834\u5408\u3001\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u4f7f\u7528\u3055\u308c\u307e\u305b\u3093\u3002
+DataSourceIngestCancellationPanel.cancelCurrentModuleRadioButton.text=\u73fe\u5728\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u307f\u3092\u53d6\u308a\u6d88\u3059
+FileIngestCancellationPanel.cancelIngestJobRadioButton.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3068\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u53d6\u308a\u6d88\u3059
+FileIngestCancellationPanel.cancelFileIngestRadioButton.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u307f\u3092\u53d6\u308a\u6d88\u3059
+DataSourceIngestCancellationPanel.cancelAllModulesRadioButton.text=\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u53d6\u308a\u6d88\u3059
+IngestProgressSnapshotPanel.SnapshotsTableModel.colNames.jobID=\u30b8\u30e7\u30d6ID
+IngestJobTableModel.colName.jobID=\u30b8\u30e7\u30d6ID
+IngestJobTableModel.colName.dataSource=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+IngestJobTableModel.colName.start=\u958b\u59cb
+IngestJobTableModel.colName.numProcessed=\u51e6\u7406\u3057\u305f\u6570
+IngestJobTableModel.colName.filesPerSec=\u30d5\u30a1\u30a4\u30eb/\u79d2
+IngestJobTableModel.colName.inProgress=\u9032\u884c\u4e2d
+IngestJobTableModel.colName.filesQueued=\u30ad\u30e5\u30fc\u6e08\u307f\u30d5\u30a1\u30a4\u30eb
+IngestJobTableModel.colName.dirQueued=\u30ad\u30e5\u30fc\u6e08\u307f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc
+IngestJobTableModel.colName.rootQueued=\u30ad\u30e5\u30fc\u6e08\u307f\u30eb\u30fc\u30c8
+IngestJobTableModel.colName.dsQueued=\u30ad\u30e5\u30fc\u6e08\u307f\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9
+ModuleTableModel.colName.module=\u30e2\u30b8\u30e5\u30fc\u30eb
+ModuleTableModel.colName.duration=\u671f\u9593
+IngestJobSettingsPanel.jButtonSelectAll.text=\u3059\u3079\u3066\u3092\u9078\u629e
+IngestJobSettingsPanel.jButtonDeselectAll.text=\u3059\u3079\u3066\u306e\u9078\u629e\u3092\u89e3\u9664
+IngestManager.cancellingIngest.msgDlg.text=\u73fe\u5728\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u3092\u3059\u3079\u3066\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059
+IngestManager.serviceIsDown.msgDlg.text={0} \u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
+ProfilePanel.messages.profileNameContainsIllegalCharacter=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u4e0d\u6b63\u306a\u6587\u5b57\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059
+ProfilePanel.messages.profilesMustBeNamed=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306b\u540d\u524d\u3092\u4ed8\u3051\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+ProfilePanel.newProfileText=NewEmptyProfile
+ProfilePanel.profileDescLabel.text=\u8aac\u660e:
+ProfilePanel.profileNameLabel.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d:
+ProfilePanel.title.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb
+ProfileSettingsPanel.deleteProfileButton.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664
+# {0} - \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d
+ProfileSettingsPanel.doFileSetsDialog.duplicateProfile.text={0} \u306e\u540d\u524d\u306e\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002
+ProfileSettingsPanel.editProfileButton.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u7de8\u96c6
+ProfileSettingsPanel.filterNameLabel.text=\u30d5\u30a3\u30eb\u30bf\u30fc:
+ProfileSettingsPanel.infoTextArea.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u304c\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5185\u306e\u4e00\u90e8\u307e\u305f\u306f\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u4e0a\u3067\u4e8b\u524d\u69cb\u6210\u6e08\u307f\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30bb\u30c3\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306e\u30b5\u30d6\u30bb\u30c3\u30c8\u4e0a\u3067\u540c\u3058\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u30bb\u30c3\u30c8\u3092\u983b\u7e41\u306b\u5b9f\u884c\u3059\u308b\u5834\u5408\u306f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ProfileSettingsPanel.messages.filterLoadFailed=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f
+ProfileSettingsPanel.newProfileButton.text=\u65b0\u898f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb
+ProfileSettingsPanel.profileDescLabel.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u8aac\u660e:
+ProfileSettingsPanel.profileListLabel.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb:
+ProfileSettingsPanel.selectedModulesLabel.text=\u9078\u629e\u3057\u305f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb:
+ProfileSettingsPanel.title=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u8a2d\u5b9a
+RunIngestSubMenu.menuItem.empty=-\u7a7a(\u672a\u5165\u529b)-
RunIngestModulesMenu.getName.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
-DataSourceIngestPipeline.moduleError.title.text={0}\u30a8\u30e9\u30fc
-FileIngestPipeline.moduleError.title.text={0}\u30a8\u30e9\u30fc
-IngestJob.cancelReason.notCancelled.text=\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-IngestJob.cancelReason.cancelledByUser.text=\u30e6\u30fc\u30b6\u30fc\u304c\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u307e\u3057\u305f
-IngestJob.cancelReason.ingestModStartFail.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306e\u8d77\u52d5\u306b\u5931\u6557
-IngestJob.cancelReason.outOfDiskSpace.text=\u30c7\u30a3\u30b9\u30af\u30b9\u30da\u30fc\u30b9\u304c\u8db3\u308a\u307e\u305b\u3093
+DataSourceIngestPipeline.moduleError.title.text={0} \u30a8\u30e9\u30fc
+FileIngestPipeline.moduleError.title.text={0} \u30a8\u30e9\u30fc
+IngestJob.cancelReason.notCancelled.text=\u53d6\u308a\u6d88\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+IngestJob.cancelReason.cancelledByUser.text=\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u3063\u3066\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f
+IngestJob.cancelReason.ingestModStartFail.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+IngestJob.cancelReason.outOfDiskSpace.text=\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093
+IngestJob.cancelReason.servicesDown.text=\u30b5\u30fc\u30d3\u30b9\u304c\u30c0\u30a6\u30f3\u3057\u3066\u3044\u307e\u3059
IngestJob.cancelReason.caseClosed.text=\u30b1\u30fc\u30b9\u3092\u9589\u3058\u307e\u3057\u305f
-IngestJobSettingsPanel.globalSettingsButton.actionCommand=\u30a2\u30c9\u30d0\u30f3\u30b9
-IngestJobSettingsPanel.globalSettingsButton.text=\u30a2\u30c9\u30d0\u30f3\u30b9
-IngestSettingsPanel.jLabelNumThreads.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u4f7f\u7528\u3059\u308b\u30b9\u30ec\u30c3\u30c9\u6570\uff1a
+IngestJobSettingsPanel.globalSettingsButton.text=\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a
+\u30b2\u30b9\u30c8
+IngestJobSettingsPanel.globalSettingsButton.actionCommand=\u9ad8\u5ea6
+IngestJobSettingsPanel.globalSettingsButton.text=\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a
+IngestJobSettingsPanel.pastJobsButton.text=\u5c65\u6b74
+IngestJobSettingsPanel.fileIngestFilterLabel.text=\u6b21\u3067\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c:
+OptionsCategory_Name_IngestOptions=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
+OptionsCategory_Keywords_IngestOptions=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
IngestSettingsPanel.jLabelProcessTimeOutUnits.text=\u6642\u9593
-IngestSettingsPanel.jLabelSetProcessTimeOut.text=\u4e00\u5b9a\u306e\u6642\u9593\u304c\u904e\u304e\u305f\u5f8c\u306b\u81ea\u52d5\u7684\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u505c\u6b62\u3067\u304d\u308b\u3088\u3046\u306b\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3092\u6709\u52b9\u5316\uff1a
-IngestSettingsPanel.restartRequiredLabel.text=\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3067\u306f\u6700\u5927{0}\u306e\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b9\u30ec\u30c3\u30c9\u3092\u4f7f\u7528\u3059\u3079\u304d\u3067\u3059\u3002\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
-IngestSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-ProfileSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+IngestSettingsPanel.jFormattedTextFieldProcTimeOutHrs.text=60
+IngestSettingsPanel.jCheckBoxEnableProcTimeout.text=
+IngestSettingsPanel.jLabelSetProcessTimeOut.text=\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u3001\u8a2d\u5b9a\u3057\u305f\u6642\u9593\u306e\u7d4c\u904e\u5f8c\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u81ea\u52d5\u7684\u306b\u7d42\u4e86\u3067\u304d\u307e\u3059\u3002
+IngestSettingsPanel.restartRequiredLabel.text=\u3053\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u306e\u5834\u5408\u3001\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b9\u30ec\u30c3\u30c9 {0} \u306e\u6700\u5927\u6570\u3092\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u518d\u8d77\u52d5\u304c\u5fc5\u8981\u3067\u3059\u3002
+IngestSettingsPanel.jLabelNumThreads.text=\u30d5\u30a1\u30a4\u30eb\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u4f7f\u7528\u3067\u304d\u308b\u30b9\u30ec\u30c3\u30c9\u6570:
+IngestSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+ProfileSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java b/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java
index e0cb7176f9..7dfbdacb4c 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java
+++ b/Core/src/org/sleuthkit/autopsy/ingest/GetFilesContentVisitor.java
@@ -30,6 +30,7 @@ import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.Image;
import org.sleuthkit.datamodel.VirtualDirectory;
import org.sleuthkit.datamodel.LocalDirectory;
+import org.sleuthkit.datamodel.Pool;
import org.sleuthkit.datamodel.Report;
import org.sleuthkit.datamodel.TskException;
import org.sleuthkit.datamodel.Volume;
@@ -71,6 +72,11 @@ abstract class GetFilesContentVisitor implements ContentVisitor visit(VolumeSystem vs) {
return getAllFromChildren(vs);
}
+
+ @Override
+ public Collection visit(Pool pool) {
+ return getAllFromChildren(pool);
+ }
@Override
public Collection visit(Report r) {
diff --git a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties
index 39d7a2632b..431b60a8b1 100644
--- a/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/ingest/runIngestModuleWizard/Bundle_ja.properties
@@ -1 +1,8 @@
-RunIngestModulesAction.name=\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
\ No newline at end of file
+IngestModulesConfigWizardPanel.name.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u69cb\u6210
+IngestProfileSelectionPanel.customSettings.description=\u30a6\u30a3\u30b6\u30fc\u30c9\u306e\u6b21\u306e\u30b9\u30c6\u30c3\u30d7\u3067\u500b\u3005\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u8a2d\u5b9a\u3092\u69cb\u6210
+IngestProfileSelectionPanel.customSettings.name=\u30ab\u30b9\u30bf\u30e0\u8a2d\u5b9a
+IngestProfileSelectionPanel.ingestSettingsButton.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u8a2d\u5b9a
+IngestProfileSelectionPanel.profileListLabel.text=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e:
+IngestProfileWizardPanel.panelName=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u9078\u629e\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8
+RunIngestModulesAction.actionPerformed.errorMessage=\u9078\u629e\u3057\u305f\u9805\u76ee\u306e\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30af\u30a8\u30ea\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+RunIngestModulesAction.name=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c
diff --git a/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties
index 9bbd244f08..76dff54faf 100644
--- a/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/menuactions/Bundle_ja.properties
@@ -1,7 +1,7 @@
-OpenIDE-Module-Name=\u30E1\u30CB\u30E5\u30FC\u30A2\u30AF\u30B7\u30E7\u30F3
-DataContentDynamicMenu.menu.dataContentWin.text=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4\u30A6\u30A3\u30F3\u30C9\u30A6
-DataContentMenu.getName.text=\u30C7\u30FC\u30BF\u30B3\u30F3\u30C6\u30F3\u30C4\u30E1\u30CB\u30E5\u30FC
-DataExplorerMenu.getName.text=\u30C7\u30FC\u30BF\u30A8\u30AF\u30B9\u30D7\u30ED\u30FC\u30E9\u30C4\u30FC\u30EB
-DataResultMenu.menu.dataResWin.text=\u30C7\u30FC\u30BF\u7D50\u679C\u30A6\u30A3\u30F3\u30C9\u30A6
-DataResultMenu.getName.text=\u30C7\u30FC\u30BF\u7D50\u679C\u30E1\u30CB\u30E5\u30FC
-SearchResultMenu.menu.dataRes.text=\u30C7\u30FC\u30BF\u7D50\u679C
\ No newline at end of file
+OpenIDE-Module-Name=\u30e1\u30cb\u30e5\u30fc\u30a2\u30af\u30b7\u30e7\u30f3
+DataContentDynamicMenu.menu.dataContentWin.text=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4\u30a6\u30a3\u30f3\u30c9\u30a6
+DataContentMenu.getName.text=\u30c7\u30fc\u30bf\u30b3\u30f3\u30c6\u30f3\u30c4\u30e1\u30cb\u30e5\u30fc
+DataExplorerMenu.getName.text=\u30c7\u30fc\u30bf\u30a8\u30af\u30b9\u30d7\u30ed\u30fc\u30e9\u30c4\u30fc\u30eb
+DataResultMenu.menu.dataResWin.text=\u30c7\u30fc\u30bf\u7d50\u679c\u30a6\u30a3\u30f3\u30c9\u30a6
+DataResultMenu.getName.text=\u30c7\u30fc\u30bf\u7d50\u679c\u30e1\u30cb\u30e5\u30fc
+SearchResultMenu.menu.dataRes.text=\u30c7\u30fc\u30bf\u7d50\u679c
diff --git a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle_ja.properties
index cbd02b8693..f73bf77a55 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/dataSourceIntegrity/Bundle_ja.properties
@@ -1,14 +1,50 @@
-OpenIDE-Module-Name=EWFVerify
-DataSourceIntegrityIngestModule.process.errProcImg={0}\u3092\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-DataSourceIntegrityModuleFactory.moduleName.text=E01\u8a8d\u8a3c\u30c4\u30fc\u30eb
-DataSourceIntegrityModuleFactory.moduleDesc.text=E01\u30d5\u30a1\u30a4\u30eb\u306e\u6574\u5408\u6027\u3092\u8a8d\u8a3c\u3057\u307e\u3059\u3002
-DataSourceIntegrityIngestModule.process.skipNonEwf=E01\u30a4\u30e1\u30fc\u30b8\u3067\u306f\u306a\u3044{0}\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u3066\u3044\u307e\u3059
-DataSourceIntegrityIngestModule.process.noStoredHash=\u30a4\u30e1\u30fc\u30b8{0}\u306f\u4fdd\u5b58\u3055\u308c\u3066\u3044\u308b\u30cf\u30c3\u30b7\u30e5\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-DataSourceIntegrityIngestModule.process.startingImg={0}\u3092\u958b\u59cb\u4e2d
-DataSourceIntegrityIngestModule.process.errReadImgAtChunk={0}\u306e\u30c1\u30e3\u30f3\u30af{1}\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-DataSourceIntegrityIngestModule.shutDown.calcHashLi=\u8a08\u7b97\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u5024\uff1a{0}
-DataSourceIntegrityIngestModule.shutDown.notVerified=\u8a8d\u8a3c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-DataSourceIntegrityIngestModule.shutDown.resultLi=\u7d50\u679c\uff1a{0}
-DataSourceIntegrityIngestModule.shutDown.storedHashLi=\u4fdd\u5b58\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\uff1a {0}
-DataSourceIntegrityIngestModule.shutDown.verifyResultsHeader={0}\u306eEWF\u30d9\u30ea\u30d5\u30a3\u30b1\u30fc\u30b7\u30e7\u30f3\u7d50\u679c
-EwfVerifyIDataSourceIntegrityIngestModulengestModule.shutDown.verified=\u8a8d\u8a3c\u3055\u308c\u307e\u3057\u305f
\ No newline at end of file
+# {0} - hashName
+# {1} - calculatedHashValue
+DataSourceIntegrityIngestModule.process.calcHashWithType=\u8a08\u7b97\u6e08\u307f {0} \u30cf\u30c3\u30b7\u30e5: {1}
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.calculateHashDone= {0} \u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30cf\u30c3\u30b7\u30e5\u8a08\u7b97\u7d50\u679c
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.errorLoadingHashes=\ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304b\u3089\u30a4\u30e1\u30fc\u30b8 {0} \u306e\u30cf\u30c3\u30b7\u30e5\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.errorSavingHashes=\ \u30a4\u30e1\u30fc\u30b8 {0} \u306e\u30cf\u30c3\u30b7\u30e5\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - hashName
+DataSourceIntegrityIngestModule.process.hashAlgorithmError={0} \u30a2\u30eb\u30b4\u30ea\u30ba\u30e0\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u30c0\u30a4\u30b8\u30a7\u30b9\u30c8\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+DataSourceIntegrityIngestModule.process.hashesCalculated=\ \u8a08\u7b97\u6e08\u307f\u30cf\u30c3\u30b7\u30e5
+# {0} - hashAlgorithm
+# {1} - calculatedHashValue
+# {2} - storedHashValue
+DataSourceIntegrityIngestModule.process.hashFailedForArtifact={0} \u30cf\u30c3\u30b7\u30e5\u306e\u691c\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f:\n \u8a08\u7b97\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {1}\N \u4fdd\u5b58\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {2}\n
+# {0} - calculatedHashValue
+# {1} - storedHashValue
+DataSourceIntegrityIngestModule.process.hashList=\u8a08\u7b97\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {0} \u4fdd\u5b58\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {1}
+# {0} - hashName
+DataSourceIntegrityIngestModule.process.hashMatch={0} \u691c\u8a3c\u6e08\u307f\u30cf\u30c3\u30b7\u30e5
+# {0} - hashName
+DataSourceIntegrityIngestModule.process.hashNonMatch={0} \u30cf\u30c3\u30b7\u30e5\u304c\u691c\u8a3c\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.skipCompute=\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u7121\u52b9\u3060\u3063\u305f\u305f\u3081 {0} \u306e\u65b0\u898f\u30cf\u30c3\u30b7\u30e5\u306e\u8a08\u7b97\u304c\u884c\u308f\u308c\u3066\u3044\u307e\u305b\u3093
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.skipVerify=\u30aa\u30d7\u30b7\u30e7\u30f3\u304c\u7121\u52b9\u3060\u3063\u305f\u305f\u3081 {0} \u306e\u65e2\u5b58\u30cf\u30c3\u30b7\u30e5\u306e\u691c\u8a3c\u304c\u884c\u308f\u308c\u3066\u3044\u307e\u305b\u3093
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.verificationFailure={0} \u304c\u5b8c\u5168\u6027\u691c\u8a3c\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+# {0} - imageName
+DataSourceIntegrityIngestModule.process.verificationSuccess={0} \u306e\u5b8c\u5168\u6027\u304c\u691c\u8a3c\u3055\u308c\u307e\u3057\u305f
+DataSourceIntegrityIngestModule.startup.noCheckboxesSelected=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u30c1\u30a7\u30c3\u30af\u30dc\u30c3\u30af\u30b9\u3092\u9078\u629e\u3057\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093
+OpenIDE-Module-Name=ewfVerify
+DataSourceIntegrityModuleFactory.moduleName.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5b8c\u5168\u6027
+DataSourceIntegrityModuleFactory.moduleDesc.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u306e\u30cf\u30c3\u30b7\u30e5\u3092\u8a08\u7b97\u304a\u3088\u3073\u691c\u8a3c\u3057\u307e\u3059\u3002
+DataSourceIntegrityIngestModule.process.errProcImg={0} \u306e\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+DataSourceIntegrityIngestModule.process.skipNonEwf=\u975e\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 {0} \u3092\u30b9\u30ad\u30c3\u30d7\u4e2d\u3067\u3059
+DataSourceIntegrityIngestModule.process.noStoredHash=\u30a4\u30e1\u30fc\u30b8 {0} \u306b\u4fdd\u5b58\u6e08\u307f\u30cf\u30c3\u30b7\u30e5\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+DataSourceIntegrityIngestModule.process.startingImg={0} \u3092\u8d77\u52d5\u4e2d\u3067\u3059
+DataSourceIntegrityIngestModule.process.errReadImgAtChunk=\u30c1\u30e3\u30f3\u30af {1} \u306e {0} \u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+DataSourceIntegrityIngestModule.shutDown.verified=\ \u691c\u8a3c\u6e08\u307f
+DataSourceIntegrityIngestModule.shutDown.notVerified=\ \u691c\u8a3c\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+DataSourceIntegrityIngestModule.shutDown.verifyResultsHeader= {0} \u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u691c\u8a3c\u7d50\u679c
+DataSourceIntegrityIngestModule.shutDown.resultLi=\u7d50\u679c:{0}
+DataSourceIntegrityIngestModule.shutDown.calcHashLi=\u8a08\u7b97\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {0}
+DataSourceIntegrityIngestModule.shutDown.storedHashLi=\u4fdd\u5b58\u6e08\u307f\u30cf\u30c3\u30b7\u30e5: {0}
+DataSourceIntegrityIngestSettingsPanel.computeHashesCheckbox.text=\u4f55\u3082\u306a\u3044\u5834\u5408\u306f\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30cf\u30c3\u30b7\u30e5\u3092\u8a08\u7b97
+DataSourceIntegrityIngestSettingsPanel.jLabel1.text=\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u8ad6\u7406\u30d5\u30a1\u30a4\u30eb\u4e0a\u3067\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093
+DataSourceIntegrityIngestSettingsPanel.jLabel3.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u8a2d\u5b9a
+DataSourceIntegrityIngestSettingsPanel.verifyHashesCheckbox.text=\u65e2\u5b58\u306e\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u30cf\u30c3\u30b7\u30e5\u3092\u691c\u8a3c
diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties
index 66063448fd..355c94be83 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/Bundle_ja.properties
@@ -1,40 +1,55 @@
+CannotCreateOutputFolder=\u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
+CannotRunFileTypeDetection=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u691c\u51fa\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.moduleDesc.text=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb(doc, docx, ppt, pptx, xls, xlsx, zip, rar, arj, 7z, gzip, bzip2, tar)\u3092\u62bd\u51fa\u3057\u3001\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u30b9\u30b1\u30b8\u30e5\u30fc\u30eb\u3057\u3001\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u30c4\u30ea\u30fc\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u5165\u529b\u3057\u307e\u3059\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.moduleName=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u30c4\u30fc\u30eb
+EmbeddedFileExtractorIngestModule.NoOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+EmbeddedFileExtractorIngestModule.UnableToGetMSOfficeExtractor.errMsg=MSOfficeEmbeddedContentExtractor\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002
+ExtractArchiveWithPasswordAction.extractFailed.title=\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u5c01\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+ExtractArchiveWithPasswordAction.name.text=\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u89e3\u51cd
+# {0} - archiveFile
+ExtractArchiveWithPasswordAction.progress.text=\u6b21\u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u958b\u5c01\u4e2d\u3067\u3059: {0}
+ExtractArchiveWithPasswordAction.prompt.text=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b
+ExtractArchiveWithPasswordAction.prompt.title=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
OpenIDE-Module-Long-Description=\
- \u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\n\n\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u30d5\u30a1\u30a4\u30eb\uff08doc\u3001docx\u3001ppt\u3001pptx\u3001xls\u3001xlsx\u7b49\uff09\u3084\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\uff08zip\u3084\u305d\u306e\u4ed6\u306e7zip\u30a8\u30af\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\uff09\u3092\u51e6\u7406\u3057\u307e\u3059\u3002\n\
- 7Zip\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\n\n7Zip\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3057\u307e\u3059\uff08zip\u30847zip\u30a8\u30af\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u306b\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u305d\u306e\u4ed6\u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u30bf\u30a4\u30d7\u306a\u3069\uff09\u3002\n\
- \u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u62bd\u51fa\u3055\u308c\u3001\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u306f\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u8ffd\u52a0\u3055\u308c\u3001\u8a2d\u5b9a\u3055\u308c\u305f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u51e6\u7406\u3055\u308c\u307e\u3059\u3002\n\
- \u3082\u3057\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\u3067\u3042\u308c\u3070\u30017Zip\u30a8\u30af\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u306b\u3088\u308a\u3001\u518d\u5ea6\u51e6\u7406\u3055\u308c\u307e\u3059 - \u30a8\u30af\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u306f\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\u3092N-\u30ec\u30d9\u30eb\u306e\u6df1\u3055\u3067\u51e6\u7406\u3057\u307e\u3059\u3002\n\n\
- \u62bd\u51fa\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30c4\u30ea\u30fc\u3067\u30ca\u30d3\u30b2\u30fc\u30c8\u3067\u304d\u307e\u3059\u3002\n\n\
- \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306fWindows\u3001Linux\u3001Mac\u306e\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u74b0\u5883\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u3059\u3002
+ Embedded File Extraction Ingest Module\n\n\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u3001\u6587\u66f8\u30d5\u30a1\u30a4\u30eb(\u4f8b: doc, docx, ppt, pptx, xls, xlsx)\u3068\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb(\u4f8b: zip\u3001\u5727\u7e2e\u30fb\u89e3\u51cd\u30bd\u30d5\u30c87zip\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u305d\u306e\u4ed6\u30a2\u30fc\u30ab\u30a4\u30d6\u30bf\u30a4\u30d7)\u3092\u51e6\u7406\u3057\u307e\u3059\u3002\n\
+ \u3053\u308c\u3089\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u62bd\u51fa\u3057\u3001\u69cb\u6210\u6e08\u307f\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u3088\u3063\u3066\u51e6\u7406\u3055\u308c\u308b\u73fe\u5728\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306b\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u3092\u623b\u3057\u307e\u3059\u3002\n\
+ \u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\u306e\u5834\u5408\u3001\u5727\u7e2e\u30fb\u89e3\u51cd\u30bd\u30d5\u30c87zip\u3067\u518d\u51e6\u7406\u3055\u308c\u307e\u3059\u3002\u5727\u7e2e\u30fb\u89e3\u51cd\u30bd\u30d5\u30c8\u304cN\u30ec\u30d9\u30eb\u306e\u6df1\u3055\u3067\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3057\u307e\u3059\u3002\n\n\
+ \u62bd\u51fa\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u30c4\u30ea\u30fc\u3067\u53c2\u7167\u3067\u304d\u307e\u3059\u3002\n\n\
+ \u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u3002Windows\u3001Linux\u3001Mac\u306e\u5404\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002
OpenIDE-Module-Name=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa
-OpenIDE-Module-Short-Description=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-SevenZipContentReadStream.seek.exception.invalidOrigin=\u7121\u52b9\u306a\u30b7\u30fc\u30af\u539f\u70b9\uff1a {0}
-SevenZipContentReadStream.read.exception.errReadStream=\u30b3\u30f3\u30c6\u30f3\u30c4\u30b9\u30c8\u30ea\u30fc\u30e0\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=\u7121\u52b9\u306a\u30b7\u30fc\u30af\u306e\u539f\u70b9\: {0}
+OpenIDE-Module-Short-Description=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u62bd\u51fa\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
+EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.seek.exception.invalidOrigin=\u7121\u52b9\u306a\u30b7\u30fc\u30af\u30aa\u30ea\u30b8\u30f3: {0}
EmbeddedFileExtractorIngestModule.SevenZipContentReadStream.read.exception.errReadStream=\u30b3\u30f3\u30c6\u30f3\u30c4\u30b9\u30c8\u30ea\u30fc\u30e0\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.moduleName=\u57cb\u3081\u8fbc\u307f\u30d5\u30a1\u30a4\u30eb\u306e\u62bd\u51fa\u30c4\u30fc\u30eb
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.encryptionFileLevel=\u30d5\u30a1\u30a4\u30eb\u30ec\u30d9\u30eb\u3067\u306e\u6697\u53f7\u5316
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.encryptionFull=\u5b8c\u5168\u306a\u6697\u53f7\u5316
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.init.errInitModule.details=\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\: {0}\: {1}\u3092\u8d77\u52d5\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=\u30a2\u30fc\u30ab\u30a4\u30d6\: {0}, item\: {1}\u306bZIP\u7206\u5f3e\u304b\u3082\u3057\u308c\u306a\u3044\u3082\u306e\u3092\u767a\u898b
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=\u5727\u7e2e\u7387\u304c{0}\u3001{1}\u306b\u3042\u308b\u30a2\u30a4\u30c6\u30e0\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=ZIP\u7206\u5f3e\u304b\u3082\u3057\u308c\u306a\u3044\u3082\u306e\u3092\u767a\u898b\uff1a{0}
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=\u30a2\u30fc\u30ab\u30a4\u30d6\u306f{0}\u30ec\u30d9\u30eb\u306e\u6df1\u3055\u3067\u3059\u3002{1}\u306e\u51e6\u7406\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\: {0}\u306b\u4e0d\u660e\u306a\u30a2\u30a4\u30c6\u30e0\u30d1\u30b9\u304c\u3042\u308a\u307e\u3059\u3002{1}\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u30a2\u30a4\u30c6\u30e0\: {0}, {1}\u3092\u89e3\u51cd\u3059\u308b\u306e\u306b\u30c7\u30a3\u30b9\u30af\u30b9\u30da\u30fc\u30b9\u304c\u8db3\u308a\u307e\u305b\u3093
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=\u30a2\u30fc\u30ab\u30a4\u30d6\u30a2\u30a4\u30c6\u30e0\u304c\u89e3\u51cd\u3059\u308b\u306e\u306b\u5927\u304d\u3059\u304e\u307e\u3059\u3002\u3053\u306e\u30a2\u30a4\u30c6\u30e0\u306e\u89e3\u51cd\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg={0}\u306e\u89e3\u51cd\u30a8\u30e9\u30fc
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.details={0}. {1}\u3092\u89e3\u51cd\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.encrFileDetected.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u306b\u6697\u53f7\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u767a\u898b\u3057\u307e\u3057\u305f\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.encrFileDetected.details=\u30a2\u30fc\u30ab\u30a4\u30d6\: {0}\u306e\u4e00\u90e8\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u307e\u3059\u3002 {1} \u30a8\u30af\u30b9\u30c8\u30e9\u30af\u30bf\u30fc\u304c\u3053\u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u5168\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.exception.msg=\u89e3\u51cd\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\: {0}\u306b\u66f8\u304d\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackedTree.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\:{0}\u306b\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.docContainer.init.err=\u8aad\u307f\u53d6\u308a\u4e2d\u306bDoc\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.docxContainer.init.err={0}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bDocx\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.pptContainer.init.err={0}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bPpt\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.pptxContainer.init.err={0}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bPptx\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err={0}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bXls\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.xlsxContainer.init.err={0}\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bXlsx\u30b3\u30f3\u30c6\u30a4\u30ca\u30fc\u3092\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ImageExtractor.extractImage.addToDB.exception.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg=\u30a2\u30d6\u30b9\u30c8\u30e9\u30af\u30c8\u30d5\u30a1\u30a4\u30eb\: {0}\u304b\u3089\u753b\u50cf\u62bd\u51fa\u306e\u30d1\u30b9\u3092\u5165\u624b\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.noSpace.msg=\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u30c7\u30a3\u30b9\u30af\u306b\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.encryptionFileLevel=\u30b3\u30f3\u30c6\u30f3\u30c4\u306e\u307f\u306e\u6697\u53f7\u5316(\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb)
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.encryptionFull=\u5b8c\u5168\u306a\u6697\u53f7\u5316(\u30a2\u30fc\u30ab\u30a4\u30d6\u30d5\u30a1\u30a4\u30eb)
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.init.errInitModule.details=\u30a8\u30e9\u30fc\u307e\u305f\u306f\u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u306e\u521d\u671f\u5316\u4e2d\u3067\u3059: {0}: {1}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnMsg=\u30a2\u30fc\u30ab\u30a4\u30d6\u3067ZIP\u7206\u5f3e\u304c\u691c\u51fa\u3055\u308c\u305f\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059: {0}\u3001\u9805\u76ee: {1}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.isZipBombCheck.warnDetails=\u5727\u7e2e\u7387\u306f {0} \u3067\u3059\u3002{1} \u306e\u9805\u76ee\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnMsg.zipBomb=ZIP\u7206\u5f3e\u304c\u691c\u51fa\u3055\u308c\u305f\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059: {0}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.warnDetails.zipBomb=\u30a2\u30fc\u30ab\u30a4\u30d6\u306f {0} \u30ec\u30d9\u30eb\u306e\u6df1\u3055\u3067\u3059\u3002{1} \u306e\u51e6\u7406\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.unknownPath.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u4e0d\u660e\u306a\u9805\u76ee\u30d1\u30b9: {0}\u3001\u6b21\u3092\u4f7f\u7528\u3057\u307e\u3059: {1}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u9805\u76ee\u3092\u958b\u5c01\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093: {0}\u3001{1}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.notEnoughDiskSpace.details=\u30a2\u30fc\u30ab\u30a4\u30d6\u9805\u76ee\u304c\u5927\u304d\u3059\u304e\u3067\u958b\u5c01\u3067\u304d\u307e\u305b\u3093\u3002\u3053\u306e\u9805\u76ee\u306e\u958b\u5c01\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.msg={0} \u306e\u958b\u5c01\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.errUnpacking.details={0} \u306e\u958b\u5c01\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002{1}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.encrFileDetected.msg=\u30a2\u30fc\u30ab\u30a4\u30d6\u306b\u6697\u53f7\u5316\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.unpack.encrFileDetected.details=\u30a2\u30fc\u30ab\u30a4\u30d6\u306e\u3044\u304f\u3064\u304b\u306e\u30d5\u30a1\u30a4\u30eb: {0} \u304c\u6697\u53f7\u5316\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u5727\u7e2e\u30fb\u89e3\u51cd\u30bd\u30d5\u30c8 {1} \u306f\u3053\u306e\u30a2\u30fc\u30ab\u30a4\u30d6\u304b\u3089\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.exception.msg=\u30d5\u30a1\u30a4\u30eb\u3092\u6b21\u306b\u958b\u5c01\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackedTree.exception.msg=\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u3092\u6b21\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f:{0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.docContainer.init.err=\u8aad\u307f\u53d6\u308a\u4e2d\u306bDOC\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+EmbeddedFileExtractorIngestModule.ImageExtractor.docxContainer.init.err=\u6b21\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bDOCX\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.pptContainer.init.err=\u6b21\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bPPT\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.pptxContainer.init.err=\u8aad\u307f\u53d6\u308a\u4e2d\u306bPPTX\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.xlsContainer.init.err=\u6b21\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bXLS\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.xlsxContainer.init.err=\u6b21\u3092\u8aad\u307f\u53d6\u308a\u4e2d\u306bXLSX\u30b3\u30f3\u30c6\u30ca\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.extractImage.addToDB.exception.msg=\u6d3e\u751f\u30d5\u30a1\u30a4\u30eb\u3092\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093.
+EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg=\u6b21\u306e\u62bd\u8c61\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u30a4\u30e1\u30fc\u30b8\u62bd\u51fa\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ImageExtractor.getOutputFolderPath.exception.msg=\u6b21\u306e\u62bd\u8c61\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u306e\u30a4\u30e1\u30fc\u30b8\u62bd\u51fa\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackStream.write.noSpace.msg=\u30c7\u30a3\u30b9\u30af\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093\u3002\u5341\u5206\u306a\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+SevenZipContentReadStream.seek.exception.invalidOrigin=\u7121\u52b9\u306a\u30aa\u30ea\u30b8\u30f3 {0}
+SevenZipContentReadStream.read.exception.errReadStream=\u30b9\u30c8\u30ea\u30fc\u30e0\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+SevenZipExtractor.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u6697\u53f7\u5316\u691c\u51fa\u6e08\u307f\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+# {0} - rootArchive
+SevenZipExtractor.zipBombArtifactCreation.text=Zip\u7206\u5f3e\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f {0}
+UnableToInitializeLibraries=7Zip\u30e9\u30a4\u30d6\u30e9\u30ea\u30fc\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java
index 0ccd35cef9..958813a905 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/embeddedfileextractor/SevenZipExtractor.java
@@ -21,6 +21,7 @@ package org.sleuthkit.autopsy.modules.embeddedfileextractor;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -37,12 +38,14 @@ import net.sf.sevenzipjbinding.ExtractAskMode;
import net.sf.sevenzipjbinding.ExtractOperationResult;
import net.sf.sevenzipjbinding.IArchiveExtractCallback;
import net.sf.sevenzipjbinding.ICryptoGetTextPassword;
+import net.sf.sevenzipjbinding.IInArchive;
import net.sf.sevenzipjbinding.ISequentialOutStream;
-import net.sf.sevenzipjbinding.ISevenZipInArchive;
import net.sf.sevenzipjbinding.PropID;
import net.sf.sevenzipjbinding.SevenZip;
import net.sf.sevenzipjbinding.SevenZipException;
import net.sf.sevenzipjbinding.SevenZipNativeInitializationException;
+import org.apache.tika.parser.txt.CharsetDetector;
+import org.apache.tika.parser.txt.CharsetMatch;
import org.netbeans.api.progress.ProgressHandle;
import org.openide.util.NbBundle;
import org.openide.util.NbBundle.Messages;
@@ -76,6 +79,7 @@ import org.sleuthkit.datamodel.TskData;
class SevenZipExtractor {
private static final Logger logger = Logger.getLogger(SevenZipExtractor.class.getName());
+
private static final String MODULE_NAME = EmbeddedFileExtractorModuleFactory.getModuleName();
//encryption type strings
@@ -185,7 +189,7 @@ class SevenZipExtractor {
*
* @return true if potential zip bomb, false otherwise
*/
- private boolean isZipBombArchiveItemCheck(AbstractFile archiveFile, ISevenZipInArchive inArchive, int inArchiveItemIndex, ConcurrentHashMap depthMap, String escapedFilePath) {
+ private boolean isZipBombArchiveItemCheck(AbstractFile archiveFile, IInArchive inArchive, int inArchiveItemIndex, ConcurrentHashMap depthMap, String escapedFilePath) {
//If a file is corrupted as a result of reconstructing it from unallocated space, then
//7zip does a poor job estimating the original uncompressed file size.
//As a result, many corrupted files have wonky compression ratios and could flood the UI
@@ -399,18 +403,16 @@ class SevenZipExtractor {
/**
* Get the path in the archive of the specified item
*
- * @param item - the item to get the path for
- * @param itemNumber - the item number to help provide uniqueness to the
- * path
- * @param archiveFile - the archive file the item exists in
+ * @param archive - the archive to get the path for
+ * @param inArchiveItemIndex - the item index to help provide uniqueness to the path
+ * @param archiveFile - the archive file the item exists in
*
* @return a string representing the path to the item in the archive
*
* @throws SevenZipException
*/
- private String getPathInArchive(ISevenZipInArchive archive, int inArchiveItemIndex, AbstractFile archiveFile) throws SevenZipException {
- String pathInArchive = (String) archive.getProperty(
- inArchiveItemIndex, PropID.PATH);
+ private String getPathInArchive(IInArchive archive, int inArchiveItemIndex, AbstractFile archiveFile) throws SevenZipException {
+ String pathInArchive = (String) archive.getProperty(inArchiveItemIndex, PropID.PATH);
if (pathInArchive == null || pathInArchive.isEmpty()) {
//some formats (.tar.gz) may not be handled correctly -- file in archive has no name/path
@@ -454,6 +456,10 @@ class SevenZipExtractor {
}
return pathInArchive;
}
+
+ private byte[] getPathBytesInArchive(IInArchive archive, int inArchiveItemIndex, AbstractFile archiveFile) throws SevenZipException {
+ return (byte[]) archive.getProperty(inArchiveItemIndex, PropID.PATH_BYTES);
+ }
/*
* Get the String that will represent the key for the hashmap which keeps
@@ -505,7 +511,7 @@ class SevenZipExtractor {
final String escapedArchiveFilePath = FileUtil.escapeFileName(archiveFilePath);
HashMap statusMap = new HashMap<>();
List unpackedFiles = Collections.emptyList();
- ISevenZipInArchive inArchive = null;
+
currentArchiveName = archiveFile.getName();
SevenZipContentReadStream stream = null;
@@ -520,7 +526,6 @@ class SevenZipExtractor {
return unpackSuccessful;
}
try {
-
List existingFiles = getAlreadyExtractedFiles(archiveFile, archiveFilePath);
for (AbstractFile file : existingFiles) {
statusMap.put(getKeyAbstractFile(file), new ZipFileStatusWrapper(file, ZipFileStatus.EXISTS));
@@ -553,6 +558,7 @@ class SevenZipExtractor {
return unpackSuccessful;
}
}
+ IInArchive inArchive = null;
try {
stream = new SevenZipContentReadStream(new ReadContentInputStream(archiveFile));
// for RAR files we need to open them explicitly as RAR. Otherwise, if there is a ZIP archive inside RAR archive
@@ -600,7 +606,8 @@ class SevenZipExtractor {
}
String pathInArchive = getPathInArchive(inArchive, inArchiveItemIndex, archiveFile);
- UnpackedTree.UnpackedNode unpackedNode = unpackedTree.addNode(pathInArchive);
+ byte[] pathBytesInArchive = getPathBytesInArchive(inArchive, inArchiveItemIndex, archiveFile);
+ UnpackedTree.UnpackedNode unpackedNode = unpackedTree.addNode(pathInArchive, pathBytesInArchive);
final boolean isEncrypted = (Boolean) inArchive.getProperty(inArchiveItemIndex, PropID.ENCRYPTED);
@@ -801,6 +808,34 @@ class SevenZipExtractor {
return unpackSuccessful;
}
+ private Charset detectFilenamesCharset(List byteDatas) {
+ Charset detectedCharset = null;
+ CharsetDetector charsetDetector = new CharsetDetector();
+ int byteSum = 0;
+ int fileNum = 0;
+ for (byte[] byteData : byteDatas) {
+ fileNum++;
+ byteSum += byteData.length;
+ // Only read ~1000 bytes of filenames in this directory
+ if (byteSum >= 1000) {
+ break;
+ }
+ }
+ byte[] allBytes = new byte[byteSum];
+ int start = 0;
+ for (int i = 0; i < fileNum; i++) {
+ byte[] byteData = byteDatas.get(i);
+ System.arraycopy(byteData, 0, allBytes, start, byteData.length);
+ start += byteData.length;
+ }
+ charsetDetector.setText(allBytes);
+ CharsetMatch cm = charsetDetector.detect();
+ if (cm.getConfidence() >= 90 && Charset.isSupported(cm.getName())) {
+ detectedCharset = Charset.forName(cm.getName());
+ }
+ return detectedCharset;
+ }
+
/**
* Produce a list of archive indices needed for the call to extract, which
* will open the archive and begin unpacking the files.
@@ -906,7 +941,7 @@ class SevenZipExtractor {
implements IArchiveExtractCallback, ICryptoGetTextPassword {
private final AbstractFile archiveFile;
- private final ISevenZipInArchive inArchive;
+ private final IInArchive inArchive;
private UnpackStream unpackStream = null;
private final Map archiveDetailsMap;
private final ProgressHandle progressHandle;
@@ -922,11 +957,10 @@ class SevenZipExtractor {
private boolean unpackSuccessful = true;
- StandardIArchiveExtractCallback(ISevenZipInArchive inArchive,
- AbstractFile archiveFile, ProgressHandle progressHandle,
- Map archiveDetailsMap,
- String password, long freeDiskSpace) {
-
+ StandardIArchiveExtractCallback(IInArchive inArchive,
+ AbstractFile archiveFile, ProgressHandle progressHandle,
+ Map archiveDetailsMap,
+ String password, long freeDiskSpace) {
this.inArchive = inArchive;
this.progressHandle = progressHandle;
this.archiveFile = archiveFile;
@@ -998,7 +1032,7 @@ class SevenZipExtractor {
final Date accessTime = (Date) inArchive.getProperty(
inArchiveItemIndex, PropID.LAST_ACCESS_TIME);
final Date writeTime = (Date) inArchive.getProperty(
- inArchiveItemIndex, PropID.LAST_WRITE_TIME);
+ inArchiveItemIndex, PropID.LAST_MODIFICATION_TIME);
createTimeInSeconds = createTime == null ? 0L
: createTime.getTime() / 1000;
@@ -1100,7 +1134,6 @@ class SevenZipExtractor {
* @param localPathRoot Path in module output folder that files will be
* saved to
* @param archiveFile Archive file being extracted
- * @param fileManager
*/
UnpackedTree(String localPathRoot, AbstractFile archiveFile) {
this.rootNode = new UnpackedNode();
@@ -1118,7 +1151,7 @@ class SevenZipExtractor {
*
* @return child node for the last file token in the filePath
*/
- UnpackedNode addNode(String filePath) {
+ UnpackedNode addNode(String filePath, byte[] filePathBytes) {
String[] toks = filePath.split("[\\/\\\\]");
List tokens = new ArrayList<>();
for (int i = 0; i < toks.length; ++i) {
@@ -1126,7 +1159,36 @@ class SevenZipExtractor {
tokens.add(toks[i]);
}
}
- return addNode(rootNode, tokens);
+
+ List byteTokens = null;
+ if (filePathBytes == null) {
+ return addNode(rootNode, tokens, null);
+ } else {
+ byteTokens = new ArrayList<>(tokens.size());
+ int last = 0;
+ for (int i = 0; i < filePathBytes.length; i++) {
+ if (filePathBytes[i] == '/') {
+ int len = i - last;
+ byte[] arr = new byte[len];
+ System.arraycopy(filePathBytes, last, arr, 0, len);
+ byteTokens.add(arr);
+ last = i + 1;
+ }
+ }
+ int len = filePathBytes.length - last;
+ if (len > 0) {
+ byte[] arr = new byte[len];
+ System.arraycopy(filePathBytes, last, arr, 0, len);
+ byteTokens.add(arr);
+ }
+
+ if (tokens.size() != byteTokens.size()) {
+ logger.log(Level.WARNING, "Could not map path bytes to path string");
+ return addNode(rootNode, tokens, null);
+ }
+ }
+
+ return addNode(rootNode, tokens, byteTokens);
}
/**
@@ -1137,7 +1199,8 @@ class SevenZipExtractor {
*
* @return
*/
- private UnpackedNode addNode(UnpackedNode parent, List tokenPath) {
+ private UnpackedNode addNode(UnpackedNode parent,
+ List tokenPath, List tokenPathBytes) {
// we found all of the tokens
if (tokenPath.isEmpty()) {
return parent;
@@ -1145,15 +1208,20 @@ class SevenZipExtractor {
// get the next name in the path and look it up
String childName = tokenPath.remove(0);
+ byte[] childNameBytes = null;
+ if (tokenPathBytes != null) {
+ childNameBytes = tokenPathBytes.remove(0);
+ }
UnpackedNode child = parent.getChild(childName);
// create new node
if (child == null) {
child = new UnpackedNode(childName, parent);
+ child.setFileNameBytes(childNameBytes);
parent.addChild(child);
}
// go down one more level
- return addNode(child, tokenPath);
+ return addNode(child, tokenPath, tokenPathBytes);
}
/**
@@ -1254,6 +1322,32 @@ class SevenZipExtractor {
NbBundle.getMessage(SevenZipExtractor.class, "EmbeddedFileExtractorIngestModule.ArchiveExtractor.UnpackedTree.exception.msg",
node.getFileName()), ex);
}
+
+ // Determine encoding of children
+ if (node.getChildren().size() > 0) {
+ String names = "";
+ ArrayList byteDatas = new ArrayList<>();
+ for (UnpackedNode child : node.getChildren()) {
+ byte[] childBytes = child.getFileNameBytes();
+ if (childBytes != null) {
+ byteDatas.add(childBytes);
+ }
+ names += child.getFileName();
+ }
+ Charset detectedCharset = detectFilenamesCharset(byteDatas);
+
+ // If a charset was detected, transcode filenames accordingly
+ if (detectedCharset != null && detectedCharset.canEncode()) {
+ for (UnpackedNode child : node.getChildren()) {
+ byte[] childBytes = child.getFileNameBytes();
+ if (childBytes != null) {
+ String decodedName = new String(childBytes, detectedCharset);
+ child.setFileName(decodedName);
+ }
+ }
+ }
+ }
+
//recurse adding the children if this file was incomplete the children presumably need to be added
for (UnpackedNode child : node.getChildren()) {
updateOrAddFileToCaseRec(child, fileManager, statusMap, getKeyFromUnpackedNode(node, archiveFilePath));
@@ -1266,6 +1360,7 @@ class SevenZipExtractor {
private class UnpackedNode {
private String fileName;
+ private byte[] fileNameBytes;
private AbstractFile file;
private final List children = new ArrayList<>();
private String localRelPath = "";
@@ -1396,6 +1491,19 @@ class SevenZipExtractor {
boolean isIsFile() {
return isFile;
}
+
+ void setFileNameBytes(byte[] fileNameBytes) {
+ if (fileNameBytes != null) {
+ this.fileNameBytes = Arrays.copyOf(fileNameBytes, fileNameBytes.length);
+ }
+ }
+
+ byte[] getFileNameBytes() {
+ if (fileNameBytes == null) {
+ return null;
+ }
+ return Arrays.copyOf(fileNameBytes, fileNameBytes.length);
+ }
}
}
diff --git a/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/Bundle_ja.properties
new file mode 100644
index 0000000000..8d75ef4fad
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/modules/encryptiondetection/Bundle_ja.properties
@@ -0,0 +1,17 @@
+EncryptionDetectionDataSourceIngestModule.artifactComment.bitlocker=Bitlocker\u6697\u53f7\u5316\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
+EncryptionDetectionDataSourceIngestModule.artifactComment.suspected=\u9ad8\u30a8\u30f3\u30c8\u30ed\u30d4\u30fc(%f)\u306b\u3088\u308a\u6697\u53f7\u5316\u304c\u7591\u308f\u308c\u307e\u3057\u305f\u3002
+EncryptionDetectionDataSourceIngestModule.processing.message=\u6697\u53f7\u5316\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u30c1\u30a7\u30c3\u30af\u4e2d\u3067\u3059\u3002
+EncryptionDetectionFileIngestModule.artifactComment.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u4fdd\u8b77\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f\u3002
+EncryptionDetectionFileIngestModule.artifactComment.suspected=\u9ad8\u30a8\u30f3\u30c8\u30ed\u30d4\u30fc(%f)\u306b\u3088\u308a\u6697\u53f7\u5316\u304c\u7591\u308f\u308c\u307e\u3057\u305f\u3002
+EncryptionDetectionFileIngestModule.getDesc.text=\u6307\u5b9a\u3057\u305f\u6700\u5c0f\u30a8\u30f3\u30c8\u30ed\u30d4\u30fc\u3092\u4f7f\u3063\u3066\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3057\u307e\u3059\u3002
+EncryptionDetectionFileIngestModule.moduleName.text=\u6697\u53f7\u5316\u691c\u51fa
+EncryptionDetectionIngestJobSettingsPanel.minimumEntropyLabel.text=\u6700\u5c0f\u30a8\u30f3\u30c8\u30ed\u30d4\u30fc:
+EncryptionDetectionIngestJobSettingsPanel.minimumFileSizeLabel.text=\u6700\u5c0f\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba:
+EncryptionDetectionIngestJobSettingsPanel.fileSizeMultiplesEnforcedCheckbox.text=512\u306e\u500d\u6570\u306b\u306a\u308b\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u307f\u3092\u691c\u8a0e\u3057\u307e\u3059\u3002
+EncryptionDetectionIngestJobSettingsPanel.slackFilesAllowedCheckbox.text=\u30b9\u30e9\u30c3\u30af\u9818\u57df\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u8a0e\u3057\u307e\u3059\u3002
+EncryptionDetectionIngestJobSettingsPanel.mbLabel.text=MB
+EncryptionDetectionIngestJobSettingsPanel.detectionSettingsLabel.text=\u691c\u51fa\u8a2d\u5b9a
+EncryptionDetectionIngestJobSettingsPanel.minimumFileSizeTextbox.text=
+EncryptionDetectionIngestJobSettingsPanel.minimumEntropyTextbox.text=
+EncryptionDetectionTools.errorMessage.minimumEntropyInput=\u6700\u5c0f\u30a8\u30f3\u30c8\u30ed\u30d4\u30fc\u306e\u5165\u529b\u306f6.0\uff5e8.0\u306e\u6570\u5b57\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+EncryptionDetectionTools.errorMessage.minimumFileSizeInput=\u6700\u5c0f\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u5165\u529b\u306f1\u4ee5\u4e0a\u306e\u6574\u6570(\u5358\u4f4d:\u30e1\u30ac\u30d0\u30a4\u30c8)\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties
index 4200bd7f58..fb0ec85c09 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/exif/Bundle_ja.properties
@@ -1,8 +1,10 @@
+CannotRunFileTypeDetection=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u691c\u51fa\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002
+ExifParserFileIngestModule.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001EXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
OpenIDE-Module-Long-Description=\
- Exif\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3002\n\n\
- \u3053\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u3057\u3001Exif\u60c5\u5831\u3092\u62bd\u51fa\u3057\u3001Exif\u60c5\u5831\u3092\u7d50\u679c\u3068\u3057\u3066\u30dd\u30b9\u30c8\u3057\u307e\u3059\u3002
-OpenIDE-Module-Name=Exif\u30d1\u30fc\u30b5
-OpenIDE-Module-Short-Description=Exif\u30e1\u30bf\u30c7\u30fc\u30bf\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-ExifParserFileIngestModule.moduleName.text=Exif\u30d1\u30fc\u30b5
-ExifParserFileIngestModule.getDesc.text=JPEG\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3057\u3001\u305d\u308c\u3089\u306eEXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002
+ EXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002 \n\n\
+ \u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a4\u30e1\u30fc\u30b8\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u3057\u3001Exif\u60c5\u5831\u3092\u62bd\u51fa\u3057\u3001Exif\u30c7\u30fc\u30bf\u3092\u7d50\u679c\u3068\u3057\u3066\u6295\u7a3f\u3057\u307e\u3059\u3002
+OpenIDE-Module-Name=ExifParser
+OpenIDE-Module-Short-Description=Exif\u30e1\u30bf\u30c7\u30fc\u30bf\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002
+ExifParserFileIngestModule.moduleName.text=Exif\u89e3\u6790\u30c4\u30fc\u30eb
+ExifParserFileIngestModule.getDesc.text=Ingests JPEG\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3057\u3001EXIF\u30e1\u30bf\u30c7\u30fc\u30bf\u3092\u56de\u53ce\u3057\u307e\u3059\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserModuleFactory.java
index 8f1b1a4efe..4b18db33c7 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserModuleFactory.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/exif/ExifParserModuleFactory.java
@@ -38,7 +38,7 @@ public class ExifParserModuleFactory extends IngestModuleFactoryAdapter {
return getModuleName();
}
- static String getModuleName() {
+ public static String getModuleName() {
return NbBundle.getMessage(ExifParserFileIngestModule.class,
"ExifParserFileIngestModule.moduleName.text");
}
diff --git a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties
index fc35bab029..24969e973b 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/fileextmismatch/Bundle_ja.properties
@@ -1,44 +1,64 @@
-OpenIDE-Module-Name=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4
+AddFileExtensionAction.writeError.message=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u8a2d\u5b9a\u3092\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+CannotRunFileTypeDetection=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u691c\u51fa\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002
+FileExtMismatchIngestModule.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+FileExtMismatchIngestModule.readError.message=\u8a2d\u5b9a\u3092\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+FileExtMismatchSettingsPanel.Title=\u30b0\u30ed\u30fc\u30d0\u30eb\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u8b58\u5225\u8a2d\u5b9a
+OpenIDE-Module-Name=FileExtMismatch
OptionsCategory_Name_FileExtMismatchOptions=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4
OptionsCategory_FileExtMismatch=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4
-AddFileExtensionAction.msgDlg.msg=XML\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304f\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-AddFileExtensionAction.msgDlg.title=\u4e0d\u4e00\u81f4\u62e1\u5f35\u5b50\u306e\u30a8\u30e9\u30fc\u3092\u8ffd\u52a0
-FileExtMismatchConfigPanel.addExtButton.errLabel.empty=\u62e1\u5f35\u5b50\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a\u767d\u3067\u3059\uff01
-FileExtMismatchConfigPanel.addExtButton.errLabel.noMimeType=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01
-FileExtMismatchConfigPanel.addExtButton.errLabel.extExists=\u62e1\u5f35\u5b50\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01
-FileExtMismatchConfigPanel.addExtButton.errLabel.extAdded=\u62e1\u5f35\u5b50{0}\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.addTypeButton.empty=MIME\u30bf\u30a4\u30d7\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a\u767d\u3067\u3059\uff01
-FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotSupported=MIME\u30bf\u30a4\u30d7\u304c\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01
-FileExtMismatchConfigPanel.addTypeButton.mimeTypeExists=MIME\u30bf\u30a4\u30d7\u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\uff01
-FileExtMismatchConfigPanel.addTypeButton.mimeTypeNotDetectable=MIME\u30bf\u30a4\u30d7\u304c\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u306f\u691c\u51fa\u3067\u304d\u307e\u305b\u3093\u3002
-FileExtMismatchConfigPanel.addTypeButton.mimeTypeAdded=MIME\u30bf\u30a4\u30d7{0}\u304c\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.removeTypeButton.noneSelected=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01
-FileExtMismatchConfigPanel.remoteTypeButton.deleted=MIME\u30bf\u30a4\u30d7{0}\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.removeExtButton.noneSelected=\u62e1\u5f35\u5b50\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01
-FileExtMismatchConfigPanel.removeExtButton.noMimeTypeSelected=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\uff01
-FileExtMismatchConfigPanel.removeExtButton.deleted=\u62e1\u5f35\u5b50{0}\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.store.msg=\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.store.msgDlg.msg=XML\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f8\u304f\u306e\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-FileExtMismatchConfigPanel.save.msgDlg.title=\u4fdd\u5b58\u30a8\u30e9\u30fc
-FileExtMismatchConfigPanel.ok.confDlg.msg=\u8a2d\u5b9a\u5909\u66f4\u3092\u4fdd\u5b58\u3057\u307e\u3059\u304b\uff1f
+AddFileExtensionAction.msgDlg.msg2=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u8a2d\u5b9a\u304c\u8aad\u307f\u53d6\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u62e1\u5f35\u5b50\u306e\u66f4\u65b0\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+AddFileExtensionAction.msgDlg.title=\u4e0d\u4e00\u81f4\u62e1\u5f35\u5b50\u30a8\u30e9\u30fc\u3092\u8ffd\u52a0
+AddFileExtensionAction.extHeaderLbl.text=\u62e1\u5f35\u5b50\u306e\u8a31\u53ef\u5148
+FileExtMismatchConfigPanel.store.msg=\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002
+FileExtMismatchConfigPanel.store.msgDlg.msg=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+FileExtMismatchConfigPanel.save.msgDlg.title=\u30a8\u30e9\u30fc\u3092\u4fdd\u5b58
+FileExtMismatchConfigPanel.ok.confDlg.msg=\u69cb\u6210\u306e\u5909\u66f4\u3092\u4fdd\u5b58\u3057\u307e\u3059\u304b?
FileExtMismatchConfigPanel.confDlg.title=\u4fdd\u5b58\u3055\u308c\u3066\u3044\u306a\u3044\u5909\u66f4
FileExtMismatchConfigPanel.mimeTableModel.colName=MIME\u30bf\u30a4\u30d7
FileExtMismatchConfigPanel.extTableModel.colName=\u62e1\u5f35\u5b50
-FileExtMismatchContextMenuActionsProvider.menuItemStr=\u62e1\u5f35\u5b50{0}\u3092MIME\u30bf\u30a4\u30d7{1}\u306e\u4e00\u81f4\u3068\u3057\u3066\u8ffd\u52a0
-FileExtMismatchIngestModule.moduleName=\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u30c7\u30a3\u30c6\u30af\u30bf\u30fc
-FileExtMismatchIngestModule.moduleDesc.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306b\u57fa\u3065\u3044\u3066\u3001\u6a19\u6e96\u7684\u3067\u306f\u306a\u3044\u62e1\u5f35\u5b50\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u3092\u30d5\u30e9\u30b0\u3057\u307e\u3059\u3002d
+FileExtMismatchContextMenuActionsProvider.menuItemStr=\u4e00\u81f4\u3059\u308bMIME\u30bf\u30a4\u30d7 {1} \u3068\u3057\u3066\u62e1\u5f35\u5b50 {0} \u3092\u8ffd\u52a0
+FileExtMismatchIngestModule.moduleName=\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u691c\u51fa\u30c4\u30fc\u30eb
+FileExtMismatchIngestModule.moduleDesc.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306b\u57fa\u3065\u304d\u3001\u975e\u6a19\u6e96\u306e\u62e1\u5f35\u5b50\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u306b\u30d5\u30e9\u30b0\u3092\u7acb\u3066\u307e\u3059\u3002
FileExtMismatchIngestModule.complete.totalProcTime=\u5408\u8a08\u51e6\u7406\u6642\u9593
-FileExtMismatchIngestModule.complete.totalFiles=\u5408\u8a08\u51e6\u7406\u30d5\u30a1\u30a4\u30eb\u6570
+FileExtMismatchIngestModule.complete.totalFiles=\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306b\u8cbb\u3084\u3057\u305f\u5408\u8a08\u6642\u9593
FileExtMismatchIngestModule.complete.svcMsg.text=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u4e0d\u4e00\u81f4\u7d50\u679c
FileExtMismatchOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-FileExtMismatchOptionsPanelController.moduleErr.msg=FileExtMismatchOptionsPanelController\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u306e\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-AddFileExtensionAction.extHeaderLbl.text=\u4e0b\u8a18\u7528\u306b\u8a31\u53ef\u3059\u308b\u62e1\u5f35\u5b50
-FileExtMismatchModuleSettingsPanel.skipNoExtCheckBox.text=\u62e1\u5f35\u5b50\u306e\u7121\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u30b9\u30ad\u30c3\u30d7
-FileExtMismatchSettingsPanel.extHeaderLabel.text=\u8a31\u53ef\u3059\u308b\u62e1\u5f35\u5b50\uff1a
-FileExtMismatchSettingsPanel.removeExtButton.text=\u9078\u629e\u3057\u305f\u62e1\u5f35\u5b50\u3092\u524a\u9664
-FileExtMismatchDetectorModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002
-FileExtMismatchDetectorModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileExtMismatchDetectorModuleSettings\u3067\u3059\u3002
-FileExtMismatchSettingsPanel.removeTypeButton.text=\u9078\u629e\u3057\u305f\u30bf\u30a4\u30d7\u3092\u524a\u9664
-FileExtMismatchSettingsPanel.newTypeButton.text=\u30bf\u30a4\u30d7\u3092\u8ffd\u52a0
-FileExtMismatchSettingsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\uff1a
-FileExtMismatchSettingsPanel.newExtButton.text=\u62e1\u5f35\u5b50\u3092\u8ffd\u52a0
+FileExtMismatchOptionsPanelController.moduleErr.msg=FileExtMismatchOptionsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+FileExtMismatchModuleSettingsPanel.skipNoExtCheckBox.text=\u62e1\u5f35\u5b50\u306e\u306a\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u30b9\u30ad\u30c3\u30d7
+FileExtMismatchSettingsPanel.extHeaderLabel.text=\u8a31\u53ef\u3055\u308c\u3066\u3044\u308b\u62e1\u5f35\u5b50:
+FileExtMismatchSettingsPanel.removeExtButton.text=\u62e1\u5f35\u5b50\u3092\u524a\u9664
+FileExtMismatchDetectorModuleFactory.getIngestJobSettingsPanel.exception.msg=instanceof FileExtMismatchDetectorModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+FileExtMismatchDetectorModuleFactory.createFileIngestModule.exception.msg=instanceof FileExtMismatchDetectorModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+FileExtMismatchModuleSettingsPanel.skipKnownFiles.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u30b9\u30ad\u30c3\u30d7
+FileExtMismatchSettingsPanel.removeTypeButton.text=\u30bf\u30a4\u30d7\u3092\u524a\u9664
+FileExtMismatchSettingsPanel.newTypeButton.text=\u65b0\u898f\u30bf\u30a4\u30d7
+FileExtMismatchSettingsPanel.jLabel1.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7:
+FileExtMismatchSettingsPanel.newExtButton.text=\u65b0\u898f\u62e1\u5f35\u5b50
+FileExtMismatchSettingsPanel.newMimePrompt.message=\u65b0\u898fMIME\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u8ffd\u52a0:
+FileExtMismatchSettingsPanel.newMimePrompt.title=\u65b0\u898fMIME
+FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.message=MIME\u30bf\u30a4\u30d7\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a(\u672a\u5165\u529b)\u3067\u3059\!
+FileExtMismatchSettingsPanel.newMimePrompt.emptyMime.title=\u7a7a(\u672a\u5165\u529b)\u306e\u30bf\u30a4\u30d7
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.message=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044MIME\u30bf\u30a4\u30d7\u3067\u3059\!
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotSupported.title=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u306a\u3044\u30bf\u30a4\u30d7
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.message=MIME\u30bf\u30a4\u30d7\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\!
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeExists.title=\u30bf\u30a4\u30d7\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.message=\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u306fMIME\u30bf\u30a4\u30d7\u3092\u691c\u51fa\u3067\u304d\u307e\u305b\u3093\u3002
+FileExtMismatchSettingsPanel.newMimePrompt.mimeTypeNotDetectable.title=\u691c\u51fa\u4e0d\u80fd\u306e\u30bf\u30a4\u30d7
+FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.message=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\!
+FileExtMismatchSettingsPanel.removeTypeButton.noneSelected.title=\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+FileExtMismatchSettingsPanel.newExtPrompt.message=\u8a31\u53ef\u3055\u308c\u3066\u3044\u308b\u62e1\u5f35\u5b50\u3092\u8ffd\u52a0:
+FileExtMismatchSettingsPanel.newExtPrompt.title=\u65b0\u898f\u8a31\u53ef\u3055\u308c\u305f\u62e1\u5f35\u5b50
+FileExtMismatchSettingsPanel.newExtPrompt.empty.message=\u62e1\u5f35\u5b50\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a(\u672a\u5165\u529b)\u3067\u3059\!
+FileExtMismatchSettingsPanel.newExtPrompt.empty.title=\u62e1\u5f35\u5b50\u306e\u30c6\u30ad\u30b9\u30c8\u304c\u7a7a\u5165\u529b)\u3067\u3059
+FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.message=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\!
+FileExtMismatchSettingsPanel.newExtPrompt.noMimeType.title=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+FileExtMismatchSettingsPanel.newExtPrompt.extExists.message=\u62e1\u5f35\u5b50\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\!
+FileExtMismatchSettingsPanel.newExtPrompt.extExists.title=\u62e1\u5f35\u5b50\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+FileExtMismatchSettingsPanel.removeExtButton.noneSelected.message=\u62e1\u5f35\u5b50\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\!
+FileExtMismatchSettingsPanel.removeExtButton.noneSelected.title=\u62e1\u5f35\u5b50\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.message=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\!
+FileExtMismatchSettingsPanel.removeExtButton.noMimeTypeSelected.title=MIME\u30bf\u30a4\u30d7\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+FileExtMismatchSettingsPanel.removeTypeButton.toolTipText=
+FileExtMismatchModuleSettingsPanel.checkAllRadioButton.text=\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u30c1\u30a7\u30c3\u30af
+FileExtMismatchModuleSettingsPanel.checkNoTextRadioButton.text=\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u4ee5\u5916\u306e\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u30c1\u30a7\u30c3\u30af
+FileExtMismatchModuleSettingsPanel.checkMediaExeRadioButton.text=\u30de\u30eb\u30c1\u30e1\u30c7\u30a3\u30a2\u30d5\u30a1\u30a4\u30eb\u3068\u5b9f\u884c\u53ef\u80fd\u30d5\u30a1\u30a4\u30eb\u306e\u307f\u3092\u30c1\u30a7\u30c3\u30af
diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties
index 61626e69aa..8620a7ca3d 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/Bundle_ja.properties
@@ -1,42 +1,75 @@
-OpenIDE-Module-Name=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID
-FileTypeIdIngestModule.moduleName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u7279\u5b9a
-FileTypeIdIngestModule.moduleDesc.text=\u30d0\u30a4\u30ca\u30ea\u30b7\u30b0\u30cd\u30c1\u30e3\u306b\u57fa\u3065\u3044\u3066\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u4e00\u81f4\u3057\u307e\u3059\u3002
-FileTypeIdIngestModule.complete.totalProcTime=\u5408\u8a08\u51e6\u7406\u6642\u9593
-FileTypeIdIngestModule.complete.totalFiles=\u5408\u8a08\u51e6\u7406\u30d5\u30a1\u30a4\u30eb\u6570
-FileTypeIdIngestModule.complete.srvMsg.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID\u306e\u7d50\u679c
-FileTypeIdModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002
-FileTypeIdModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof FileTypeIdModuleSettings\u3067\u3059\u3002
-FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.toolTipText=\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u6570\u306b\u3088\u3063\u3066\u306f\u3001\u3053\u306e\u30dc\u30c3\u30af\u30b9\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u7279\u5b9a\u3092\u52a0\u901f\u3057\u307e\u3059\u3002
-FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\uff08NSRL\uff09\u3092\u30b9\u30ad\u30c3\u30d7
-FileTypeIdGlobalSettingsPanel.deleteTypeButton.text=\u524a\u9664
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u6b20\u3051\u3066\u3044\u307e\u3059
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message=MIME\u30bf\u30a4\u30d7\u304c\u5fc5\u8981\u3067\u3059\u3002
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title=MIME\u30bf\u30a4\u30d7\u304c\u6b20\u3051\u3066\u3044\u307e\u3059
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6b63\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u3044\u3051\u307e\u305b\u3093\u3002
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title=\u7121\u52b9\u306a\u30aa\u30d5\u30bb\u30c3\u30c8
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message=\u3053\u306e\u30b7\u30b0\u30cd\u30c1\u30e3\u306b\u4e00\u3064\u4ee5\u4e0a\u306e\u7121\u52b9\u306a16\u9032\u6570\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u5fc5\u8981\u3067\u3059\u3002
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u6b20\u3051\u3066\u3044\u307e\u3059
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title=\u30b7\u30b0\u30cd\u30c1\u30e3\u304c\u7121\u52b9\u3067\u3059
-FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=\u8aad\u307f\u8fbc\u307f\u304c\u5931\u6557\u3057\u307e\u3057\u305f
-FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title=\u4fdd\u5b58\u304c\u5931\u6557\u3057\u307e\u3057\u305f
-FileTypeIdGlobalSettingsPanel.newTypeButton.text=\u65b0\u898f\u30bf\u30a4\u30d7
-FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem=\u30b9\u30c8\u30ea\u30f3\u30b0\uff08ASCII\uff09
-FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem=\u30d0\u30a4\u30c8\uff08HEX\uff09
-OptionsCategory_Keywords_FileTypeId=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID
+# {0} - \u30bf\u30a4\u30d7\u540d
+AddFileTypePanel.containsIllegalCharacter.message=\u4ee3\u308f\u308a\u306bMIME\u30bf\u30a4\u30d7\u306e\u7121\u52b9\u306a\u6587\u5b57 {0} \u304c\u63d0\u6848\u3055\u308c\u307e\u3057\u305f
+AddFileTypePanel.containsIllegalCharacter.title=MIME\u30bf\u30a4\u30d7\u306e\u7121\u52b9\u306a\u6587\u5b57
+AddFileTypePanel.mimeFormatLabel.text=MIME\u30bf\u30a4\u30d7\u306e\u5f62\u5f0f\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u3042\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059: \u30e1\u30c7\u30a3\u30a2\u30bf\u30a4\u30d7/\u30e1\u30c7\u30a3\u30a2\u30b5\u30d6\u30bf\u30a4\u30d7
+# {0} - \u30e1\u30c7\u30a3\u30a2\u30b5\u30d6\u30bf\u30a4\u30d7
+AddFileTypePanel.nonStandardMIMEType.message=MIME\u30bf\u30a4\u30d7\u306e\u5f62\u5f0f\u306f\u6b21\u306e\u3068\u304a\u308a\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093: \u30e1\u30c7\u30a3\u30a2\u30bf\u30a4\u30d7/\u30e1\u30c7\u30a3\u30a2\u30b5\u30d6\u30bf\u30a4\u30d7\u3002\u4ee3\u308f\u308a\u306b\u30ab\u30b9\u30bf\u30e0/{0} \u304c\u63d0\u6848\u3055\u308c\u307e\u3057\u305f\u3002
+AddFileTypePanel.nonStandardMIMEType.title=\u975e\u6a19\u6e96\u306eMIME\u30bf\u30a4\u30d7
+AddFileTypeSignatureDialog.addButton.title=OK
+AddFileTypeSignatureDialog.cancelButton.title=\u53d6\u308a\u6d88\u3057
+AddFileTypeSignatureDialog.invalidSignature.message=\u7121\u52b9\u306a\u7f72\u540d
+AddFileTypeSignaturePanel.signatureStringFail.text=\u7f72\u540d\u6587\u5b57\u5217\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+AddMimeTypeDialog.addButton.title=OK
+AddMimeTypeDialog.cancelButton.title=\u53d6\u308a\u6d88\u3057
+AddMimeTypedialog.title=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+AddMimeTypePanel.emptySetName.message=\u30a2\u30e9\u30fc\u30c8\u304c\u8981\u6c42\u3055\u308c\u305f\u5834\u5408\u3001\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002
+AddMimeTypePanel.emptySetName.title=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+AddMimeTypePanel.emptySigList.message=\u5c11\u306a\u304f\u3068\u30821\u3064\u306e\u7f72\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002
+AddMimeTypePanel.emptySigList.title=\u7121\u52b9\u306a\u7f72\u540d\u30ea\u30b9\u30c8
+CannotRunFileTypeDetection=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u306e\u691c\u51fa\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002
+FileTypeIdGlobalSettingsPanel.Title=\u30b0\u30ed\u30fc\u30d0\u30eb\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u8b58\u5225\u8a2d\u5b9a
OptionsCategory_Name_FileTypeId=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
-FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u306e\u8aad\u307f\u8fbc\u307f\u306b\u5931\u6557\u3057\u307e\u3057\u305f
-FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u306e\u4fdd\u5b58\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.message=\u30a2\u30e9\u30fc\u30c8\u3092\u8a2d\u5b9a\u3059\u308b\u306b\u306f\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002
+OptionsCategory_Keywords_FileTypeId=FileTypeId
+OpenIDE-Module-Name=FileTypeId
+FileTypeIdIngestModule.moduleName.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u8b58\u5225
+FileTypeIdIngestModule.moduleDesc.text=\u30d0\u30a4\u30ca\u30ea\u30fc\u7f72\u540d\u306b\u57fa\u3065\u304d\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u7167\u5408\u3057\u307e\u3059\u3002
+FileTypeIdIngestModule.complete.totalProcTime=\u5408\u8a08\u51e6\u7406\u6642\u9593
+FileTypeIdIngestModule.complete.totalFiles=\u30d5\u30a1\u30a4\u30eb\u51e6\u7406\u306b\u8cbb\u3084\u3057\u305f\u5408\u8a08\u6642\u9593
+FileTypeIdIngestModule.complete.srvMsg.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7ID\u7d50\u679c
+FileTypeIdModuleFactory.getIngestJobSettingsPanel.exception.msg=instanceof FileTypeIdModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+FileTypeIdModuleFactory.createFileIngestModule.exception.msg=instanceof FileTypeIdModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.toolTipText=\u65e2\u77e5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u30d5\u30a1\u30a4\u30eb\u6570\u306b\u5fdc\u3058\u3066\u3001\u3053\u306e\u30dc\u30c3\u30af\u30b9\u3092\u30c1\u30a7\u30c3\u30af\u3059\u308b\u3068\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u8b58\u5225\u901f\u5ea6\u304c\u5411\u4e0a\u3057\u307e\u3059\u3002
+FileTypeIdIngestJobSettingsPanel.skipKnownCheckBox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb(NSRL)\u3092\u30b9\u30ad\u30c3\u30d7
+FileTypeIdGlobalSettingsPanel.deleteTypeButton.text=\u30bf\u30a4\u30d7\u3092\u524a\u9664
+FileTypeIdGlobalSettingsPanel.signatureComboBox.rawItem=\u30d0\u30a4\u30c8(16\u9032\u6570)
+FileTypeIdGlobalSettingsPanel.signatureComboBox.asciiItem=\u6587\u5b57\u5217(ASCII)
FileTypeIdGlobalSettingsPanel.offsetComboBox.startItem=\u958b\u59cb
-FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem=\u505c\u6b62
-FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u30b7\u30b0\u30cd\u30c1\u30e3\u30b5\u30a4\u30ba\u3088\u308a\u5c0f\u3055\u304f\u3066\u306f\u3044\u3051\u307e\u305b\u3093\u3002
-FileTypeIdGlobalSettingsPanel.jLabel2.text=MIME\u30bf\u30a4\u30d7\uff1a
-FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u30c7\u30a3\u30c6\u30af\u30bf\u3092\u8d77\u52d5\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-AddFileTypeSignaturePanel.signatureTypeLabel.text=\u30b7\u30b0\u30cd\u30c1\u30e3\u30bf\u30a4\u30d7
-AddFileTypeSignaturePanel.signatureLabel.text=\u30b7\u30b0\u30cd\u30c1\u30e3
-AddFileTypeSignaturePanel.offsetRelativeToLabel.text=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6b21\u3068\u76f8\u5bfe\u7684
+FileTypeIdGlobalSettingsPanel.offsetComboBox.endItem=\u7d42\u4e86
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.message=MIME\u30bf\u30a4\u30d7\u304c\u5fc5\u8981\u3067\u3059\u3002
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidMIMEType.title=MIME\u30bf\u30a4\u30d7\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.message=\u7f72\u540d\u304c\u5fc5\u8981\u3067\u3059\u3002
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignature.title=\u7f72\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.length=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u7f72\u540d\u30b5\u30a4\u30ba\u3088\u308a\u3082\u5c0f\u3055\u304f\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.message=\u30aa\u30d5\u30bb\u30c3\u30c8\u306f\u6b63\u306e\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidOffset.title=\u7121\u52b9\u306a\u30aa\u30d5\u30bb\u30c3\u30c8
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidRawSignatureBytes.message=\u7f72\u540d\u306b1\u3064\u4ee5\u4e0a\u306e\u7121\u52b9\u306a16\u9032\u6570\u306e\u6841\u304c\u3042\u308a\u307e\u3059\u3002
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidSignatureBytes.title=\u7121\u52b9\u306a\u7f72\u540d
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.message=
+FileTypeIdGlobalSettingsPanel.JOptionPane.invalidInterestingFilesSetName.title=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+FileTypeIdGlobalSettingsPanel.JOptionPane.storeFailed.title=\u4fdd\u5b58\u5931\u6557
+FileTypeIdGlobalSettingsPanel.JOptionPane.loadFailed.title=\u8aad\u307f\u8fbc\u307f\u5931\u6557
+FileTypeIdGlobalSettingsPanel.loadFileTypes.errorMessage=\u65e2\u5b58\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+FileTypeIdGlobalSettingsPanel.saveFileTypes.errorMessage=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+FileTypeIdGlobalSettingsPanel.newTypeButton.text=\u65b0\u898f\u30bf\u30a4\u30d7
+FileTypeIdGlobalSettingsPanel.jLabel2.text=\u30ab\u30b9\u30bf\u30e0MIME\u30bf\u30a4\u30d7:
+FileTypeIdGlobalSettingsPanel.startUp.fileTypeDetectorInitializationException.msg=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u691c\u51fa\u30c4\u30fc\u30eb\u306e\u521d\u671f\u5316\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
AddFileTypeSignaturePanel.offsetLabel.text=\u30d0\u30a4\u30c8\u30aa\u30d5\u30bb\u30c3\u30c8
+AddFileTypeSignaturePanel.signatureTextField.text=
+AddFileTypeSignaturePanel.signatureTypeLabel.text=\u7f72\u540d\u30bf\u30a4\u30d7
+AddFileTypeSignaturePanel.signatureLabel.text=\u7f72\u540d
+AddFileTypeSignaturePanel.hexPrefixLabel.text=0x
+AddFileTypeSignaturePanel.offsetRelativeToLabel.text=\u30aa\u30d5\u30bb\u30c3\u30c8\u76f8\u5bfe\u5148
+AddFileTypeSignaturePanel.offsetTextField.text=
+FileTypeIdGlobalSettingsPanel.jLabel1.text=\u7f72\u540d
+FileTypeIdGlobalSettingsPanel.editTypeButton.text=\u30bf\u30a4\u30d7\u3092\u7de8\u96c6
+AddFileTypePanel.mimeTypeTextField.text=
AddFileTypePanel.mimeTypeLabel.text=MIME\u30bf\u30a4\u30d7
-FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u4e2d\u306b\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\uff01
-FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy\u306f\u81ea\u52d5\u7684\u306b\u591a\u304f\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u691c\u77e5\u3067\u304d\u307e\u3059\u3002\u3053\u3053\u306b\u306f\u3042\u306a\u305f\u306e\u30ab\u30b9\u30bf\u30e0\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+AddFileTypePanel.deleteSigButton.text=\u7f72\u540d\u3092\u524a\u9664
+AddFileTypePanel.jLabel1.text=\u7f72\u540d
+AddFileTypePanel.editSigButton.text=\u7f72\u540d\u3092\u7de8\u96c6
+AddFileTypePanel.addSigButton.text=\u7f72\u540d\u3092\u8ffd\u52a0
+AddFileTypePanel.postHitCheckBox.text=\u691c\u51fa\u6642\u306b"\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb"\u3068\u3057\u3066\u30a2\u30e9\u30fc\u30c8
+AddFileTypePanel.setNameLabel.text=\u30bb\u30c3\u30c8\u540d
+AddFileTypePanel.setNameTextField.text=
+FileTypeIdGlobalSettingsPanel.ingestRunningWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5b9f\u884c\u4e2d\u306f\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u5b9a\u7fa9\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093!
+FileTypeIdGlobalSettingsPanel.jLabel3.text=Autopsy\u306f\u81ea\u52d5\u7684\u306b\u591a\u304f\u306e\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u691c\u51fa\u3067\u304d\u307e\u3059\u3002\u3053\u3053\u306b\u30ab\u30b9\u30bf\u30e0\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
index 0c885472de..46b60d9b1e 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeDetector.java
@@ -18,6 +18,7 @@
*/
package org.sleuthkit.autopsy.modules.filetypeid;
+import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -29,6 +30,7 @@ import org.apache.tika.Tika;
import org.apache.tika.io.TikaInputStream;
import org.apache.tika.mime.MimeTypes;
import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.textextractors.TextFileExtractor;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.ReadContentInputStream;
import org.sleuthkit.datamodel.TskCoreException;
@@ -249,6 +251,17 @@ public class FileTypeDetector {
mimeType = tikaType.replace("tika-", ""); //NON-NLS
mimeType = removeOptionalParameter(mimeType);
}
+ } else {
+ /*
+ * If the file was marked as an octet stream and the extension is .txt, try to detect a text
+ * encoding with Decodetect.
+ */
+ if (file.getNameExtension().equals("txt")) {
+ Charset detectedCharset = TextFileExtractor.getEncoding(file);
+ if (detectedCharset != TextFileExtractor.UNKNOWN_CHARSET) {
+ mimeType = MimeTypes.PLAIN_TEXT;
+ }
+ }
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleFactory.java
index f80340303d..c8ca8b7a1c 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleFactory.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/filetypeid/FileTypeIdModuleFactory.java
@@ -41,11 +41,11 @@ public class FileTypeIdModuleFactory extends IngestModuleFactoryAdapter {
*
* @return The module display name.
*/
- static String getModuleName() {
+ public static String getModuleName() {
return NbBundle.getMessage(FileTypeIdIngestModule.class,
"FileTypeIdIngestModule.moduleName.text");
}
-
+
@Override
public String getModuleDisplayName() {
return getModuleName();
diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties
index 47a18afeda..3f5ea43a61 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/Bundle_ja.properties
@@ -1,207 +1,297 @@
+HashDbCreateDatabaseDialog.databaseCreationError=\u65b0\u898f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbCreateDatabaseDialog.databaseLookupError=\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbCreateDatabaseDialog.duplicateName=\u3053\u306e\u540d\u524d\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+HashDbCreateDatabaseDialog.missingOrg=\u7d44\u7e54\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+HashDbCreateDatabaseDialog.populateOrgsError.message=\u7d44\u7e54\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+HashDbImportDatabaseDialog.databaseLookupError=\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbImportDatabaseDialog.duplicateName=\u3053\u306e\u540d\u524d\u3068\u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u30d0\u30fc\u30b8\u30e7\u30f3\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+HashDbImportDatabaseDialog.missingOrg=\u7d44\u7e54\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+HashDbImportDatabaseDialog.missingVersion=\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059
+HashDbImportDatabaseDialog.mustEnterHashSetNameMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbImportDatabaseDialog.populateOrgsError.message=\u7d44\u7e54\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+HashDbIngestModule.dialogTitle.errorFindingArtifacts=\u6b21\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+HashDbIngestModule.errorMessage.lookingForFileArtifacts={0} \u306e\u65e2\u5b58\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashDbIngestModule.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u30d2\u30c3\u30c8\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn=\u9855\u8457\u306a\u30d5\u30a1\u30a4\u30eb\u306e\u691c\u7d22\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002
+HashDbIngestModule.knownFileSearchWillNotExecuteWarn=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u306e\u691c\u7d22\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002
+HashDbIngestModule.noKnownBadHashDbSetMsg=\u9855\u8457\u306a\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+HashDbIngestModule.noKnownHashDbSetMsg=\u65e2\u77e5\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+HashDbManager.CentralRepoHashDb.orgError=\u7d44\u7e54\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbManager.centralRepoLoadError.message=\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - \u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d
+HashDbManager.noDbPath.message=\u6b21\u306e\u305f\u3081\u306e\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+HashDbSearchAction.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+HashDbSearchPanel.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+HashLookupSettingsPanel.centralRepo=\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc
+HashLookupSettingsPanel.editable=\u7de8\u96c6\u53ef\u80fd
+HashLookupSettingsPanel.indexNsrl.text=\u3053\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306fNSRL\u306e\u3088\u3046\u306b\u898b\u3048\u308b\u305f\u3081\u3001\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002\n
+HashLookupSettingsPanel.indexNsrl.title=NSRL\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u307e\u305b\u3093\u3002
+HashLookupSettingsPanel.notApplicable=N/A
+HashLookupSettingsPanel.promptMessage.deleteHashDb=\u3053\u308c\u306b\u3088\u308a\u3001\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u306b\u5229\u7528\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u7d9a\u884c\u3057\u307e\u3059\u304b?\n\n\u6ce8: \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u5f8c\u304b\u3089\u3067\u3082\u518d\u30a4\u30f3\u30dd\u30fc\u30c8\u3067\u304d\u307e\u3059\u3002
+HashLookupSettingsPanel.promptTitle.deleteHashDb=\u69cb\u6210\u304b\u3089\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664
+HashLookupSettingsPanel.readOnly=\u8aad\u307f\u53d6\u308a\u5c02\u7528
+# {0} - \u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u540d
+HashLookupSettingsPanel.removeDatabaseFailure.message=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f: {0}
+# {0} - nsrlUrlAddress
+HashLookupSettingsPanel.removeUnindexedNsrl.text=NSRL\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3059\u308b\u4ee3\u308f\u308a\u306b\u3001\u3053\u3053\u3067\u5165\u624b\u53ef\u80fd\u306a\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6e08\u307f\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u304f\u3060\u3055\u3044:\n{0}
+HashLookupSettingsPanel.removeUnindexedNsrl.title=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u306a\u3044NSRL(s)\u306f\u524a\u9664\u3055\u308c\u307e\u3059
+HashLookupSettingsPanel.saveFail.message=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u8a2d\u5b9a\u3092\u4fdd\u5b58\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashLookupSettingsPanel.saveFail.title=\u4fdd\u5b58\u5931\u6557
+HashLookupSettingsPanel.Title=\u30b0\u30ed\u30fc\u30d0\u30eb\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u8a2d\u5b9a
+# {0} - nsrlHashSet
+HashLookupSettingsPanel.unindexedNsrl.base=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306eNSRL\u306e\u3088\u3046\u306b\u898b\u3048\u308b\u305f\u3081\u3001\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002\nHash set:{0}\n
+# {0} - nsrlHashSets
+HashLookupSettingsPanel.unindexedNsrls.base=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u306a\u3044\u30d0\u30fc\u30b8\u30e7\u30f3\u306eNSRL\u306e\u3088\u3046\u306b\u898b\u3048\u308b\u305f\u3081\u3001\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002\nHash sets:{0}\n
+HashLookupSettingsPanel.updateStatusError=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u8aad\u307f\u53d6\u308a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ImportCentralRepoDbProgressDialog.errorParsingFile.message=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u89e3\u6790\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ImportCentralRepoDbProgressDialog.linesProcessed.message=\ \u51e6\u7406\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5
+ImportCentralRepoDbProgressDialog.title.text=\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306e\u30a4\u30f3\u30dd\u30fc\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
OpenIDE-Module-Long-Description=\
- \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb \n\n\
- \u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u306b\u3042\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u3057\u3001\u300c\u65e2\u77e5\u300d\uff08NSRL\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u300c\u65e2\u77e5\u300d\u30d5\u30a1\u30a4\u30eb\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u3092\u57fa\u306b\uff09\u307e\u305f\u306f\u300c\u60aa\u8cea\uff0f\u7591\u308f\u3057\u3044\u300d\uff08\u30e6\u30fc\u30b6\u30fc\u304c\u6307\u5b9a\u3057\u305f\u5358\u6570\u307e\u305f\u306f\u8907\u6570\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u57fa\u306b\uff09\u3068\u30de\u30fc\u30af\u3057\u307e\u3059\u3002\n\n\
- \u30cf\u30c3\u30b7\u30e5\u3084\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u306b\u57fa\u3065\u3044\u305f\u30d5\u30a1\u30a4\u30eb\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u306a\u3069\u3001\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306fGUI\u306b\u9023\u643a\u3057\u3066\u3044\u308b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3057\u306a\u3044\u3001\u8ffd\u52a0\u306e\u30c4\u30fc\u30eb\u304c\u542b\u307e\u308c\u307e\u3059\u3002
-OpenIDE-Module-Name=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
+ \u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002 \n\n\
+ \u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u30c7\u30a3\u30b9\u30af\u30a4\u30e1\u30fc\u30b8\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u89e3\u6790\u3057\u3001\u300c\u65e2\u77e5\u300d(\u300c\u65e2\u77e5\u300d\u30d5\u30a1\u30a4\u30eb\u306eNSRL\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u306b\u57fa\u3065\u304f)\u304a\u3088\u3073\u300c\u4e0d\u6b63 / \u8208\u5473\u6df1\u3044\u300d(\u30e6\u30fc\u30b6\u30fc\u304c\u63d0\u4f9b\u3059\u308b1\u3064\u4ee5\u4e0a\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u57fa\u3065\u304f)\u3068\u30de\u30fc\u30af\u4ed8\u3051\u3057\u307e\u3059\u3002\n\n\
+ \u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306b\u306f\u3001\u30cf\u30c3\u30b7\u30e5\u3084\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u69cb\u6210\u5225\u306e\u30d5\u30a1\u30a4\u30eb\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u306a\u3069\u306e\u3001GUI\u306b\u7d71\u5408\u3055\u308c\u3066\u3044\u308b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30c4\u30fc\u30eb\u4ee5\u5916\u306e\u305d\u306e\u4ed6\u306e\u30c4\u30fc\u30eb\u3082\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
+OpenIDE-Module-Name=HashDatabases
+OptionsCategory_Name_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
+OptionsCategory_Keywords_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
HashDbSearchPanel.hashTable.columnModel.title0=MD5\u30cf\u30c3\u30b7\u30e5
HashDbSearchPanel.addButton.text=\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
-HashDbSearchPanel.hashLabel.text=MD5\u30cf\u30c3\u30b7\u30e5\uff1a
+HashDbSearchPanel.hashField.text=
+HashDbSearchPanel.hashLabel.text=MD5\u30cf\u30c3\u30b7\u30e5:
HashDbSearchPanel.searchButton.text=\u691c\u7d22
-HashDbSearchPanel.removeButton.text=\u9078\u629e\u3057\u305f\u3082\u306e\u3092\u524a\u9664
-HashDbSearchPanel.titleLabel.text=\u6b21\u306eMD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\uff1a
-HashDbSearchPanel.errorField.text=\u30a8\u30e9\u30fc\uff1a\u5168\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30cf\u30c3\u30b7\u30e5\u3055\u308c\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashDbSearchPanel.removeButton.text=\u9078\u629e\u3055\u308c\u305f\u9805\u76ee\u3092\u524a\u9664
+HashDbSearchPanel.titleLabel.text=\u6b21\u306eMD5\u30cf\u30c3\u30b7\u30e5\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22:
+HashDbSearchPanel.errorField.text=\u30a8\u30e9\u30fc: \u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u30cf\u30c3\u30b7\u30e5\u3055\u308c\u3066\u3044\u308b\u308f\u3051\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
HashDbSearchPanel.saveBox.text=\u30cf\u30c3\u30b7\u30e5\u3092\u8a18\u61b6
-HashDbSearchPanel.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-OpenIDE-Module-Short-Description=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u304a\u3088\u3073\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30c4\u30fc\u30eb
-HashDbImportDatabaseDialog.jLabel1.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a
-HashDbImportDatabaseDialog.knownBadRadioButton.text=\u65e2\u77e5\u306e\u60aa\u8cea
-HashDbImportDatabaseDialog.jLabel2.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30bf\u30a4\u30d7\uff1a
+HashDbSearchPanel.cancelButton.text=\u53d6\u308a\u6d88\u3057
+OpenIDE-Module-Short-Description=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3068\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30c4\u30fc\u30eb
+HashDbImportDatabaseDialog.jLabel1.text=\u540d\u524d:
+HashDbImportDatabaseDialog.databasePathTextField.text=
+HashDbImportDatabaseDialog.knownBadRadioButton.text=\u9855\u8457
+HashDbImportDatabaseDialog.jLabel2.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30bf\u30a4\u30d7:
HashDbImportDatabaseDialog.okButton.text=OK
-HashDbImportDatabaseDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-HashDbCreateDatabaseDialog.jLabel2.text=\u30bf\u30a4\u30d7\uff1a
-HashDbCreateDatabaseDialog.knownBadRadioButton.text=\u65e2\u77e5\u306e\u60aa\u8cea
-HashDbCreateDatabaseDialog.cancelButton.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-ModalNoButtons.CURRENTLYON_LABEL.text=y\u306ex\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-ModalNoButtons.GO_GET_COFFEE_LABEL.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u3067\u3059\u3002\u6642\u9593\u304c\u304b\u304b\u308b\u5834\u5408\u304c\u3042\u308a\u307e\u3059\u3002
-ModalNoButtons.CANCEL_BUTTON.text=\u30ad\u30e3\u30f3\u30bb\u30eb
-HashDbImportDatabaseDialog.knownRadioButton.text=\u65e2\u77e5\uff08NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6\uff09
+HashDbImportDatabaseDialog.cancelButton.text=\u53d6\u308a\u6d88\u3057
+HashDbCreateDatabaseDialog.jLabel2.text=\u30bf\u30a4\u30d7:
+HashDbCreateDatabaseDialog.knownBadRadioButton.text=\u9855\u8457
+HashDbCreateDatabaseDialog.cancelButton.text=\u53d6\u308a\u6d88\u3057
+ModalNoButtons.CURRENTDB_LABEL.text=(CurrentDb)
+ModalNoButtons.CURRENTLYON_LABEL.text=\u73fe\u5728y\u306ex\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4e2d\u3067\u3059
+ModalNoButtons.GO_GET_COFFEE_LABEL.text=\u73fe\u5728\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u4e2d\u3067\u3059\u3002\u3053\u308c\u306b\u306f\u6642\u9593\u304c\u304b\u304b\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
+ModalNoButtons.CANCEL_BUTTON.text=\u53d6\u308a\u6d88\u3057
+HashDbImportDatabaseDialog.knownRadioButton.text=\u65e2\u77e5(NSRL\u307e\u305f\u306f\u305d\u306e\u4ed6)
HashDbCreateDatabaseDialog.knownRadioButton.text=\u65e2\u77e5
-HashDbCreateDatabaseDialog.saveAsButton.text=\u540d\u524d\u3092\u3064\u3051\u3066\u4fdd\u5b58\u2026
-HashDbImportDatabaseDialog.jLabel3.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a
-HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b
-HashDbImportDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b
+HashDbCreateDatabaseDialog.saveAsButton.text=\u540d\u524d\u3092\u4ed8\u3051\u3066\u4fdd\u5b58...
+HashDbCreateDatabaseDialog.hashSetNameTextField.text=
+HashDbImportDatabaseDialog.jLabel3.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9:
+HashDbCreateDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u3054\u3068\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u53d7\u4fe1\u7bb1\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1
+HashDbImportDatabaseDialog.sendIngestMessagesCheckbox.text=\u30d2\u30c3\u30c8\u3054\u3068\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u53d7\u4fe1\u7bb1\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1
+HashDbImportDatabaseDialog.hashSetNameTextField.text=
HashDbImportDatabaseDialog.openButton.text=\u958b\u304f...
-HashDbCreateDatabaseDialog.jLabel3.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a
+HashDbCreateDatabaseDialog.jLabel3.text=\u540d\u524d:
HashDbCreateDatabaseDialog.okButton.text=OK
-AddContentToHashDbAction.ContentMenu.noHashDbsConfigd=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-AddContentToHashDbAction.ContentMenu.createDbItem=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210...
-AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr1.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
-AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr2.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
-AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr3.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
-AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u9069\u5207\u306a\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u8a2d\u5b9a\u3057\u3001\u5b9f\u884c\u3057\u3066\u4e0b\u3055\u3044\u3002
+HashDbCreateDatabaseDialog.databasePathTextField.text=
+AddContentToHashDbAction.ContentMenu.noHashDbsConfigd=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u69cb\u6210\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+AddContentToHashDbAction.ContentMenu.createDbItem=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u4f5c\u6210...
+AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr1.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
+AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr2.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
+AddContentToHashDbAction.addFilesToHashSet.addToHashDbErr3.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a8\u30e9\u30fc\u306b\u8ffd\u52a0
+AddContentToHashDbAction.addFilesToHashSet.unableToAddFileMsg={0} \u3092\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002
+AddContentToHashDbAction.addFilesToHashSet.unableToAddFileEmptyMsg={0} \u3092\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002\u30d5\u30a1\u30a4\u30eb\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+AddContentToHashDbAction.addFilesToHashSet.unableToAddFileSzMsg={0} \u3092\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3002\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u9069\u5207\u306a\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u69cb\u6210\u3057\u3066\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002
HashDatabaseOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-HashDatabaseOptionsPanelController.moduleErrMsg=HashDatabaseOptionsPanelController\u306e\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304b\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u5b8c\u5168\u3067\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
-HashDbConfigPanel.noSelectionText=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+HashDatabaseOptionsPanelController.moduleErrMsg=HashDatabaseOptionsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbConfigPanel.noSelectionText=
HashDbConfigPanel.errorGettingPathText=\u30d1\u30b9\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-HashDbConfigPanel.errorGettingIndexStatusText=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-HashDbConfigPanel.indexButtonText.index=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-HashDbConfigPanel.indexButtonText.indexing=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-HashDbConfigPanel.indexStatusText.indexGen=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3092\u4f5c\u6210\u4e2d\u3067\u3059
-HashDbConfigPanel.indexStatusText.indexOnly=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u307f
-HashDbConfigPanel.indexStatusText.indexed=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6e08\u307f
+HashDbConfigPanel.errorGettingIndexStatusText=\u30b9\u30c6\u30fc\u30bf\u30b9\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbConfigPanel.indexButtonText.index=\u7d22\u5f15
+HashDbConfigPanel.indexButtonText.indexing=\u7d22\u5f15\u751f\u6210
+HashDbConfigPanel.indexStatusText.indexGen=\u73fe\u5728\u7d22\u5f15\u3092\u751f\u6210\u4e2d\u3067\u3059
+HashDbConfigPanel.indexStatusText.indexOnly=\u7d22\u5f15\u306e\u307f
+HashDbConfigPanel.indexButtonText.indexing=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u6e08\u307f
HashDbConfigPanel.indexButtonText.reIndex=\u518d\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-HashDbConfigPanel.indexStatusText.noIndex=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u7121\u3057
-HashDbConfigPanel.dbsNotIndexedMsg=\u6b21\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3057\u307e\u3059\u304b\uff1f\n {0}
-HashDbConfigPanel.unindexedDbsMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u306a\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
-HashDbConfigPanel.allUnindexedDbsRmFromListMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u306a\u3044\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059
+HashDbConfigPanel.indexStatusText.noIndex=\u7d22\u5f15\u304c\u3042\u308a\u307e\u305b\u3093
+HashDbConfigPanel.dbsNotIndexedMsg=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4eca\u3059\u3050\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3057\u307e\u3059\u304b? \n {0}
+HashDbConfigPanel.dbNotIndexedMsg=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u4eca\u3059\u3050\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3057\u307e\u3059\u304b? \n{0}
+HashDbConfigPanel.unindexedDbsMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u306a\u3044\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
+HashDbConfigPanel.allUnindexedDbsRmFromListMsg=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u3066\u3044\u306a\u3044\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u30ea\u30b9\u30c8\u304b\u3089\u3059\u3079\u3066\u524a\u9664\u3055\u308c\u307e\u3059
HashDbConfigPanel.nameColLbl=\u540d\u524d
-HashDbConfigPanel.editingCellsNotSupportedMsg=\u30bb\u30eb\u306f\u7de8\u96c6\u4e0d\u53ef\u3067\u3059
-HashDbCreateDatabaseDialog.createHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210
-HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u306f .{0} \u306e\u62e1\u5f35\u5b50\u304c\u5fc5\u8981\u3067\u3059\u3002
+HashDbConfigPanel.editingCellsNotSupportedMsg=\u30bb\u30eb\u306e\u7de8\u96c6\u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+HashDbCreateDatabaseDialog.defaultFileName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
+HashDbCreateDatabaseDialog.createHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u4f5c\u6210
+HashDbCreateDatabaseDialog.hashDbMustHaveFileExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306b\u306f .{0} \u62e1\u5f35\u5b50\u304c\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
HashDbCreateDatabaseDialog.fileNameErr=\u30d5\u30a1\u30a4\u30eb\u540d\u30a8\u30e9\u30fc
-HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg=\u540c\u540d\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u5225\u306e\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u8a2d\u5b9a\u3057\u3066\u4e0b\u3055\u3044\u3002
-HashDbCreateDatabaseDialog.fileExistsErr=\u30d5\u30a1\u30a4\u30eb\u304c\u65e2\u306b\u5b58\u5728\u3057\u3066\u3044\u308b\u30a8\u30e9\u30fc
-HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\u306e\u5165\u529b\u304c\u5fc5\u8981\u3067\u3059
-HashDbCreateDatabaseDialog.createHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4f5c\u6210\u30a8\u30e9\u30fc
-HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\u306e\u5165\u529b\u304c\u5fc5\u8981\u3067\u3059\u3002
-HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u4f5c\u6210\u30a8\u30e9\u30fc
-HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg=\u6307\u5b9a\u3055\u308c\u305f\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u3067\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
-HashDbCreateDatabaseDialog.failedToCreateHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u4f5c\u6210\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-HashDbImportDatabaseDialog.importHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
-HashDbImportDatabaseDialog.fileNameExtFilter.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
-HashDbImportDatabaseDialog.failedToGetDbPathMsg=\u9078\u629e\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d1\u30b9\u306e\u5165\u624b\u3092\u5931\u6557\u3057\u307e\u3057\u305f\u3002
-HashDbImportDatabaseDialog.importHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a8\u30e9\u30fc\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
-HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9\u306e\u9078\u629e\u304c\u5fc5\u8981\u3067\u3059\u3002
-HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=\u9078\u629e\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
-HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg={0}\u3067\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u304f\u306e\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002
+HashDbCreateDatabaseDialog.fileNameAlreadyExistsMsg=\u3053\u306e\u540d\u524d\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u65b0\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u540d\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+HashDbCreateDatabaseDialog.fileExistsErr=\u30d5\u30a1\u30a4\u30eb\u304c\u3059\u3067\u306b\u5b58\u5728\u3059\u308b\u5834\u5408\u306e\u30a8\u30e9\u30fc
+HashDbCreateDatabaseDialog.mustEnterHashSetNameMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbCreateDatabaseDialog.createHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u4f5c\u6210\u30a8\u30e9\u30fc
+HashDbCreateDatabaseDialog.mustEnterHashDbPathMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9\u3092\u5165\u529b\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbCreateDatabaseDialog.errMsg.hashDbCreationErr=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u4f5c\u6210\u30a8\u30e9\u30fc
+HashDbCreateDatabaseDialog.cannotCreateFileAtLocMsg=\u9078\u629e\u3057\u305f\u5834\u6240\u3067\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3002
+HashDbCreateDatabaseDialog.failedToCreateHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashDbImportDatabaseDialog.importHashDbMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
+HashDbImportDatabaseDialog.fileNameExtFilter.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb
+HashDbImportDatabaseDialog.failedToGetDbPathMsg=\u9078\u629e\u3057\u305f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u30d1\u30b9\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashDbImportDatabaseDialog.importHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a4\u30f3\u30dd\u30fc\u30c8\u30a8\u30e9\u30fc
+HashDbImportDatabaseDialog.mustSelectHashDbFilePathMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30d1\u30b9\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbImportDatabaseDialog.hashDbDoesNotExistMsg=\u9078\u629e\u3057\u305f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+HashDbImportDatabaseDialog.unableToCopyToUserDirMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30e6\u30fc\u30b6\u30fc\u69cb\u6210\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc {0} \u306b\u30b3\u30d4\u30fc\u3067\u304d\u307e\u305b\u3093\u3002
+HashDbImportDatabaseDialog.errorMessage.failedToOpenHashDbMsg={0} \u306b\u3042\u308b\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002
HashLookupModuleFactory.moduleName.text=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7
-HashLookupModuleFactory.moduleDescription.text=\u6a19\u6e96\u306eNSRL\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306a\u3069\u3001\u63d0\u4f9b\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u5229\u7528\u3057\u3066\u3001\u65e2\u77e5\u307e\u305f\u306f\u7591\u308f\u3057\u3044\u3082\u306e\u3092\u691c\u77e5\u3057\u307e\u3059\u3002
-HashDbIngestModule.noKnownHashDbSetMsg=\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
-HashDbIngestModule.knownFileSearchWillNotExecuteWarn=\u65e2\u77e5\u306e\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u304c\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002
-HashDbIngestModule.noKnownBadHashDbSetMsg=\u65e2\u77e5\u306e\u60aa\u8cea\u306a\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30bb\u30c3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002
-HashDbConfigPanel.dbNotIndexedMsg=\u6b21\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3057\u307e\u3059\u304b\uff1f\n{0}
-HashDbIngestModule.knownBadFileSearchWillNotExecuteWarn=\u65e2\u77e5\u306e\u60aa\u8cea\u30d5\u30a1\u30a4\u30eb\u691c\u7d22\u306f\u5b9f\u884c\u3055\u308c\u307e\u305b\u3093\u3002
-HashDbIngestModule.fileReadErrorMsg=\u8aad\u307f\u8fbc\u307f\u30a8\u30e9\u30fc\uff1a {0}
-HashDbIngestModule.calcHashValueErr={0}\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8a08\u7b97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-HashDbIngestModule.hashLookupErrorMsg=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u30a8\u30e9\u30fc\uff1a {0}
-HashDbIngestModule.lookingUpKnownBadHashValueErr={0}\u306e\u65e2\u77e5\u306e\u60aa\u8cea\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-HashDbIngestModule.lookingUpKnownHashValueErr={0}\u306e\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashLookupModuleFactory.moduleDescription.text=\u6a19\u6e96\u306eNSRL\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306a\u3069\u306e\u63d0\u4f9b\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u4f7f\u3063\u3066\u3001\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3068\u9855\u8457\u306a\u30d5\u30a1\u30a4\u30eb\u3092\u8b58\u5225\u3057\u307e\u3059\u3002
+HashDbIngestModule.fileReadErrorMsg=\u8aad\u307f\u53d6\u308a\u30a8\u30e9\u30fc: {0}
+HashDbIngestModule.calcHashValueErr={0} ({1}) \u306e\u30cf\u30c3\u30b7\u30e5\u5024\u306e\u8a08\u7b97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashDbIngestModule.hashLookupErrorMsg=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u30a8\u30e9\u30fc: {0}
+HashDbIngestModule.settingKnownBadStateErr={0} \u306e\u9855\u8457\u306a\u72b6\u614b\u306e\u8a2d\u5b9a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashDbIngestModule.lookingUpKnownBadHashValueErr={0} \u306e\u9855\u8457\u306a\u30cf\u30c3\u30b7\u30e5\u5024\u306e\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashDbIngestModule.lookingUpKnownHashValueErr={0} \u306e\u65e2\u77e5\u30cf\u30c3\u30b7\u30e5\u5024\u306e\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
HashDbIngestModule.postToBB.fileName=\u30d5\u30a1\u30a4\u30eb\u540d
HashDbIngestModule.postToBB.md5Hash=MD5\u30cf\u30c3\u30b7\u30e5
HashDbIngestModule.postToBB.hashsetName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d
-HashDbIngestModule.postToBB.knownBadMsg=\u65e2\u77e5\u306e\u60aa\u8cea\: {0}
-HashDbIngestModule.complete.knownBadsFound=\u767a\u898b\u3055\u308c\u305f\u65e2\u77e5\u306e\u60aa\u8cea\uff1a
-HashDbIngestModule.complete.totalCalcTime=\u8a08\u7b97\u6642\u9593\u306e\u5408\u8a08
-HashDbIngestModule.complete.totalLookupTime=\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u6642\u9593\u306e\u5408\u8a08
-HashDbIngestModule.complete.databasesUsed=\u5229\u7528\u3057\u305f\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff1a
+HashDbIngestModule.postToBB.knownBadMsg=\u9855\u8457: {0}
+HashDbIngestModule.complete.knownBadsFound=\u898b\u3064\u304b\u3063\u305f\u9855\u8457\u6027:
+HashDbIngestModule.complete.totalCalcTime=\u5408\u8a08\u8a08\u7b97\u6642\u9593
+HashDbIngestModule.complete.totalLookupTime=\u5408\u8a08\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u6642\u9593
+HashDbIngestModule.complete.databasesUsed=\u4f7f\u7528\u3057\u305f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8:
HashDbIngestModule.complete.hashLookupResults=\u30cf\u30c3\u30b7\u30e5\u30eb\u30c3\u30af\u30a2\u30c3\u30d7\u7d50\u679c
-HashDbManager.moduleErrorListeningToUpdatesMsg=HashDbManager\u30a2\u30c3\u30d7\u30c7\u30fc\u30c8\u3092\u78ba\u8a8d\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u8d77\u3053\u3057\u307e\u3057\u305f\u3002\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u539f\u56e0\u306a\u306e\u304b\u3092\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u4e0b\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u5b8c\u5168\u3067\u306a\u3044\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002
-HashDbManager.replacingDuplicateHashsetNameMsg=\u91cd\u8907\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d {0} \u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\n {1}\u306b\u66f8\u304d\u63db\u3048\u307e\u3059\u3002
-HashDbManager.openHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u304f\u30a8\u30e9\u30fc
-HashDbManager.unableToOpenHashDbMsg=\ {0} \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u958b\u3051\u307e\u305b\u3093\u3002
-HashDbManager.savedBackupOfOldConfigMsg={0}\n\u53e4\u3044\u8a2d\u5b9a\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30b3\u30d4\u30fc\u304c\u6b21\u306e\u901a\u308a\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f\u3002\n{1}
-HashDbManager.baseMessage.updatedFormatHashDbConfig=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u306e\u5f62\u5f0f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002
-HashDbManager.msgBoxTitle.confFileFmtChanged=\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u306e\u5909\u66f4\u5b8c\u4e86
-HashDbManager.dlgMsg.dbNotFoundAtLoc=\ {0} \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u6b21\u306e\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u306b\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002\n {1}\n \u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3057\u307e\u3059\u304b\uff1f
-HashDbManager.dlgTitle.MissingDb=\u6b20\u843d\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
-HashDbManager.progress.indexingHashSet=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d {0}
-HashDbManager.dlgMsg.errorIndexingHashSet=\ {0} \u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u306e\u30a8\u30e9\u30fc
-HashDbManager.hashDbIndexingErr=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d\u306e\u30a8\u30e9\u30fc
-HashDbPanelSearchAction.actionName=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u304f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated=MD5\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u3066\u3044\u308b\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u307e\u305a\u306fHashDB\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3057\u3066\u4e0b\u3055\u3044\u3002
+HashDbManager.moduleErrorListeningToUpdatesMsg=HashDbManager\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+HashDbManager.replacingDuplicateHashsetNameMsg=\u691c\u51fa\u3055\u308c\u305f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d {0} \u3092\u8907\u88fd\u3057\u307e\u3059\u3002\n{1} \u3067\u7f6e\u304d\u63db\u3048\u4e2d\u3067\u3059\u3002
+HashDbManager.openHashDbErr=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a4\u30f3\u30aa\u30fc\u30d7\u30f3\u30a8\u30e9\u30fc
+HashDbManager.unableToOpenHashDbMsg={0} \u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u958b\u3051\u307e\u305b\u3093\u3002
+HashDbManager.savedBackupOfOldConfigMsg={0}\n\u53e4\u3044\u69cb\u6210\u306e\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u30b3\u30d4\u30fc\u304c \n{1} \u3068\u3057\u3066\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f
+HashDbManager.baseMessage.updatedFormatHashDbConfig=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u306e\u5f62\u5f0f\u304c\u66f4\u65b0\u3055\u308c\u307e\u3057\u305f\u3002
+HashDbManager.msgBoxTitle.confFileFmtChanged=\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u306e\u5f62\u5f0f\u304c\u5909\u66f4\u3055\u308c\u307e\u3057\u305f
+HashDbManager.dlgMsg.dbNotFoundAtLoc=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8 {0} \u304c\n{1}\u306e\u5834\u6240\u3067\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\n\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3057\u307e\u3059\u304b?
+HashDbManager.dlgTitle.MissingDb=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093
+HashDbManager.progress.indexingHashSet={0} \u306e\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+HashDbManager.dlgMsg.errorIndexingHashSet={0} \u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u7d22\u5f15\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+HashDbManager.hashDbIndexingErr=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30a8\u30e9\u30fc
+HashDbPanelSearchAction.actionName=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
+HashDbSearchAction.dlgMsg.noFilesHaveMD5Calculated=\u73fe\u5728MD5\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u6700\u521d\u306bHashDB\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
HashDbSearchManager.MD5HashSearch=MD5\u30cf\u30c3\u30b7\u30e5\u691c\u7d22
-HashDbSearchManager.noResultsFoundMsg=\u4e00\u81f4\u3059\u308b\u3082\u306e\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-HashDbSearchPanel.titleText.ingestOngoing=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\uff1b\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-HashDbSearchPanel.noFilesHaveMD5HashMsg=MD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-HashDbSearchPanel.errorText.noHashesAddedMsg=\u30a8\u30e9\u30fc\uff1a\u30cf\u30c3\u30b7\u30e5\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
-HashDbSearchPanel.errorText.hashAlreadyAddedMsg=\u30a8\u30e9\u30fc\uff1a\u30cf\u30c3\u30b7\u30e5\u304c\u65e2\u306b\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-HashDbSearchPanel.errorText.invalidMD5HashMsg=\u30a8\u30e9\u30fc\uff1a\u6709\u52b9\u306aMD5\u30cf\u30c3\u30b7\u30e5\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
-HashDbSearchThread.progress.cancellingSearch={0}\uff08\u30ad\u30e3\u30f3\u30bb\u30eb\u4e2d\u2026\uff09
-HashDbSearchThread.name.searching=\u691c\u7d22\u4e2d
-HashDbSearchThread.noMoreFilesWithMD5Msg=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u306f\u4ed6\u306b\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-ModalNoButtons.indexingDbsTitle=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-ModalNoButtons.indexingDbTitle=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-ModalNoButtons.exitHashDbIndexingMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u4e2d\u6b62\u3057\u307e\u3059\u3002\n\
-\u4f5c\u6210\u3055\u308c\u305f\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306f\u5229\u7528\u4e0d\u53ef\u3068\u306a\u308a\u307e\u3059\u3002\u7d9a\u884c\u3059\u308b\u5834\u5408\u306f\n\
-\u30cf\u30c3\u30b7\u30e5\u30d5\u30a9\u30eb\u30c0\u5185\u306b\u3042\u308b\u3001\u5bfe\u5fdc\u3059\u308b-md5.idx \u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3057\u3066\u4e0b\u3055\u3044\u3002\n\
-\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u3092\u4e2d\u6b62\u3057\u307e\u3059\u304b\uff1f
-ModalNoButtons.dlgTitle.unfinishedIndexing=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u672a\u5b8c\u4e86
-ModalNoButtons.indexThis.currentlyIndexing1Db=\uff11\u3064\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=\uff11\uff0f {0}\u3064\u76ee\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-ModalNoButtons.propChg.currentlyIndexingXofN={0}\uff0f {1}\u3064\u76ee\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u5316\u4e2d
-HashDbManager.duplicateHashSetNameExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d''{0}''\u306f\u65e2\u306b\u5225\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4f7f\u308f\u308c\u3066\u3044\u307e\u3059\u3002
-HashDbManager.hashDbDoesNotExistExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u6b21\u3067\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\n{0}
-HashDbManager.hashDbFileExistsExceptionMsg=\u65e2\u306b\u30d5\u30a1\u30a4\u30eb\u304c\u6b21\u306b\u5b58\u5728\u3057\u307e\u3059\n{0}
-HashDbManager.hashDbAlreadyAddedExceptionMsg=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\n{0}\n\u306f\u65e2\u306b\u4f5c\u6210\u307e\u305f\u306f\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002
-HashDbManager.illegalHashDbFileNameExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u540d\u306f.{0}\u306e\u62e1\u5f35\u5b50\u304c\u5fc5\u8981\u3067\u3059\u3002
+HashDbSearchManager.noResultsFoundMsg=\u8a72\u5f53\u3059\u308b\u7d50\u679c\u304c\u3042\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+HashDbSearchPanel.titleText.ingestOngoing=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+HashDbSearchPanel.noFilesHaveMD5HashMsg=\u73fe\u5728MD5\u30cf\u30c3\u30b7\u30e5\u304c\u8a08\u7b97\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+HashDbSearchPanel.errorText.noHashesAddedMsg=\u30a8\u30e9\u30fc: \u30cf\u30c3\u30b7\u30e5\u304c\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002
+HashDbSearchPanel.errorText.hashAlreadyAddedMsg=\u30a8\u30e9\u30fc: \u30cf\u30c3\u30b7\u30e5\u304c\u3059\u3067\u306b\u8ffd\u52a0\u3055\u308c\u3066\u3044\u307e\u3059\u3002
+HashDbSearchPanel.errorText.invalidMD5HashMsg=\u30a8\u30e9\u30fc: \u305d\u308c\u306f\u6709\u52b9\u306aMD5\u30cf\u30c3\u30b7\u30e5\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+HashDbSearchThread.progress.cancellingSearch={0} (\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...)
+HashDbSearchThread.name.searching=\u691c\u7d22\u4e2d\u3067\u3059
+HashDbSearchThread.noMoreFilesWithMD5Msg=\u540c\u3058MD5\u30cf\u30c3\u30b7\u30e5\u3092\u6301\u3064\u4ed6\u306e\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ModalNoButtons.indexingDbsTitle=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+ModalNoButtons.indexingDbTitle=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+ModalNoButtons.exitHashDbIndexingMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u7d22\u5f15\u751f\u6210\u3092\u7d42\u4e86\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059\u3002\n\
+\u751f\u6210\u3055\u308c\u305f\u7d22\u5f15\u306f\u4f7f\u7528\u3067\u304d\u306a\u3044\u72b6\u614b\u306e\u307e\u307e\u306b\u306a\u308a\u307e\u3059\u3002\u7d9a\u884c\u3092\u9078\u629e\u3059\u308b\u5834\u5408\u3001\n\
+ \u30cf\u30c3\u30b7\u30e5\u30d5\u30a9\u30eb\u30c0\u30fc\u5185\u306e\u8a72\u5f53\u3059\u308b-md5.idx\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\
+ \u7d22\u5f15\u751f\u6210\u3092\u7d42\u4e86\u3057\u307e\u3059\u304b?
+ModalNoButtons.dlgTitle.unfinishedIndexing=\u5b8c\u4e86\u3057\u3066\u3044\u306a\u3044\u7d22\u5f15\u751f\u6210
+ModalNoButtons.indexThis.currentlyIndexing1Db=\u73fe\u57281\u3064\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+ModalNoButtons.indexThese.currentlyIndexing1OfNDbs=\u73fe\u5728 {0} \u306e1\u3064\u3092\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+ModalNoButtons.propChg.currentlyIndexingXofN=\u73fe\u5728 {1} \u306e {0} \u3092\u7d22\u5f15\u751f\u6210\u4e2d\u3067\u3059
+HashDbManager.duplicateHashSetNameExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d ''{0}'' \u306f\u3059\u3067\u306b\u4ed6\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002
+HashDbManager.hashDbDoesNotExistExceptionMsg=\n{0} \u306b\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306f\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
+HashDbManager.hashDbFileExistsExceptionMsg=at\n{0} \u306b\u30d5\u30a1\u30a4\u30eb\u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+HashDbManager.hashDbAlreadyAddedExceptionMsg=\n{0}\n \u306b\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u3059\u3067\u306b\u4f5c\u6210\u307e\u305f\u306f\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002
+HashDbManager.illegalHashDbFileNameExtensionMsg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u540d\u306b\u306f .{0} \u62e1\u5f35\u5b50\u304c\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
HashDbManager.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-HashDbManager.knownBad.text=\u65e2\u77e5\u306e\u60aa\u8cea
+HashDbManager.knownBad.text=\u9855\u8457
HashDbManager.known.text=\u65e2\u77e5
-HashDbManager.fileNameExtensionFilter.title=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
-HashDbSearchAction.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u3044\u305f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
+HashDbManager.fileNameExtensionFilter.title=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb
+HashDbSearchAction.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
HashDbSearchAction.getName.text=\u30cf\u30c3\u30b7\u30e5\u691c\u7d22
-HashDbSearchPanel.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u57fa\u3065\u304f\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
-AddContentToHashDbAction.singleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0
-AddContentToHashDbAction.multipleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0
-OptionsCategory_Name_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
-OptionsCategory_Keywords_HashDatabase=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9
-HashDbManager.ingestRunningExceptionMsg=\u51e6\u7406\u4e2d\uff1b\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-ModalNoButtons.CURRENTDB_LABEL.text=\uff08\u73fe\u5728\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff09
-HashDbCreateDatabaseDialog.defaultFileName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
-HashDbManager.saveErrorExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u8a2d\u5b9a\u306e\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbSearchPanel.dlgMsg.title=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u3088\u308b\u30d5\u30a1\u30a4\u30eb\u691c\u7d22
+AddContentToHashDbAction.singleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0
+AddContentToHashDbAction.multipleSelectionName=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0
+AddContentToHashDbAction.singleSelectionNameDuringIngest=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d)
+AddContentToHashDbAction.multipleSelectionNameDuringIngest=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u306e\u5b9f\u884c\u4e2d)
+AddContentToHashDbAction.singleSelectionNameNoMD5=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(MD5\u30cf\u30c3\u30b7\u30e5\u306a\u3057)
+AddContentToHashDbAction.multipleSelectionNameNoMD5=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(MD5\u30cf\u30c3\u30b7\u30e5\u306a\u3057)
+AddContentToHashDbAction.singleSelectionNameEmpty=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(\u7a7a(\u672a\u8a18\u5165)\u306e\u30d5\u30a1\u30a4\u30eb)
+AddContentToHashDbAction.multipleSelectionNameEmpty=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8ffd\u52a0(\u7a7a(\u672a\u8a18\u5165)\u306e\u30d5\u30a1\u30a4\u30eb)
+HashDbManager.ingestRunningExceptionMsg=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u3053\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+HashDbManager.saveErrorExceptionMsg=\u30cf\u30c3\u30b7\u30e5\u69cb\u6210\u306e\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashLookupSettingsPanel.jButton3.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
+HashLookupSettingsPanel.jLabel6.text=\u30bf\u30a4\u30d7:
+HashLookupSettingsPanel.jLabel4.text=\u5834\u6240:
+HashLookupSettingsPanel.jLabel2.text=\u540d\u524d:
+HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3067\u3082MD5\u3092\u8a08\u7b97
+HashLookupModuleSettingsPanel.knownHashDbsLabel.text=\u4f7f\u7528\u3059\u308b\u65e2\u77e5\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u9078\u629e:
+HashLookupModuleSettingsPanel.knownBadHashDbsLabel.text=\u4f7f\u7528\u3059\u308b\u9855\u8457\u306a\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u9078\u629e:
AddContentToHashDbAction.addFilesToHashSet.files=\u30d5\u30a1\u30a4\u30eb
AddContentToHashDbAction.addFilesToHashSet.file=\u30d5\u30a1\u30a4\u30eb
-HashDbManager.errCreatingIndex.title=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
-HashDbManager.errCreatingIndex.msg=\u6b21\u306e\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\uff1a {0}
-HashLookupSettingsPanel.jButton3.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
-HashLookupSettingsPanel.jLabel6.text=\u30bf\u30a4\u30d7\uff1a
-HashLookupSettingsPanel.jLabel4.text=\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\uff1a
-HashLookupSettingsPanel.jLabel2.text=\u540d\u524d\uff1a
-HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u304f\u3066\u3082\u3001MD5\u3092\u8a08\u7b97
-HashLookupModuleSettingsPanel.knownHashDbsLabel.text=\u5229\u7528\u3059\u308b\u65e2\u77e5\u306e\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u9078\u629e\uff1a
-HashLookupModuleSettingsPanel.knownBadHashDbsLabel.text=\u51e6\u7406\u306b\u5229\u7528\u3059\u308b\u65e2\u77e5\u306e\u60aa\u8cea\u306a\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u9078\u629e\uff1a
-HashLookupModuleFactory.createFileIngestModule.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof HashLookupModuleSettings\u3067\u3059\u3002
-HashLookupModuleFactory.getIngestJobSettingsPanel.exception.msg=\u8a2d\u5b9a\u3092\u884c\u3046\u70ba\u306e\u60f3\u5b9a\u3055\u308c\u308b\u5f15\u6570\u306finstanceof HashLookupModuleSettings\u3067\u3059\u3002
-HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.toolTipText=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u304f\u3066\u3082\u3001MD5\u3092\u8a08\u7b97
+HashDbManager.errCreatingIndex.title=\u7d22\u5f15\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+HashDbManager.errCreatingIndex.msg=\u6b21\u306e\u7d22\u5f15\u3092\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f: {0}
+HashLookupModuleFactory.getIngestJobSettingsPanel.exception.msg=instanceof HashLookupModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+HashLookupModuleFactory.createFileIngestModule.exception.msg=instanceof HashLookupModuleSettings\u306b\u306a\u308b\u3068\u4e88\u60f3\u3055\u308c\u308b\u8a2d\u5b9a\u5f15\u6570
+HashLookupModuleSettingsPanel.alwaysCalcHashesCheckbox.toolTipText=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3067\u3082MD5\u3092\u8a08\u7b97
HashDbSearchPanel.hashTable.defaultModel.title.text=MD5\u30cf\u30c3\u30b7\u30e5
-AddContentToHashDbAction.addFilesToHashSet.unableToAddFileEmptyMsg=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b{0}\u3092\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30d5\u30a1\u30a4\u30eb\u306b\u30b3\u30f3\u30c6\u30f3\u30c4\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-AddHashValuesToDatabaseDialog.JDialog.Title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\
-HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
-AddHashValuesToDatabaseDialog.instructionLabel.text_1=\u4e0b\u8a18\u306bMD5\u306e\u30cf\u30c3\u30b7\u30e5\u5024\u3092\u8cbc\u308a\u4ed8\u3051\u308b\uff08\u30e9\u30a4\u30f3\u3054\u3068\u306b\u4e00\u3064\u305a\u3064\uff09\uff1a
-AddHashValuesToDatabaseDialog.cancelButton.text_2=\u30ad\u30e3\u30f3\u30bb\u30eb
-AddHashValuesToDatabaseDialog.pasteFromClipboardButton.text_2=\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u304b\u3089\u8cbc\u308a\u4ed8\u3051\u308b
+AddHashValuesToDatabaseDialog.JDialog.Title=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
+AddHashValuesToDatabaseDialog.instructionLabel.text_1=\u4ee5\u4e0b\u306eMD5\u30cf\u30c3\u30b7\u30e5\u5024(1\u30e9\u30a4\u30f3\u306b\u3064\u304d1\u3064)\u3092\u8cbc\u308a\u4ed8\u3051:
+AddHashValuesToDatabaseDialog.cancelButton.text_2=\u53d6\u308a\u6d88\u3057
+AddHashValuesToDatabaseDialog.pasteFromClipboardButton.text_2=\u30af\u30ea\u30c3\u30d7\u30dc\u30fc\u30c9\u304b\u3089\u8cbc\u308a\u4ed8\u3051
AddHashValuesToDatabaseProgressDialog.okButton.text=OK
AddHashValuesToDatabaseProgressDialog.statusLabel.text=\u30b9\u30c6\u30fc\u30bf\u30b9
-AddHashValuesToDatabaseProgressDialog.title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d7\u30ed\u30b0\u30ec\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
-AddHashValuesToDatabaseDialog.title=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
+AddHashValuesToDatabaseProgressDialog.title=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3078\u306e\u30cf\u30c3\u30b7\u30e5\u8ffd\u52a0\u306e\u9032\u6357\u72b6\u6cc1
+AddHashValuesToDatabaseDialog.title=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
AddHashValuesToDatabaseProgressDialog.showErrorsButton.text=\u30a8\u30e9\u30fc\u3092\u8868\u793a
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.parsing=MD5\u30cf\u30c3\u30b7\u30e5\u306b\u30c6\u30ad\u30b9\u30c8\u3092\u30d1\u30fc\u30b9\u4e2d...
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invalidHash=\u30a4\u30f3\u30d7\u30c3\u30c8\u306b\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invaliHash.msg=\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\uff1a
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.parsing=MD5\u30cf\u30c3\u30b7\u30e5\u306e\u30c6\u30ad\u30b9\u30c8\u306e\u89e3\u6790\u4e2d\u3067\u3059...
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invalidHash=\u5165\u529b\u306b\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.invaliHash.msg=\u7121\u52b9\u306a\u30cf\u30c3\u30b7\u30e5:
AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.noHashesToAdd=\u8ffd\u52a0\u3059\u308b\u30cf\u30c3\u30b7\u30e5\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.success={0}\u30cf\u30c3\u30b7\u30e5\u304c\u6b63\u3057\u304f\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash=\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-HashLookupSettingsPanel.deleteDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u524a\u9664
-HashLookupSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
-HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
-HashLookupSettingsPanel.indexPathLabelLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30d1\u30b9\uff1a
-HashLookupSettingsPanel.createDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210
-HashLookupSettingsPanel.informationLabel.text=\u60c5\u5831
-HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30d2\u30c3\u30c8\u6bce\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30a4\u30f3\u30dc\u30c3\u30af\u30b9\u306b\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u308b
-HashLookupSettingsPanel.indexButton.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9
-HashLookupSettingsPanel.indexLabel.text=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u30b9\u30c6\u30fc\u30bf\u30b9\uff1a
-HashLookupSettingsPanel.hashDbIndexStatusLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-HashLookupSettingsPanel.hashDbTypeLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-HashLookupSettingsPanel.typeLabel.text=\u30bf\u30a4\u30d7\uff1a
-HashLookupSettingsPanel.locationLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a
-HashLookupSettingsPanel.hashDbLocationLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-HashLookupSettingsPanel.hashDbNameLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-HashLookupSettingsPanel.nameLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u540d\uff1a
-HashLookupSettingsPanel.hashDatabasesLabel.text=\u30cf\u30c3\u30b7\u30e5\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\uff1a
-HashLookupSettingsPanel.importDatabaseButton.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
-HashDbCreateDatabaseDialog.databasePathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u30d1\u30b9\uff1a
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.success={0} \u30cf\u30c3\u30b7\u30e5\u304c\u6b63\u5e38\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash=\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u306e\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+AddHashValuesToDatabaseProgressDialog.addHashValuesToDatabase.errorAddingValidHash.msg=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u6709\u52b9\u306a\u30cf\u30c3\u30b7\u30e5\u306e\u8ffd\u52a0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f:
+HashLookupSettingsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+HashLookupSettingsPanel.addHashesToDatabaseButton.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306b\u30cf\u30c3\u30b7\u30e5\u3092\u8ffd\u52a0
+HashLookupSettingsPanel.indexPathLabelLabel.text=\u7d22\u5f15\u30d1\u30b9:
+HashLookupSettingsPanel.createDatabaseButton.toolTipText=
+HashLookupSettingsPanel.createDatabaseButton.text=\u65b0\u898f\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8
+HashLookupSettingsPanel.informationLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u8a73\u7d30
+HashLookupSettingsPanel.sendIngestMessagesCheckBox.text=\u30d2\u30c3\u30c8\u3054\u3068\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u53d7\u4fe1\u7bb1\u306e\u30e1\u30c3\u30bb\u30fc\u30b8\u3092\u9001\u4fe1
+HashLookupSettingsPanel.indexButton.text=\u7d22\u5f15
+HashLookupSettingsPanel.indexLabel.text=\u7d22\u5f15\u30b9\u30c6\u30fc\u30bf\u30b9:
+HashLookupSettingsPanel.hashDbIndexStatusLabel.text=
+HashLookupSettingsPanel.hashDbTypeLabel.text=
+HashLookupSettingsPanel.typeLabel.text=\u30bf\u30a4\u30d7:
+HashLookupSettingsPanel.locationLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9:
+HashLookupSettingsPanel.hashDbLocationLabel.text=
+HashLookupSettingsPanel.hashDbNameLabel.text=
+HashLookupSettingsPanel.nameLabel.text=\u540d\u524d:
+HashLookupSettingsPanel.hashDatabasesLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8:
+HashLookupSettingsPanel.importDatabaseButton.toolTipText=
+HashLookupSettingsPanel.importDatabaseButton.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
+HashLookupSettingsPanel.deleteDatabaseButton.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u524a\u9664
+ImportHashDatabaseDialog.lbFilePath.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9:
+ImportHashDatabaseDialog.tfDatabaseName.tooltip=\u3053\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u540d\u524d
+ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7
+ImportHashDatabaseDialog.tfDatabaseName.tooltip=\u3053\u306e\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u540d\u524d
+ImportHashDatabaseDialog.tfDatabaseVersion.tooltip.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u30d0\u30fc\u30b8\u30e7\u30f3\u756a\u53f7
+ImportCentralRepoDbProgressDialog.lbProgress.text=\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u3057\u307e\u3059...
+ImportCentralRepoDbProgressDialog.bnOk.text=OK
+ImportCentralRepoDbProgressDialog.bnCancel.text=\u53d6\u308a\u6d88\u3057
+HashLookupSettingsPanel.versionLabel.text_1=\u30d0\u30fc\u30b8\u30e7\u30f3:
+HashLookupSettingsPanel.hashDbVersionLabel.text_1=
+HashLookupSettingsPanel.orgLabel.text_1=\u7d44\u7e54:
+HashLookupSettingsPanel.hashDbOrgLabel.text_1=
+HashLookupSettingsPanel.readOnlyLabel.text_1=\u8aad\u307f\u53d6\u308a\u5c02\u7528:
+HashLookupSettingsPanel.hashDbReadOnlyLabel.text_1=
+ImportCentralRepoDbProgressDialog.jLabel1.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc\u306b\u30a4\u30f3\u30dd\u30fc\u30c8\u4e2d\u3067\u3059
+HashDbImportDatabaseDialog.lbVersion.text=\u30d0\u30fc\u30b8\u30e7\u30f3:
+HashDbImportDatabaseDialog.lbOrg.text=\u30bd\u30fc\u30b9\u7d44\u7e54:
+HashDbImportDatabaseDialog.readOnlyCheckbox.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u8aad\u307f\u53d6\u308a\u5c02\u7528\u306b\u3059\u308b
+HashDbImportDatabaseDialog.orgButton.text=\u7d44\u7e54\u3092\u7ba1\u7406
+HashDbImportDatabaseDialog.versionTextField.text=1.0
+HashDbImportDatabaseDialog.fileTypeRadioButton.text=\u30ed\u30fc\u30ab\u30eb
+HashDbImportDatabaseDialog.centralRepoRadioButton.text=\u30ea\u30e2\u30fc\u30c8(\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc)
+HashDbImportDatabaseDialog.jLabel4.text=\u5b9b\u5148:
+HashDbCreateDatabaseDialog.jLabel4.text=\u5b9b\u5148:
+HashDbCreateDatabaseDialog.fileTypeRadioButton.text=\u30ed\u30fc\u30ab\u30eb
+HashDbCreateDatabaseDialog.centralRepoRadioButton.text=\u30ea\u30e2\u30fc\u30c8(\u30bb\u30f3\u30c8\u30e9\u30eb\u30fb\u30ec\u30dd\u30b8\u30c8\u30ea\u30fc)
+HashDbCreateDatabaseDialog.lbOrg.text=\u30bd\u30fc\u30b9\u7d44\u7e54:
+HashDbCreateDatabaseDialog.orgButton.text=\u7d44\u7e54\u3092\u7ba1\u7406
+HashDbCreateDatabaseDialog.databasePathLabel.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d1\u30b9:
AddHashValuesToDatabaseDialog.okButton.text_2=OK
-HashLookupSettingsPanel.indexPathLabel.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.text=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3092\u30e6\u30fc\u30b6\u30fc\u69cb\u6210\u30d5\u30a1\u30a4\u30eb\u306b\u30b3\u30d4\u30fc
+HashDbImportDatabaseDialog.saveInUserConfigFolderCheckbox.toolTipText=\u30e9\u30a4\u30d6\u30c8\u30ea\u30a2\u30fc\u30b8\u306e\u72b6\u6cc1\u3067\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u306b\u3088\u3063\u3066\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u3078\u306e\u30d1\u30b9\u304c\u6709\u52b9\u3067\u3042\u308b\u3053\u3068\u304c\u4fdd\u8a3c\u3055\u308c\u307e\u3059\u3002
+HashLookupSettingsPanel.indexPathLabel.text=
diff --git a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleFactory.java b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleFactory.java
index af27157fd8..98b2a27759 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleFactory.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/hashdatabase/HashLookupModuleFactory.java
@@ -47,7 +47,7 @@ public class HashLookupModuleFactory extends IngestModuleFactoryAdapter {
*
* @return The module name.
*/
- static String getModuleName() {
+ public static String getModuleName() {
return NbBundle.getMessage(HashLookupModuleFactory.class, "HashLookupModuleFactory.moduleName.text");
}
diff --git a/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties
index bfccdf05e9..03cd3cc41e 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/iOS/Bundle_ja.properties
@@ -1,5 +1,8 @@
-iOSModuleFactory.moduleDescription=\u30B7\u30B9\u30C6\u30E0\u304A\u3088\u3073\u7B2C\u4E09\u8005\u30A2\u30D7\u30EA\u30C7\u30FC\u30BF\u3092\u62BD\u51FA
-iOSModuleFactory.moduleName=iOS\u30A2\u30CA\u30E9\u30A4\u30B6
-TextMessageAnalyzer.bbAttribute.incoming=\u53D7\u4FE1
-TextMessageAnalyzer.bbAttribute.outgoing=\u9001\u4FE1
-TextMessageAnalyzer.bbAttribute.smsMessage=SMS\u30E1\u30C3\u30BB\u30FC\u30B8
\ No newline at end of file
+CallLogAnalyzer.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u901a\u8a71\u30ed\u30b0\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ContactAnalyzer.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u9023\u7d61\u5148\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+iOSModuleFactory.moduleName=iOS Analyzer
+iOSModuleFactory.moduleDescription=\u30b7\u30b9\u30c6\u30e0\u3068\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u88fd\u30a2\u30d7\u30ea\u30c7\u30fc\u30bf\u3092\u62bd\u51fa
+TextMessageAnalyzer.bbAttribute.incoming=\u53d7\u4fe1
+TextMessageAnalyzer.bbAttribute.outgoing=\u9001\u4fe1
+TextMessageAnalyzer.bbAttribute.smsMessage=SMS\u30e1\u30c3\u30bb\u30fc\u30b8
+TextMessageAnalyzer.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u30c6\u30ad\u30b9\u30c8\u30e1\u30c3\u30bb\u30fc\u30b8\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties
index 6f6d7f49cf..5a940ca1fd 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/interestingitems/Bundle_ja.properties
@@ -1,51 +1,142 @@
-FilesIdentifierIngestJobSettingsPanel.border.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u306b\u3059\u308b\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u9078\u629e\uff1a
-FilesSetPanel.descPanel.border.title=\u6982\u8981
-FilesSetPanel.descriptionPanel.border.title=\u6982\u8981
-FilesSetPanel.ignoreKnownFilesCheckbox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u7121\u8996
-FilesSetPanel.interesting.messages.filesSetsMustBeNamed=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306f\u540d\u524d\u304c\u5fc5\u8981\u3067\u3059\u3002
-FilesSetPanel.interesting.nameLabel.text=\u30bb\u30c3\u30c8\u540d\uff1a
-FilesSetPanel.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8
-FilesSetRulePanel.extensionRadioButton.text=\u62e1\u5f35\u5b50\u306e\u307f
-FilesSetRulePanel.fullNameRadioButton.text=\u30d5\u30eb\u30cd\u30fc\u30e0
-FilesSetRulePanel.jLabel1.text=\u30bf\u30a4\u30d7*\uff1a
-FilesSetRulePanel.messages.emptyNameCondition=\u3053\u306e\u30eb\u30fc\u30eb\u306f\u30cd\u30fc\u30e0\u30d1\u30bf\u30fc\u30f3\u3092\u7279\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
-FilesSetRulePanel.messages.invalidCharInName=\u6b63\u898f\u8868\u73fe\u4ee5\u5916\u306f\\\u3001/\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u540d\u524d\u306b\u542b\u3081\u307e\u305b\u3093\u3002
-FilesSetRulePanel.messages.invalidCharInPath=\u6b63\u898f\u8868\u73fe\u4ee5\u5916\u306f\\\u3001\:\u3001*\u3001?\u3001"\u3001<\u3001>\u3092\u30d1\u30b9\u306b\u542b\u3081\u307e\u305b\u3093\u3002
-FilesSetRulePanel.messages.invalidNameRegex=\u6b63\u898f\u8868\u73fe\u306f\u6709\u52b9\u306a\u540d\u524d\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a\n\n{0}
-FilesSetRulePanel.messages.invalidPathRegex=\u6b63\u898f\u8868\u73fe\u306f\u6709\u52b9\u306a\u30d1\u30b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a\n\n{0}
-FilesSetRulePanel.nameRegexCheckbox.text=\u6b63\u898f\u8868\u73fe
-FilesSetRulePanel.pathRegexCheckBox.text=\u6b63\u898f\u8868\u73fe
-FilesSetRulePanel.pathSeparatorInfoLabel.text=/\u3092\u30d1\u30b9\u533a\u5207\u308a\u6587\u5b57\u3068\u3057\u3066\u5229\u7528
-FilesSetRulePanel.ruleNameLabel.text=\u30eb\u30fc\u30eb\u540d\uff1a
-FilesSetRulePanel.title=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u30eb\u30fc\u30eb
-InterestingItemsIdentifierIngestModule.moduleDescription=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306e\u5b9a\u7fa9\u3092\u3082\u3068\u306b\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u3092\u691c\u77e5\u3057\u307e\u3059\u3002
-InterestingItemsIdentifierIngestModule.moduleName=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5
+FilesIdentifierIngestJobSettingsPanel.getError=\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+FilesIdentifierIngestJobSettingsPanel.updateError=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3092\u66f4\u65b0\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+FilesIdentifierIngestModule.getFilesError=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+FilesIdentifierIngestModule.indexError.message=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u691c\u7d22\u3059\u308b\u305f\u3081\u306e\u3001\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u306e\u30d2\u30c3\u30c8\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+# {0} - daysIncluded
+FilesSet.rule.dateRule.toString=({0} \u65e5\u4ee5\u5185\u306b\u4fee\u6b63)
+FilesSetDefsPanel.bytes=\u30d0\u30a4\u30c8
+FilesSetDefsPanel.cancelImportMsg=\u30a4\u30f3\u30dd\u30fc\u30c8\u3092\u53d6\u308a\u6d88\u3059
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+FilesSetDefsPanel.exportButtonActionPerformed.fileExistPrompt=\u30d5\u30a1\u30a4\u30eb {0} \u304c\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b?
+FilesSetDefsPanel.gigaBytes=\u30ae\u30ac\u30d0\u30a4\u30c8
+# {0} - \u30d5\u30a3\u30eb\u30bf\u30fc\u540d
+# {1} - \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u540d
+FilesSetDefsPanel.ingest.fileFilterInUseError=\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc {0} \u3092\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb {1} \u304c\u4f7f\u7528\u4e2d\u3067\u3059\u3002\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u304c\u4f7f\u7528\u3057\u3066\u3044\u308b\u9593\u306f\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3002
+FilesSetDefsPanel.Ingest.Title=\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a
+FilesSetDefsPanel.interesting.copySetButton.text=\u30bb\u30c3\u30c8\u3092\u30b3\u30d4\u30fc
+FilesSetDefsPanel.interesting.exportButtonAction.featureName=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
+FilesSetDefsPanel.interesting.ExportedMsg=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u304c\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u307e\u3057\u305f
+FilesSetDefsPanel.interesting.exportSetButton.text=\u30bb\u30c3\u30c8\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8
+FilesSetDefsPanel.interesting.failExportMsg=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u306b\u5931\u6557\u3057\u307e\u3057\u305f
+FilesSetDefsPanel.interesting.failImportMsg=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u304c\u30a4\u30f3\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093
+FilesSetDefsPanel.interesting.fileExtensionFilterLbl=Autopsy\u306e\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb(xml)
+FilesSetDefsPanel.interesting.importButtonAction.featureName=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30a4\u30f3\u30dd\u30fc\u30c8
+FilesSetDefsPanel.interesting.importOwConflict=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30b3\u30f3\u30d5\u30ea\u30af\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
+FilesSetDefsPanel.interesting.importSetButton.text=\u30bb\u30c3\u30c8\u3092\u30a4\u30f3\u30dd\u30fc\u30c8
+# {0} - \u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u540d
+FilesSetDefsPanel.interesting.overwriteSetPrompt=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8 <{0}> \u304c\u3059\u3067\u306b\u30ed\u30fc\u30ab\u30eb\u306b\u5b58\u5728\u3057\u307e\u3059\u3002\u4e0a\u66f8\u304d\u3057\u307e\u3059\u304b?
+FilesSetDefsPanel.Interesting.Title=\u8208\u5473\u6df1\u3044\u9805\u76ee\u306e\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a
+FilesSetDefsPanel.kiloBytes=\u30ad\u30ed\u30d0\u30a4\u30c8
+FilesSetDefsPanel.loadError=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+FilesSetDefsPanel.megaBytes=\u30e1\u30ac\u30d0\u30a4\u30c8
+FilesSetDefsPanel.noSkipMsg=\u3044\u3044\u3048\u3001\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059
+FilesSetDefsPanel.saveError=\u30d5\u30a1\u30a4\u30eb\u306b\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+FilesSetDefsPanel.yesOwMsg=\u306f\u3044\u3001\u4e0a\u66f8\u304d\u3057\u307e\u3059
+FilesSetPanel.filter.title=\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc
+FilesSetPanel.ingest.createNewFilter=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u4f5c\u6210/\u7de8\u96c6...
+FilesSetPanel.ingest.messages.filtersMustBeNamed=\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30a3\u30eb\u30bf\u30fc\u306b\u540d\u524d\u3092\u4ed8\u3051\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+FilesSetPanel.rule.title=\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc\u30eb\u30fc\u30eb
+FilesSetRulePanel.bytes=\u30d0\u30a4\u30c8
+# {0} - \u6b63\u898f\u8868\u73fe
+FilesSetRulePanel.CommaInRegexWarning=\u8b66\u544a: \u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u30d5\u30a3\u30fc\u30eb\u30c9\u306e\u30ab\u30f3\u30de\u306f\u6b63\u898f\u8868\u73fe\u306e\u4e00\u90e8\u3068\u3057\u3066\u89e3\u91c8\u3055\u308c\u3001\u8907\u6570\u306e\u62e1\u5f35\u5b50 (\u5165\u529b\u6570: "{0}") \u306b\u5165\u529b\u3092\u5206\u5272\u3057\u307e\u305b\u3093\u3002
+FilesSetRulePanel.DaysIncludedEmptyError=\u542b\u307e\u308c\u308b\u65e5\u6570\u306f\u7a7a(\u672a\u5165\u529b)\u306b\u3067\u304d\u307e\u305b\u3093\u3002
+FilesSetRulePanel.DaysIncludedEmptyError=\u542b\u307e\u308c\u308b\u65e5\u6570\u306f\u6b63\u306e\u6574\u6570\u3067\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FilesSetRulePanel.gigaBytes=\u30ae\u30ac\u30d0\u30a4\u30c8
+FilesSetRulePanel.kiloBytes=\u30ad\u30ed\u30d0\u30a4\u30c8
+FilesSetRulePanel.megaBytes=\u30e1\u30ac\u30d0\u30a4\u30c8
+FilesSetRulePanel.nameTextField.extensionExample=\u4f8b: "jpg" \u307e\u305f\u306f "jpg,jpeg,gif"
+FilesSetRulePanel.nameTextField.fullNameExample=\u4f8b: "file.exe"
+FilesSetRulePanel.NoConditionError=\u30eb\u30fc\u30eb\u3092\u4f5c\u308b\u305f\u3081\u306e\u6761\u4ef6\u304c\u5c11\u306a\u304f\u3068\u30821\u3064\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+FilesSetRulePanel.NoMimeTypeError=\u6709\u52b9\u306aMIME\u30bf\u30a4\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+FilesSetRulePanel.NoNameError=\u540d\u524d\u306f\u7a7a(\u672a\u5165\u529b)\u306b\u3067\u304d\u307e\u305b\u3093
+FilesSetRulePanel.NoPathError=\u30d1\u30b9\u306f\u7a7a(\u672a\u5165\u529b)\u306b\u3067\u304d\u307e\u305b\u3093
+FilesSetRulePanel.ZeroFileSizeError=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u306e\u6761\u4ef6\u5024\u306f0\u306b\u3067\u304d\u307e\u305b\u3093(= \u3092\u9078\u629e\u3059\u308b\u5834\u5408\u3092\u9664\u304f)\u3002
+FilesSetsManager.allFilesAndDirectories=\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u3068\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc(\u672a\u4f7f\u7528\u9818\u57df\u4ee5\u5916)
+FilesSetsManager.allFilesDirectoriesAndUnallocated=\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u3001\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3001\u672a\u4f7f\u7528\u9818\u57df
+InterestingItemsIngestModuleFactory.defaultSettingsError=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-OpenIDE-Module-Long-Description=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3002\n\n\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306e\u5b9a\u7fa9\u3092\u3082\u3068\u306b\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u77e5\u3057\u307e\u3059\u3002
-OpenIDE-Module-Name=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5
-OpenIDE-Module-Short-Description=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb\u691c\u77e5\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-OptionsCategory_Name_InterestingItemDefinitions=\u7591\u308f\u3057\u3044\u30d5\u30a1\u30a4\u30eb
-OptionsCategory_Keywords_InterestingItemDefinitions=\u7591\u308f\u3057\u3044\u30a2\u30a4\u30c6\u30e0\u5b9a\u7fa9
-FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text=\u540d\u524d\u304c{0}\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306f\u65e2\u306b\u5b58\u5728\u3057\u307e\u3059\u3002
-FilesSetRulePanel.interesting.jLabel5.text=\u898b\u3064\u3051\u305f\u3044\u30d5\u30a1\u30a4\u30eb\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-FilesSetDefsPanel.interesting.setsListLabel.text=\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8
+OpenIDE-Module-Long-Description=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u8b58\u5225\u5b50\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002\n\n \u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u3067\u5b9a\u3081\u308b\u3068\u304a\u308a\u306b\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u3092\u8b58\u5225\u3057\u307e\u3059\u3002
+OpenIDE-Module-Short-Description=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u8b58\u5225\u5b50\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002
+OpenIDE-Module-Name=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u8b58\u5225\u5b50
+OptionsCategory_Name_InterestingItemDefinitions=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb
+OptionsCategory_Keywords_InterestingItemDefinitions=InterestingItemDefinitions
+InterestingItemsIdentifierIngestModule.moduleName=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u8b58\u5225\u5b50
+InterestingItemsIdentifierIngestModule.moduleDescription=\u8208\u5473\u6df1\u3044\u9805\u76ee\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u3067\u5b9a\u3081\u308b\u3068\u304a\u308a\u306b\u8208\u5473\u6df1\u3044\u9805\u76ee\u3092\u8b58\u5225\u3057\u307e\u3059\u3002
+FilesSetPanel.interesting.title=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30eb\u30fc\u30eb
+FilesSetPanel.interesting.messages.filesSetsMustBeNamed=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u540d\u524d\u3092\u4ed8\u3051\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+FilesSetPanel.messages.filesSetsReservedName=\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u30ea\u30b6\u30fc\u30d6\u3059\u308b\u540d\u524d\u3092\u9078\u629e\u3057\u307e\u3057\u305f\u3002\u5225\u306e\u540d\u524d\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+FilesSetPanel.ignoreKnownFilesCheckbox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u7121\u8996
+FilesSetPanel.descriptionPanel.border.title=\u8aac\u660e
+FilesSetPanel.interesting.nameLabel.text=\u30bb\u30c3\u30c8\u540d:
+FilesSetPanel.ingest.nameLabel.text=\u30d5\u30a3\u30eb\u30bf\u30fc\u540d:
+FilesSetPanel.descPanel.border.title=\u8aac\u660e
+FilesSetPanel.ignoreUnallocCheckbox.toolTipText=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306a\u3069\u3001\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996\u3057\u307e\u3059\u3002\u5b9f\u884c\u901f\u5ea6\u304c\u901f\u304f\u306a\u308a\u3001\u3088\u308a\u5b8c\u5168\u3067\u306f\u306a\u3044\u7d50\u679c\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002
+FilesSetPanel.ignoreUnallocCheckbox.text=\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996
+FilesSetRulePanel.title=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u306e\u30eb\u30fc\u30eb
+FilesSetRulePanel.extensionRadioButton.text=\u62e1\u5f35\u5b50\u306e\u307f
+FilesSetRulePanel.pathRegexCheckBox.text=\u6b63\u898f\u8868\u73fe
+FilesSetRulePanel.pathTextField.text=
+FilesSetRulePanel.fullNameRadioButton.text=\u5b8c\u5168\u306a\u540d\u524d
+FilesSetRulePanel.nameRegexCheckbox.text=\u5f93\u5c5e\u6587\u5b57\u5217 / \u6b63\u898f\u8868\u73fe
+FilesSetRulePanel.ruleNameTextField.text=
+FilesSetRulePanel.nameTextField.text=
+FilesSetRulePanel.ruleNameLabel.text=\u30eb\u30fc\u30eb\u540d(\u4efb\u610f):
+FilesSetRulePanel.messages.emptyNameCondition=\u3053\u306e\u30eb\u30fc\u30eb\u306e\u540d\u524d\u30d1\u30bf\u30fc\u30f3\u3092\u6307\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+FilesSetRulePanel.messages.invalidNameRegex=\u540d\u524d\u306e\u6b63\u898f\u8868\u73fe\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093:\n\n{0}
+FilesSetRulePanel.messages.invalidCharInName=\u540d\u524d\u306b\u306f \\\u3001/\u3001 :\u3001*\u3001?\u3001\"\u3001 <\u3001> \u3092\u542b\u3081\u3089\u308c\u307e\u305b\u3093(\u6b63\u898f\u8868\u73fe\u306e\u5834\u5408\u3092\u9664\u304f)\u3002
+FilesSetRulePanel.messages.invalidCharInPath=\u30d1\u30b9\u306b\u306f \\\u3001/\u3001 :\u3001*\u3001?\u3001\"\u3001 <\u3001> \u3092\u542b\u3081\u3089\u308c\u307e\u305b\u3093(\u6b63\u898f\u8868\u73fe\u306e\u5834\u5408\u3092\u9664\u304f)\u3002
+FilesSetRulePanel.messages.invalidPathRegex=\u30d1\u30b9\u306e\u6b63\u898f\u8868\u73fe\u304c\u6709\u52b9\u3067\u306f\u3042\u308a\u307e\u305b\u3093:\n\n{0}
+FilesSetDefsPanel.doFileSetsDialog.duplicateRuleSet.text= {0} \u306e\u540d\u524d\u306e\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002
+FilesSetRulePanel.pathSeparatorInfoLabel.text=\u30d5\u30a9\u30eb\u30c0\u30fc\u304c\u89aa\u30d1\u30b9\u306b\u542b\u307e\u308c\u3066\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002'/\u2019 \u3092\u4f7f\u7528\u3057\u3066\u9023\u7d9a\u3059\u308b\u540d\u524d\u3092\u53d6\u5f97
+FilesIdentifierIngestJobSettingsPanel.border.title=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u306b\u6709\u52b9\u5316\u3059\u308b\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u30bb\u30c3\u30c8\u3092\u9078\u629e:
+FilesSetRulePanel.jLabel1.text=\u30bf\u30a4\u30d7:
+FilesSetRulePanel.interesting.jLabel5.text=\u691c\u7d22\u3057\u305f\u3044\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u3059\u308b\u60c5\u5831\u3092\u5165\u529b\u3057\u307e\u3059\u3002
+FilesSetRulePanel.ingest.jLabel5.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3092\u5b9f\u884c\u3057\u305f\u3044\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u3059\u308b\u60c5\u5831\u3092\u5165\u529b\u3057\u307e\u3059\u3002
+FilesSetRulePanel.nameCheck.text=\u540d\u524d:
+FilesSetRulePanel.pathCheck.text=\u30d5\u30a9\u30eb\u30c0\u30fc\u540d:
+FilesSetRulePanel.filesRadioButton.text=\u30d5\u30a1\u30a4\u30eb
+FilesSetRulePanel.dirsRadioButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc
+FilesSetDefsPanel.interesting.setsListLabel.text=\u30eb\u30fc\u30eb\u30bb\u30c3\u30c8:
+FilesSetDefsPanel.ingest.setsListLabel.text=\u30d5\u30a1\u30a4\u30eb\u30d5\u30a3\u30eb\u30bf\u30fc:
+FilesSetDefsPanel.interesting.jTextArea1.text=\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u4f7f\u7528\u3059\u308b\u3068\u3001\u6307\u5b9a\u3057\u305f\u6761\u4ef6\u3068\u4e00\u81f4\u3059\u308b\u30d5\u30a1\u30a4\u30eb\u3092\u691c\u7d22\u3067\u304d\u307e\u3059\u3002\u5404\u30bb\u30c3\u30c8\u306b\u3001\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u7279\u5fb4\u3068\u4e00\u81f4\u3059\u308b\u30eb\u30fc\u30eb\u30ea\u30b9\u30c8\u304c\u7528\u610f\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306f\u691c\u7d22\u5bfe\u8c61\u3068\u306a\u308b1\u3064\u306e\u30eb\u30fc\u30eb\u3068\u4e00\u81f4\u3059\u308b\u3060\u3051\u3067\u5341\u5206\u3067\u3059\u3002
+FilesSetDefsPanel.ingest.jTextArea1.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5185\u306e\u30d5\u30a1\u30a4\u30eb\u306e\u30b5\u30d6\u30bb\u30c3\u30c8\u306e\u307f\u3092\u5206\u6790\u3059\u308b\u3088\u3046\u30eb\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30eb\u30fc\u30eb\u3092\u30bb\u30c3\u30c8\u306b\u69cb\u9020\u5316\u3057\u307e\u3059\u3002\u4e00\u5ea6\u306b1\u3064\u306e\u30bb\u30c3\u30c8\u306e\u307f\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306f\u5206\u6790\u5bfe\u8c61\u3068\u306a\u308b1\u3064\u306e\u30eb\u30fc\u30eb\u3068\u4e00\u81f4\u3059\u308b\u3060\u3051\u3067\u5341\u5206\u3067\u3059\u3002
FilesSetDefsPanel.interesting.editSetButton.text=\u30bb\u30c3\u30c8\u3092\u7de8\u96c6
+FilesSetDefsPanel.ingest.editSetButton.text=\u7de8\u96c6\u30d5\u30a3\u30eb\u30bf\u30fc
FilesSetDefsPanel.interesting.newSetButton.text=\u65b0\u898f\u30bb\u30c3\u30c8
+FilesSetDefsPanel.ingest.newSetButton.text=\u65b0\u898f\u30d5\u30a3\u30eb\u30bf\u30fc
FilesSetDefsPanel.interesting.deleteSetButton.text=\u30bb\u30c3\u30c8\u3092\u524a\u9664
+FilesSetDefsPanel.ingest.deleteSetButton.text=\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u524a\u9664
+FilesSetDefsPanel.interesting.jLabel6.text=\u8a73\u7d30\u3092\u8a2d\u5b9a
+FilesSetDefsPanel.ingest.jLabel6.text=\u30d5\u30a3\u30eb\u30bf\u30fc\u8a73\u7d30
FilesSetDefsPanel.newRuleButton.text=\u65b0\u898f\u30eb\u30fc\u30eb
+FilesSetDefsPanel.jLabel8.text=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba:
+FilesSetDefsPanel.jLabel7.text=MIME\u30bf\u30a4\u30d7:
FilesSetDefsPanel.rulePathConditionRegexCheckBox.text=\u6b63\u898f\u8868\u73fe
-FilesSetDefsPanel.jLabel4.text=\u30d1\u30b9\u30d1\u30bf\u30fc\u30f3\uff1a
+FilesSetDefsPanel.jLabel4.text=\u30d1\u30b9\u306e\u5f93\u5c5e\u6587\u5b57\u5217:
FilesSetDefsPanel.jLabel1.text=\u30eb\u30fc\u30eb\u8a73\u7d30
-FilesSetDefsPanel.dirsRadioButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea
-FilesSetDefsPanel.jLabel2.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7\uff1a
+FilesSetDefsPanel.dirsRadioButton.text=\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc
+FilesSetDefsPanel.jLabel2.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7:
FilesSetDefsPanel.deleteRuleButton.text=\u30eb\u30fc\u30eb\u3092\u524a\u9664
-FilesSetDefsPanel.fileNameRegexCheckbox.text=\u6b63\u898f\u8868\u73fe
+FilesSetDefsPanel.fileNameRegexCheckbox.text=\u5f93\u5c5e\u6587\u5b57\u5217 / \u6b63\u898f\u8868\u73fe
FilesSetDefsPanel.ignoreKnownFilesCheckbox.text=\u65e2\u77e5\u30d5\u30a1\u30a4\u30eb\u3092\u7121\u8996
-FilesSetDefsPanel.fileNameRadioButton.text=\u30d5\u30a1\u30a4\u30eb\u540d
-FilesSetDefsPanel.jLabel5.text=\u6982\u8981\uff1a
-FilesSetDefsPanel.jLabel3.text=\u30cd\u30fc\u30e0\u30d1\u30bf\u30fc\u30f3
+FilesSetDefsPanel.rulePathConditionTextField.text=
+FilesSetDefsPanel.fileNameRadioButton.text=\u5b8c\u5168\u306a\u540d\u524d
+FilesSetDefsPanel.jLabel5.text=\u8aac\u660e:
+FilesSetDefsPanel.fileNameTextField.text=
+FilesSetDefsPanel.jLabel3.text=\u540d\u524d:
FilesSetDefsPanel.fileNameExtensionRadioButton.text=\u62e1\u5f35\u5b50\u306e\u307f
-FilesSetDefsPanel.rulesListLabel.text=\u30eb\u30fc\u30eb\uff1a
+FilesSetDefsPanel.rulesListLabel.text=\u30eb\u30fc\u30eb:
FilesSetDefsPanel.editRuleButton.text=\u30eb\u30fc\u30eb\u3092\u7de8\u96c6
FilesSetDefsPanel.filesRadioButton.text=\u30d5\u30a1\u30a4\u30eb
-FilesSetDefsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u4e2d\u3067\u3059\u3002\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u306f\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+FilesSetRulePanel.allRadioButton.text=\u3059\u3079\u3066
+FilesSetDefsPanel.ingoreUnallocCheckbox.text=\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996
+FilesSetDefsPanel.ingoreUnallocCheckbox.toolTipText=\u524a\u9664\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306a\u3069\u3001\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996\u3057\u307e\u3059\u3002\u5b9f\u884c\u901f\u5ea6\u304c\u901f\u304f\u306a\u308a\u3001\u3088\u308a\u5b8c\u5168\u3067\u306f\u306a\u3044\u7d50\u679c\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002
+FilesSetDefsPanel.ingestWarningLabel.text=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u9032\u884c\u4e2d\u3067\u3059\u3002\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3067\u4e00\u90e8\u306e\u8a2d\u5b9a\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+FilesSetDefsPanel.allRadioButton.text=\u3059\u3079\u3066
+FilesSetRulePanel.dateCheck.text=\u6b21\u306e\u4e2d\u3067\u4fee\u6b63\u6e08\u307f:
+FilesSetRulePanel.fileSizeCheck.text=\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba:
+FilesSetRulePanel.mimeCheck.text=MIME\u30bf\u30a4\u30d7:
+FilesSetDefsPanel.modifiedDateLabel.text=\u6b21\u306e\u4e2d\u3067\u4fee\u6b63\u6e08\u307f:
+FilesSetDefsPanel.daysIncludedTextField.text=
+FilesSetDefsPanel.daysIncludedLabel.text=\u65e5
+FilesSetRulePanel.daysIncludedLabel.text=\u65e5
diff --git a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties
index d97b6ae613..864c9c27f4 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/photoreccarver/Bundle_ja.properties
@@ -1,25 +1,30 @@
-moduleDescription.text=\u30b7\u30b9\u30c6\u30e0\u306e\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306b\u5bfe\u3057\u3066PhotoRec\u30ab\u30fc\u30d0\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
-moduleDisplayName.text=PhotoRec\u30ab\u30fc\u30d0
+# {0} - \u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u540d
+cannotCreateOutputDir.message=\u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093: {0}\u3002
+cannotRunExecutable.message=PhotoRec\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002
+missingExecutable.message=\u5b9f\u884c\u53ef\u80fd\u306aPhotoRec\u3092\u898b\u3064\u3051\u3089\u308c\u307e\u305b\u3093\u3002
+OpenIDE-Module-Name=PhotoRec Carver\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
OpenIDE-Module-Display-Category=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-OpenIDE-Module-Long-Description=PhotoRec\u30ab\u30fc\u30d0\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3002\n\n\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u5207\u308a\u51fa\u3057\u3001\u5207\u308a\u51fa\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u3059\u308b\u3081\u306b\u30b7\u30b9\u30c6\u30e0\u3078\u30d5\u30a3\u30fc\u30c9\u3057\u307e\u3059\u3002
-OpenIDE-Module-Name=PhotoRec\u30ab\u30fc\u30d0\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb
-OpenIDE-Module-Short-Description=\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u5207\u308a\u51fa\u3057\u3001\u5207\u308a\u51fa\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u51e6\u7406\u306e\u305f\u3081\u306b\u30b7\u30b9\u30c6\u30e0\u3078\u30d5\u30a3\u30fc\u30c9\u3057\u307e\u3059\u3002
-unallocatedSpaceProcessingSettingsError.message=\u300c\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u51e6\u7406\u300d\u304c\u30c1\u30a7\u30c3\u30af\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002PhotoRec\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u3092\u30ab\u30fc\u30d6\u3059\u308b\u3088\u3046\u306b\u8a2d\u8a08\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u672a\u5272\u308a\u5f53\u3066\u9818\u57df\u306e\u51e6\u7406\u3092\u6709\u52b9\u306b\u3059\u308b\u304b\u3001\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002
-missingExecutable.message=PhotoRec\u306e\u5b9f\u884c\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-cannotRunExecutable.message=PhotoRec\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-cannotCreateOutputDir.message=\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u30c7\u30a3\u30ec\u30af\u30c8\u30ea{0}\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
-PhotoRecIngestModule.processTerminated=\u30b9\u30ad\u30e3\u30f3\u306b\u304b\u3051\u308c\u308b\u6700\u5927\u306e\u6642\u9593\u304c\u904e\u304e\u305f\u306e\u3067\u3001PhotoRec\u30ab\u30fc\u30d0\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u505c\u6b62\u3057\u307e\u3057\u305f
-PhotoRecIngestModule.moduleError=PhotoRec\u30ab\u30fc\u30d0\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
-PhotoRecIngestModule.UnableToCarve=\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30ab\u30fc\u30d6\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\uff1a{0}
-PhotoRecIngestModule.NotEnoughDiskSpace=\u672a\u5272\u308a\u5f53\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u306e\u306b\u30c7\u30a3\u30b9\u30af\u30b9\u30da\u30fc\u30b9\u304c\u8db3\u308a\u307e\u305b\u3093\u3002\u30ab\u30fc\u30d3\u30f3\u30b0\u304c\u30b9\u30ad\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002
-PhotoRecIngestModule.complete.numberOfCarved=\u30ab\u30fc\u30d6\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u6570\uff1a
-PhotoRecIngestModule.complete.totalWritetime=\u30c7\u30a3\u30b9\u30af\u3078\u306e\u66f8\u304d\u8fbc\u307f\u6642\u9593\u306e\u5408\u8a08
-PhotoRecIngestModule.complete.totalParsetime=\u30d1\u30fc\u30b7\u30f3\u30b0\u6642\u9593\u306e\u5408\u8a08\uff1a
+OpenIDE-Module-Long-Description=PhotoRec Carver\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3067\u3059\u3002\n\n \u672a\u4f7f\u7528\u9818\u57df\u3092\u30ab\u30fc\u30d3\u30f3\u30b0\u3057\u3001\u7d50\u679c\u3068\u3057\u3066\u30ab\u30fc\u30d3\u30f3\u30b0\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30b7\u30b9\u30c6\u30e0\u306b\u623b\u3057\u3066\u51e6\u7406\u3057\u307e\u3059\u3002
+OpenIDE-Module-Short-Description=\u672a\u4f7f\u7528\u9818\u57df\u3092\u30ab\u30fc\u30d3\u30f3\u30b0\u3057\u3068\u3057\u3066\u30ab\u30fc\u30d3\u30f3\u30b0\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30b7\u30b9\u30c6\u30e0\u306b\u623b\u3057\u3066\u51e6\u7406\u3057\u307e\u3059\u3002
+moduleDisplayName.text=PhotoRec Carver
+moduleDescription.text=\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u5185\u306e\u672a\u4f7f\u7528\u9818\u57df\u306b\u5bfe\u3057\u3066PhotoRec Carver\u3092\u5b9f\u884c\u3057\u307e\u3059\u3002
+PhotoRecIngestModule.nonHostnameUNCPathUsed=PhotoRec\u306f\u3001IP\u30a2\u30c9\u30ec\u30b9\u3092\u542b\u3080UNC\u30d1\u30b9\u3092\u4f7f\u3063\u3066\u64cd\u4f5c\u3067\u304d\u307e\u305b\u3093\u3002
+PhotoRecIngestModule.PermissionsNotSufficient=\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u306b\u5341\u5206\u306a\u6a29\u9650\u304c\u3042\u308a\u307e\u305b\u3093
+PhotoRecIngestModule.PermissionsNotSufficientSeeReference=Autopsy\u30d8\u30eb\u30d7\u306e\u300c\u5171\u6709\u30c9\u30e9\u30a4\u30d6\u8a8d\u8a3c\u300d\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+PhotoRecIngestModule.processTerminated=\u30b9\u30ad\u30e3\u30f3\u6642\u306e\u6700\u5927\u8a31\u5bb9\u5b9f\u884c\u56de\u6570\u3092\u8d85\u3048\u305f\u305f\u3081\u3001PhotoRec Carver\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u7d42\u4e86\u3057\u307e\u3057\u305f
+PhotoRecIngestModule.moduleError=PhotoRec Carver\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+PhotoRecIngestModule.UnableToCarve=\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30ab\u30fc\u30d3\u30f3\u30b0\u3067\u304d\u307e\u305b\u3093: {0}
+PhotoRecIngestModule.NotEnoughDiskSpace=\u672a\u4f7f\u7528\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u30c7\u30a3\u30b9\u30af\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u30ab\u30fc\u30d3\u30f3\u30b0\u304c\u30b9\u30ad\u30c3\u30d7\u3055\u308c\u307e\u3057\u305f\u3002
+PhotoRecIngestModule.complete.numberOfCarved=\u30ab\u30fc\u30d3\u30f3\u30b0\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u6570:
+PhotoRecIngestModule.complete.totalWritetime=\u30c7\u30a3\u30b9\u30af\u3078\u306e\u66f8\u304d\u8fbc\u307f\u306b\u8981\u3059\u308b\u5408\u8a08\u6642\u9593:
+PhotoRecIngestModule.complete.totalParsetime=\u5408\u8a08\u89e3\u6790\u6642\u9593:
PhotoRecIngestModule.complete.photoRecResults=PhotoRec\u7d50\u679c
-PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg={0}\u3092{1}\u3067\u51e6\u7406\u3059\u308b\u969b\u306bPhotoRec\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u672a\u5272\u308a\u5f53\u3066\u30b9\u30da\u30fc\u30b9\u3092\u30d7\u30e9\u30a4\u30de\u30ea\u30fc\u30c7\u30a3\u30b9\u30af\u306b\u4fdd\u5b58\u3059\u308b\u306e\u306b\u30b9\u30da\u30fc\u30b9\u304c\u8db3\u308a\u307e\u305b\u3093\u3002
-PhotoRecIngestModule.cancelledByUser=PhotoRec\u304c\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u308a\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002
-PhotoRecIngestModule.error.exitValue=PhotoRec\u304c\u30a8\u30e9\u30fc\u3092\u51fa\u3057\u307e\u3057\u305f\u3002Exit\u30d0\u30ea\u30e5\u30fc\uff1d{1}\u3092\u30b9\u30ad\u30e3\u30f3\u4e2d\u306b{0}
-PhotoRecIngestModule.error.msg=PhotoRec\u30ab\u30fc\u30d0\u3067{0}\u3092\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
-PhotoRecIngestModule.complete.numberOfErrors=\u30ab\u30fc\u30d3\u30f3\u30b0\u4e2d\u306e\u30a8\u30e9\u30fc\u6570\uff1a
-PhotoRecIngestModule.PermissionsNotSufficient=\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3\u306e\u30a2\u30af\u30bb\u30b9\u304c\u4e0d\u5341\u5206\u3067\u3059
-PhotoRecIngestModule.PermissionsNotSufficientSeeReference=Autopsy\u30d8\u30eb\u30d7\u3067\u300c\u5171\u6709\u30c9\u30e9\u30a4\u30d6\u8a8d\u8a3c\u300d\u3092\u3054\u89a7\u304f\u3060\u3055\u3044\u3002
\ No newline at end of file
+PhotoRecIngestModule.NotEnoughDiskSpace.detail.msg={1} \u3092\u4f7f\u3063\u3066 {0} \u3092\u51e6\u7406\u4e2d\u306bPhotoRec\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u30021\u6b21\u30c7\u30a3\u30b9\u30af\u306b\u672a\u4f7f\u7528\u30d5\u30a1\u30a4\u30eb\u3092\u4fdd\u5b58\u3059\u308b\u305f\u3081\u306e\u5341\u5206\u306a\u9818\u57df\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+PhotoRecIngestModule.cancelledByUser=PhotoRec\u304c\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u3063\u3066\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f\u3002
+PhotoRecIngestModule.error.exitValue={1} \u3092\u30b9\u30ad\u30e3\u30f3\u4e2d\u306bPhotoRec Carver\u304c \u9593\u9055\u3063\u305f\u7d42\u4e86\u5024 \= {0} \u3092\u8fd4\u3057\u307e\u3057\u305f
+PhotoRecIngestModule.error.msg=PhotoRec Carver\u3067 {0} \u3092\u51e6\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+PhotoRecIngestModule.complete.numberOfErrors=\u30ab\u30fc\u30d3\u30f3\u30b0\u4e2d\u306e\u30a8\u30e9\u30fc\u6570:
+PhotoRecCarverIngestJobSettingsPanel.detectionSettingsLabel.text=PhotoRec\u8a2d\u5b9a
+PhotoRecCarverIngestJobSettingsPanel.keepCorruptedFilesCheckbox.text=\u7834\u640d\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u7dad\u6301
+unallocatedSpaceProcessingSettingsError.message=\u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30d5\u30a3\u30eb\u30bf\u30fc\u304c\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996\u3057\u307e\u3059\u3002\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u306f\u672a\u4f7f\u7528\u9818\u57df\u3092\u30ab\u30fc\u30d3\u30f3\u30b0\u3057\u307e\u3059\u3002\u672a\u4f7f\u7528\u9818\u57df\u3092\u7121\u8996\u3057\u306a\u3044\u304b\u3001\u3053\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u7121\u52b9\u5316\u3057\u306a\u3044\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+unsupportedOS.message=PhotoRec\u30e2\u30b8\u30e5\u30fc\u30eb\u306fWindows\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306e\u307f\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u3059\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/modules/plaso/PlasoIngestModule.java b/Core/src/org/sleuthkit/autopsy/modules/plaso/PlasoIngestModule.java
index c9fad6c1bc..d359332f84 100755
--- a/Core/src/org/sleuthkit/autopsy/modules/plaso/PlasoIngestModule.java
+++ b/Core/src/org/sleuthkit/autopsy/modules/plaso/PlasoIngestModule.java
@@ -85,7 +85,7 @@ public class PlasoIngestModule implements DataSourceIngestModule {
private static final int LOG2TIMELINE_WORKERS = 2;
private static final long TERMINATION_CHECK_INTERVAL = 5;
private static final TimeUnit TERMINATION_CHECK_INTERVAL_UNITS = TimeUnit.SECONDS;
-
+
private File log2TimeLineExecutable;
private File psortExecutable;
@@ -103,8 +103,7 @@ public class PlasoIngestModule implements DataSourceIngestModule {
@NbBundle.Messages({
"PlasoIngestModule.executable.not.found=Plaso Executable Not Found.",
- "PlasoIngestModule.requires.windows=Plaso module requires windows.",
- "PlasoIngestModule.dataSource.not.an.image=Datasource is not an Image."})
+ "PlasoIngestModule.requires.windows=Plaso module requires windows."})
@Override
public void startUp(IngestJobContext context) throws IngestModuleException {
this.context = context;
@@ -121,11 +120,6 @@ public class PlasoIngestModule implements DataSourceIngestModule {
throw new IngestModuleException(Bundle.PlasoIngestModule_executable_not_found(), exception);
}
- Content dataSource = context.getDataSource();
- if (!(dataSource instanceof Image)) {
- throw new IngestModuleException(Bundle.PlasoIngestModule_dataSource_not_an_image());
- }
- image = (Image) dataSource;
}
@NbBundle.Messages({
@@ -138,80 +132,90 @@ public class PlasoIngestModule implements DataSourceIngestModule {
"PlasoIngestModule.psort.cancelled=psort run was canceled",
"PlasoIngestModule.bad.imageFile=Cannot find image file name and path",
"PlasoIngestModule.completed=Plaso Processing Completed",
- "PlasoIngestModule.has.run=Plaso Plugin has been run.",
- "PlasoIngestModule.psort.fail=Plaso returned an error when sorting events. Results are not complete."})
+ "PlasoIngestModule.has.run=Plaso",
+ "PlasoIngestModule.psort.fail=Plaso returned an error when sorting events. Results are not complete.",
+ "PlasoIngestModule.dataSource.not.an.image=Skipping non-disk image datasource"})
@Override
public ProcessResult process(Content dataSource, DataSourceIngestModuleProgress statusHelper) {
- assert dataSource.equals(image);
- statusHelper.switchToDeterminate(100);
- currentCase = Case.getCurrentCase();
- fileManager = currentCase.getServices().getFileManager();
+ if (!(dataSource instanceof Image)) {
+ IngestMessage message = IngestMessage.createMessage(IngestMessage.MessageType.DATA,
+ Bundle.PlasoIngestModule_has_run(),
+ Bundle.PlasoIngestModule_dataSource_not_an_image());
+ IngestServices.getInstance().postMessage(message);
+ return ProcessResult.OK;
+ } else {
+ image = (Image) dataSource;
- String currentTime = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss z", Locale.US).format(System.currentTimeMillis());//NON-NLS
- Path moduleOutputPath = Paths.get(currentCase.getModuleDirectory(), PLASO, currentTime);
- try {
- Files.createDirectories(moduleOutputPath);
- } catch (IOException ex) {
- logger.log(Level.SEVERE, "Error creating Plaso module output directory.", ex); //NON-NLS
- return ProcessResult.ERROR;
- }
+ statusHelper.switchToDeterminate(100);
+ currentCase = Case.getCurrentCase();
+ fileManager = currentCase.getServices().getFileManager();
- // Run log2timeline
- logger.log(Level.INFO, "Starting Plaso Run.");//NON-NLS
- statusHelper.progress(Bundle.PlasoIngestModule_starting_log2timeline(), 0);
- ProcessBuilder log2TimeLineCommand = buildLog2TimeLineCommand(moduleOutputPath, image);
- try {
- Process log2TimeLineProcess = log2TimeLineCommand.start();
- try (BufferedReader log2TimeLineOutpout = new BufferedReader(new InputStreamReader(log2TimeLineProcess.getInputStream()))) {
- L2TStatusProcessor statusReader = new L2TStatusProcessor(log2TimeLineOutpout, statusHelper, moduleOutputPath);
- new Thread(statusReader, "log2timeline status reader").start(); //NON-NLS
- ExecUtil.waitForTermination(LOG2TIMELINE_EXECUTABLE, log2TimeLineProcess, TERMINATION_CHECK_INTERVAL, TERMINATION_CHECK_INTERVAL_UNITS, new DataSourceIngestModuleProcessTerminator(context));
- statusReader.cancel();
- }
-
- if (context.dataSourceIngestIsCancelled()) {
- logger.log(Level.INFO, "Log2timeline run was canceled"); //NON-NLS
- return ProcessResult.OK;
- }
- if (Files.notExists(moduleOutputPath.resolve(PLASO))) {
- logger.log(Level.WARNING, "Error running log2timeline: there was no storage file."); //NON-NLS
+ String currentTime = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss z", Locale.US).format(System.currentTimeMillis());//NON-NLS
+ Path moduleOutputPath = Paths.get(currentCase.getModuleDirectory(), PLASO, currentTime);
+ try {
+ Files.createDirectories(moduleOutputPath);
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, "Error creating Plaso module output directory.", ex); //NON-NLS
return ProcessResult.ERROR;
}
- // sort the output
- statusHelper.progress(Bundle.PlasoIngestModule_running_psort(), 33);
- ProcessBuilder psortCommand = buildPsortCommand(moduleOutputPath);
- int result = ExecUtil.execute(psortCommand, new DataSourceIngestModuleProcessTerminator(context));
- if (result != 0) {
- logger.log(Level.SEVERE, String.format("Error running Psort, error code returned %d", result)); //NON-NLS
- MessageNotifyUtil.Notify.error(MODULE_NAME, Bundle.PlasoIngestModule_psort_fail());
- return ProcessResult.ERROR;
- }
+ // Run log2timeline
+ logger.log(Level.INFO, "Starting Plaso Run.");//NON-NLS
+ statusHelper.progress(Bundle.PlasoIngestModule_starting_log2timeline(), 0);
+ ProcessBuilder log2TimeLineCommand = buildLog2TimeLineCommand(moduleOutputPath, image);
+ try {
+ Process log2TimeLineProcess = log2TimeLineCommand.start();
+ try (BufferedReader log2TimeLineOutpout = new BufferedReader(new InputStreamReader(log2TimeLineProcess.getInputStream()))) {
+ L2TStatusProcessor statusReader = new L2TStatusProcessor(log2TimeLineOutpout, statusHelper, moduleOutputPath);
+ new Thread(statusReader, "log2timeline status reader").start(); //NON-NLS
+ ExecUtil.waitForTermination(LOG2TIMELINE_EXECUTABLE, log2TimeLineProcess, TERMINATION_CHECK_INTERVAL, TERMINATION_CHECK_INTERVAL_UNITS, new DataSourceIngestModuleProcessTerminator(context));
+ statusReader.cancel();
+ }
- if (context.dataSourceIngestIsCancelled()) {
- logger.log(Level.INFO, "psort run was canceled"); //NON-NLS
- return ProcessResult.OK;
- }
- Path plasoFile = moduleOutputPath.resolve("plasodb.db3"); //NON-NLS
- if (Files.notExists(plasoFile)) {
- logger.log(Level.SEVERE, "Error running Psort: there was no sqlite db file."); //NON-NLS
+ if (context.dataSourceIngestIsCancelled()) {
+ logger.log(Level.INFO, "Log2timeline run was canceled"); //NON-NLS
+ return ProcessResult.OK;
+ }
+ if (Files.notExists(moduleOutputPath.resolve(PLASO))) {
+ logger.log(Level.WARNING, "Error running log2timeline: there was no storage file."); //NON-NLS
+ return ProcessResult.ERROR;
+ }
+
+ // sort the output
+ statusHelper.progress(Bundle.PlasoIngestModule_running_psort(), 33);
+ ProcessBuilder psortCommand = buildPsortCommand(moduleOutputPath);
+ int result = ExecUtil.execute(psortCommand, new DataSourceIngestModuleProcessTerminator(context));
+ if (result != 0) {
+ logger.log(Level.SEVERE, String.format("Error running Psort, error code returned %d", result)); //NON-NLS
+ MessageNotifyUtil.Notify.error(MODULE_NAME, Bundle.PlasoIngestModule_psort_fail());
+ return ProcessResult.ERROR;
+ }
+
+ if (context.dataSourceIngestIsCancelled()) {
+ logger.log(Level.INFO, "psort run was canceled"); //NON-NLS
+ return ProcessResult.OK;
+ }
+ Path plasoFile = moduleOutputPath.resolve("plasodb.db3"); //NON-NLS
+ if (Files.notExists(plasoFile)) {
+ logger.log(Level.SEVERE, "Error running Psort: there was no sqlite db file."); //NON-NLS
+ return ProcessResult.ERROR;
+ }
+
+ // parse the output and make artifacts
+ createPlasoArtifacts(plasoFile.toString(), statusHelper);
+
+ } catch (IOException ex) {
+ logger.log(Level.SEVERE, "Error running Plaso.", ex);//NON-NLS
return ProcessResult.ERROR;
}
- // parse the output and make artifacts
- createPlasoArtifacts(plasoFile.toString(), statusHelper);
-
- } catch (IOException ex) {
- logger.log(Level.SEVERE, "Error running Plaso.", ex);//NON-NLS
- return ProcessResult.ERROR;
+ IngestMessage message = IngestMessage.createMessage(IngestMessage.MessageType.DATA,
+ Bundle.PlasoIngestModule_has_run(),
+ Bundle.PlasoIngestModule_completed());
+ IngestServices.getInstance().postMessage(message);
+ return ProcessResult.OK;
}
-
- IngestMessage message = IngestMessage.createMessage(IngestMessage.MessageType.DATA,
- Bundle.PlasoIngestModule_has_run(),
- Bundle.PlasoIngestModule_completed());
- IngestServices.getInstance().postMessage(message);
- return ProcessResult.OK;
}
private ProcessBuilder buildLog2TimeLineCommand(Path moduleOutputPath, Image image) {
@@ -240,8 +244,10 @@ public class PlasoIngestModule implements DataSourceIngestModule {
static private ProcessBuilder buildProcessWithRunAsInvoker(String... commandLine) {
ProcessBuilder processBuilder = new ProcessBuilder(commandLine);
- /* Add an environment variable to force log2timeline/psort to run with
- * the same permissions Autopsy uses. */
+ /*
+ * Add an environment variable to force log2timeline/psort to run with
+ * the same permissions Autopsy uses.
+ */
processBuilder.environment().put("__COMPAT_LAYER", "RunAsInvoker"); //NON-NLS
return processBuilder;
}
@@ -277,31 +283,30 @@ public class PlasoIngestModule implements DataSourceIngestModule {
"PlasoIngestModule.create.artifacts.cancelled=Cancelled Plaso Artifact Creation ",
"# {0} - file that events are from",
"PlasoIngestModule.artifact.progress=Adding events to case: {0}",
- "PlasoIngestModule.info.empty.database=Plaso database was empty.",
- })
+ "PlasoIngestModule.info.empty.database=Plaso database was empty.",})
private void createPlasoArtifacts(String plasoDb, DataSourceIngestModuleProgress statusHelper) {
Blackboard blackboard = currentCase.getSleuthkitCase().getBlackboard();
String sqlStatement = "SELECT substr(filename,1) AS filename, "
- + " strftime('%s', datetime) AS epoch_date, "
- + " description, "
- + " source, "
- + " type, "
- + " sourcetype "
- + " FROM log2timeline "
- + " WHERE source NOT IN ('FILE', "
- + " 'WEBHIST') " // bad dates and duplicates with what we have.
- + " AND sourcetype NOT IN ('UNKNOWN', "
- + " 'PE Import Time');"; // lots of bad dates //NON-NLS
+ + " strftime('%s', datetime) AS epoch_date, "
+ + " description, "
+ + " source, "
+ + " type, "
+ + " sourcetype "
+ + " FROM log2timeline "
+ + " WHERE source NOT IN ('FILE', "
+ + " 'WEBHIST') " // bad dates and duplicates with what we have.
+ + " AND sourcetype NOT IN ('UNKNOWN', "
+ + " 'PE Import Time');"; // lots of bad dates //NON-NLS
try (SQLiteDBConnect tempdbconnect = new SQLiteDBConnect("org.sqlite.JDBC", "jdbc:sqlite:" + plasoDb); //NON-NLS
ResultSet resultSet = tempdbconnect.executeQry(sqlStatement)) {
-
+
boolean dbHasData = false;
-
+
while (resultSet.next()) {
dbHasData = true;
-
+
if (context.dataSourceIngestIsCancelled()) {
logger.log(Level.INFO, "Cancelled Plaso Artifact Creation."); //NON-NLS
return;
@@ -314,20 +319,20 @@ public class PlasoIngestModule implements DataSourceIngestModule {
logger.log(Level.INFO, "File {0} from Plaso output not found in case. Associating it with the data source instead.", currentFileName);//NON-NLS
resolvedFile = image;
}
-
+
String description = resultSet.getString("description");
TimelineEventType eventType = findEventSubtype(currentFileName, resultSet);
-
+
// If the description is empty use the event type display name
// as the description.
- if ( description == null || description.isEmpty() ) {
+ if (description == null || description.isEmpty()) {
if (eventType != TimelineEventType.OTHER) {
description = eventType.getDisplayName();
} else {
continue;
}
}
-
+
Collection bbattributes = Arrays.asList(
new BlackboardAttribute(
TSK_DATETIME, MODULE_NAME,
@@ -338,14 +343,16 @@ public class PlasoIngestModule implements DataSourceIngestModule {
new BlackboardAttribute(
TSK_TL_EVENT_TYPE, MODULE_NAME,
eventType.getTypeID()));
-
+
try {
BlackboardArtifact bbart = resolvedFile.newArtifact(TSK_TL_EVENT);
bbart.addAttributes(bbattributes);
try {
- /* Post the artifact which will index the artifact for
+ /*
+ * Post the artifact which will index the artifact for
* keyword search, and fire an event to notify UI of
- * this new artifact */
+ * this new artifact
+ */
blackboard.postArtifact(bbart, MODULE_NAME);
} catch (BlackboardException ex) {
logger.log(Level.SEVERE, "Error Posting Artifact.", ex);//NON-NLS
@@ -354,12 +361,12 @@ public class PlasoIngestModule implements DataSourceIngestModule {
logger.log(Level.SEVERE, "Exception Adding Artifact.", ex);//NON-NLS
}
}
-
+
// Check if there is data the db
- if( !dbHasData ) {
+ if (!dbHasData) {
logger.log(Level.INFO, String.format("PlasoDB was empty: %s", plasoDb));
MessageNotifyUtil.Notify.info(MODULE_NAME, Bundle.PlasoIngestModule_info_empty_database());
- }
+ }
} catch (SQLException ex) {
logger.log(Level.SEVERE, "Error while trying to read into a sqlite db.", ex);//NON-NLS
}
@@ -377,8 +384,8 @@ public class PlasoIngestModule implements DataSourceIngestModule {
// check the cached file
//TODO: would we reduce 'cache misses' if we retrieved the events sorted by file? Is that overhead worth it?
if (previousFile != null
- && previousFile.getName().equalsIgnoreCase(fileName)
- && previousFile.getParentPath().equalsIgnoreCase(filePath)) {
+ && previousFile.getName().equalsIgnoreCase(fileName)
+ && previousFile.getParentPath().equalsIgnoreCase(filePath)) {
return previousFile;
}
@@ -416,7 +423,7 @@ public class PlasoIngestModule implements DataSourceIngestModule {
switch (row.getString("source")) {
case "WEBHIST": //These shouldn't actually be present, but keeping the logic just in case...
if (fileName.toLowerCase().contains(COOKIE)
- || row.getString("type").toLowerCase().contains(COOKIE)) {//NON-NLS
+ || row.getString("type").toLowerCase().contains(COOKIE)) {//NON-NLS
return TimelineEventType.WEB_COOKIE;
} else {
diff --git a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties
index 17ff042186..5b6cba0d5f 100644
--- a/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/modules/vmextractor/Bundle_ja.properties
@@ -1,11 +1,15 @@
-VMExtractorIngestModuleFactory.moduleDisplayName=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30A8\u30AF\u30B9\u30C8\u30E9\u30AF\u30BF\u30FC
-VMExtractorIngestModuleFactory.moduleDescription=\u4EEE\u60F3\u30DE\u30B7\u30F3\u306E\u30D5\u30A1\u30A4\u30EB\u3092\u62BD\u51FA\u3057\u3001\u30C7\u30FC\u30BF\u30BD\u30FC\u30B9\u3068\u3057\u3066\u30B1\u30FC\u30B9\u306B\u8FFD\u52A0\u3057\u307E\u3059\u3002
-VMExtractorIngestModule.cannotCreateOutputDir.message=\u30A2\u30A6\u30C8\u30D7\u30C3\u30C8\u30C7\u30A3\u30EC\u30AF\u30C8\u30EA\uFF1A{0}\u3092\u4F5C\u6210\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-VMExtractorIngestModule.addedVirtualMachineImage.message=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30A4\u30E1\u30FC\u30B8{0}\u3092\u8FFD\u52A0
-VMExtractorIngestModule.searchingImage.message=\u30A4\u30E1\u30FC\u30B8\u306B\u4EEE\u60F3\u30DE\u30B7\u30F3\u30D5\u30A1\u30A4\u30EB\u304C\u306A\u3044\u304B\u691C\u7D22\u4E2D
-VMExtractorIngestModule.exportingToDisk.message=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30D5\u30A1\u30A4\u30EB\u3092\u30C7\u30A3\u30B9\u30AF\u306B\u30A8\u30AF\u30B9\u30DD\u30FC\u30C8\u4E2D
-VMExtractorIngestModule.queuingIngestJobs.message=\u62BD\u51FA\u3055\u308C\u305F\u4EEE\u60F3\u30DE\u30B7\u30F3\u306E\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u30B8\u30E7\u30D6\u3092\u30AD\u30E5\u30FC\u30A4\u30F3\u30B0
-VMExtractorIngestModule.msgNotify.failedExtractVM.title.txt=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30D5\u30A1\u30A4\u30EB\u3092\u62BD\u51FA\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-VMExtractorIngestModule.msgNotify.failedExtractVM.msg.txt=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30D5\u30A1\u30A4\u30EB{0}\u3092\u30C7\u30A3\u30B9\u30AF\u306B\u66F8\u304D\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-VMExtractorIngestModule.msgNotify.failedIngestVM.title.txt=\u4EEE\u60F3\u30DE\u30B7\u30F3\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-VMExtractorIngestModule.msgNotify.failedIngestVM.msg.txt=\u4EEE\u60F3\u30DE\u30B7\u30F3\u30D5\u30A1\u30A4\u30EB{0}\u3092\u30A4\u30F3\u30B8\u30A7\u30B9\u30C8\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002
\ No newline at end of file
+# {0} - \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u540d
+deviceIdQueryErrMsg=\u30c7\u30d0\u30a4\u30b9ID\u306e\u306a\u3044\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9 {0}
+# {0} - \u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u540d
+VMExtractorIngestModule.cannotCreateOutputDir.message=\u51fa\u529b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093: {0}\u3002
+VMExtractorIngestModule.noOpenCase.errMsg=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+VMExtractorIngestModuleFactory.moduleDisplayName=\u4eee\u60f3\u30de\u30b7\u30f3\u62bd\u51fa\u30c4\u30fc\u30eb
+VMExtractorIngestModuleFactory.moduleDescription=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa\u3057\u3001\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3068\u3057\u3066\u30b1\u30fc\u30b9\u306b\u8ffd\u52a0\u3057\u307e\u3059\u3002
+VMExtractorIngestModule.addedVirtualMachineImage.message=\u8ffd\u52a0\u3055\u308c\u305f\u4eee\u60f3\u30de\u30b7\u30f3\u30a4\u30e1\u30fc\u30b8 {0}
+VMExtractorIngestModule.searchingImage.message=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb\u306e\u30a4\u30e1\u30fc\u30b8\u3092\u691c\u7d22\u4e2d\u3067\u3059
+VMExtractorIngestModule.exportingToDisk.message=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u30c7\u30a3\u30b9\u30af\u306b\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u4e2d\u3067\u3059
+VMExtractorIngestModule.queuingIngestJobs.message=\u62bd\u51fa\u3055\u308c\u305f\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b8\u30e7\u30d6\u3092\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0\u4e2d\u3067\u3059
+VMExtractorIngestModule.msgNotify.failedExtractVM.title.txt=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+VMExtractorIngestModule.msgNotify.failedExtractVM.msg.txt=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb {0} \u3092\u30c7\u30a3\u30b9\u30af\u306b\u66f8\u304d\u8fbc\u3081\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+VMExtractorIngestModule.msgNotify.failedIngestVM.title.txt=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb\u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+VMExtractorIngestModule.msgNotify.failedIngestVM.msg.txt=\u4eee\u60f3\u30de\u30b7\u30f3\u30d5\u30a1\u30a4\u30eb {0} \u3092\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
diff --git a/Core/src/org/sleuthkit/autopsy/progress/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/progress/Bundle_ja.properties
new file mode 100644
index 0000000000..d56b88e754
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/progress/Bundle_ja.properties
@@ -0,0 +1,6 @@
+# \u3053\u306e\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u30d7\u30ed\u30d1\u30c6\u30a3] \u3067 [\u30e9\u30a4\u30bb\u30f3\u30b9\u30d8\u30c3\u30c0\u30fc] \u3092\u9078\u629e\u3057\u307e\u3059\u3002
+# \u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u5909\u66f4\u3059\u308b\u306b\u306f\u3001[\u30c4\u30fc\u30eb | \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8] \u3092\u9078\u629e\u3057\u3001
+# \u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u958b\u304d\u307e\u3059\u3002
+
+ProgressPanel.progressMessage.text=\u30e1\u30c3\u30bb\u30fc\u30b8
+TaskCanceller.progress.cancellingMessage=\u53d6\u308a\u6d88\u3057\u4e2d\u3067\u3059...
diff --git a/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties
index c407b6cf35..fdbd43efd7 100644
--- a/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/python/Bundle_ja.properties
@@ -1,2 +1,2 @@
-JythonModuleLoader.errorMessages.failedToOpenModule={0}\u304C\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u8A73\u7D30\u306F\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-JythonModuleLoader.errorMessages.failedToLoadModule={0}. {1}. \u304C\u958B\u3051\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u8A73\u7D30\u306F\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
\ No newline at end of file
+JythonModuleLoader.errorMessages.failedToOpenModule={0}\u304c\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u8a73\u7d30\u306f\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+JythonModuleLoader.errorMessages.failedToLoadModule={0}. {1}. \u304c\u958b\u3051\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u8a73\u7d30\u306f\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
index f666513e92..6dde31add8 100644
--- a/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/Bundle_ja.properties
@@ -1,8 +1,334 @@
OpenIDE-Module-Name=\u30ec\u30dd\u30fc\u30c8
-DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u3067\u8a2d\u5b9a\u3055\u308c\u307e\u3059\u3002
-ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
-ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30fb\u30c7\u30b8\u30bf\u30eb\u30fb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u306b\u3088\u308a\u63d0\u4f9b - www.sleuthkit.org
-ReportProgressPanel.pathLabel.text=\u30d1\u30b9\u30e9\u30d9\u30eb
-ReportProgressPanel.reportLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e9\u30d9\u30eb
-ReportProgressPanel.statusMessageLabel.text=\u30d7\u30ed\u30bb\u30b7\u30f3\u30b0\u30e9\u30d9\u30eb
+CTL_ReportWizardAction=\u30ec\u30dd\u30fc\u30c8\u3092\u5b9f\u884c
+ArtifactSelectionDialog.titleLabel.text=\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u5bfe\u8c61\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u9078\u629e:
+ArtifactSelectionDialog.okButton.text=OK
+PortableCaseInterestingItemsListPanel.error.errorLoadingTags=\u8208\u5473\u6df1\u3044\u9805\u76ee\u30bb\u30c3\u30c8\u540d\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseInterestingItemsListPanel.error.errorTitle=\u30b1\u30fc\u30b9\u306e\u8208\u5473\u6df1\u3044\u9805\u76ee\u30bb\u30c3\u30c8\u540d\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseInterestingItemsListPanel.error.noOpenCase=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093
+PortableCaseReportModule.compressCase.canceled=\u30e6\u30fc\u30b6\u30fc\u306b\u3088\u3063\u3066\u5727\u7e2e\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3057\u305f
+PortableCaseReportModule.compressCase.errorCompressingCase=\u30b1\u30fc\u30b9\u306e\u5727\u7e2e\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - \u4e00\u6642\u30d5\u30a9\u30eb\u30c0\u30fc\u30d1\u30b9
+PortableCaseReportModule.compressCase.errorCreatingTempFolder=\u4e00\u6642\u30d5\u30a9\u30eb\u30c0\u30fc {0} \u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f
+PortableCaseReportModule.compressCase.errorFinding7zip=7-Zip\u5b9f\u884c\u53ef\u80fd\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f
+# {0} - \u30d5\u30a1\u30a4\u30eb\u540d
+PortableCaseReportModule.copyContentToPortableCase.copyingFile={0} \u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\u4e2d\u3067\u3059
+# {0} - \u30b1\u30fc\u30b9\u30d5\u30a9\u30eb\u30c0\u30fc
+PortableCaseReportModule.createCase.caseDirExists=\u30b1\u30fc\u30b9\u30d5\u30a9\u30eb\u30c0\u30fc {0} \u304c\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059
+PortableCaseReportModule.createCase.errorCreatingCase=\u30b1\u30fc\u30b9\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - \u30d5\u30a9\u30eb\u30c0\u30fc
+PortableCaseReportModule.createCase.errorCreatingFolder=Error creating \u30d5\u30a9\u30eb\u30c0\u30fc {0} \u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.createCase.errorStoringMaxIds=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9ID\u306e\u6700\u5927\u6570\u3092\u4fdd\u5b58\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.caseClosed=\u73fe\u5728\u306e\u30b1\u30fc\u30b9\u304c\u9589\u3058\u3089\u308c\u307e\u3057\u305f\u3002
+PortableCaseReportModule.generateReport.compressingCase=\u30b1\u30fc\u30b9\u3092\u5727\u7e2e\u4e2d\u3067\u3059...
+# {0} - \u30bf\u30b0\u540d
+PortableCaseReportModule.generateReport.copyingArtifacts={0} \u3068\u3057\u3066\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u30b3\u30d4\u30fc\u4e2d\u3067\u3059...
+# {0} - \u30bf\u30b0\u540d
+PortableCaseReportModule.generateReport.copyingFiles={0} \u3068\u3057\u3066\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc\u4e2d\u3067\u3059...
+PortableCaseReportModule.generateReport.copyingTags=\u30bf\u30b0\u3092\u30b3\u30d4\u30fc\u4e2d\u3067\u3059...
+PortableCaseReportModule.generateReport.creatingCase=\u30dd\u30fc\u30bf\u30d6\u30eb\u30b1\u30fc\u30b9\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4f5c\u6210\u4e2d\u3067\u3059...
+PortableCaseReportModule.generateReport.errorCopyingArtifacts=\u30bf\u30b0\u4ed8\u304d\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u30b3\u30d4\u30fc\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.errorCopyingFiles=\u30bf\u30b0\u4ed8\u304d\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.errorCopyingInterestingFiles=\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u306e\u30b3\u30d4\u30fc\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.errorCopyingInterestingResults=\u8208\u5473\u6df1\u3044\u7d50\u679c\u306e\u30b3\u30d4\u30fc\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.errorCopyingTags=\u30bf\u30b0\u306e\u30b3\u30d4\u30fc\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+# {0} - \u5c5e\u6027\u30bf\u30a4\u30d7\u540d
+PortableCaseReportModule.generateReport.errorLookingUpAttrType=\u5c5e\u6027\u30bf\u30a4\u30d7 {0} \u306e\u691c\u7d22\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.interestingItemError=\u8208\u5473\u6df1\u3044\u9805\u76ee\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseReportModule.generateReport.noContentToCopy=\u30b3\u30d4\u30fc\u3059\u308b\u8208\u5473\u6df1\u3044\u30d5\u30a1\u30a4\u30eb\u3001\u7d50\u679c\u3001\u307e\u305f\u306f\u30bf\u30b0\u4ed8\u304d\u9805\u76ee\u304c\u3042\u308a\u307e\u305b\u3093
+# {0} - \u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u30fc
+PortableCaseReportModule.generateReport.outputDirDoesNotExist=\u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u30fc {0} \u304c\u5b58\u5728\u3057\u307e\u305b\u3093
+# {0} - \u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u30fc
+PortableCaseReportModule.generateReport.outputDirIsNotDir=\u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u30fc {0} \u306f\u30d5\u30a9\u30eb\u30c0\u30fc\u3067\u306f\u3042\u308a\u307e\u305b\u3093
+PortableCaseReportModule.generateReport.verifying=\u9078\u629e\u3057\u305f\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u691c\u8a3c\u4e2d\u3067\u3059...
+PortableCaseReportModule.getDescription.description=\u9078\u629e\u3057\u305f\u9805\u76ee\u3092\u7c21\u5358\u306b\u5171\u6709\u53ef\u80fd\u306a\u65b0\u898f\u30b7\u30f3\u30b0\u30eb\u30e6\u30fc\u30b6\u30fc\u30b1\u30fc\u30b9\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059
+PortableCaseReportModule.getName.name=\u30dd\u30fc\u30bf\u30d6\u30eb\u30b1\u30fc\u30b9
+PortableCaseTagsListPanel.error.errorLoadingTags=\u30bf\u30b0\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseTagsListPanel.error.errorTitle=\u30b1\u30fc\u30b9\u306e\u30bf\u30b0\u540d\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+PortableCaseTagsListPanel.error.noOpenCase=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093
+ReportExcel.exceptionMessage.dataTooLarge=\u5024\u304c\u9577\u3059\u304e\u3066Excel\u306e\u30bb\u30eb\u5185\u306b\u53ce\u307e\u308a\u307e\u305b\u3093\u3002
+ReportExcel.exceptionMessage.errorText=Excel\u306e\u30bb\u30eb\u5185\u3067\u30c7\u30fc\u30bf\u3092\u8868\u793a\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+ReportExcel.writeSummary.caseName=\u30b1\u30fc\u30b9\u540d:
+ReportExcel.writeSummary.caseNotes=\u30b1\u30fc\u30b9\u5099\u8003:
+ReportExcel.writeSummary.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7:
+ReportExcel.writeSummary.examiner=\u8abf\u67fb\u54e1:
+ReportExcel.writeSummary.numImages=\u30a4\u30e1\u30fc\u30b8\u6570:
+ReportExcel.writeSummary.sheetName=\u30b5\u30de\u30ea\u30fc
+ReportExcel.writeSummary.summary=\u30b5\u30de\u30ea\u30fc
+ReportGenerator.artTableColHdr.comment=\u30b3\u30e1\u30f3\u30c8
+ReportGenerator.errList.noOpenCase=\u958b\u3044\u3066\u3044\u308b\u30b1\u30fc\u30b9\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+ReportGenerator.tagTable.header.userName=\u30e6\u30fc\u30b6\u30fc\u540d
+ReportHTML.writeSum.case=\u30b1\u30fc\u30b9:
+ReportHTML.writeSum.caseNotes=\u5099\u8003:
+ReportHTML.writeSum.caseNumber=\u30b1\u30fc\u30b9\u756a\u53f7:
+ReportHTML.writeSum.caseNumImages=\u30a4\u30e1\u30fc\u30b8\u6570:
+ReportHTML.writeSum.examiner=\u8abf\u67fb\u54e1:
+ReportVisualPanel1.reportModulesLabel.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb:
+ReportVisualPanel1.invalidModuleWarning=\u7121\u52b9\u306a\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb ({0}) \u306b\u906d\u9047\u3057\u307e\u3057\u305f
+DefaultReportConfigurationPanel.infoLabel.text=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u306e\u753b\u9762\u3067\u69cb\u6210\u3055\u308c\u307e\u3059\u3002
+ReportVisualPanel2.dataLabel.text=\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u5bfe\u8c61\u306e\u30c7\u30fc\u30bf\u3092\u9078\u629e:
+ReportVisualPanel2.deselectAllButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+ReportVisualPanel2.selectAllButton.text=\u3059\u3079\u3066\u9078\u629e
+ReportVisualPanel2.advancedButton.text=\u30c7\u30fc\u30bf\u30bf\u30a4\u30d7
+ArtifactSelectionDialog.deselectAllButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+ArtifactSelectionDialog.selectAllButton.text=\u3059\u3079\u3066\u9078\u629e
+ReportGenerationPanel.closeButton.text=\u9589\u3058\u308b
+ReportProgressPanel.reportLabel.text=reportLabel
+ReportProgressPanel.pathLabel.text=pathLabel
ReportProgressPanel.separationLabel.text=:
+ReportProgressPanel.statusMessageLabel.text=processingLabel
+ReportGenerationPanel.titleLabel.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u9032\u6357\u72b6\u6cc1
+ReportVisualPanel2.taggedResultsRadioButton.text=\u30bf\u30b0\u4ed8\u304d\u7d50\u679c
+ReportVisualPanel2.allResultsRadioButton.text=\u3059\u3079\u3066\u306e\u7d50\u679c
+ReportWizardFileOptionsVisualPanel.selectAllButton.text=\u3059\u3079\u3066\u9078\u629e
+ReportWizardFileOptionsVisualPanel.deselectAllButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+ReportWizardFileOptionsVisualPanel.jLabel1.text=\u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u306b\u542b\u3081\u308b\u9805\u76ee\u3092\u9078\u629e:
+ArtifactSelectionDialog.dlgTitle.text=\u9ad8\u5ea6\u306a\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u9078\u629e
+FileReportDataTypes.filename.text=\u540d\u524d
+FileReportDataTypes.fileExt.text=\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50
+FileReportDataTypes.fileType.text=\u30d5\u30a1\u30a4\u30eb\u30bf\u30a4\u30d7
+FileReportDataTypes.isDel.text=\u524a\u9664\u3055\u308c\u3066\u3044\u307e\u3059
+FileReportDataTypes.aTime.text=\u6700\u7d42\u30a2\u30af\u30bb\u30b9\u65e5
+FileReportDataTypes.crTime.text=\u4f5c\u6210\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+FileReportDataTypes.mTime.text=\u6700\u7d42\u66f4\u65b0\u65e5
+FileReportDataTypes.size.text=\u30b5\u30a4\u30ba
+FileReportDataTypes.address.text=\u30a2\u30c9\u30ec\u30b9
+FileReportDataTypes.hash.text=\u30cf\u30c3\u30b7\u30e5\u5024
+FileReportDataTypes.knownStatus.text=\u65e2\u77e5\u306e\u30b9\u30c6\u30fc\u30bf\u30b9
+FileReportDataTypes.perms.text=\u30a2\u30af\u30bb\u30b9\u6a29
+FileReportDataTypes.path.text=\u5b8c\u5168\u306a\u30d1\u30b9
+FileReportText.getName.text=\u30d5\u30a1\u30a4\u30eb - \u30c6\u30ad\u30b9\u30c8
+FileReportText.getDesc.text=\u30b1\u30fc\u30b9\u306e\u500b\u3005\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u95a2\u3059\u308b\u60c5\u5831\u3092\u542b\u3080\u533a\u5207\u308a\u30c6\u30ad\u30b9\u30c8\u30d5\u30a1\u30a4\u30eb\u3067\u3059\u3002
+ReportBodyFile.progress.querying=\u30d5\u30a1\u30a4\u30eb\u3092\u30af\u30a8\u30ea\u4e2d\u3067\u3059...
+ReportBodyFile.ingestWarning.text=\u8b66\u544a: \u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u306e\u5b8c\u4e86\u524d\u306b\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\\uff01
+ReportBodyFile.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059...
+ReportBodyFile.progress.processing={0} \u3092\u73fe\u5728\u51e6\u7406\u4e2d\u3067\u3059...
+ReportBodyFile.getName.text=TSK Body\u30d5\u30a1\u30a4\u30eb
+ReportBodyFile.getDesc.text=\u3059\u3079\u3066\u306e\u30d5\u30a1\u30a4\u30eb\u306b\u5bfe\u5fdc\u3057\u305f\u3001MAC\u56de\u6570\u3092\u6301\u3064Body\u30d5\u30a1\u30a4\u30eb\u5f62\u5f0f\u3067\u3059\u3002\u3053\u306e\u5f62\u5f0f\u306f\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30d3\u30e5\u30fc\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
+ReportBodyFile.getFilePath.text=BodyFile.txt
+ReportKML.progress.querying=\u30d5\u30a1\u30a4\u30eb\u3092\u30af\u30a8\u30ea\u4e2d\u3067\u3059...
+ReportKML.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059...
+ReportKML.getName.text=Google Earth KML
+ReportKML.getDesc.text=\u95a2\u9023\u30d5\u30a1\u30a4\u30eb\u306e\u5ea7\u6a19\u3092\u6301\u3064KML\u5f62\u5f0f\u30ec\u30dd\u30fc\u30c8\u3067\u3059\u3002\u3053\u306e\u5f62\u5f0f\u306fGoogle Earth\u30d3\u30e5\u30fc\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
+ReportKML.getFilePath.text=ReportKML.kml
+ReportBranding.defaultReportTitle.text=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30ec\u30dd\u30fc\u30c8
+ReportBranding.defaultReportFooter.text=Autopsy\u30aa\u30fc\u30d7\u30f3\u30bd\u30fc\u30b9\u30c7\u30b8\u30bf\u30eb\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u4f7f\u7528 - www.sleuthkit.org
+ReportExcel.numAartifacts.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u6570:
+ReportExcel.getName.text=Excel\u30ec\u30dd\u30fc\u30c8
+ReportExcel.getDesc.text=\u7d50\u679c\u3068\u30bf\u30b0\u4ed8\u304d\u9805\u76ee\u306b\u95a2\u3059\u308bExcel (XLS)\u5f62\u5f0f\u306e\u30ec\u30dd\u30fc\u30c8\u3067\u3059\u3002
+ReportExcel.sheetName.text=\u30b5\u30de\u30ea\u30fc
+ReportExcel.cellVal.summary=\u30b5\u30de\u30ea\u30fc
+ReportExcel.cellVal.caseName=\u30b1\u30fc\u30b9\u540d:
+ReportExcel.cellVal.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7:
+ReportExcel.cellVal.examiner=\u8abf\u67fb\u54e1:
+ReportExcel.cellVal.numImages=\u30a4\u30e1\u30fc\u30b8\u6570:
+ReportGenerationPanel.confDlg.sureToClose.msg=\u30c0\u30a4\u30a2\u30ed\u30b0\u3092\u9589\u3058\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?\n\u3059\u3079\u3066\u306e\u30ec\u30dd\u30fc\u30c8\u304c\u53d6\u308a\u6d88\u3055\u308c\u307e\u3059\u3002
+ReportGenerationPanel.confDlg.title.closing=\u9589\u3058\u3066\u3044\u307e\u3059
+ReportGenerationPanel.confDlg.cancelReport.msg=\u30ec\u30dd\u30fc\u30c8\u3092\u53d6\u308a\u6d88\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
+ReportGenerator.displayProgress.title.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u9032\u6357\u72b6\u6cc1...
+ReportGenerator.progress.queryingDb.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30af\u30a8\u30ea\u4e2d\u3067\u3059...
+ReportGenerator.progress.processingFile.text={0} \u3092\u73fe\u5728\u51e6\u7406\u4e2d\u3067\u3059...
+ReportGenerator.artifactTable.taggedResults.text=\u6b21\u306e\u3044\u305a\u308c\u304b\u3067\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u7d50\u679c\u3092\u542b\u307f\u307e\u3059:
+ReportGenerator.progress.processing={0} \u3092\u73fe\u5728\u51e6\u7406\u4e2d\u3067\u3059...\u3002
+ReportGenerator.msgShow.skippingArtType.title=\u30ec\u30dd\u30fc\u30c8\u5185\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7 {0} \u306e\u30b9\u30ad\u30c3\u30d7\u4e2d\u3067\u3059
+ReportGenerator.msgShow.skippingArtType.msg=\u4e0d\u660e\u306a\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u5bfe\u8c61\u306e\u5217
+ReportGenerator.makeContTagTab.taggedFiles.msg=\u6b21\u306e\u3044\u305a\u308c\u304b\u3067\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u542b\u307f\u307e\u3059:
+ReportGenerator.makeBbArtTagTab.taggedRes.msg=\u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u6b21\u3067\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u7d50\u679c\u306e\u307f\u3092\u542b\u307f\u307e\u3059:
+ReportGenerator.tagTable.header.resultType=\u7d50\u679c\u30bf\u30a4\u30d7
+ReportGenerator.tagTable.header.tag=\u30bf\u30b0
+ReportGenerator.tagTable.header.comment=\u30b3\u30e1\u30f3\u30c8
+ReportGenerator.tagTable.header.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+ReportGenerator.progress.createdThumb.text=\u30b5\u30e0\u30cd\u30a4\u30eb\u306e\u4f5c\u6210\u4e2d\u3067\u3059...
+ReportGenerator.htmlOutput.header.file=\u30d5\u30a1\u30a4\u30eb
+ReportGenerator.htmlOutput.header.tag=\u30bf\u30b0
+ReportGenerator.htmlOutput.header.comment=\u30b3\u30e1\u30f3\u30c8
+ReportGenerator.htmlOutput.header.timeModified=MFT\u5909\u66f4\u6642\u523b
+ReportGenerator.htmlOutput.header.timeChanged=\u5909\u66f4\u3055\u308c\u305f\u523b\u523b
+ReportGenerator.htmlOutput.header.timeAccessed=\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u6642\u523b
+ReportGenerator.htmlOutput.header.timeCreated=\u4f5c\u6210\u3055\u308c\u305f\u6642\u523b
+ReportGenerator.htmlOutput.header.size=\u30b5\u30a4\u30ba(\u30d0\u30a4\u30c8)
+ReportGenerator.htmlOutput.header.hash=\u30cf\u30c3\u30b7\u30e5
+ReportGenerator.thumbnailTable.name=\u30bf\u30b0\u4ed8\u304d\u30a4\u30e1\u30fc\u30b8
+ReportGenerator.thumbnailTable.desc=\u30bf\u30b0\u4ed8\u304d\u306e\u30d5\u30a1\u30a4\u30eb\u3068\u7d50\u679c\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a4\u30e1\u30fc\u30b8\u306e\u30b5\u30e0\u30cd\u30a4\u30eb\u3092\u542b\u307f\u307e\u3059\u3002
+ReportGenerator.writeKwHits.userSrchs=\u30e6\u30fc\u30b6\u30fc\u691c\u7d22
+ReportGenerator.progress.processing={0} ({1}) \u3092\u73fe\u5728\u51e6\u7406\u4e2d\u3067\u3059...
+ReportGenerator.artTableColHdr.url=URL
+ReportGenerator.artTableColHdr.title=\u30bf\u30a4\u30c8\u30eb
+ReportGenerator.artTableColHdr.dateCreated=\u4f5c\u6210\u3055\u308c\u305f\u30c7\u30fc\u30bf
+ReportGenerator.artTableColHdr.program=\u30d7\u30ed\u30b0\u30e9\u30e0
+ReportGenerator.artTableColHdr.urlDomainDecoded=URL\u30c9\u30e1\u30a4\u30f3
+ReportGenerator.artTableColHdr.srcFile=\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb
+ReportGenerator.artTableColHdr.dateTime=\u65e5\u6642
+ReportGenerator.artTableColHdr.name=\u540d\u524d
+ReportGenerator.artTableColHdr.value=\u5024
+ReportGenerator.artTableColHdr.dateAccessed=\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u30c7\u30fc\u30bf
+ReportGenerator.artTableColHdr.referrer=\u30ea\u30d5\u30a1\u30e9\u30fc
+ReportGenerator.artTableColHdr.dest=\u5b9b\u5148
+ReportGenerator.artTableColHdr.sourceUrl=\u30bd\u30fc\u30b9URL
+ReportGenerator.artTableColHdr.path=\u30d1\u30b9
+ReportGenerator.artTableColHdr.progName=\u30d7\u30ed\u30b0\u30e9\u30e0\u540d
+ReportGenerator.artTableColHdr.dateTime=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5\u6642
+ReportGenerator.artTableColHdr.preview=\u30d7\u30ec\u30d3\u30e5\u30fc
+ReportGenerator.artTableColHdr.file=\u30d5\u30a1\u30a4\u30eb
+ReportGenerator.artTableColHdr.size=\u30b5\u30a4\u30ba
+ReportGenerator.artTableColHdr.deviceId=\u30c7\u30d0\u30a4\u30b9ID
+ReportGenerator.artTableColHdr.text=\u30c6\u30ad\u30b9\u30c8
+ReportGenerator.artTableColHdr.domain=\u30c9\u30e1\u30a4\u30f3
+ReportGenerator.artTableColHdr.dateTaken=\u53d6\u5f97\u65e5
+ReportGenerator.artTableColHdr.devManufacturer=\u30c7\u30d0\u30a4\u30b9\u30e1\u30fc\u30ab\u30fc
+ReportGenerator.artTableColHdr.devMake=\u30c7\u30d0\u30a4\u30b9\u30e1\u30fc\u30ab\u30fc
+ReportGenerator.artTableColHdr.devModel=\u30c7\u30d0\u30a4\u30b9\u578b\u5f0f
+ReportGenerator.artTableColHdr.latitude=\u7def\u5ea6
+ReportGenerator.artTableColHdr.longitude=\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.latitudeStart=\u958b\u59cb\u7def\u5ea6
+ReportGenerator.artTableColHdr.longitudeStart=\u958b\u59cb\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.latitudeEnd=\u7d42\u4e86\u7def\u5ea6
+ReportGenerator.artTableColHdr.longitudeEnd=\u7d42\u4e86\u7d4c\u5ea6
+ReportGenerator.artTableColHdr.associatedArtifact=\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8
+ReportGenerator.artTableColHdr.count=\u30ab\u30a6\u30f3\u30c8
+ReportGenerator.artTableColHdr.personName=\u4eba\u540d
+ReportGenerator.artTableColHdr.phoneNumber=\u96fb\u8a71\u756a\u53f7
+ReportGenerator.artTableColHdr.phoneNumHome=\u96fb\u8a71\u756a\u53f7(\u81ea\u5b85)
+ReportGenerator.artTableColHdr.phoneNumOffice=\u96fb\u8a71\u756a\u53f7(\u4f1a\u793e)
+ReportGenerator.artTableColHdr.phoneNumMobile=\u96fb\u8a71\u756a\u53f7(\u643a\u5e2f)
+ReportGenerator.artTableColHdr.email=\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.msgType=\u30e1\u30c3\u30bb\u30fc\u30b8\u30bf\u30a4\u30d7
+ReportGenerator.artTableColHdr.direction=\u65b9\u5411
+ReportGenerator.artTableColHdr.readStatus=\u8aad\u307f\u53d6\u308a\u30b9\u30c6\u30fc\u30bf\u30b9
+ReportGenerator.artTableColHdr.fromPhoneNum=\u767a\u4fe1\u5143\u96fb\u8a71\u756a\u53f7
+ReportGenerator.artTableColHdr.fromEmail=\u9001\u4fe1\u5143\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.toPhoneNum=\u76f8\u624b\u5148\u96fb\u8a71\u756a\u53f7
+ReportGenerator.artTableColHdr.toEmail=\u9001\u4fe1\u5148\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.subject=\u4ef6\u540d
+ReportGenerator.artTableColHdr.tskEmailTo=To\u306e\u5b9b\u5148\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.tskEmailTo=CC\u306e\u5b9b\u5148\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.tskEmailTo=BCC\u306e\u5b9b\u5148\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.tskEmailTo=\u5dee\u51fa\u4eba\u306e\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.tskMsgId=\u30e1\u30c3\u30bb\u30fc\u30b8ID
+ReportGenerator.artTableColHdr.tskDateTimeRcvd=\u53d7\u4fe1\u65e5
+ReportGenerator.artTableColHdr.tskDateTimeSent=\u9001\u4fe1\u65e5
+ReportGenerator.artTableColHdr.tskSubject=\u4ef6\u540d
+ReportGenerator.artTableColHdr.tskSetName=\u30bb\u30c3\u30c8\u540d
+ReportGenerator.artTableColHdr.tskInterestingFilesCategory=\u30eb\u30fc\u30eb
+ReportGenerator.artTableColHdr.tskGpsRouteCategory=\u30ab\u30c6\u30b4\u30ea\u30fc
+ReportGenerator.artTableColHdr.tskPath=\u30d1\u30b9
+ReportGenerator.artTableColHdr.calendarEntryType=\u30ab\u30ec\u30f3\u30c0\u30fc\u5165\u529b\u30bf\u30a4\u30d7
+ReportGenerator.artTableColHdr.description=\u8aac\u660e
+ReportGenerator.artTableColHdr.startDateTime=\u958b\u59cb\u65e5\u6642
+ReportGenerator.artTableColHdr.endDateTime=\u7d42\u4e86\u65e5\u6642
+ReportGenerator.artTableColHdr.location=\u5834\u6240
+ReportGenerator.artTableColHdr.shortCut=\u30b7\u30e7\u30fc\u30c8\u30ab\u30c3\u30c8
+ReportGenerator.artTableColHdr.deviceName=\u30c7\u30d0\u30a4\u30b9\u540d
+ReportGenerator.artTableColHdr.deviceAddress=\u30c7\u30d0\u30a4\u30b9\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.altitude=\u6a19\u9ad8
+ReportGenerator.artTableColHdr.locationAddress=\u6240\u5728\u5730\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.category=\u30ab\u30c6\u30b4\u30ea\u30fc
+ReportGenerator.artTableColHdr.userId=\u30e6\u30fc\u30b6\u30fcID
+ReportGenerator.artTableColHdr.userName=\u30e6\u30fc\u30b6\u30fc\u540d
+ReportGenerator.artTableColHdr.password=\u30d1\u30b9\u30ef\u30fc\u30c9
+ReportGenerator.artTableColHdr.appName=\u30a2\u30d7\u30ea\u540d
+ReportGenerator.artTableColHdr.appPath=\u30a2\u30d7\u30ea\u30d1\u30b9
+ReportGenerator.artTableColHdr.replytoAddress=\u8fd4\u4fe1\u5148\u30a2\u30c9\u30ec\u30b9
+ReportGenerator.artTableColHdr.mailServer=\u30e1\u30fc\u30eb\u30b5\u30fc\u30d0\u30fc
+ReportGenerator.artTableColHdr.tags=\u30bf\u30b0
+ReportGenerator.artTableColHdr.localPath=\u30ed\u30fc\u30ab\u30eb\u30d1\u30b9
+ReportGenerator.artTableColHdr.remotePath=\u30ea\u30e2\u30fc\u30c8\u30d1\u30b9
+ReportGenerator.errors.reportErrorTitle=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+ReportGenerator.errors.reportErrorText=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f:
+ReportHTML.addThumbRows.dataType.title=\u30bf\u30b0\u4ed8\u3051\u30a4\u30e1\u30fc\u30b8 - {0}
+ReportHTML.addThumbRows.dataType.msg=\u30a4\u30e1\u30fc\u30b8\u3092\u542b\u3080\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u7d50\u679c\u3068\u30b3\u30f3\u30c6\u30f3\u30c4
+ReportHTML.thumbLink.tags=\u30bf\u30b0:
+ReportHTML.getName.text=HTML\u30ec\u30dd\u30fc\u30c8
+ReportHTML.getDesc.text=\u7d50\u679c\u3068\u30bf\u30b0\u4ed8\u304d\u9805\u76ee\u306b\u95a2\u3059\u308bHTML\u5f62\u5f0f\u306e\u30ec\u30dd\u30fc\u30c8\u3067\u3059\u3002
+ReportHTML.writeIndex.title=\u30b1\u30fc\u30b9 {0} \u306e
+ReportHTML.writeIndex.noFrames.msg=\u304a\u4f7f\u3044\u306e\u30d6\u30e9\u30a6\u30b6\u30fc\u306f\u5f53\u793e\u306e\u30d5\u30ec\u30fc\u30e0\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3068\u4e92\u63db\u6027\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+ReportHTML.writeIndex.noFrames.seeNav=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u30ea\u30f3\u30af\u306f\u3001the navigation page \u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ReportHTML.writeIndex.seeSum=and \u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc\u306e \u30b5\u30de\u30ea\u30fc\u30da\u30fc\u30b8\u3067\u3059\u3002
+ReportHTML.writeNav.title=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
+ReportHTML.writeNav.h1=\u30ec\u30dd\u30fc\u30c8\u30ca\u30d3\u30b2\u30fc\u30b7\u30e7\u30f3
+ReportHTML.writeNav.summary=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
+ReportHTML.writeSum.title=\u30b1\u30fc\u30b9\u30b5\u30de\u30ea\u30fc
+ReportHTML.writeSum.warningMsg=\u8b66\u544a: \u3053\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30b5\u30fc\u30d3\u30b9\u306e\u5b8c\u4e86\u524d\u306b\u5b9f\u884c\u3055\u308c\u307e\u3057\u305f\!
+#
+# autopsy/test/scripts/regression.py._html_report_diff()\u306f reportGenOn.text\u3001caseName\u3001caseNum\u3001
+# examiner\u3092\u6b63\u898f\u8868\u73fe\u30b7\u30b0\u30cd\u30c1\u30e3\u30fc\u3068\u3057\u3066\u4f7f\u7528\u3057\u3001report.html\u3068summary.html\u3092\u30b9\u30ad\u30c3\u30d7\u3057\u307e\u3059\u3002
+#
+ReportHTML.writeSum.reportGenOn.text={0} \u3067\u751f\u6210\u3055\u308c\u305fHTML\u30ec\u30dd\u30fc\u30c8
+ReportHTML.writeSum.imageInfoHeading=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831:
+ReportHTML.writeSum.softwareInfoHeading=\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u60c5\u5831:
+ReportHTML.writeSum.ingestHistoryHeading=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5c65\u6b74:
+ReportHTML.writeSum.modulesEnabledHeading=\u6709\u52b9\u5316\u3055\u308c\u305f\u30e2\u30b8\u30e5\u30fc\u30eb:
+ReportHTML.writeSum.autopsyVersion=Autopsy\u30d0\u30fc\u30b8\u30e7\u30f3:
+ReportHTML.writeSum.timezone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3:
+ReportHTML.writeSum.path=\u30d1\u30b9:
+ReportProgressPanel.progress.queuing=\u30ad\u30e5\u30fc\u30a4\u30f3\u30b0\u4e2d\u3067\u3059...
+ReportProgressPanel.initPathLabel.noFile=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u304c\u3042\u308a\u307e\u305b\u3093
+ReportProgressPanel.start.cancelButton.text=\u53d6\u308a\u6d88\u3057
+ReportProgressPanel.start.progress.text=\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u59cb\u4e2d\u3067\u3059...
+ReportProgressPanel.complete.processLbl.text=\u5b8c\u4e86
+ReportProgressPanel.complete.processLb2.text=\u30a8\u30e9\u30fc\u3067\u5b8c\u4e86\u3057\u307e\u3057\u305f
+ReportProgressPanel.complete.cancelButton.text=\u5b8c\u4e86
+ReportProgressPanel.cancel.cancelButton.toolTipText=\u53d6\u308a\u6d88\u3057\u6e08\u307f
+ReportProgressPanel.cancel.procLbl.text=\u53d6\u308a\u6d88\u3057\u6e08\u307f
+ReportVisualPanel1.getName.text=\u30ec\u30dd\u30fc\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u9078\u629e\u3057\u3066\u69cb\u6210
+ReportVisualPanel2.getName.text=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u3092\u69cb\u6210
+ReportWizardAction.actionName.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210
+ReportWizardAction.reportWiz.title=\u30ec\u30dd\u30fc\u30c8\u751f\u6210
+ReportWizardAction.toolBarButton.text=\u30ec\u30dd\u30fc\u30c8\u751f\u6210
+ReportWizardFileOptionsPanel.finishButton.text=\u5b8c\u4e86
+ReportWizardFileOptionsVisualPanel.getName.text=\u30d5\u30a1\u30a4\u30eb\u30ec\u30dd\u30fc\u30c8\u3092\u69cb\u6210
+ReportWizardPanel1.nextButton.text=\u6b21\u3078 >
+ReportWizardPanel1.finishButton.text=\u5b8c\u4e86
+ReportWizardPanel2.finishButton.text=\u5b8c\u4e86
+ReportWizardPanel2.nextButton.text=\u6b21\u3078 >
+ReportBodyFile.generateReport.srcModuleName.text=TSK Body\u30d5\u30a1\u30a4\u30eb
+ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
+ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
+ReportKML.genReport.srcModuleName.text=\u5730\u7406\u7a7a\u9593\u30c7\u30fc\u30bf
+ReportKML.genReport.reportName=KML\u30ec\u30dd\u30fc\u30c8
+ReportGenerator.artTableColHdr.extension.text=\u62e1\u5f35\u5b50
+ReportGenerator.artTableColHdr.mimeType.text=MIME\u30bf\u30a4\u30d7
+ReportGenerator.artTableColHdr.processorArchitecture.text=\u30d7\u30ed\u30bb\u30c3\u30b5\u30fc\u30a2\u30fc\u30ad\u30c6\u30af\u30c1\u30e3
+ReportGenerator.artTableColHdr.osName.text=\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0\u540d
+ReportGenerator.artTableColHdr.osInstallDate.text=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u65e5
+ReportGenerator.errList.failedMakeRptFolder=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30ec\u30dd\u30fc\u30c8\u3092\u751f\u6210\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+ReportGenerator.notifyErr.errsDuringRptGen=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f:
+ReportGenerator.errList.failedGetContentTags=\u30b3\u30f3\u30c6\u30f3\u30c4\u30bf\u30b0\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedGetBBArtifactTags=\u30d6\u30e9\u30c3\u30af\u30dc\u30fc\u30c9\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30b0\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.errGetContentFromBBArtifact=\u30ec\u30dd\u30fc\u30c8\u4f5c\u6210\u5bfe\u8c61\u306e\u30d6\u30e9\u30c3\u30af\u30dc\u30fc\u30c9\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+ReportGenerator.errList.failedGetBBAttribs=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30d6\u30e9\u30c3\u30af\u30dc\u30fc\u30c9\u5c5e\u6027\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedGetBBArtifacts=\u30ec\u30dd\u30fc\u30c8\u751f\u6210\u4e2d\u306b\u30d6\u30e9\u30c3\u30af\u30dc\u30fc\u30c9\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryKWLists=\u30ad\u30fc\u30ef\u30fc\u30c9\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedGetAbstractFileByID=ID\u5225\u306b\u62bd\u8c61\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryKWs=\u30ad\u30fc\u30ef\u30fc\u30c9\u3092\u30af\u30a8\u30ea\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryHashsetLists=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30ea\u30b9\u30c8\u3092\u30af\u30a8\u30ea\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedGetAbstractFileFromID=ID\u304b\u3089\u62bd\u8c61\u30d5\u30a1\u30a4\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.failedQueryHashsetHits=\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30d2\u30c3\u30c8\u3092\u30af\u30a8\u30ea\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+ReportGenerator.errList.coreExceptionWhileGenRptRow=\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30ec\u30dd\u30fc\u30c8\u306e\u5217\u30c7\u30fc\u30bf\u306e\u751f\u6210\u4e2d\u306b\u30b3\u30a2\u4f8b\u5916\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+ReportKML.latLongStartPoint={0};{1};;{2} (\u958b\u59cb)\n
+ReportKML.latLongEndPoint={0};{1};;{2} (\u7d42\u4e86)\n
+ReportGenerationPanel.cancelButton.actionCommand=\u53d6\u308a\u6d88\u3057
+ReportGenerationPanel.cancelButton.text=\u53d6\u308a\u6d88\u3057
+ReportHTMLConfigurationPanel.headerTextField.text=
+ReportHTMLConfigurationPanel.footerTextField.text=
+ReportHTMLConfigurationPanel.headerLabel.text=\u30d8\u30c3\u30c0\u30fc:
+ReportHTMLConfigurationPanel.footerLabel.text=\u30d5\u30c3\u30bf\u30fc:
+CreatePortableCasePanel.selectAllButton.text=\u3059\u3079\u3066\u9078\u629e
+CreatePortableCasePanel.deselectAllButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+CreatePortableCasePanel.outputFolderTextField.text=jTextField1
+CreatePortableCasePanel.chooseOutputFolderButton.text=\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u9078\u629e
+CreatePortableCasePanel.jLabel1.text=\u6b21\u3068\u3057\u3066\u30bf\u30b0\u4ed8\u3051\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u30a8\u30af\u30b9\u30dd\u30fc\u30c8:
+CreatePortableCasePanel.jLabel2.text=\u51fa\u529b\u30d5\u30a9\u30eb\u30c0\u30fc\u3092\u9078\u629e:
+CreatePortableCasePanel.errorLabel.text_1=Windows\u306e\u307f
+ReportWizardPortableCaseOptionsVisualPanel.errorLabel.text=Windows\u306e\u307f
+ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.text=\u30b1\u30fc\u30b9\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u5185\u306b\u30d1\u30c3\u30b1\u30fc\u30b8\u5316:
+PortableCaseTagsListPanel.deselectButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+PortableCaseTagsListPanel.selectButton.text=\u3059\u3079\u3066\u9078\u629e
+PortableCaseInterestingItemsListPanel.selectButton.text=\u3059\u3079\u3066\u9078\u629e
+PortableCaseInterestingItemsListPanel.deselectButton.text=\u3059\u3079\u3066\u9078\u629e\u89e3\u9664
+ReportFileTextConfigurationPanel.tabDelimitedButton.text=\u533a\u5207\u308a\u30bf\u30d6
+ReportFileTextConfigurationPanel.commaDelimitedButton.text=\u533a\u5207\u308a\u30ab\u30f3\u30de
+PortableCaseTagsListPanel.descLabel.text=\u6b21\u306e\u30bf\u30b0\u3092\u542b\u3080:
+PortableCaseInterestingItemsListPanel.descLabel.text=\u3053\u308c\u3089\u306e\u30bb\u30c3\u30c8\u306e\u8208\u5473\u6df1\u3044\u9805\u76ee\u3092\u542b\u3080:
+ReportWizardPortableCaseOptionsVisualPanel.compressCheckbox.toolTipText=
+ReportWizardPortableCaseOptionsVisualPanel.getName.title=\u30dd\u30fc\u30bf\u30d6\u30eb\u30b1\u30fc\u30b9\u8a2d\u5b9a\u3092\u9078\u629e
+TableReportGenerator.StatusColumn.Header=\u30ec\u30d3\u30e5\u30fc\u30b9\u30c6\u30fc\u30bf\u30b9
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ArtifactSelectionDialog.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ArtifactSelectionDialog.java
index 8fef4083ef..78ae4479a5 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ArtifactSelectionDialog.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ArtifactSelectionDialog.java
@@ -77,8 +77,16 @@ class ArtifactSelectionDialog extends javax.swing.JDialog {
BlackboardArtifact.ARTIFACT_TYPE.TSK_GEN_INFO.getDisplayName()));
doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(),
- BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review
-
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getDisplayName()));
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getDisplayName()));
+
artifactTypes = Case.getCurrentCaseThrows().getSleuthkitCase().getArtifactTypesInUse();
artifactTypes.removeAll(doNotReport);
Collections.sort(artifactTypes, new Comparator() {
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
old mode 100755
new mode 100644
index c911dd381d..5077b78fd1
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/Bundle_ja.properties
@@ -183,4 +183,4 @@ FileReportDataTypes.address.text=\u30a2\u30c9\u30ec\u30b9
FileReportDataTypes.hash.text=\u30cf\u30c3\u30b7\u30e5\u5024
FileReportDataTypes.knownStatus.text=\u65e2\u77e5\u30b9\u30c6\u30fc\u30bf\u30b9
FileReportDataTypes.perms.text=\u30d1\u30fc\u30df\u30c3\u30b7\u30e7\u30f3
-FileReportDataTypes.path.text=\u30d5\u30eb\u30d1\u30b9
\ No newline at end of file
+FileReportDataTypes.path.text=\u30d5\u30eb\u30d1\u30b9
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java
index 7a69681322..e804f0384f 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportVisualPanel2.java
@@ -206,7 +206,14 @@ final class ReportVisualPanel2 extends JPanel {
doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review
-
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getDisplayName()));
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getDisplayName()));
// get artifact types that exist in the current case
artifacts = openCase.getSleuthkitCase().getArtifactTypesInUse();
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
index e336538d4d..634f779988 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/ReportWizardAction.java
@@ -58,7 +58,7 @@ import org.sleuthkit.autopsy.coreutils.Logger;
@ActionReferences(value = {
@ActionReference(path = "Menu/Tools", position = 301, separatorAfter = 399)
,
- @ActionReference(path = "Toolbars/Case", position = 105)})
+ @ActionReference(path = "Toolbars/Case", position = 106)})
public final class ReportWizardAction extends CallableSystemAction implements Presenter.Toolbar, ActionListener {
private static final Logger logger = Logger.getLogger(ReportWizardAction.class.getName());
diff --git a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
index 264ed461c4..3d4355f233 100644
--- a/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
+++ b/Core/src/org/sleuthkit/autopsy/report/infrastructure/TableReportGenerator.java
@@ -108,6 +108,14 @@ class TableReportGenerator {
doNotReport.add(new BlackboardArtifact.Type(BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getTypeID(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getLabel(),
BlackboardArtifact.ARTIFACT_TYPE.TSK_TOOL_OUTPUT.getDisplayName())); // output is too unstructured for table review
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_ASSOCIATED_OBJECT.getDisplayName()));
+ doNotReport.add(new BlackboardArtifact.Type(
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getTypeID(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getLabel(),
+ BlackboardArtifact.ARTIFACT_TYPE.TSK_TL_EVENT.getDisplayName()));
Case.getCurrentCaseThrows().getSleuthkitCase().getArtifactTypes().forEach(artifactTypes::add);
artifactTypes.removeAll(doNotReport);
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/bodyfile/Bundle_ja.properties
old mode 100755
new mode 100644
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/excel/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/excel/Bundle_ja.properties
old mode 100755
new mode 100644
index 0c990dc024..fd9a57fb2a
--- a/Core/src/org/sleuthkit/autopsy/report/modules/excel/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/excel/Bundle_ja.properties
@@ -7,4 +7,4 @@ ReportExcel.cellVal.caseName=\u30b1\u30fc\u30b9\u540d\uff1a
ReportExcel.cellVal.caseNum=\u30b1\u30fc\u30b9\u756a\u53f7\uff1a
ReportExcel.cellVal.examiner=\u8abf\u67fb\u62c5\u5f53\u8005\uff1a
ReportExcel.cellVal.numImages=\u30a4\u30e1\u30fc\u30b8\u6570\uff1a
-ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
\ No newline at end of file
+ReportExcel.endReport.srcModuleName.text=Excel\u30ec\u30dd\u30fc\u30c8
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/file/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/file/Bundle_ja.properties
old mode 100755
new mode 100644
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle_ja.properties
old mode 100755
new mode 100644
index 50dfb93246..f05aa0e273
--- a/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/html/Bundle_ja.properties
@@ -22,4 +22,4 @@ ReportHTML.writeSum.imageInfoHeading=\u30a4\u30e1\u30fc\u30b8\u60c5\u5831\uf
ReportHTML.writeSum.timezone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\uff1a
ReportHTML.writeSum.reportGenOn.text={0}\u306bHTML\u30ec\u30dd\u30fc\u30c8\u306f\u751f\u6210\u3055\u308c\u307e\u3057\u305f
ReportHTML.writeSum.noCaseNum=\u30b1\u30fc\u30b9\u756a\u53f7\u304c\u3042\u308a\u307e\u305b\u3093
-ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
\ No newline at end of file
+ReportHTML.writeIndex.srcModuleName.text=HTML\u30ec\u30dd\u30fc\u30c8
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/kml/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/kml/Bundle_ja.properties
old mode 100755
new mode 100644
index 27048c26c1..4593a4b4b6
--- a/Core/src/org/sleuthkit/autopsy/report/modules/kml/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/kml/Bundle_ja.properties
@@ -3,4 +3,4 @@ ReportKML.getName.text=Google Earth/KML
ReportKML.progress.loading=\u30d5\u30a1\u30a4\u30eb\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u2026
ReportKML.progress.querying=\u30d5\u30a1\u30a4\u30eb\u306e\u30af\u30a8\u30ea\u3092\u5b9f\u884c\u4e2d\u2026
ReportKML.genReport.reportName=KML\u30ec\u30dd\u30fc\u30c8
-ReportKML.getFilePath.text=\u30ec\u30dd\u30fc\u30c8KML.kml
\ No newline at end of file
+ReportKML.getFilePath.text=\u30ec\u30dd\u30fc\u30c8KML.kml
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
index a140338524..a002a0279d 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/kml/KMLReport.java
@@ -33,6 +33,7 @@ import java.io.OutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
+import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import org.jdom2.Document;
@@ -59,7 +60,7 @@ import org.sleuthkit.datamodel.TskCoreException;
/**
* Generates a KML file based on geospatial information from the BlackBoard.
*/
-class KMLReport implements GeneralReportModule {
+public final class KMLReport implements GeneralReportModule {
private static final Logger logger = Logger.getLogger(KMLReport.class.getName());
private static final String KML_STYLE_FILE = "style.kml";
@@ -79,6 +80,8 @@ class KMLReport implements GeneralReportModule {
private Element gpsSearchesFolder;
private Element gpsTrackpointsFolder;
+ private List waypointList = null;
+
private enum FeatureColor {
RED("style.kml#redFeature"),
GREEN("style.kml#greenFeature"),
@@ -141,6 +144,11 @@ class KMLReport implements GeneralReportModule {
"Route_Details_Header=GPS Route"
})
+ public void generateReport(String baseReportDir, ReportProgressPanel progressPanel, List waypointList) {
+ this.waypointList = waypointList;
+ generateReport(baseReportDir, progressPanel);
+ }
+
@Override
public void generateReport(String baseReportDir, ReportProgressPanel progressPanel) {
try {
@@ -298,7 +306,7 @@ class KMLReport implements GeneralReportModule {
* @throws IOException
*/
void addExifMetadataContent(List points, String baseReportDirectory) throws IOException {
- for(Waypoint point: points) {
+ for (Waypoint point : points) {
Element mapPoint = makePoint(point);
if (mapPoint == null) {
return;
@@ -332,41 +340,49 @@ class KMLReport implements GeneralReportModule {
* @throws IOException
*/
void addLocationsToReport(SleuthkitCase skCase, String baseReportDir) throws GeoLocationDataException, IOException {
- addExifMetadataContent(WaypointBuilder.getEXIFWaypoints(skCase), baseReportDir);
- addWaypoints(WaypointBuilder.getBookmarkWaypoints(skCase), gpsBookmarksFolder, FeatureColor.BLUE, Bundle.Waypoint_Bookmark_Display_String());
- addWaypoints(WaypointBuilder.getLastKnownWaypoints(skCase), gpsLastKnownLocationFolder, FeatureColor.PURPLE, Bundle.Waypoint_Last_Known_Display_String());
- addWaypoints(WaypointBuilder.getSearchWaypoints(skCase), gpsSearchesFolder, FeatureColor.WHITE, Bundle.Waypoint_Search_Display_String());
- addWaypoints(WaypointBuilder.getTrackpointWaypoints(skCase), gpsTrackpointsFolder, FeatureColor.WHITE, Bundle.Waypoint_Trackpoint_Display_String());
+ if (waypointList == null) {
+ addExifMetadataContent(WaypointBuilder.getEXIFWaypoints(skCase), baseReportDir);
+ addWaypoints(WaypointBuilder.getBookmarkWaypoints(skCase), gpsBookmarksFolder, FeatureColor.BLUE, Bundle.Waypoint_Bookmark_Display_String());
+ addWaypoints(WaypointBuilder.getLastKnownWaypoints(skCase), gpsLastKnownLocationFolder, FeatureColor.PURPLE, Bundle.Waypoint_Last_Known_Display_String());
+ addWaypoints(WaypointBuilder.getSearchWaypoints(skCase), gpsSearchesFolder, FeatureColor.WHITE, Bundle.Waypoint_Search_Display_String());
+ addWaypoints(WaypointBuilder.getTrackpointWaypoints(skCase), gpsTrackpointsFolder, FeatureColor.WHITE, Bundle.Waypoint_Trackpoint_Display_String());
+ } else {
+ addExifMetadataContent(WaypointBuilder.getEXIFWaypoints(waypointList), baseReportDir);
+ addWaypoints(WaypointBuilder.getBookmarkWaypoints(waypointList), gpsBookmarksFolder, FeatureColor.BLUE, Bundle.Waypoint_Bookmark_Display_String());
+ addWaypoints(WaypointBuilder.getLastKnownWaypoints(waypointList), gpsLastKnownLocationFolder, FeatureColor.PURPLE, Bundle.Waypoint_Last_Known_Display_String());
+ addWaypoints(WaypointBuilder.getSearchWaypoints(waypointList), gpsSearchesFolder, FeatureColor.WHITE, Bundle.Waypoint_Search_Display_String());
+ addWaypoints(WaypointBuilder.getTrackpointWaypoints(waypointList), gpsTrackpointsFolder, FeatureColor.WHITE, Bundle.Waypoint_Trackpoint_Display_String());
+ }
}
-
+
/**
- * For each point in the waypoint list an Element to represent the given waypoint
- * is created and added it to the given Element folder.
- *
- * @param points List of waypoints to add to the report
- * @param folder The Element folder to add the points to
+ * For each point in the waypoint list an Element to represent the given
+ * waypoint is created and added it to the given Element folder.
+ *
+ * @param points List of waypoints to add to the report
+ * @param folder The Element folder to add the points to
* @param waypointColor The color the waypoint should appear in the report
*/
void addWaypoints(List points, Element folder, FeatureColor waypointColor, String headerLabel) {
- for(Waypoint point: points) {
+ for (Waypoint point : points) {
addContent(folder, point.getLabel(), waypointColor, getFormattedDetails(point, headerLabel), point.getTimestamp(), makePoint(point), point.getLatitude(), point.getLongitude());
}
}
-
+
/**
* Adds the waypoint Element with details to the report in the given folder.
- *
- * @param folder Element folder to add the waypoint to
- * @param waypointLabel String waypoint Label
- * @param waypointColor FeatureColor for the waypoint
+ *
+ * @param folder Element folder to add the waypoint to
+ * @param waypointLabel String waypoint Label
+ * @param waypointColor FeatureColor for the waypoint
* @param formattedDetails String HTML formatted waypoint details
- * @param timestamp Long timestamp (unix\jave epoch seconds)
- * @param point Element point object
- * @param latitude Double latitude value
- * @param longitude Double longitude value
+ * @param timestamp Long timestamp (unix\jave epoch seconds)
+ * @param point Element point object
+ * @param latitude Double latitude value
+ * @param longitude Double longitude value
*/
void addContent(Element folder, String waypointLabel, FeatureColor waypointColor, String formattedDetails, Long timestamp, Element point, Double latitude, Double longitude) {
- if(folder != null && point != null) {
+ if (folder != null && point != null) {
String formattedCords = formattedCoordinates(latitude, longitude);
folder.addContent(makePlacemark(waypointLabel, waypointColor, formattedDetails, timestamp, point, formattedCords));
}
@@ -380,17 +396,19 @@ class KMLReport implements GeneralReportModule {
* @throws TskCoreException
*/
void makeRoutes(SleuthkitCase skCase) throws GeoLocationDataException {
- List routes = Route.getRoutes(skCase);
-
- if(routes == null) {
- return;
+ List routes = null;
+
+ if (waypointList == null) {
+ routes = Route.getRoutes(skCase);
+ } else {
+ routes = new ArrayList<>();
}
for (Route route : routes) {
addRouteToReport(route);
}
}
-
+
void addRouteToReport(Route route) {
List routePoints = route.getRoute();
Waypoint start = null;
@@ -423,15 +441,15 @@ class KMLReport implements GeneralReportModule {
}
if (startingPoint != null) {
- gpsRouteFolder.addContent(makePlacemark(start.getLabel(),
- FeatureColor.GREEN, getFormattedDetails(start, Bundle.Waypoint_Route_Point_Display_String()),
+ gpsRouteFolder.addContent(makePlacemark(start.getLabel(),
+ FeatureColor.GREEN, getFormattedDetails(start, Bundle.Waypoint_Route_Point_Display_String()),
start.getTimestamp(), startingPoint, formattedStart)); //NON-NLS
}
if (endingPoint != null) {
- gpsRouteFolder.addContent(makePlacemark(end.getLabel(),
- FeatureColor.GREEN,
- getFormattedDetails(end, Bundle.Waypoint_Route_Point_Display_String()),
+ gpsRouteFolder.addContent(makePlacemark(end.getLabel(),
+ FeatureColor.GREEN,
+ getFormattedDetails(end, Bundle.Waypoint_Route_Point_Display_String()),
end.getTimestamp(), endingPoint, formattedEnd)); //NON-NLS
}
}
@@ -688,11 +706,11 @@ class KMLReport implements GeneralReportModule {
/**
* Get the nicely formatted details for the given waypoint.
- *
- * @param point Waypoint object
+ *
+ * @param point Waypoint object
* @param header String details header
- *
- * @return HTML formatted String of details for given waypoint
+ *
+ * @return HTML formatted String of details for given waypoint
*/
private String getFormattedDetails(Waypoint point, String header) {
StringBuilder result = new StringBuilder(); //NON-NLS
@@ -706,15 +724,15 @@ class KMLReport implements GeneralReportModule {
result.append(formatAttribute("Latitude", point.getLatitude().toString()))
.append(formatAttribute("Longitude", point.getLongitude().toString()));
-
+
if (point.getAltitude() != null) {
result.append(formatAttribute("Altitude", point.getAltitude().toString()));
}
List list = point.getOtherProperties();
- for(Waypoint.Property prop: list) {
+ for (Waypoint.Property prop : list) {
String value = prop.getValue();
- if(value != null && !value.isEmpty()) {
+ if (value != null && !value.isEmpty()) {
result.append(formatAttribute(prop.getDisplayName(), value));
}
}
@@ -733,8 +751,7 @@ class KMLReport implements GeneralReportModule {
*
* @return A HTML formatted list of the Route attributes
*/
-
- private String getFormattedDetails(Route route) {
+ private String getFormattedDetails(Route route) {
List points = route.getRoute();
StringBuilder result = new StringBuilder(); //NON-NLS
@@ -752,38 +769,38 @@ class KMLReport implements GeneralReportModule {
result.append(formatAttribute("Start Latitude", start.getLatitude().toString()))
.append(formatAttribute("Start Longitude", start.getLongitude().toString()));
-
+
Double altitude = start.getAltitude();
- if(altitude != null) {
+ if (altitude != null) {
result.append(formatAttribute("Start Altitude", altitude.toString()));
}
-
+
result.append(formatAttribute("End Latitude", end.getLatitude().toString()))
.append(formatAttribute("End Longitude", end.getLongitude().toString()));
-
+
altitude = end.getAltitude();
- if(altitude != null) {
+ if (altitude != null) {
result.append(formatAttribute("End Altitude", altitude.toString()));
}
}
List list = route.getOtherProperties();
- for(Waypoint.Property prop: list) {
+ for (Waypoint.Property prop : list) {
String value = prop.getValue();
- if(value != null && !value.isEmpty()) {
+ if (value != null && !value.isEmpty()) {
result.append(formatAttribute(prop.getDisplayName(), value));
}
}
return result.toString();
}
-
+
/**
* Helper functions for consistently formatting longitude and latitude.
- *
- * @param latitude Double latitude value
+ *
+ * @param latitude Double latitude value
* @param longitude Double longitude value
- *
+ *
* @return String Nicely formatted double values separated by a comma
*/
private String formattedCoordinates(Double latitude, Double longitude) {
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
index 38e53b5eb6..bf2e8c8507 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/portablecase/PortableCaseReportModule.java
@@ -55,6 +55,7 @@ import org.sleuthkit.datamodel.ContentTag;
import org.sleuthkit.datamodel.FileSystem;
import org.sleuthkit.datamodel.Image;
import org.sleuthkit.datamodel.LocalFilesDataSource;
+import org.sleuthkit.datamodel.Pool;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.SleuthkitCase.CaseDbTransaction;
import org.sleuthkit.datamodel.TagName;
@@ -891,6 +892,9 @@ public class PortableCaseReportModule implements ReportModule {
Volume vs = (Volume)content;
newContent = portableSkCase.addVolume(parentId, vs.getAddr(), vs.getStart(), vs.getLength(),
vs.getDescription(), vs.getFlags(), trans);
+ } else if (content instanceof Pool) {
+ Pool pool = (Pool)content;
+ newContent = portableSkCase.addPool(parentId, pool.getType(), trans);
} else if (content instanceof FileSystem) {
FileSystem fs = (FileSystem)content;
newContent = portableSkCase.addFileSystem(parentId, fs.getImageOffset(), fs.getFsType(), fs.getBlock_size(),
diff --git a/Core/src/org/sleuthkit/autopsy/report/modules/stix/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/report/modules/stix/Bundle_ja.properties
index 5dfc25469b..b57761ac09 100644
--- a/Core/src/org/sleuthkit/autopsy/report/modules/stix/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/report/modules/stix/Bundle_ja.properties
@@ -10,4 +10,4 @@ STIXReportModuleConfigPanel.jButton1.text=\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u
STIXReportModuleConfigPanel.jCheckBox1.text=\u30a2\u30a6\u30c8\u30d7\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u8aa4\u3063\u305f\u30a4\u30f3\u30b8\u30b1\u30fc\u30bf\u30fc\u306e\u7d50\u679c\u3082\u542b\u3080
STIXReportModuleConfigPanel.jLabel2.text=STIX\u30d5\u30a1\u30a4\u30eb\u307e\u305f\u306fSTIX\u30d5\u30a1\u30a4\u30eb\u306e\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3092\u9078\u629e
STIXReportModule.notifyErr.noFildDirProvided=STIX\u30d5\u30a1\u30a4\u30eb\uff0f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u305b\u3093
-STIXReportModule.progress.noFildDirProvided=STIX\u30d5\u30a1\u30a4\u30eb\uff0f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u305b\u3093
\ No newline at end of file
+STIXReportModule.progress.noFildDirProvided=STIX\u30d5\u30a1\u30a4\u30eb\uff0f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u304c\u63d0\u4f9b\u3055\u308c\u3066\u3044\u307e\u305b\u3093
diff --git a/Core/src/org/sleuthkit/autopsy/test/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/test/Bundle_ja.properties
new file mode 100644
index 0000000000..5e2cc58164
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/test/Bundle_ja.properties
@@ -0,0 +1,3 @@
+CustomArtifactsCreatorDataSourceIngestModule.exceptionMessage.errorCreatingCustomType=\u30ab\u30b9\u30bf\u30e0\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+CustomArtifactsCreatorFileIngestModule.exceptionMessage.errorCreatingCustomType=\u30ab\u30b9\u30bf\u30e0\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+InterestingArtifactCreatorIngestModule.exceptionMessage.errorCreatingCustomType=\u30ab\u30b9\u30bf\u30e0\u306e\u30a2\u30fc\u30c6\u30a3\u30d5\u30a1\u30af\u30c8\u30bf\u30a4\u30d7\u306e\u4f5c\u6210\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/textextractors/Bundle_ja.properties
old mode 100755
new mode 100644
index 5d243eba03..8966e582e2
--- a/Core/src/org/sleuthkit/autopsy/textextractors/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/textextractors/Bundle_ja.properties
@@ -1,2 +1,2 @@
-AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4f8b\u5916\uff1a\u30d5\u30a1\u30a4\u30eb\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u30bf\u30b9\u30af\u5b9f\u884c\u4e2d\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916
-AbstractFileTikaTextExtract.index.tikaParseTimeout.text=\u4f8b\u5916\uff1a\u30b3\u30f3\u30c6\u30f3\u30c4\uff1a{0}, {1}\u306eApache Tika\u30d1\u30fc\u30b9\u306e\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8
\ No newline at end of file
+AbstractFileTikaTextExtract.index.tikaParseTimeout.text=\u4f8b\u5916: \u6b21\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u306eTika\u89e3\u6790\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8: {0}\u3001{1}
+AbstractFileTikaTextExtract.index.exception.tikaParse.msg=\u4f8b\u5916: \u6b21\u306e\u30d5\u30a1\u30a4\u30eb\u306eTika\u89e3\u6790\u30bf\u30b9\u30af\u5b9f\u884c\u6642\u306e\u4e88\u671f\u305b\u306c\u4f8b\u5916: {0}\u3001{1}
diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractorFactory.java b/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractorFactory.java
index 2c8316ba60..ff0ba51dd1 100755
--- a/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractorFactory.java
+++ b/Core/src/org/sleuthkit/autopsy/textextractors/TextExtractorFactory.java
@@ -89,6 +89,7 @@ public class TextExtractorFactory {
*/
private static List getFileExtractors(AbstractFile content, Lookup context) {
List fileExtractors = Arrays.asList(
+ new TextFileExtractor(content),
new HtmlTextExtractor(content),
new SqliteTextExtractor(content),
new TikaTextExtractor(content));
diff --git a/Core/src/org/sleuthkit/autopsy/textextractors/TextFileExtractor.java b/Core/src/org/sleuthkit/autopsy/textextractors/TextFileExtractor.java
new file mode 100644
index 0000000000..3efb6b1aed
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/textextractors/TextFileExtractor.java
@@ -0,0 +1,135 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2018-2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.textextractors;
+
+import com.ethteck.decodetect.core.Decodetect;
+import com.ethteck.decodetect.core.DecodetectResult;
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.nio.charset.Charset;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CharsetEncoder;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+import java.util.List;
+import org.apache.tika.parser.txt.CharsetDetector;
+import org.apache.tika.parser.txt.CharsetMatch;
+import org.sleuthkit.datamodel.AbstractFile;
+import org.sleuthkit.datamodel.Content;
+import org.sleuthkit.datamodel.ReadContentInputStream;
+
+/**
+ * Extract text from text files
+ */
+public final class TextFileExtractor implements TextExtractor {
+ public static Charset UNKNOWN_CHARSET = new Charset("unknown", null) {
+ @Override
+ public boolean contains(Charset cs) {
+ return false;
+ }
+
+ @Override
+ public CharsetDecoder newDecoder() {
+ return null;
+ }
+
+ @Override
+ public CharsetEncoder newEncoder() {
+ return null;
+ }
+ };
+
+ // This value will be used as a threshold for determining which encoding
+ // detection library to use. If Tika's own confidence is at least
+ // MIN_MATCH_CONFIDENCE, Tika's result will be used for decoding.
+ // Otherwise, Decodetect will be used.
+ static final private int MIN_TIKA_MATCH_CONFIDENCE = 35;
+
+ // This value determines whether we will consider Decodetect's top-scoring
+ // result a legitimate match or if we will disregard its findings
+ //
+ // Possible values are 0 to 1, inclusive
+ static final private double MIN_DECODETECT_MATCH_CONFIDENCE = 0.4;
+
+ private final AbstractFile file;
+
+ public TextFileExtractor(AbstractFile file) {
+ this.file = file;
+ }
+
+ @Override
+ public Reader getReader() {
+ Charset encoding = getEncoding(file);
+ if (encoding.equals(UNKNOWN_CHARSET)) {
+ encoding = StandardCharsets.UTF_8;
+ }
+ return getReader(encoding);
+ }
+
+ public Reader getReader(Charset encoding) {
+ return new InputStreamReader(new BufferedInputStream(new ReadContentInputStream(file)), encoding);
+ }
+
+ @Override
+ public boolean isSupported() {
+ return file.getMIMEType().equals("text/plain");
+ }
+
+ public class TextFileExtractorException extends Exception {
+ public TextFileExtractorException(String msg, Throwable ex) {
+ super(msg, ex);
+ }
+ public TextFileExtractorException(String msg) {
+ super(msg);
+ }
+ }
+
+ public static Charset getEncoding(Content content) {
+ try (InputStream stream = new BufferedInputStream(new ReadContentInputStream(content))) {
+ // Tika first
+ CharsetDetector detector = new CharsetDetector();
+ detector.setText(stream);
+ CharsetMatch tikaResult = detector.detect();
+ if (tikaResult != null && tikaResult.getConfidence() >= MIN_TIKA_MATCH_CONFIDENCE) {
+ try {
+ return Charset.forName(tikaResult.getName());
+ } catch (UnsupportedCharsetException ignored) {
+ }
+ }
+
+ // Decodetect if Tika fails or falls below confidence threshold
+ int maxBytes = 100000;
+ int numBytes = Math.min(stream.available(), maxBytes);
+ byte[] targetArray = new byte[numBytes];
+ stream.read(targetArray);
+ List results = Decodetect.DECODETECT.getResults(targetArray);
+ if (!results.isEmpty()) {
+ DecodetectResult topResult = results.get(0);
+ if (topResult.getConfidence() >= MIN_DECODETECT_MATCH_CONFIDENCE) {
+ return topResult.getEncoding();
+ }
+ }
+ } catch (IOException ignored) {
+ }
+ return UNKNOWN_CHARSET;
+ }
+}
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle_ja.properties
new file mode 100644
index 0000000000..f09a84b18c
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle_ja.properties
@@ -0,0 +1,12 @@
+OptionsCategory_Name_Machine_Translation=\u6a5f\u68b0\u7ffb\u8a33
+OptionsCategory_Keywords_Machine_Translation_Settings=\u6a5f\u68b0\u7ffb\u8a33\u8a2d\u5b9a
+TranslationContentPanel.ocrLabel.text=OCR:
+TranslationOptionsPanel.noTextTranslators.text=\u30c6\u30ad\u30b9\u30c8\u7ffb\u8a33\u30c4\u30fc\u30eb\u304c\u5b58\u5728\u3057\u307e\u305b\u3093\u3002\u7ffb\u8a33\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002
+TranslationOptionsPanel.noTextTranslators.text=\u30c6\u30ad\u30b9\u30c8\u7ffb\u8a33\u30c4\u30fc\u30eb\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002\u7ffb\u8a33\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002
+TranslationOptionsPanel.textTranslatorsUnavailable.text=\u9078\u629e\u3057\u305f\u30c6\u30ad\u30b9\u30c8\u7ffb\u8a33\u30c4\u30fc\u30eb\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002\u7ffb\u8a33\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002
+TranslationOptionsPanel.translationDisabled.text=\u7ffb\u8a33\u304c\u7121\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059
+TranslationOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+TranslationOptionsPanelController.moduleErr.msg=TranslationSettingsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TranslationContentPanel.showLabel.text=\u8868\u793a:
+TranslationOptionsPanel.translationServiceLabel.text=\u30c6\u30ad\u30b9\u30c8\u7ffb\u8a33\u30c4\u30fc\u30eb:
+TranslationOptionsPanel.translationOptionsDescription.text=\u30b5\u30fc\u30c9\u30d1\u30fc\u30c6\u30a3\u88fd\u30c6\u30ad\u30b9\u30c8\u7ffb\u8a33\u30b5\u30fc\u30d3\u30b9\u3092\u69cb\u6210\u3057\u3001\u30c6\u30ad\u30b9\u30c8\u3068\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u7ffb\u8a33\u3092\u6709\u52b9\u5316\u3057\u307e\u3059\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties
new file mode 100644
index 0000000000..885df0f635
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/texttranslation/translators/Bundle_ja.properties
@@ -0,0 +1,30 @@
+BingTranslator.name.text=Bing\u3067\u7ffb\u8a33\u8005\u3092\u691c\u7d22
+BingTranslatorSettingsPanel.warning.invalidKey=\u7121\u52b9\u306a\u7ffb\u8a33\u8a8d\u8a3c\u30ad\u30fc\u3067\u3059
+BingTranslatorSettingsPanel.warning.targetLanguageFailure=\u5bfe\u8c61\u8a00\u8a9e\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u306a\u3044\u304b\u3001\u53d7\u4fe1\u3057\u305f\u7d50\u679c\u3092\u89e3\u6790\u3067\u304d\u307e\u305b\u3093
+GoogleTranslator.name.text=Google\u7ffb\u8a33
+GoogleTranslatorSettingsPanel.browseButton.text=\u53c2\u7167
+GoogleTranslatorSettingsPanel.credentialsLabel.text=\u8cc7\u683c\u60c5\u5831\u306e\u30d1\u30b9:
+GoogleTranslatorSettingsPanel.errorMessage.fileNotFound=\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3002\u6709\u52b9\u306aJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u3042\u308b\u5834\u6240\u3092\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+GoogleTranslatorSettingsPanel.errorMessage.noFileSelected=Google\u7ffb\u8a33\u306b\u8cc7\u683c\u60c5\u5831\u3092\u63d0\u4f9b\u3059\u308b\u305f\u3081\u306b\u30011\u3064\u306eJSON\u30d5\u30a1\u30a4\u30eb\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+GoogleTranslatorSettingsPanel.errorMessage.translationFailure=\u6307\u5b9a\u3057\u305f\u8cc7\u683c\u60c5\u5831\u3067\u306f\u7ffb\u8a33\u3067\u304d\u307e\u305b\u3093
+GoogleTranslatorSettingsPanel.errorMessage.unableToMakeCredentials=\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8cc7\u683c\u60c5\u5831\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u3092\u69cb\u7bc9\u3067\u304d\u307e\u305b\u3093\u3002\u6709\u52b9\u306aJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u3042\u308b\u5834\u6240\u3092\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+GoogleTranslatorSettingsPanel.errorMessage.unableToReadCredentials=\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u8cc7\u683c\u60c5\u5831\u3092\u8aad\u307f\u8fbc\u3081\u307e\u305b\u3093\u3002\u6709\u52b9\u306aJSON\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u306e\u3042\u308b\u5834\u6240\u3092\u8a2d\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+GoogleTranslatorSettingsPanel.errorMessage.unknownFailureGetting=\u73fe\u5728\u306e\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u8a00\u8a9e\u306e\u30ea\u30b9\u30c8\u3092\u53d6\u5f97\u3067\u304d\u307e\u305b\u3093\u3002
+GoogleTranslatorSettingsPanel.errorMessage.unknownFailurePopulating=\u73fe\u5728\u306e\u8cc7\u683c\u60c5\u5831\u30d5\u30a1\u30a4\u30eb\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u308b\u8a00\u8a9e\u306e\u30ea\u30b9\u30c8\u3092\u5165\u529b\u3067\u304d\u307e\u305b\u3093\u3002
+GoogleTranslatorSettingsPanel.fileChooser.confirmButton=\u9078\u629e
+GoogleTranslatorSettingsPanel.json.description=JSON\u30d5\u30a1\u30a4\u30eb
+GoogleTranslatorSettingsPanel.warningLabel.text=
+GoogleTranslatorSettingsPanel.targetLanguageLabel.text=\u5bfe\u8c61\u8a00\u8a9e:
+BingTranslatorSettingsPanel.testButton.text=\u30c6\u30b9\u30c8
+BingTranslatorSettingsPanel.testResultValueLabel.text=
+BingTranslatorSettingsPanel.resultLabel.text=\u7d50\u679c:
+BingTranslatorSettingsPanel.untranslatedLabel.text=\u672a\u7ffb\u8a33:
+BingTranslatorSettingsPanel.targetLanguageLabel.text=\u5bfe\u8c61\u8a00\u8a9e:
+BingTranslatorSettingsPanel.authenticationKeyField.toolTipText=\u6b21\u306e\u30cf\u30c3\u30b7\u30e5\u3092\u5165\u529b\u3059\u308b
+GoogleTranslatorSettingsPanel.testButton.text=\u30c6\u30b9\u30c8
+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
diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties
new file mode 100644
index 0000000000..b9442d6a12
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle_ja.properties
@@ -0,0 +1,22 @@
+OptionsCategory_Name_Machine_Translation=\u6a5f\u68b0\u7ffb\u8a33
+OptionsCategory_Keywords_Machine_Translation_Settings=\u6a5f\u68b0\u7ffb\u8a33\u8a2d\u5b9a
+TranslatedContentPanel.comboBoxOption.originalText=\u30aa\u30ea\u30b8\u30ca\u30eb\u30c6\u30ad\u30b9\u30c8(\u6700\u592725KB)
+TranslatedContentPanel.comboBoxOption.translatedText=\u7ffb\u8a33\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8
+TranslatedContentViewer.emptyTranslation=\u751f\u6210\u3055\u308c\u305f\u7ffb\u8a33\u7d50\u679c\u306f\u7a7a(\u672a\u5165\u529b)\u3067\u3057\u305f\u3002
+TranslatedContentViewer.errorExtractingText=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+TranslatedContentViewer.errorMsg=\u30d5\u30a1\u30a4\u30eb\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+TranslatedContentViewer.extractingFileText=\u30d5\u30a1\u30a4\u30eb\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
+TranslatedContentViewer.extractingImageText=\u30a4\u30e1\u30fc\u30b8\u304b\u3089\u30c6\u30ad\u30b9\u30c8\u3092\u62bd\u51fa\u4e2d\u3067\u3059\u3002\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
+TranslatedContentViewer.noIndexedTextMsg=\u30ad\u30fc\u30ef\u30fc\u30c9\u691c\u7d22\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u30e2\u30b8\u30e5\u30fc\u30eb\u3092\u5b9f\u884c\u3057\u3001\u7ffb\u8a33\u30c6\u30ad\u30b9\u30c8\u3092\u53d6\u5f97\u3057\u307e\u3059\u3002
+TranslatedContentViewer.noServiceProvider=\u6a5f\u68b0\u7ffb\u8a33\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+TranslatedContentViewer.textAlreadyIndexed=\u30a4\u30f3\u30c7\u30c3\u30af\u30b9\u3055\u308c\u305f\u30c6\u30ad\u30b9\u30c8\u306e\u30d3\u30e5\u30fc\u30ef\u30fc\u3067\u30aa\u30ea\u30b8\u30ca\u30eb\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+TranslatedContentViewer.translatingText=\u30c6\u30ad\u30b9\u30c8\u3092\u7ffb\u8a33\u4e2d\u3067\u3059\u3002T\u304a\u5f85\u3061\u304f\u3060\u3055\u3044...
+TranslatedContentViewer.translationException=\u7ffb\u8a33\u3092\u8a66\u307f\u3066\u3044\u308b\u9593\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+TranslatedTextViewer.maxPayloadSize=\u30c6\u30ad\u30b9\u30c8\u306e\u6700\u521d\u306e %dKB \u307e\u3067\u7ffb\u8a33\u3055\u308c\u307e\u3059
+TranslatedTextViewer.title=\u7ffb\u8a33
+TranslatedTextViewer.toolTip=\u7ffb\u8a33\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+TranslationContentPanel.autoDetectOCR=\u81ea\u52d5\u691c\u51fa\u3055\u308c\u305f\u8a00\u8a9e
+TranslationContentPanel.ocrLabel.text=OCR:
+TranslationOptionsPanelController.moduleErr=\u30e2\u30b8\u30e5\u30fc\u30eb\u30a8\u30e9\u30fc
+TranslationOptionsPanelController.moduleErr.msg=TranslationSettingsPanelController\u66f4\u65b0\u306e\u30ea\u30c3\u30b9\u30f3\u4e2d\u306b\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u30a8\u30e9\u30fc\u3092\u767a\u751f\u3055\u305b\u307e\u3057\u305f\u3002\u30ed\u30b0\u3092\u78ba\u8a8d\u3057\u3066\u3069\u306e\u30e2\u30b8\u30e5\u30fc\u30eb\u304c\u5224\u65ad\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u4e00\u90e8\u306e\u30c7\u30fc\u30bf\u304c\u4e0d\u5b8c\u5168\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TranslationContentPanel.showLabel.text=\u8868\u793a:
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties
old mode 100755
new mode 100644
index c631cee729..918ab67c66
--- a/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/Bundle_ja.properties
@@ -1,47 +1,66 @@
-CTL_MakeTimeline=\u300c\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u300d
-CTL_TimeLineTopComponent=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a6\u30a3\u30f3\u30c9\u30a6
-CTL_TimeLineTopComponentAction=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c8\u30c3\u30d7\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8
-OpenTimelineAction.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+CTL_MakeTimeline=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+CTL_TimeLineTopComponentAction=TimeLineTopComponent
+CTL_TimeLineTopComponent=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+
+OpenTimelineAction.displayName=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+OpenTimeLineAction.msgdlg.text=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002
+OpenTimelineAction.settingsErrorMessage=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u8a2d\u5b9a\u3092\u521d\u671f\u5316\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+PrompDialogManager.buttonType.continueNoUpdate=\u66f4\u65b0\u305b\u305a\u306b\u7d9a\u884c
+PrompDialogManager.buttonType.showTimeline=\u7d9a\u884c
+PrompDialogManager.buttonType.update=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0
+PromptDialogManager.confirmDuringIngest.contentText=\u7d9a\u884c\u3057\u307e\u3059\u304b?
+PromptDialogManager.confirmDuringIngest.headerText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u307e\u3048\u306b\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u5b8c\u5168\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+PromptDialogManager.progressDialog.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u3092\u5165\u529b\u4e2d\u3067\u3059
+PromptDialogManager.rebuildPrompt.details=\u8a73\u7d30
+PromptDialogManager.rebuildPrompt.headerText=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u304c\u5b8c\u5168\u304a\u3088\u3073/\u307e\u305f\u306f\u6700\u65b0\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002 \u4e00\u90e8\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u304b\u3001\u6b63\u78ba\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u307e\u305f\u3001\u4e00\u90e8\u306e\u6a5f\u80fd\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+PromptDialogManager.showTimeLineDisabledMessage.contentText=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u6a5f\u80fd\u306f\u307e\u3060\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u304c\u7121\u52b9\u306b\u306a\u308a\u307e\u3059\u3002
+PromptDialogManager.showTimeLineDisabledMessage.headerText=
+PromptDialogManager.showTooManyFiles.contentText=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u30d5\u30a1\u30a4\u30eb\u6570\u304c\u591a\u3059\u304e\u3066\u3001\u76f8\u5fdc\u306e\u30d1\u30d5\u30a9\u30fc\u30de\u30f3\u30b9\u3092\u4fdd\u8a3c\u3067\u304d\u307e\u305b\u3093\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u304c\u7121\u52b9\u306b\u306a\u308a\u307e\u3059\u3002
+PromptDialogManager.showTooManyFiles.headerText=
+ShowInTimelineDialog.amountValidator.message=\u5165\u529b\u3059\u308b\u91cf\u306b\u306f\u6570\u5b57\u306e\u307f\u304c\u542b\u307e\u308c\u3066\u3044\u306a\u3051\u308c\u3070\u306a\u308a\u307e\u305b\u3093\u3002
+ShowInTimelineDialog.artifactTitle=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u7d50\u679c\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+ShowInTimelineDialog.eventSelectionValidator.message=\u30a4\u30d9\u30f3\u30c8\u3092\u9078\u629e\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002
+# {0} - \u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+ShowInTimelineDialog.fileTitle=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b {0} \u3092\u8868\u793a\u3057\u307e\u3059\u3002
+ShowInTimelineDialog.showTimelineButtonType.text=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u8868\u793a
+Timeline.dialogs.title=\ \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
Timeline.frameName.text={0} - Autopsy\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
-Timeline.goToButton.text=\u4e0b\u8a18\u3078\u79fb\u52d5\uff1a
-Timeline.pushDescrLOD.confdlg.msg={0}\u30a4\u30d9\u30f3\u30c8\u306e\u8a73\u7d30\u304c\u8868\u793a\u53ef\u80fd\u3067\u3059\u3002\u3053\u306e\u51e6\u7406\u306f\u9577\u6642\u9593\u304b\u304b\u308b\u3082\u3057\u304f\u306fAutopsy\u3092\u30af\u30e9\u30c3\u30b7\u30e5\u3059\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\n\n\u5b9f\u884c\u3057\u307e\u3059\u304b\uff1f
-Timeline.resultPanel.loading=\u30ed\u30fc\u30c9\u4e2d\u30fb\u30fb\u30fb
Timeline.resultsPanel.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u7d50\u679c
-Timeline.runJavaFxThread.progress.creating=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u4f5c\u6210\u4e2d\u30fb\u30fb\u30fb
+Timeline.runJavaFxThread.progress.creating=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u4f5c\u6210\u4e2d\u3067\u3059 ...
Timeline.zoomOutButton.text=\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
+Timeline.goToButton.text=\u79fb\u52d5:
+Timeline.yearBarChart.x.years=\u5e74
+Timeline.resultPanel.loading=\u8aad\u307f\u8fbc\u307f\u4e2d...
+
+TimeLineController.errorTitle=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a8\u30e9\u30fc\u3067\u3059\u3002
+TimeLineController.outOfDate.errorMessage=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u304c\u6700\u65b0\u306e\u60c5\u5831\u3067\u306f\u306a\u3044\u304b\u3069\u3046\u304b\u3092\u5224\u65ad\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u66f4\u65b0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u3068\u4eee\u5b9a\u3057\u307e\u3059\u3002 \u30ed\u30b0\u3092\u8868\u793a\u3057\u3066\u8a73\u7d30\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+TimeLineController.rebuildReasons.incompleteOldSchema=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u4ee5\u524d\u306b\u4e0d\u5b8c\u5168\u306a\u60c5\u5831\u3067\u5165\u529b\u3055\u308c\u307e\u3057\u305f: \u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u306a\u3044\u9650\u308a\u3001\u4e00\u90e8\u306e\u6a5f\u80fd\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u304b\u6a5f\u80fd\u3057\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLineController.rebuildReasons.ingestWasRunning=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306f\u4ee5\u524d\u306b\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5b9f\u884c\u4e2d\u306b\u5165\u529b\u3055\u308c\u307e\u3057\u305f: \u4e00\u90e8\u306e\u30a4\u30d9\u30f3\u30c8\u304c\u898b\u3064\u304b\u3089\u306a\u3044\u304b\u3001\u4e0d\u5b8c\u5168\u304b\u3001\u6b63\u78ba\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLineController.rebuildReasons.outOfDate=\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u306f\u6700\u65b0\u3067\u306f\u3042\u308a\u307e\u305b\u3093: \u3059\u3079\u3066\u306e\u30c7\u30fc\u30bf\u3092\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3002
+TimeLineController.rebuildReasons.outOfDateError=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u304c\u6700\u65b0\u306e\u60c5\u5831\u3067\u306f\u306a\u3044\u304b\u3069\u3046\u304b\u3092\u5224\u65ad\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+TimeLineController.setEventsDBStale.errMsgNotStale=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53e4\u3044\u3082\u306e\u3068\u3057\u3066\u30de\u30fc\u30af\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u7d50\u679c\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u898b\u3064\u304b\u3089\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLineController.setEventsDBStale.errMsgStale=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u53e4\u3044\u3082\u306e\u3068\u3057\u3066\u30de\u30fc\u30af\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u7d50\u679c\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u898b\u3064\u304b\u3089\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLinecontroller.setIngestRunning.errMsgNotRunning=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b9f\u884c\u3057\u3066\u3044\u306a\u3044\u9593\u306b\u3001\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u5165\u529b\u6e08\u307f\u3068\u3057\u3066\u30de\u30fc\u30af\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u7d50\u679c\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u898b\u3064\u304b\u3089\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLineController.setIngestRunning.errMsgRunning=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u5b9f\u884c\u4e2d\u306b\u3001\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u5165\u529b\u6e08\u307f\u3068\u3057\u3066\u30de\u30fc\u30af\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u4e00\u90e8\u306e\u7d50\u679c\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u898b\u3064\u304b\u3089\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+TimeLinecontroller.updateNowQuestion=\u4eca\u3059\u3050\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u307e\u3059\u304b?
TimelineFrame.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+TimelinePanel.jButton1.text=6m
+TimelinePanel.jButton13.text=\u3059\u3079\u3066
+TimelinePanel.jButton10.text=1h
+TimelinePanel.jButton9.text=12h
+TimelinePanel.jButton11.text=5y
+TimelinePanel.jButton12.text=10y
+TimelinePanel.jButton6.text=1w
+TimelinePanel.jButton5.text=1y
+TimelinePanel.jButton8.text=1d
+TimelinePanel.jButton7.text=3d
+TimelinePanel.jButton2.text=1m
+TimelinePanel.jButton3.text=3m
+TimelinePanel.jButton4.text=2w
+ProgressWindow.progressHeader.text=\
+# {0} - \u65e5\u4ed8\u7bc4\u56f2\u306e\u958b\u59cb
+# {1} - \u65e5\u4ed8\u7bc4\u56f2\u306e\u7d42\u4e86
+TimeLineResultView.startDateToEndDate.text={0} ~ {1}
TimeLineTopComponent.eventsTab.name=\u30a4\u30d9\u30f3\u30c8
TimeLineTopComponent.filterTab.name=\u30d5\u30a3\u30eb\u30bf\u30fc
-OpenTimeLineAction.msgdlg.text=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u4f5c\u6210\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-PrompDialogManager.buttonType.continueNoUpdate=\u66f4\u65b0\u305b\u305a\u6b21\u3078
-PrompDialogManager.buttonType.showTimeline=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u8868\u793a
-PrompDialogManager.buttonType.update=\u66f4\u65b0
-PromptDialogManager.confirmDuringIngest.contentText=\u6b21\u3078\u9032\u307f\u307e\u3059\u304b\uff1f
-PromptDialogManager.confirmDuringIngest.headerText=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b8c\u4e86\u3059\u308b\u524d\u306b\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u3092\u8868\u793a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059\u3002\n\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u304c\u5b8c\u6210\u3057\u3066\u3044\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-PromptDialogManager.progressDialog.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u3092\u5165\u529b\u4e2d
-PromptDialogManager.rebuildPrompt.details=\u8a73\u7d30\uff1a
-PromptDialogManager.rebuildPrompt.headerText=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u4e0d\u5b8c\u5168\u307e\u305f\u306f\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\n \u6b20\u843d\u3057\u3066\u3044\u308b\u307e\u305f\u306f\u4e0d\u6b63\u78ba\u306a\u30a4\u30d9\u30f3\u30c8\u304c\u4e00\u90e8\u3042\u308b\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002\u4e00\u90e8\u306e\u6a5f\u80fd\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-Timeline.confirmation.dialogs.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u307e\u3059\u304b\uff1f
-Timeline.pushDescrLOD.confdlg.title=\u8aac\u660e\u306e\u8a18\u8ff0\u30ec\u30d9\u30eb\u3092\u5909\u66f4\u3057\u307e\u3059\u304b\uff1f
-TimeLineController.errorTitle=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a8\u30e9\u30fc
-TimeLineController.outOfDate.errorMessage=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u304c\u6700\u65b0\u304b\u78ba\u8a8d\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u66f4\u65b0\u304c\u5fc5\u8981\u3060\u3068\u60f3\u5b9a\u3057\u307e\u3059\u3002
-TimeLineController.rebuildReasons.incompleteOldSchema=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a4\u30d9\u30f3\u30c8\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u4e0d\u5b8c\u5168\u306a\u60c5\u5831\u304c\u4ee5\u524d\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u3057\u305f\uff1a\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u306a\u3044\u3068\u3001\u4e00\u90e8\u306e\u6a5f\u80fd\u304c\u5229\u7528\u3067\u304d\u306a\u3044\u3001\u307e\u305f\u306f\u6a5f\u80fd\u3057\u306a\u3044\u304b\u3082\u3057\u308c\u306a\u3044\u3067\u3059\u3002
-TimeLineController.rebuildReasons.ingestWasRunning=\u30a4\u30f3\u30b8\u30a7\u30b9\u30c8\u304c\u5b9f\u884c\u4e2d\u306b\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30a4\u30d9\u30f3\u30c8\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306b\u60c5\u5831\u304c\u5165\u529b\u3055\u308c\u3066\u3044\u307e\u3057\u305f\uff1a\u30a4\u30d9\u30f3\u30c8\u304c\u6b20\u3051\u3066\u3044\u308b\u3001\u4e0d\u5b8c\u5168\u3001\u307e\u305f\u306f\u4e0d\u6b63\u78ba\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-TimeLineController.rebuildReasons.outOfDate=\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u304c\u6700\u65b0\u3067\u306f\u3042\u308a\u307e\u305b\u3093\uff1a\u898b\u308c\u306a\u3044\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u3059\u3002
-TimeLineController.rebuildReasons.outOfDateError=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u30c7\u30fc\u30bf\u304c\u6700\u65b0\u304b\u78ba\u8a8d\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
-TimeLinecontroller.updateNowQuestion=\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u4eca\u66f4\u65b0\u3057\u307e\u3059\u304b\uff1f
-TimelinePanel.jButton13.text=\u5168\u3066
-Timeline.yearBarChart.x.years=\u5e74
-TimelinePanel.jButton1.text=6\u30f6\u6708
-TimelinePanel.jButton10.text=1\u6642\u9593
-TimelinePanel.jButton9.text=12\u6642\u9593
-TimelinePanel.jButton11.text=5\u5e74
-TimelinePanel.jButton12.text=10\u5e74
-TimelinePanel.jButton6.text=1\u9031\u9593
-TimelinePanel.jButton5.text=1\u5e74
-TimelinePanel.jButton8.text=1\u65e5
-TimelinePanel.jButton7.text=3\u65e5
-TimelinePanel.jButton2.text=1\u30f6\u6708
-TimelinePanel.jButton3.text=3\u30f6\u6708
-TimelinePanel.jButton4.text=2\u9031\u9593
-TimeLineResultView.startDateToEndDate.text={0}\u304b\u3089{1}
\ No newline at end of file
+TimelineTopComponent.selectedEventListener.errorMsg=\u9078\u629e\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u306e\u30b3\u30f3\u30c6\u30f3\u30c4\u3092\u53d6\u5f97\u4e2d\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/EventsModel.java b/Core/src/org/sleuthkit/autopsy/timeline/EventsModel.java
new file mode 100755
index 0000000000..c75c7c814e
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/timeline/EventsModel.java
@@ -0,0 +1,804 @@
+/*
+ * Autopsy Forensic Browser
+ *
+ * Copyright 2014-2019 Basis Technology Corp.
+ * Contact: carrier sleuthkit org
+ *
+ * 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.
+ */
+package org.sleuthkit.autopsy.timeline;
+
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableList;
+import com.google.common.eventbus.EventBus;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.logging.Level;
+import javafx.beans.InvalidationListener;
+import javafx.beans.property.ReadOnlyObjectProperty;
+import javafx.beans.property.ReadOnlyObjectWrapper;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableMap;
+import static org.apache.commons.collections4.CollectionUtils.emptyIfNull;
+import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
+import org.joda.time.DateTimeZone;
+import org.joda.time.Interval;
+import org.openide.util.NbBundle;
+import org.sleuthkit.autopsy.casemodule.Case;
+import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagAddedEvent;
+import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent;
+import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo;
+import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
+import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent;
+import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent.DeletedContentTagInfo;
+import org.sleuthkit.autopsy.coreutils.Logger;
+import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
+import org.sleuthkit.autopsy.timeline.events.RefreshRequestedEvent;
+import org.sleuthkit.autopsy.timeline.events.TagsAddedEvent;
+import org.sleuthkit.autopsy.timeline.events.TagsDeletedEvent;
+import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
+import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
+import org.sleuthkit.autopsy.timeline.utils.CacheLoaderImpl;
+import org.sleuthkit.autopsy.timeline.utils.FilterUtils;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
+import org.sleuthkit.datamodel.AbstractFile;
+import org.sleuthkit.datamodel.BlackboardArtifact;
+import org.sleuthkit.datamodel.BlackboardArtifactTag;
+import org.sleuthkit.datamodel.Content;
+import org.sleuthkit.datamodel.ContentTag;
+import org.sleuthkit.datamodel.DataSource;
+import org.sleuthkit.datamodel.SleuthkitCase;
+import org.sleuthkit.datamodel.TimelineManager;
+import org.sleuthkit.datamodel.TskCoreException;
+import org.sleuthkit.datamodel.TimelineEvent;
+import org.sleuthkit.datamodel.TimelineEventType;
+import org.sleuthkit.datamodel.TimelineFilter;
+import org.sleuthkit.datamodel.TimelineFilter.DataSourceFilter;
+import org.sleuthkit.datamodel.TimelineFilter.DataSourcesFilter;
+import org.sleuthkit.datamodel.TimelineFilter.EventTypeFilter;
+import org.sleuthkit.datamodel.TimelineFilter.FileTypesFilter;
+import org.sleuthkit.datamodel.TimelineFilter.HashHitsFilter;
+import org.sleuthkit.datamodel.TimelineFilter.HideKnownFilter;
+import org.sleuthkit.datamodel.TimelineFilter.RootFilter;
+import org.sleuthkit.datamodel.TimelineFilter.TagsFilter;
+import org.sleuthkit.datamodel.TimelineFilter.TextFilter;
+import org.sleuthkit.datamodel.TimelineLevelOfDetail;
+
+/**
+ * In the timeline implementation of the MVC pattern, this class acts as the
+ * model. The views are the event counts view, the event details view and the
+ * events list view.
+ *
+ * Concurrency Policy: TimelineManager is internally synchronized, so methods
+ * that only access the TimelineManager atomically do not need further
+ * synchronization. All other member state variables should only be accessed
+ * with intrinsic lock of the containing FilteredEventsModel held.
+ *
+ */
+public final class EventsModel {
+
+ private static final Logger logger = Logger.getLogger(EventsModel.class.getName());
+ private final EventBus eventbus = new EventBus("EventsModel_EventBus"); //NON-NLS
+ private final Case currentCase;
+ private final TimelineManager caseDbEventManager;
+
+ /*
+ * User-specified parameters for the model exposed as JFX properties. These
+ * parameters apply across all of the views of the model and are set using
+ * GUI elements such the event filters panel.
+ *
+ * IMPORTANT: Note that the parameters are exposed both as a set and
+ * individually.
+ */
+ private final ReadOnlyObjectWrapper modelParamsProperty = new ReadOnlyObjectWrapper<>();
+ private final ReadOnlyObjectWrapper filterStateProperty = new ReadOnlyObjectWrapper<>();
+ private final ReadOnlyObjectWrapper timeRangeProperty = new ReadOnlyObjectWrapper<>();
+ private final ReadOnlyObjectWrapper eventTypesHierarchyLevelProperty = new ReadOnlyObjectWrapper<>(TimelineEventType.HierarchyLevel.CATEGORY);
+ private final ReadOnlyObjectWrapper timelineLODProperty = new ReadOnlyObjectWrapper<>(TimelineLevelOfDetail.LOW);
+
+ /*
+ * Caches of model data from the case database.
+ */
+ private final ObservableMap datasourceIDsToNamesMap = FXCollections.observableHashMap();
+ private final LoadingCache maxEventTimeCache;
+ private final LoadingCache minEventTimeCache;
+ private final LoadingCache idsToEventsCache;
+ private final LoadingCache> eventCountsCache;
+
+ /**
+ * Makes a new data source filter from a given entry in the cache of data
+ * source object IDs to data source names.
+ *
+ * @param dataSourceEntry The cache entry.
+ *
+ * @return A new DataSourceFilter.
+ */
+ private static DataSourceFilter newDataSourceFilter(Map.Entry dataSourceEntry) {
+ return new DataSourceFilter(dataSourceEntry.getValue(), dataSourceEntry.getKey());
+ }
+
+ /**
+ * Constructs the model in the timeline implementation of the MVC pattern.
+ *
+ * @param currentCase The current case.
+ * @param modelParams The initial state of the model parameters.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public EventsModel(Case currentCase, ReadOnlyObjectProperty modelParams) throws TskCoreException {
+ this.currentCase = currentCase;
+ this.caseDbEventManager = currentCase.getSleuthkitCase().getTimelineManager();
+
+ /*
+ * Set up the caches of model data from the case database. Note that the
+ * build() method calls specify the methods used to create default cache
+ * entries when a call to get() would otherwise return a cache miss.
+ */
+ populateDataSourcesCache();
+ idsToEventsCache = CacheBuilder.newBuilder()
+ .maximumSize(5000L)
+ .expireAfterAccess(10, TimeUnit.MINUTES)
+ .build(new CacheLoaderImpl<>(caseDbEventManager::getEventById));
+ eventCountsCache = CacheBuilder.newBuilder()
+ .maximumSize(1000L)
+ .expireAfterAccess(10, TimeUnit.MINUTES)
+ .build(new CacheLoaderImpl<>(this::countEventsByType));
+ maxEventTimeCache = CacheBuilder.newBuilder()
+ .build(new CacheLoaderImpl<>(ignored -> caseDbEventManager.getMaxEventTime()));
+ minEventTimeCache = CacheBuilder.newBuilder()
+ .build(new CacheLoaderImpl<>(ignored -> caseDbEventManager.getMinEventTime()));
+
+ /*
+ * Add a listener to the data sources cache that adds a data source
+ * filter to the event filter state model parameter when a data source
+ * is added to the cache.
+ */
+ InvalidationListener dataSourcesMapListener = observable -> {
+ RootFilterState rootFilter = filterStateProperty.getReadOnlyProperty().get();
+ addDataSourceFilters(rootFilter);
+ filterStateProperty.set(rootFilter.copyOf());
+ };
+ datasourceIDsToNamesMap.addListener(dataSourcesMapListener);
+
+ /*
+ * Initialize the events filter state model parameter with the default
+ * events filter.
+ */
+ filterStateProperty.set(getDefaultEventFilterState());
+
+ /*
+ * Add a listener to the model parameters property that updates the
+ * properties that expose the individual model parameters when they are
+ * changed through the model parameters property.
+ */
+ modelParamsProperty.addListener(observable -> {
+ final EventsModelParams params = modelParamsProperty.get();
+ if (params != null) {
+ synchronized (EventsModel.this) {
+ eventTypesHierarchyLevelProperty.set(params.getEventTypesHierarchyLevel());
+ filterStateProperty.set(params.getEventFilterState());
+ timeRangeProperty.set(params.getTimeRange());
+ timelineLODProperty.set(params.getTimelineLOD());
+ }
+ }
+ });
+
+ modelParamsProperty.bind(modelParams);
+ }
+
+ /**
+ * Populates the map of data source object IDs to data source names from the
+ * data source data in the case database.
+ */
+ synchronized private void populateDataSourcesCache() throws TskCoreException {
+ datasourceIDsToNamesMap.clear();
+ SleuthkitCase skCase = currentCase.getSleuthkitCase();
+ for (DataSource ds : skCase.getDataSources()) {
+ datasourceIDsToNamesMap.putIfAbsent(ds.getId(), ds.getName());
+ }
+ }
+
+ /**
+ * Adds a data source filter for each data source in the data sources cache
+ * to a given root filter state object.
+ *
+ * @param rootFilterState A root filter state object.
+ */
+ synchronized void addDataSourceFilters(RootFilterState rootFilterState) {
+ DataSourcesFilter dataSourcesFilter = rootFilterState.getDataSourcesFilterState().getFilter();
+ datasourceIDsToNamesMap.entrySet().forEach(entry -> dataSourcesFilter.addSubFilter(newDataSourceFilter(entry)));
+ }
+
+ /**
+ * Gets the count of all events that fit the given model parameters. The
+ * counts are organized by event type for the given event types hierarchy
+ * level.
+ *
+ * @param modelParams The model parameters.
+ *
+ * @return A mapping of event types to event counts at the given event types
+ * hierarchy level.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ private Map countEventsByType(EventsModelParams modelParams) throws TskCoreException {
+ if (modelParams.getTimeRange() == null) {
+ return Collections.emptyMap();
+ } else {
+ return caseDbEventManager.countEventsByType(modelParams.getTimeRange().getStartMillis() / 1000,
+ modelParams.getTimeRange().getEndMillis() / 1000,
+ modelParams.getEventFilterState().getActiveFilter(),
+ modelParams.getEventTypesHierarchyLevel());
+ }
+ }
+
+ /**
+ * Gets the case database events manager.
+ *
+ * @return The case database events manager.
+ */
+ public TimelineManager getEventManager() {
+ return caseDbEventManager;
+ }
+
+ /**
+ * Gets the case database.
+ *
+ * @return The case database.
+ */
+ public SleuthkitCase getSleuthkitCase() {
+ return currentCase.getSleuthkitCase();
+ }
+
+ /**
+ * Gets the model parameters property.
+ *
+ * @return A read only, observable property for the current model
+ * parameters.
+ */
+ synchronized public ReadOnlyObjectProperty modelParamsProperty() {
+ return modelParamsProperty.getReadOnlyProperty();
+ }
+
+ /**
+ * Gets a read only, observable property for the time range model parameter.
+ *
+ * @return The time range model parameter property.
+ */
+ @NbBundle.Messages({
+ "FilteredEventsModel.timeRangeProperty.errorTitle=Timeline",
+ "FilteredEventsModel.timeRangeProperty.errorMessage=Error getting spanning interval."})
+ synchronized public ReadOnlyObjectProperty timeRangeProperty() {
+ if (timeRangeProperty.get() == null) {
+ try {
+ timeRangeProperty.set(EventsModel.this.getSpanningInterval());
+ } catch (TskCoreException timelineCacheException) {
+ MessageNotifyUtil.Notify.error(Bundle.FilteredEventsModel_timeRangeProperty_errorTitle(),
+ Bundle.FilteredEventsModel_timeRangeProperty_errorMessage());
+ logger.log(Level.SEVERE, "Error getting spanning interval.", timelineCacheException);
+ }
+ }
+ return timeRangeProperty.getReadOnlyProperty();
+ }
+
+ /**
+ * Gets a read only, observable property for the timeline level of detail
+ * model parameter.
+ *
+ * @return The timeline level of detail model parameter property.
+ */
+ synchronized public ReadOnlyObjectProperty descriptionLODProperty() {
+ return timelineLODProperty.getReadOnlyProperty();
+ }
+
+ /**
+ * Gets a read only, observable property for the event filter model
+ * parameter.
+ *
+ * @return The event filter model parameter property.
+ */
+ synchronized public ReadOnlyObjectProperty eventFilterProperty() {
+ return filterStateProperty.getReadOnlyProperty();
+ }
+
+ /**
+ * Gets a read only, observable property for the event types hierarchy level
+ * model parameter.
+ *
+ * @return The event types hierarchy level model parameter property.
+ */
+ synchronized public ReadOnlyObjectProperty eventTypesHierarchyLevelProperty() {
+ return eventTypesHierarchyLevelProperty.getReadOnlyProperty();
+ }
+
+ /**
+ * Gets the current model parameters.
+ *
+ * @return The current model parameters.
+ */
+ synchronized public EventsModelParams getModelParams() {
+ return modelParamsProperty.get();
+ }
+
+ /**
+ * Gets the time range model parameter.
+ *
+ * @return The time range model parameter.
+ */
+ synchronized public Interval getTimeRange() {
+ return getModelParams().getTimeRange();
+ }
+
+ /**
+ * Gets the time range model parameter.
+ *
+ * @return The time range model parameter.
+ */
+ synchronized public TimelineLevelOfDetail getDescriptionLOD() {
+ return getModelParams().getTimelineLOD();
+ }
+
+ /**
+ * Gets the event filter model parameter.
+ *
+ * @return The event filter model parameter.
+ */
+ synchronized public RootFilterState getEventFilterState() {
+ return getModelParams().getEventFilterState();
+ }
+
+ /**
+ * Gets the event types hierarchy level model model parameter.
+ *
+ * @return The event types hierarchy level model model parameter.
+ */
+ synchronized public TimelineEventType.HierarchyLevel getEventTypeZoom() {
+ return getModelParams().getEventTypesHierarchyLevel();
+ }
+
+ /**
+ * Gets a new instance of the default event filter state model parameter,
+ * with data source filters for every data source currently in the data
+ * sopurces cache.
+ *
+ * @return An instance of the default filter state model parameter.
+ */
+ public synchronized RootFilterState getDefaultEventFilterState() {
+ /*
+ * Construct data source filters for all of the data sources in the data
+ * sources cache.
+ */
+ DataSourcesFilter dataSourcesFilter = new DataSourcesFilter();
+ datasourceIDsToNamesMap.entrySet().forEach(dataSourceEntry
+ -> dataSourcesFilter.addSubFilter(newDataSourceFilter(dataSourceEntry)));
+
+ /*
+ * Make the rest of the event filters and wrap all of the filters with
+ * filter state objects for the GUI.
+ */
+ RootFilterState rootFilterState = new RootFilterState(new RootFilter(
+ new HideKnownFilter(),
+ new TagsFilter(),
+ new HashHitsFilter(),
+ new TextFilter(),
+ new EventTypeFilter(TimelineEventType.ROOT_EVENT_TYPE),
+ dataSourcesFilter,
+ FilterUtils.createDefaultFileTypesFilter(),
+ Collections.emptySet()));
+
+ return rootFilterState;
+ }
+
+ /**
+ * Gets an event given its event ID.
+ *
+ * @param eventID The event ID.
+ *
+ * @return The event.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public TimelineEvent getEventById(Long eventID) throws TskCoreException {
+ try {
+ return idsToEventsCache.get(eventID);
+ } catch (ExecutionException ex) {
+ throw new TskCoreException("Error getting cached event from ID", ex);
+ }
+ }
+
+ /**
+ * Gets a set of events given their event IDs.
+ *
+ * @param eventIDs The event IDs.
+ *
+ * @return THe events.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Set getEventsById(Collection eventIDs) throws TskCoreException {
+ Set events = new HashSet<>();
+ for (Long id : eventIDs) {
+ events.add(getEventById(id));
+ }
+ return events;
+ }
+
+ /**
+ * Gets a list of event IDs for a given time range and a given events
+ * filter.
+ *
+ * @param timeRange The time range.
+ * @param filterState A filter state object for the events filter.
+ *
+ * @return The events.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public List getEventIDs(Interval timeRange, FilterState extends TimelineFilter> filterState) throws TskCoreException {
+ final Interval overlap;
+ RootFilter intersection;
+ synchronized (this) {
+ overlap = EventsModel.this.getSpanningInterval().overlap(timeRange);
+ intersection = getEventFilterState().intersect(filterState).getActiveFilter();
+ }
+ return caseDbEventManager.getEventIDs(overlap, intersection);
+ }
+
+ /**
+ * Gets a set of event IDs associated with a given file.
+ *
+ * @param file The file.
+ * @param includeDerivedArtifacts If true, also gets the event IDs of events
+ * associated with artifacts for which the
+ * file is the source file.
+ *
+ * @return The event IDs.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Set getEventIDsForFile(AbstractFile file, boolean includeDerivedArtifacts) throws TskCoreException {
+ return caseDbEventManager.getEventIDsForContent(file, includeDerivedArtifacts);
+ }
+
+ /**
+ * Gets a set of event IDs associated with a given artifact.
+ *
+ * @param artifact The artifact.
+ *
+ * @return The event IDs.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public List getEventIDsForArtifact(BlackboardArtifact artifact) throws TskCoreException {
+ return caseDbEventManager.getEventIDsForArtifact(artifact);
+ }
+
+ /**
+ * Gets counts by event type of the events within a given time range.
+ *
+ * @param timeRange The time range.
+ *
+ * @return The event counts by type.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Map getEventCounts(Interval timeRange) throws TskCoreException {
+ final RootFilterState filter;
+ final TimelineEventType.HierarchyLevel typeZoom;
+ synchronized (this) {
+ filter = getEventFilterState();
+ typeZoom = getEventTypeZoom();
+ }
+ try {
+ return eventCountsCache.get(new EventsModelParams(timeRange, typeZoom, filter, null));
+ } catch (ExecutionException executionException) {
+ throw new TskCoreException("Error getting cached event counts.`1", executionException);
+ }
+ }
+
+ /**
+ * Gets the spanning interval for the events that fall within the time range
+ * and event filter model parameters, in terms of a given time zone.
+ *
+ * @param timeZone The time zone.
+ *
+ * @return The spanning interval.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Interval getSpanningInterval(DateTimeZone timeZone) throws TskCoreException {
+ return caseDbEventManager.getSpanningInterval(modelParamsProperty().get().getTimeRange(), getEventFilterState().getActiveFilter(), timeZone);
+ }
+
+ /**
+ * Gets the spanning interval for all of the events in the case database.
+ *
+ * @return The spanning interval.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Interval getSpanningInterval() throws TskCoreException {
+ return new Interval(getMinEventTime() * 1000, 1000 + getMaxEventTime() * 1000);
+ }
+
+ /**
+ * Gets the spanning interval for a collection of events.
+ *
+ * @param eventIDs The event IDs of the events.
+ *
+ * @return The spanning interval.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Interval getSpanningInterval(Collection eventIDs) throws TskCoreException {
+ return caseDbEventManager.getSpanningInterval(eventIDs);
+ }
+
+ /**
+ * Gets the minimum event time in the case database, in seconds since the
+ * UNIX epoch.
+ *
+ * @return The minimum event time.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Long getMinEventTime() throws TskCoreException {
+ try {
+ return minEventTimeCache.get("min"); // NON-NLS
+ } catch (ExecutionException ex) {
+ throw new TskCoreException("Error getting cached min time.", ex);
+ }
+ }
+
+ /**
+ * Gets the maximum event time in the case database, in seconds since the
+ * UNIX epoch.
+ *
+ * @return The maximum event time.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ public Long getMaxEventTime() throws TskCoreException {
+ try {
+ return maxEventTimeCache.get("max"); // NON-NLS
+ } catch (ExecutionException ex) {
+ throw new TskCoreException("Error getting cached max time.", ex);
+ }
+ }
+
+ /**
+ * Updates the events model for a content tag added event and publishes a
+ * tag added event via the model's event bus.
+ *
+ * @param evt The event.
+ *
+ * @return If a tags added event was published via the model's event bus.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ synchronized public boolean handleContentTagAdded(ContentTagAddedEvent evt) throws TskCoreException {
+ ContentTag contentTag = evt.getAddedTag();
+ Content content = contentTag.getContent();
+ Set updatedEventIDs = caseDbEventManager.updateEventsForContentTagAdded(content);
+ if (isNotEmpty(updatedEventIDs)) {
+ invalidateCaches(updatedEventIDs);
+ }
+ return postTagsAdded(updatedEventIDs);
+ }
+
+ /**
+ * Updates the events model for an artifact tag added event and publishes a
+ * tag added event via the model's event bus.
+ *
+ * @param evt The event.
+ *
+ * @return If a tags added event was published via the model's event bus.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ synchronized public boolean handleArtifactTagAdded(BlackBoardArtifactTagAddedEvent evt) throws TskCoreException {
+ BlackboardArtifactTag artifactTag = evt.getAddedTag();
+ BlackboardArtifact artifact = artifactTag.getArtifact();
+ Set updatedEventIDs = caseDbEventManager.updateEventsForArtifactTagAdded(artifact);
+ if (isNotEmpty(updatedEventIDs)) {
+ invalidateCaches(updatedEventIDs);
+ }
+ return postTagsAdded(updatedEventIDs);
+ }
+
+ /**
+ * Updates the events model for a content tag deleted event and publishes a
+ * tag deleted event via the model's event bus.
+ *
+ * @param evt The event.
+ *
+ * @return If a tags deleted event was published via the model's event bus.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ synchronized public boolean handleContentTagDeleted(ContentTagDeletedEvent evt) throws TskCoreException {
+ DeletedContentTagInfo deletedTagInfo = evt.getDeletedTagInfo();
+ Content content = currentCase.getSleuthkitCase().getContentById(deletedTagInfo.getContentID());
+ Set updatedEventIDs = caseDbEventManager.updateEventsForContentTagDeleted(content);
+ if (isNotEmpty(updatedEventIDs)) {
+ invalidateCaches(updatedEventIDs);
+ }
+ return postTagsDeleted(updatedEventIDs);
+ }
+
+ /**
+ * Updates the events model for an artifact tag deleted event and publishes
+ * a tag deleted event via the model's event bus.
+ *
+ * @param evt The event.
+ *
+ * @return If a tags deleted event was published via the model's event bus.
+ *
+ * @throws TskCoreException If there is an error reading model data from the
+ * case database.
+ */
+ synchronized public boolean handleArtifactTagDeleted(BlackBoardArtifactTagDeletedEvent evt) throws TskCoreException {
+ DeletedBlackboardArtifactTagInfo deletedTagInfo = evt.getDeletedTagInfo();
+ BlackboardArtifact artifact = currentCase.getSleuthkitCase().getBlackboardArtifact(deletedTagInfo.getArtifactID());
+ Set updatedEventIDs = caseDbEventManager.updateEventsForArtifactTagDeleted(artifact);
+ if (isNotEmpty(updatedEventIDs)) {
+ invalidateCaches(updatedEventIDs);
+ }
+ return postTagsDeleted(updatedEventIDs);
+ }
+
+ /**
+ * Post a TagsAddedEvent to all registered subscribers, if the given set of
+ * updated event IDs is not empty.
+ *
+ * @param updatedEventIDs The set of event ids to be included in the
+ * TagsAddedEvent.
+ *
+ * @return True if an event was posted.
+ */
+ private boolean postTagsAdded(Set updatedEventIDs) {
+ boolean tagsUpdated = !updatedEventIDs.isEmpty();
+ if (tagsUpdated) {
+ eventbus.post(new TagsAddedEvent(updatedEventIDs));
+ }
+ return tagsUpdated;
+ }
+
+ /**
+ * Post a TagsDeletedEvent to all registered subscribers, if the given set
+ * of updated event IDs is not empty.
+ *
+ * @param updatedEventIDs The set of event ids to be included in the
+ * TagsDeletedEvent.
+ *
+ * @return True if an event was posted.
+ */
+ private boolean postTagsDeleted(Set updatedEventIDs) {
+ boolean tagsUpdated = !updatedEventIDs.isEmpty();
+ if (tagsUpdated) {
+ eventbus.post(new TagsDeletedEvent(updatedEventIDs));
+ }
+ return tagsUpdated;
+ }
+
+ /**
+ * Register the given object to receive events.
+ *
+ * @param subscriber The object to register. Must implement public methods
+ * annotated with Subscribe.
+ */
+ synchronized public void registerForEvents(Object subscriber) {
+ eventbus.register(subscriber);
+ }
+
+ /**
+ * Un-register the given object, so it no longer receives events.
+ *
+ * @param subscriber The object to un-register.
+ */
+ synchronized public void unRegisterForEvents(Object subscriber) {
+ eventbus.unregister(subscriber);
+ }
+
+ /**
+ * Posts a refresh requested event to all registered subscribers.
+ */
+ public void postRefreshRequest() {
+ eventbus.post(new RefreshRequestedEvent());
+ }
+
+ /**
+ * Gets a list of the event types from the case database.
+ *
+ * @return The list of event types.
+ */
+ public ImmutableList getEventTypes() {
+ return caseDbEventManager.getEventTypes();
+ }
+
+ /**
+ * Sets the hash set hits flag for the events associated with the source
+ * files for a collection of hash set hit artifacts.
+ *
+ * @param hashSetHitArtifacts The hash set hit artifacts.
+ *
+ * @return The event IDs of the updated events.
+ *
+ * @throws TskCoreException If there is an error reading model data from or
+ * writing model data to the case database.
+ */
+ synchronized public Set updateEventsForHashSetHits(Collection hashSetHitArtifacts) throws TskCoreException {
+ Set updatedEventIDs = new HashSet<>();
+ for (BlackboardArtifact artifact : hashSetHitArtifacts) {
+ Content content = currentCase.getSleuthkitCase().getContentById(artifact.getObjectID());
+ updatedEventIDs.addAll(caseDbEventManager.updateEventsForHashSetHit(content));
+ }
+ if (isNotEmpty(updatedEventIDs)) {
+ invalidateCaches(updatedEventIDs);
+ }
+ return updatedEventIDs;
+ }
+
+ /**
+ * Invalidates all of the the model caches and publishes a caches
+ * invalidated event. Optionally, a collection of event IDs may be supplied,
+ * in which case only the corresponding entries in the event IDs cache are
+ * invalidated.
+ *
+ * @param updatedEventIDs Either null or a collection of the event IDs.
+ *
+ * @throws TskCoreException
+ */
+ public synchronized void invalidateCaches(Collection updatedEventIDs) throws TskCoreException {
+ populateDataSourcesCache();
+ minEventTimeCache.invalidateAll();
+ maxEventTimeCache.invalidateAll();
+ idsToEventsCache.invalidateAll(emptyIfNull(updatedEventIDs));
+ eventCountsCache.invalidateAll();
+ eventbus.post(new CacheInvalidatedEvent());
+ }
+
+ /**
+ * Event fired when a cache has been invalidated and the views need to be
+ * refreshed
+ */
+ public static class CacheInvalidatedEvent {
+
+ private CacheInvalidatedEvent() {
+ }
+ }
+
+}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/FilteredEventsModel.java b/Core/src/org/sleuthkit/autopsy/timeline/FilteredEventsModel.java
deleted file mode 100755
index 483172844f..0000000000
--- a/Core/src/org/sleuthkit/autopsy/timeline/FilteredEventsModel.java
+++ /dev/null
@@ -1,651 +0,0 @@
-/*
- * Autopsy Forensic Browser
- *
- * Copyright 2011-2019 Basis Technology Corp.
- * Contact: carrier sleuthkit org
- *
- * 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.
- */
-package org.sleuthkit.autopsy.timeline;
-
-import com.google.common.cache.CacheBuilder;
-import com.google.common.cache.LoadingCache;
-import com.google.common.collect.ImmutableList;
-import com.google.common.eventbus.EventBus;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.logging.Level;
-import javafx.beans.InvalidationListener;
-import javafx.beans.property.ReadOnlyObjectProperty;
-import javafx.beans.property.ReadOnlyObjectWrapper;
-import javafx.collections.FXCollections;
-import javafx.collections.ObservableMap;
-import static org.apache.commons.collections4.CollectionUtils.emptyIfNull;
-import static org.apache.commons.collections4.CollectionUtils.isNotEmpty;
-import org.joda.time.DateTimeZone;
-import org.joda.time.Interval;
-import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.casemodule.Case;
-import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagAddedEvent;
-import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent;
-import org.sleuthkit.autopsy.casemodule.events.BlackBoardArtifactTagDeletedEvent.DeletedBlackboardArtifactTagInfo;
-import org.sleuthkit.autopsy.casemodule.events.ContentTagAddedEvent;
-import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent;
-import org.sleuthkit.autopsy.casemodule.events.ContentTagDeletedEvent.DeletedContentTagInfo;
-import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.coreutils.MessageNotifyUtil;
-import org.sleuthkit.autopsy.events.AutopsyEvent;
-import org.sleuthkit.autopsy.timeline.events.RefreshRequestedEvent;
-import org.sleuthkit.autopsy.timeline.events.TagsAddedEvent;
-import org.sleuthkit.autopsy.timeline.events.TagsDeletedEvent;
-import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
-import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
-import org.sleuthkit.autopsy.timeline.utils.CacheLoaderImpl;
-import org.sleuthkit.autopsy.timeline.utils.FilterUtils;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
-import org.sleuthkit.datamodel.AbstractFile;
-import org.sleuthkit.datamodel.BlackboardArtifact;
-import org.sleuthkit.datamodel.BlackboardArtifactTag;
-import org.sleuthkit.datamodel.Content;
-import org.sleuthkit.datamodel.ContentTag;
-import org.sleuthkit.datamodel.DataSource;
-import org.sleuthkit.datamodel.SleuthkitCase;
-import org.sleuthkit.datamodel.TimelineManager;
-import org.sleuthkit.datamodel.TskCoreException;
-import org.sleuthkit.datamodel.TimelineEvent;
-import org.sleuthkit.datamodel.TimelineEventType;
-import org.sleuthkit.datamodel.TimelineFilter;
-import org.sleuthkit.datamodel.TimelineFilter.DataSourceFilter;
-import org.sleuthkit.datamodel.TimelineFilter.DataSourcesFilter;
-import org.sleuthkit.datamodel.TimelineFilter.EventTypeFilter;
-import org.sleuthkit.datamodel.TimelineFilter.FileTypesFilter;
-import org.sleuthkit.datamodel.TimelineFilter.HashHitsFilter;
-import org.sleuthkit.datamodel.TimelineFilter.HideKnownFilter;
-import org.sleuthkit.datamodel.TimelineFilter.RootFilter;
-import org.sleuthkit.datamodel.TimelineFilter.TagsFilter;
-import org.sleuthkit.datamodel.TimelineFilter.TextFilter;
-import org.sleuthkit.datamodel.TimelineLevelOfDetail;
-
-/**
- * This class acts as the model for a TimelineView
- *
- * Views can register listeners on properties returned by methods.
- *
- * This class is implemented as a filtered view into an underlying
- * TimelineManager.
- *
- * Maintainers, NOTE: as many methods as possible should cache their results so
- * as to avoid unnecessary db calls through the TimelineManager -jm
- *
- * Concurrency Policy: TimelineManager is internally synchronized, so methods
- * that only access the TimelineManager atomically do not need further
- * synchronization. All other member state variables should only be accessed
- * with intrinsic lock of containing FilteredEventsModel held.
- *
- */
-public final class FilteredEventsModel {
-
- private static final Logger logger = Logger.getLogger(FilteredEventsModel.class.getName());
-
- private final TimelineManager eventManager;
-
- private final Case autoCase;
- private final EventBus eventbus = new EventBus("FilteredEventsModel_EventBus"); //NON-NLS
-
- //Filter and zoome state
- private final ReadOnlyObjectWrapper requestedFilter = new ReadOnlyObjectWrapper<>();
- private final ReadOnlyObjectWrapper requestedTimeRange = new ReadOnlyObjectWrapper<>();
- private final ReadOnlyObjectWrapper requestedZoomState = new ReadOnlyObjectWrapper<>();
- private final ReadOnlyObjectWrapper requestedTypeZoom = new ReadOnlyObjectWrapper<>(TimelineEventType.HierarchyLevel.CATEGORY);
- private final ReadOnlyObjectWrapper requestedLOD = new ReadOnlyObjectWrapper<>(TimelineLevelOfDetail.LOW);
- // end Filter and zoome state
-
- //caches
- private final LoadingCache maxCache;
- private final LoadingCache minCache;
- private final LoadingCache idToEventCache;
- private final LoadingCache> eventCountsCache;
- /**
- * Map from datasource id to datasource name.
- */
- private final ObservableMap datasourcesMap = FXCollections.observableHashMap();
- // end caches
-
- /**
- * Make a DataSourceFilter from an entry from the datasourcesMap.
- *
- * @param dataSourceEntry A map entry from datasource id to datasource name.
- *
- * @return A new DataSourceFilter for the given datsourcesMap entry.
- */
- private static DataSourceFilter newDataSourceFromMapEntry(Map.Entry dataSourceEntry) {
- return new DataSourceFilter(dataSourceEntry.getValue(), dataSourceEntry.getKey());
- }
-
- public FilteredEventsModel(Case autoCase, ReadOnlyObjectProperty currentStateProperty) throws TskCoreException {
- this.autoCase = autoCase;
- this.eventManager = autoCase.getSleuthkitCase().getTimelineManager();
- populateFilterData();
-
- //caches
- idToEventCache = CacheBuilder.newBuilder()
- .maximumSize(5000L)
- .expireAfterAccess(10, TimeUnit.MINUTES)
- .build(new CacheLoaderImpl<>(eventManager::getEventById));
- eventCountsCache = CacheBuilder.newBuilder()
- .maximumSize(1000L)
- .expireAfterAccess(10, TimeUnit.MINUTES)
- .build(new CacheLoaderImpl<>(this::countEventsByType));
-
- maxCache = CacheBuilder.newBuilder()
- .build(new CacheLoaderImpl<>(ignored -> eventManager.getMaxEventTime()));
- minCache = CacheBuilder.newBuilder()
- .build(new CacheLoaderImpl<>(ignored -> eventManager.getMinEventTime()));
-
- InvalidationListener filterSyncListener = observable -> {
- RootFilterState rootFilter = filterProperty().get();
- syncFilters(rootFilter);
- requestedFilter.set(rootFilter.copyOf());
- };
-
- datasourcesMap.addListener(filterSyncListener);
-
- requestedFilter.set(getDefaultFilter());
-
- requestedZoomState.addListener(observable -> {
- final ZoomState zoomState = requestedZoomState.get();
-
- if (zoomState != null) {
- synchronized (FilteredEventsModel.this) {
- requestedTypeZoom.set(zoomState.getTypeZoomLevel());
- requestedFilter.set(zoomState.getFilterState());
- requestedTimeRange.set(zoomState.getTimeRange());
- requestedLOD.set(zoomState.getDescriptionLOD());
- }
- }
- });
-
- requestedZoomState.bind(currentStateProperty);
- }
-
- /**
- * get the count of all events that fit the given zoom params organized by
- * the EvenType of the level specified in the zoomState
- *
- * @param zoomState The params that control what events to count and how to
- * organize the returned map
- *
- * @return a map from event type( of the requested level) to event counts
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- private Map countEventsByType(ZoomState zoomState) throws TskCoreException {
- if (zoomState.getTimeRange() == null) {
- return Collections.emptyMap();
- } else {
- return eventManager.countEventsByType(zoomState.getTimeRange().getStartMillis() / 1000,
- zoomState.getTimeRange().getEndMillis() / 1000,
- zoomState.getFilterState().getActiveFilter(), zoomState.getTypeZoomLevel());
- }
- }
-
- public TimelineManager getEventManager() {
- return eventManager;
- }
-
- public SleuthkitCase getSleuthkitCase() {
- return autoCase.getSleuthkitCase();
- }
-
- public Interval getBoundingEventsInterval(Interval timeRange, RootFilter filter, DateTimeZone timeZone) throws TskCoreException {
- return eventManager.getSpanningInterval(timeRange, filter, timeZone);
- }
-
- /**
- * Readonly observable property for the current ZoomState
- *
- * @return A readonly observable property for the current ZoomState.
- */
- synchronized public ReadOnlyObjectProperty zoomStateProperty() {
- return requestedZoomState.getReadOnlyProperty();
- }
-
- /**
- * Get the current ZoomState
- *
- * @return The current ZoomState
- */
- synchronized public ZoomState getZoomState() {
- return requestedZoomState.get();
- }
-
- /**
- * Update the data used to determine the available filters.
- */
- synchronized private void populateFilterData() throws TskCoreException {
- SleuthkitCase skCase = autoCase.getSleuthkitCase();
-
- //because there is no way to remove a datasource we only add to this map.
- for (DataSource ds : skCase.getDataSources()) {
- datasourcesMap.putIfAbsent(ds.getId(), ds.getName());
- }
- }
-
- /**
- * "sync" the given root filter with the state of the casee: Disable filters
- * for tags that are not in use in the case, and add new filters for tags,
- * hashsets, and datasources, that don't have them. New filters are selected
- * by default.
- *
- * @param rootFilterState the filter state to modify so it is consistent
- * with the tags in use in the case
- */
- public void syncFilters(RootFilterState rootFilterState) {
- DataSourcesFilter dataSourcesFilter = rootFilterState.getDataSourcesFilterState().getFilter();
- datasourcesMap.entrySet().forEach(entry -> dataSourcesFilter.addSubFilter(newDataSourceFromMapEntry(entry)));
- }
-
- /**
- * Get a read only view of the time range currently in view.
- *
- * @return A read only view of the time range currently in view.
- */
- @NbBundle.Messages({
- "FilteredEventsModel.timeRangeProperty.errorTitle=Timeline",
- "FilteredEventsModel.timeRangeProperty.errorMessage=Error getting spanning interval."})
- synchronized public ReadOnlyObjectProperty timeRangeProperty() {
- if (requestedTimeRange.get() == null) {
- try {
- requestedTimeRange.set(getSpanningInterval());
- } catch (TskCoreException timelineCacheException) {
- MessageNotifyUtil.Notify.error(Bundle.FilteredEventsModel_timeRangeProperty_errorTitle(),
- Bundle.FilteredEventsModel_timeRangeProperty_errorMessage());
- logger.log(Level.SEVERE, "Error getting spanning interval.", timelineCacheException);
- }
- }
- return requestedTimeRange.getReadOnlyProperty();
- }
-
- synchronized public ReadOnlyObjectProperty descriptionLODProperty() {
- return requestedLOD.getReadOnlyProperty();
- }
-
- synchronized public ReadOnlyObjectProperty filterProperty() {
- return requestedFilter.getReadOnlyProperty();
- }
-
- synchronized public ReadOnlyObjectProperty eventTypeZoomProperty() {
- return requestedTypeZoom.getReadOnlyProperty();
- }
-
- /**
- * The time range currently in view.
- *
- * @return The time range currently in view.
- */
- synchronized public Interval getTimeRange() {
- return getZoomState().getTimeRange();
- }
-
- synchronized public TimelineLevelOfDetail getDescriptionLOD() {
- return getZoomState().getDescriptionLOD();
- }
-
- synchronized public RootFilterState getFilterState() {
- return getZoomState().getFilterState();
- }
-
- synchronized public TimelineEventType.HierarchyLevel getEventTypeZoom() {
- return getZoomState().getTypeZoomLevel();
- }
-
- /**
- * Get the default filter used at startup.
- *
- * @return the default filter used at startup
- */
- public synchronized RootFilterState getDefaultFilter() {
- DataSourcesFilter dataSourcesFilter = new DataSourcesFilter();
- datasourcesMap.entrySet().forEach(dataSourceEntry
- -> dataSourcesFilter.addSubFilter(newDataSourceFromMapEntry(dataSourceEntry)));
-
- HashHitsFilter hashHitsFilter = new HashHitsFilter();
-
- TagsFilter tagsFilter = new TagsFilter();
-
- FileTypesFilter fileTypesFilter = FilterUtils.createDefaultFileTypesFilter();
-
- return new RootFilterState(new RootFilter(new HideKnownFilter(),
- tagsFilter,
- hashHitsFilter,
- new TextFilter(),
- new EventTypeFilter(TimelineEventType.ROOT_EVENT_TYPE),
- dataSourcesFilter,
- fileTypesFilter,
- Collections.emptySet()));
- }
-
- public Interval getBoundingEventsInterval(DateTimeZone timeZone) throws TskCoreException {
- return eventManager.getSpanningInterval(zoomStateProperty().get().getTimeRange(), getFilterState().getActiveFilter(), timeZone);
- }
-
- public TimelineEvent getEventById(Long eventID) throws TskCoreException {
- try {
- return idToEventCache.get(eventID);
- } catch (ExecutionException ex) {
- throw new TskCoreException("Error getting cached event from ID", ex);
- }
- }
-
- public Set getEventsById(Collection eventIDs) throws TskCoreException {
- Set events = new HashSet<>();
- for (Long id : eventIDs) {
- events.add(getEventById(id));
- }
- return events;
- }
-
- public List getEventIDs(Interval timeRange, FilterState extends TimelineFilter> filter) throws TskCoreException {
-
- final Interval overlap;
- RootFilter intersection;
- synchronized (this) {
- overlap = getSpanningInterval().overlap(timeRange);
- intersection = getFilterState().intersect(filter).getActiveFilter();
- }
-
- return eventManager.getEventIDs(overlap, intersection);
- }
-
- /**
- * Return the number of events that pass the requested filter and are within
- * the given time range.
- *
- * NOTE: this method does not change the requested time range
- *
- * @param timeRange
- *
- * @return
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Map getEventCounts(Interval timeRange) throws TskCoreException {
-
- final RootFilterState filter;
- final TimelineEventType.HierarchyLevel typeZoom;
- synchronized (this) {
- filter = getFilterState();
- typeZoom = getEventTypeZoom();
- }
- try {
- return eventCountsCache.get(new ZoomState(timeRange, typeZoom, filter, null));
- } catch (ExecutionException executionException) {
- throw new TskCoreException("Error getting cached event counts.`1", executionException);
- }
- }
-
- /**
- * @return The smallest interval spanning all the events from the case,
- * ignoring any filters or requested ranges.
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Interval getSpanningInterval() throws TskCoreException {
- return new Interval(getMinTime() * 1000, 1000 + getMaxTime() * 1000);
- }
-
- /**
- * Get the smallest interval spanning all the given events.
- *
- * @param eventIDs The IDs of the events to get a spanning interval arround.
- *
- * @return the smallest interval spanning all the given events
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Interval getSpanningInterval(Collection eventIDs) throws TskCoreException {
- return eventManager.getSpanningInterval(eventIDs);
- }
-
- /**
- * @return the time (in seconds from unix epoch) of the absolutely first
- * event available from the repository, ignoring any filters or
- * requested ranges
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Long getMinTime() throws TskCoreException {
- try {
- return minCache.get("min"); // NON-NLS
- } catch (ExecutionException ex) {
- throw new TskCoreException("Error getting cached min time.", ex);
- }
- }
-
- /**
- * @return the time (in seconds from unix epoch) of the absolutely last
- * event available from the repository, ignoring any filters or
- * requested ranges
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Long getMaxTime() throws TskCoreException {
- try {
- return maxCache.get("max"); // NON-NLS
- } catch (ExecutionException ex) {
- throw new TskCoreException("Error getting cached max time.", ex);
- }
- }
-
- synchronized public boolean handleContentTagAdded(ContentTagAddedEvent evt) throws TskCoreException {
- ContentTag contentTag = evt.getAddedTag();
- Content content = contentTag.getContent();
- Set updatedEventIDs = eventManager.updateEventsForContentTagAdded(content);
- if (isNotEmpty(updatedEventIDs)) {
- invalidateCaches(updatedEventIDs);
- }
- return postTagsAdded(updatedEventIDs);
- }
-
- synchronized public boolean handleArtifactTagAdded(BlackBoardArtifactTagAddedEvent evt) throws TskCoreException {
- BlackboardArtifactTag artifactTag = evt.getAddedTag();
- BlackboardArtifact artifact = artifactTag.getArtifact();
- Set updatedEventIDs = eventManager.updateEventsForArtifactTagAdded(artifact);
- if (isNotEmpty(updatedEventIDs)) {
- invalidateCaches(updatedEventIDs);
- }
- return postTagsAdded(updatedEventIDs);
- }
-
- synchronized public boolean handleContentTagDeleted(ContentTagDeletedEvent evt) throws TskCoreException {
- DeletedContentTagInfo deletedTagInfo = evt.getDeletedTagInfo();
- Content content = autoCase.getSleuthkitCase().getContentById(deletedTagInfo.getContentID());
- Set updatedEventIDs = eventManager.updateEventsForContentTagDeleted(content);
- if (isNotEmpty(updatedEventIDs)) {
- invalidateCaches(updatedEventIDs);
- }
- return postTagsDeleted(updatedEventIDs);
- }
-
- synchronized public boolean handleArtifactTagDeleted(BlackBoardArtifactTagDeletedEvent evt) throws TskCoreException {
- DeletedBlackboardArtifactTagInfo deletedTagInfo = evt.getDeletedTagInfo();
- BlackboardArtifact artifact = autoCase.getSleuthkitCase().getBlackboardArtifact(deletedTagInfo.getArtifactID());
- Set updatedEventIDs = eventManager.updateEventsForArtifactTagDeleted(artifact);
- if (isNotEmpty(updatedEventIDs)) {
- invalidateCaches(updatedEventIDs);
- }
- return postTagsDeleted(updatedEventIDs);
- }
-
- /**
- * Get a Set of event IDs for the events that are derived from the given
- * file.
- *
- * @param file The AbstractFile to get derived event IDs
- * for.
- * @param includeDerivedArtifacts If true, also get event IDs for events
- * derived from artifacts derived form this
- * file. If false, only gets events derived
- * directly from this file (file system
- * timestamps).
- *
- * @return A Set of event IDs for the events that are derived from the given
- * file.
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public Set getEventIDsForFile(AbstractFile file, boolean includeDerivedArtifacts) throws TskCoreException {
- return eventManager.getEventIDsForContent(file, includeDerivedArtifacts);
- }
-
- /**
- * Get a List of event IDs for the events that are derived from the given
- * artifact.
- *
- * @param artifact The BlackboardArtifact to get derived event IDs for.
- *
- * @return A List of event IDs for the events that are derived from the
- * given artifact.
- *
- * @throws org.sleuthkit.datamodel.TskCoreException
- */
- public List getEventIDsForArtifact(BlackboardArtifact artifact) throws TskCoreException {
- return eventManager.getEventIDsForArtifact(artifact);
- }
-
- /**
- * Post a TagsAddedEvent to all registered subscribers, if the given set of
- * updated event IDs is not empty.
- *
- * @param updatedEventIDs The set of event ids to be included in the
- * TagsAddedEvent.
- *
- * @return True if an event was posted.
- */
- private boolean postTagsAdded(Set updatedEventIDs) {
- boolean tagsUpdated = !updatedEventIDs.isEmpty();
- if (tagsUpdated) {
- eventbus.post(new TagsAddedEvent(updatedEventIDs));
- }
- return tagsUpdated;
- }
-
- /**
- * Post a TagsDeletedEvent to all registered subscribers, if the given set
- * of updated event IDs is not empty.
- *
- * @param updatedEventIDs The set of event ids to be included in the
- * TagsDeletedEvent.
- *
- * @return True if an event was posted.
- */
- private boolean postTagsDeleted(Set updatedEventIDs) {
- boolean tagsUpdated = !updatedEventIDs.isEmpty();
- if (tagsUpdated) {
- eventbus.post(new TagsDeletedEvent(updatedEventIDs));
- }
- return tagsUpdated;
- }
-
- /**
- * Register the given object to receive events.
- *
- * @param subscriber The object to register. Must implement public methods
- * annotated with Subscribe.
- */
- synchronized public void registerForEvents(Object subscriber) {
- eventbus.register(subscriber);
- }
-
- /**
- * Un-register the given object, so it no longer receives events.
- *
- * @param subscriber The object to un-register.
- */
- synchronized public void unRegisterForEvents(Object subscriber) {
- eventbus.unregister(subscriber);
- }
-
- /**
- * Post a RefreshRequestedEvent to all registered subscribers.
- */
- public void postRefreshRequest() {
- eventbus.post(new RefreshRequestedEvent());
- }
-
- /**
- * (Re)Post an AutopsyEvent received from another event distribution system
- * locally to all registered subscribers.
- *
- * @param event The event to re-post.
- */
- public void postAutopsyEventLocally(AutopsyEvent event) {
- eventbus.post(event);
- }
-
- public ImmutableList getEventTypes() {
- return eventManager.getEventTypes();
- }
-
- synchronized public Set setHashHit(Collection artifacts) throws TskCoreException {
- Set updatedEventIDs = new HashSet<>();
- for (BlackboardArtifact artifact : artifacts) {
- Content content = autoCase.getSleuthkitCase().getContentById(artifact.getObjectID());
- updatedEventIDs.addAll(eventManager.updateEventsForHashSetHit(content));
- }
- if (isNotEmpty(updatedEventIDs)) {
- invalidateCaches(updatedEventIDs);
- }
- return updatedEventIDs;
- }
-
- /**
- * Invalidate the timeline caches for the given event IDs. Also forces the
- * filter values to be updated with any new values from the case data.( data
- * sources, tags, etc)
- *
- * @param updatedEventIDs A collection of the event IDs whose cached event
- * objects should be invalidated. Can be null or an
- * empty sett to invalidate the general caches, such
- * as min/max time, or the counts per event type.
- *
- * @throws TskCoreException
- */
- public synchronized void invalidateCaches(Collection updatedEventIDs) throws TskCoreException {
- minCache.invalidateAll();
- maxCache.invalidateAll();
- idToEventCache.invalidateAll(emptyIfNull(updatedEventIDs));
- eventCountsCache.invalidateAll();
-
- populateFilterData();
-
- eventbus.post(new CacheInvalidatedEvent());
- }
-
- /**
- * Event fired when a cache has been invalidated. The UI should make it
- * clear that the view is potentially out of date and present an action to
- * refresh the view.
- */
- public static class CacheInvalidatedEvent {
-
- private CacheInvalidatedEvent() {
- }
- }
-}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java b/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java
index 1c1dae4165..abad95b2ff 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ShowInTimelineDialog.java
@@ -195,7 +195,7 @@ final class ShowInTimelineDialog extends Dialog {
//add events to table
Set events = new HashSet<>();
- FilteredEventsModel eventsModel = controller.getEventsModel();
+ EventsModel eventsModel = controller.getEventsModel();
for (Long eventID : eventIDS) {
try {
events.add(eventsModel.getEventById(eventID));
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java
index 8235fb79f3..adf4509e76 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/TimeLineController.java
@@ -1,7 +1,7 @@
/*
* Autopsy Forensic Browser
*
- * Copyright 2014-2018 Basis Technology Corp.
+ * Copyright 2014-2019 Basis Technology Corp.
* Contact: carrier sleuthkit org
*
* Licensed under the Apache License, Version 2.0 (the "License");
@@ -85,11 +85,10 @@ import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.DescriptionFilterSt
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
import org.sleuthkit.autopsy.timeline.utils.IntervalUtils;
import org.sleuthkit.autopsy.timeline.zooming.TimeUnits;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
import org.sleuthkit.datamodel.AbstractFile;
import org.sleuthkit.datamodel.BlackboardArtifact;
import static org.sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE.TSK_HASHSET_HIT;
-import org.sleuthkit.datamodel.TimelineEvent;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TimelineEventType;
import org.sleuthkit.datamodel.TimelineFilter.EventTypeFilter;
@@ -200,16 +199,16 @@ public class TimeLineController {
private final ReadOnlyObjectWrapper viewMode = new ReadOnlyObjectWrapper<>(ViewMode.COUNTS);
@GuardedBy("filteredEvents")
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
@GuardedBy("this")
- private final ZoomState InitialZoomState;
+ private final EventsModelParams InitialZoomState;
@GuardedBy("this")
- private final History historyManager = new History<>();
+ private final History historyManager = new History<>();
@GuardedBy("this")
- private final ReadOnlyObjectWrapper currentParams = new ReadOnlyObjectWrapper<>();
+ private final ReadOnlyObjectWrapper currentParams = new ReadOnlyObjectWrapper<>();
//selected events (ie shown in the result viewer)
@GuardedBy("this")
@@ -281,7 +280,7 @@ public class TimeLineController {
TimeLineController(Case autoCase) throws TskCoreException {
this.autoCase = autoCase;
- filteredEvents = new FilteredEventsModel(autoCase, currentParams.getReadOnlyProperty());
+ filteredEvents = new EventsModel(autoCase, currentParams.getReadOnlyProperty());
/*
* as the history manager's current state changes, modify the tags
* filter to be in sync, and expose that as propery from
@@ -289,16 +288,16 @@ public class TimeLineController {
* filters?
*/
historyManager.currentState().addListener((observable, oldState, newState) -> {
- ZoomState historyManagerState = newState;
- filteredEvents.syncFilters(historyManagerState.getFilterState());
+ EventsModelParams historyManagerState = newState;
+ filteredEvents.addDataSourceFilters(historyManagerState.getEventFilterState());
currentParams.set(historyManagerState);
});
try {
- InitialZoomState = new ZoomState(filteredEvents.getSpanningInterval(),
+ InitialZoomState = new EventsModelParams(filteredEvents.getSpanningInterval(),
TimelineEventType.HierarchyLevel.CATEGORY,
- filteredEvents.filterProperty().get(),
+ filteredEvents.eventFilterProperty().get(),
TimelineLevelOfDetail.LOW);
} catch (TskCoreException ex) {
throw new TskCoreException("Error getting spanning interval.", ex);
@@ -318,17 +317,17 @@ public class TimeLineController {
/**
* @return a shared events model
*/
- public FilteredEventsModel getEventsModel() {
+ public EventsModel getEventsModel() {
return filteredEvents;
}
public void applyDefaultFilters() {
- pushFilters(filteredEvents.getDefaultFilter());
+ pushFilters(filteredEvents.getDefaultEventFilterState());
}
public void zoomOutToActivity() throws TskCoreException {
- Interval boundingEventsInterval = filteredEvents.getBoundingEventsInterval(getJodaTimeZone());
- advance(filteredEvents.zoomStateProperty().get().withTimeRange(boundingEventsInterval));
+ Interval boundingEventsInterval = filteredEvents.getSpanningInterval(getJodaTimeZone());
+ advance(filteredEvents.modelParamsProperty().get().withTimeRange(boundingEventsInterval));
}
private final ObservableSet pinnedEvents = FXCollections.observableSet();
@@ -494,7 +493,7 @@ public class TimeLineController {
}
synchronized public void pushEventTypeZoom(TimelineEventType.HierarchyLevel typeZoomeLevel) {
- ZoomState currentZoom = filteredEvents.zoomStateProperty().get();
+ EventsModelParams currentZoom = filteredEvents.modelParamsProperty().get();
if (currentZoom == null) {
advance(InitialZoomState.withTypeZoomLevel(typeZoomeLevel));
} else if (currentZoom.hasTypeZoomLevel(typeZoomeLevel) == false) {
@@ -525,7 +524,7 @@ public class TimeLineController {
}
}
- ZoomState currentZoom = filteredEvents.zoomStateProperty().get();
+ EventsModelParams currentZoom = filteredEvents.modelParamsProperty().get();
if (currentZoom == null) {
advance(InitialZoomState.withTimeRange(clampedTimeRange));
return true;
@@ -556,7 +555,7 @@ public class TimeLineController {
}
synchronized public void pushDescrLOD(TimelineLevelOfDetail newLOD) {
- ZoomState currentZoom = filteredEvents.zoomStateProperty().get();
+ EventsModelParams currentZoom = filteredEvents.modelParamsProperty().get();
if (currentZoom == null) {
advance(InitialZoomState.withDescrLOD(newLOD));
} else if (currentZoom.hasDescrLOD(newLOD) == false) {
@@ -567,7 +566,7 @@ public class TimeLineController {
@SuppressWarnings("AssignmentToMethodParameter") //clamp timerange to case
synchronized public void pushTimeAndType(Interval timeRange, TimelineEventType.HierarchyLevel typeZoom) throws TskCoreException {
Interval overlappingTimeRange = this.filteredEvents.getSpanningInterval().overlap(timeRange);
- ZoomState currentZoom = filteredEvents.zoomStateProperty().get();
+ EventsModelParams currentZoom = filteredEvents.modelParamsProperty().get();
if (currentZoom == null) {
advance(InitialZoomState.withTimeAndType(overlappingTimeRange, typeZoom));
} else if (currentZoom.hasTimeRange(overlappingTimeRange) == false && currentZoom.hasTypeZoomLevel(typeZoom) == false) {
@@ -580,7 +579,7 @@ public class TimeLineController {
}
synchronized public void pushFilters(RootFilterState filter) {
- ZoomState currentZoom = filteredEvents.zoomStateProperty().get();
+ EventsModelParams currentZoom = filteredEvents.modelParamsProperty().get();
if (currentZoom == null) {
advance(InitialZoomState.withFilterState(filter));
} else if (currentZoom.hasFilterState(filter) == false) {
@@ -596,7 +595,7 @@ public class TimeLineController {
historyManager.retreat();
}
- synchronized private void advance(ZoomState newState) {
+ synchronized private void advance(EventsModelParams newState) {
historyManager.advance(newState);
}
@@ -746,7 +745,7 @@ public class TimeLineController {
case DATA_ADDED:
ModuleDataEvent eventData = (ModuleDataEvent) evt.getOldValue();
if (null != eventData && eventData.getBlackboardArtifactType().getTypeID() == TSK_HASHSET_HIT.getTypeID()) {
- logFutureException(executor.submit(() -> filteredEvents.setHashHit(eventData.getArtifacts())),
+ logFutureException(executor.submit(() -> filteredEvents.updateEventsForHashSetHits(eventData.getArtifacts())),
"Error executing task in response to DATA_ADDED event.",
"Error executing response to new data.");
}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties
old mode 100755
new mode 100644
index af71283ca2..ae83b8c4ac
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/Bundle_ja.properties
@@ -1,26 +1,39 @@
-Back.longText=\u6700\u5F8C\u306E\u30D3\u30E5\u30FC\u8A2D\u5B9A\u306B\u623B\u308B\u3002
-Back.text=\u623B\u308B
-Forward.text=\u6B21\u3078
-OpenReportAction.DisplayName=\u30EC\u30DD\u30FC\u30C8\u3092\u958B\u304F
-OpenReportAction.MessageBoxTitle=\u30EC\u30DD\u30FC\u30C8\u3092\u958B\u304F\u306E\u3092\u5931\u6557\u3057\u307E\u3057\u305F
-OpenReportAction.MissingReportFileMessage=\u30EC\u30DD\u30FC\u30C8\u30D5\u30A1\u30A4\u30EB\u304C\u5B58\u5728\u3057\u307E\u305B\u3093\u3002
-OpenReportAction.NoAssociatedEditorMessage=\u3053\u306E\u30BF\u30A4\u30D7\u306E\u30EC\u30DD\u30FC\u30C8\u306E\u95A2\u9023\u30A8\u30C7\u30A3\u30BF\u30FC\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u307E\u305F\u306F\u95A2\u9023\u306E\u30A2\u30D7\u30EA\u30B1\u30FC\u30B7\u30E7\u30F3\u304C\u8D77\u52D5\u3057\u307E\u305B\u3093\u3067\u3057\u305F\u3002
-OpenReportAction.NoOpenInEditorSupportMessage=\u3053\u306E\u30D7\u30E9\u30C3\u30C8\u30D5\u30A9\u30FC\u30E0\uFF08\u30AA\u30DA\u30EC\u30FC\u30C6\u30A3\u30F3\u30B0\u30B7\u30B9\u30C6\u30E0\uFF09\u306F\u3053\u306E\u3088\u3046\u306B\u30D5\u30A1\u30A4\u30EB\u3092\u30A8\u30C7\u30A3\u30BF\u30FC\u3067\u958B\u304F\u306E\u3092\u30B5\u30DD\u30FC\u30C8\u3057\u3066\u3044\u307E\u305B\u3093\u3002
-OpenReportAction.ReportFileOpenPermissionDeniedMessage=\u30EC\u30DD\u30FC\u30C8\u30D5\u30A1\u30A4\u30EB\u3092\u958B\u304F\u8A31\u53EF\u304C\u5374\u4E0B\u3055\u308C\u307E\u3057\u305F\u3002
-ResetFilters.text=\u5168\u3066\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30EA\u30BB\u30C3\u30C8
-RestFilters.longText=\u5168\u3066\u306E\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\u30C7\u30D5\u30A9\u30EB\u30C8\u72B6\u614B\u306B\u30EA\u30BB\u30C3\u30C8\u3057\u307E\u3059\u3002
-SaveSnapshot.action.longText=\u30EC\u30DD\u30FC\u30C8\u3068\u3057\u3066\u30D3\u30B8\u30E5\u30A2\u30E9\u30A4\u30BC\u30FC\u30B7\u30E7\u30F3\uFF08\u53EF\u8996\u5316\uFF09\u306E\u30B9\u30AF\u30EA\u30FC\u30F3\u30AD\u30E3\u30D7\u30C1\u30E3\u3092\u4FDD\u5B58\u3057\u307E\u3059\u3002
-SaveSnapshot.action.name.text=\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u30EC\u30DD\u30FC\u30C8
-SaveSnapshot.fileChoose.title.text=\u6B21\u3078\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u4FDD\u5B58
-SaveSnapShotAsReport.ErrorWritingReport=\u30EC\u30DD\u30FC\u30C8{0}\u3092\u30C7\u30A3\u30B9\u30AF\u306B\u66F8\u304D\u8FBC\u3081\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u8A73\u7D30\u306F\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-SaveSnapShotAsReport.FailedToAddReport=\u30EC\u30DD\u30FC\u30C8\u3068\u3057\u3066\u30B9\u30CA\u30C3\u30D7\u30B7\u30E7\u30C3\u30C8\u3092\u8FFD\u52A0\u3067\u304D\u307E\u305B\u3093\u3067\u3057\u305F\u3002\u8A73\u7D30\u306F\u30ED\u30B0\u3092\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002
-SaveSnapsHotAsReport.ReportName=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3\u30FC\u30EC\u30DD\u30FC\u30C8\u30FC{0}
-SaveSnapShotAsReport.ReportSavedAt=\u30EC\u30DD\u30FC\u30C8\u306F\u6B21\u3078\u4FDD\u5B58\u3055\u308C\u307E\u3057\u305F[{0}]
-SaveSnapShotAsReport.Success=\u6210\u529F
-Timeline.ModuleName=\u30BF\u30A4\u30E0\u30E9\u30A4\u30F3
-ZoomIn.action.text=\u62E1\u5927
-ZoomIn.longText=\u304A\u3088\u305D\u534A\u5206\u306E\u6642\u9593\u3092\u8868\u793A\u3059\u308B\u3088\u3046\u306B\u62E1\u5927\u3057\u307E\u3059\u3002
-ZoomOut.action.text=\u7E2E\u5C0F
-ZoomOut.longText=\u304A\u3088\u305D50%\u591A\u304F\u8868\u793A\u3059\u308B\u3088\u3046\u306B\u7E2E\u5C0F\u3057\u307E\u3059\u3002
-ZoomToEvents.action.text=\u30A4\u30D9\u30F3\u30C8\u306B\u30BA\u30FC\u30E0
-ZoomToEvents.longText=\u4E00\u756A\u8FD1\u304F\u306E\u30A4\u30D9\u30F3\u30C8\u304C\u8868\u793A\u3055\u308C\u308B\u3088\u3046\u306B\u7E2E\u5C0F\u3057\u307E\u3059\u3002
+# {0} - \u30a2\u30af\u30b7\u30e7\u30f3\u30fb\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30bf\u30fb\u30ad\u30fc
+Back.longText=\u623b\u308b: {0}\n\u524d\u306e\u30d3\u30e5\u30fc\u8a2d\u5b9a\u306b\u623b\u308a\u307e\u3059\u3002
+Back.text=\u623b\u308b
+# {0} - \u30a2\u30af\u30b7\u30e7\u30f3\u30fb\u30a2\u30af\u30bb\u30e9\u30ec\u30fc\u30bf\u30fb\u30ad\u30fc
+Forward.longText=\u9032\u3080: {0}\n\u6b21\u306e\u30d3\u30e5\u30fc\u8a2d\u5b9a\u306b\u9032\u307f\u307e\u3059\u3002
+Forward.text=\u9032\u3080
+OpenReportAction.DisplayName=\u30ec\u30dd\u30fc\u30c8\u3092\u958b\u304f
+OpenReportAction.MessageBoxTitle=\u30ec\u30dd\u30fc\u30c8\u30aa\u30fc\u30d7\u30f3\u5931\u6557
+OpenReportAction.MissingReportFileMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u305b\u3093\u3002
+OpenReportAction.NoAssociatedEditorMessage=\u3053\u306e\u30bf\u30a4\u30d7\u306e\u30ec\u30dd\u30fc\u30c8\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a8\u30c7\u30a3\u30bf\u30fc\u304c\u306a\u3044\u304b\u3001\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3066\u3044\u308b\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u304c\u8d77\u52d5\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+OpenReportAction.NoOpenInEditorSupportMessage=\u3053\u306e\u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0(\u30aa\u30da\u30ec\u30fc\u30c6\u30a3\u30f3\u30b0\u30b7\u30b9\u30c6\u30e0)\u306f\u3053\u306e\u65b9\u6cd5\u3067\u30a8\u30c7\u30a3\u30bf\u30fc\u3067\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u3053\u3068\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002
+OpenReportAction.ReportFileOpenPermissionDeniedMessage=\u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f\u8a31\u53ef\u304c\u62d2\u5426\u3055\u308c\u307e\u3057\u305f\u3002
+RebuildDataBase.longText=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0\u3057\u3066\u65b0\u3057\u3044\u30a4\u30d9\u30f3\u30c8\u3092\u542b\u3081\u307e\u3059\u3002
+RebuildDataBase.text=\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u66f4\u65b0
+ResetFilters.text=\u3059\u3079\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ea\u30bb\u30c3\u30c8
+RestFilters.longText=\u3059\u3079\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u72b6\u614b\u306b\u30ea\u30bb\u30c3\u30c8\u3057\u307e\u3059\u3002
+SaveSnapShotAsReport.action.dialogs.title=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+SaveSnapShotAsReport.action.longText=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u73fe\u5728\u306e\u30d3\u30e5\u30fc\u306e\u30b9\u30af\u30ea\u30fc\u30f3\u30ad\u30e3\u30d7\u30c1\u30e3\u30fc\u3092\u30ec\u30dd\u30fc\u30c8\u3068\u3057\u3066\u4fdd\u5b58\u3057\u307e\u3059\u3002
+SaveSnapShotAsReport.action.name.text=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u30fb\u30ec\u30dd\u30fc\u30c8
+SaveSnapShotAsReport.duplicateReportNameError.text=\u305d\u306e\u540d\u524d\u306e\u30ec\u30dd\u30fc\u30c8\u306f\u3059\u3067\u306b\u5b58\u5728\u3057\u307e\u3059\u3002
+# {0} - \u30ec\u30dd\u30fc\u30c8\u30d1\u30b9
+SaveSnapShotAsReport.ErrorWritingReport={0} \u306b\u3042\u308b\u30c7\u30a3\u30b9\u30af\u306b\u30ec\u30dd\u30fc\u30c8\u3092\u66f8\u8fbc\u307f\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+SaveSnapShotAsReport.FailedToAddReport=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u30b1\u30fc\u30b9\u3068\u3057\u3066\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002
+SaveSnapShotAsReport.reportName.header=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u30fb\u30ec\u30dd\u30fc\u30c8\u306e\u30ec\u30dd\u30fc\u30c8\u540d\u3092\u5165\u529b\u3057\u307e\u3059\u3002
+# {0} - \u751f\u6210\u3055\u308c\u305f\u30c7\u30d5\u30a9\u30eb\u30c8\u30ec\u30dd\u30fc\u30c8\u540d
+SaveSnapShotAsReport.reportName.prompt=\u6b21\u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u30ec\u30dd\u30fc\u30c8\u540d\u3092\u7a7a(\u672a\u5165\u529b)\u306e\u307e\u307e\u306b\u3059\u308b: {0}\u3002
+# {0} - \u30ec\u30dd\u30fc\u30c8\u30d5\u30a1\u30a4\u30eb\u30d1\u30b9
+SaveSnapShotAsReport.ReportSavedAt=[{0}] \u306b\u30ec\u30dd\u30fc\u30c8\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f
+SaveSnapShotAsReport.Success=\u6210\u529f
+Timeline.ModuleName=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3
+ViewArtifactInTimelineAction.displayName=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u7d50\u679c\u3092\u8868\u793a...
+ViewFileInTimelineAction.viewFile.displayName=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a...
+DataResultFilterNode.action.viewSrcFileInDir.text=\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u30bd\u30fc\u30b9\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a...
+ZoomIn.action.text=\u30ba\u30fc\u30e0\u30a4\u30f3
+ZoomIn.longText=\u30ba\u30fc\u30e0\u30a4\u30f3\u3057\u3066\u7d04\u534a\u5206\u306e\u6642\u9593\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+ZoomOut.action.text=\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
+ZoomOut.longText=\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8\u3057\u3066\u7d0450%\u4ee5\u4e0a\u306e\u6642\u9593\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+ZoomToEvents.action.text=\u30a4\u30d9\u30f3\u30c8\u306b\u30ba\u30fc\u30e0
+ZoomToEvents.longText=\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8\u3057\u3066\u6700\u3082\u6700\u8fd1\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u8868\u793a\u3057\u307e\u3059\u3002
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java
index 30ed0ebb81..57f0ed61e5 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/ResetFilters.java
@@ -22,7 +22,7 @@ import javafx.beans.binding.BooleanBinding;
import javafx.event.ActionEvent;
import org.controlsfx.control.action.Action;
import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
/**
@@ -32,7 +32,7 @@ import org.sleuthkit.autopsy.timeline.TimeLineController;
"RestFilters.longText=Reset all filters to their default state."})
public class ResetFilters extends Action {
- private FilteredEventsModel eventsModel;
+ private EventsModel eventsModel;
public ResetFilters(final TimeLineController controller) {
this(Bundle.ResetFilters_text(), controller);
@@ -44,12 +44,12 @@ public class ResetFilters extends Action {
eventsModel = controller.getEventsModel();
disabledProperty().bind(new BooleanBinding() {
{
- bind(eventsModel.zoomStateProperty());
+ bind(eventsModel.modelParamsProperty());
}
@Override
protected boolean computeValue() {
- return eventsModel.zoomStateProperty().getValue().getFilterState().equals(eventsModel.getDefaultFilter());
+ return eventsModel.modelParamsProperty().getValue().getEventFilterState().equals(eventsModel.getDefaultEventFilterState());
}
});
setEventHandler((ActionEvent t) -> {
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
index 6208714e06..b5949b7f01 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/SaveSnapshotAsReport.java
@@ -137,7 +137,7 @@ public class SaveSnapshotAsReport extends Action {
reportMainFilePath = new SnapShotReportWriter(currentCase,
reportFolderPath,
reportName,
- controller.getEventsModel().getZoomState(),
+ controller.getEventsModel().getModelParams(),
generationDate, snapshot).writeReport();
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, "Error writing report to disk at " + reportFolderPath, ex); //NON_NLS
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java
index 9550004e1c..5022d3e8da 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomOut.java
@@ -26,7 +26,7 @@ import javafx.scene.image.ImageView;
import org.controlsfx.control.action.Action;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.datamodel.TskCoreException;
@@ -58,10 +58,10 @@ public class ZoomOut extends Action {
//disable action when the current time range already encompases the entire case.
disabledProperty().bind(new BooleanBinding() {
- private final FilteredEventsModel eventsModel = controller.getEventsModel();
+ private final EventsModel eventsModel = controller.getEventsModel();
{
- bind(eventsModel.zoomStateProperty(), eventsModel.timeRangeProperty());
+ bind(eventsModel.modelParamsProperty(), eventsModel.timeRangeProperty());
}
@Override
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java
index e85de25b5f..799208bf8e 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/actions/ZoomToEvents.java
@@ -27,7 +27,7 @@ import org.controlsfx.control.action.Action;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.timeline.TimeLineController;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.datamodel.TskCoreException;
/**
@@ -56,10 +56,10 @@ public class ZoomToEvents extends Action {
//disable action when the current time range already encompases the entire case.
disabledProperty().bind(new BooleanBinding() {
- private final FilteredEventsModel eventsModel = controller.getEventsModel();
+ private final EventsModel eventsModel = controller.getEventsModel();
{
- bind(eventsModel.zoomStateProperty());
+ bind(eventsModel.modelParamsProperty());
}
@Override
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties
new file mode 100644
index 0000000000..56871db82c
--- /dev/null
+++ b/Core/src/org/sleuthkit/autopsy/timeline/datamodel/eventtype/Bundle_ja.properties
@@ -0,0 +1,22 @@
+BaseTypes.fileSystem.name=\u30d5\u30a1\u30a4\u30eb\u30b7\u30b9\u30c6\u30e0
+BaseTypes.webActivity.name=Web\u30a2\u30af\u30c6\u30a3\u30d3\u30c6\u30a3\u30fc
+BaseTypes.miscTypes.name=\u3055\u307e\u3056\u307e\u306a\u30bf\u30a4\u30d7
+FileSystemTypes.fileModified.name=\u4fee\u6b63\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+FileSystemTypes.fileAccessed.name=\u30a2\u30af\u30bb\u30b9\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+FileSystemTypes.fileCreated.name=\u4f5c\u6210\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+FileSystemTypes.fileChanged.name=\u5909\u66f4\u3055\u308c\u305f\u30d5\u30a1\u30a4\u30eb
+MiscTypes.message.name=\u30e1\u30c3\u30bb\u30fc\u30b8
+MiscTypes.GPSRoutes.name=GPS\u30eb\u30fc\u30c8
+MiscTypes.GPSTrackpoint.name=\u5834\u6240\u5c65\u6b74
+MiscTypes.Calls.name=\u547c\u3073\u51fa\u3057
+MiscTypes.Email.name=\u30e1\u30fc\u30eb\u30a2\u30c9\u30ec\u30b9
+MiscTypes.recentDocuments.name=\u6700\u8fd1\u4f7f\u3063\u305f\u6587\u66f8
+MiscTypes.installedPrograms.name=\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u3066\u3044\u308b\u30d7\u30ed\u30b0\u30e9\u30e0
+MiscTypes.exif.name=\u7d42\u4e86
+MiscTypes.devicesAttached.name=\u88c5\u7740\u3055\u308c\u3066\u3044\u308b\u30c7\u30d0\u30a4\u30b9
+RootEventType.eventTypes.name=\u30a4\u30d9\u30f3\u30c8\u30bf\u30a4\u30d7
+WebTypes.webDownloads.name=Web\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9
+WebTypes.webCookies.name=Web\u30af\u30c3\u30ad\u30fc
+WebTypes.webBookmarks.name=Web\u30d6\u30c3\u30af\u30de\u30fc\u30af
+WebTypes.webHistory.name=Web\u5c65\u6b74
+WebTypes.webSearch.name=Web\u691c\u7d22
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties
old mode 100755
new mode 100644
index 7096881555..8e1199be05
--- a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/Bundle_ja.properties
@@ -1 +1,11 @@
-EventRoodNode.tooManyNode.displayName=\u8868\u793a\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u6570\u304c\u591a\u3059\u304e\u307e\u3059\u3002\u6700\u5927 \= {0}\u3002\u8868\u793a\u3059\u308b\u30a4\u30d9\u30f3\u30c8\u306f{1}\u3042\u308a\u307e\u3059\u3002
\ No newline at end of file
+EventNode.getAction.errorTitle=\u30a2\u30af\u30b7\u30e7\u30f3\u306e\u53d6\u5f97\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f
+EventNode.getAction.linkedFileMessage=\u9078\u629e\u3057\u305f\u7d50\u679c\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u53d6\u5f97\u4e2d\u306b\u554f\u984c\u304c\u3042\u308a\u307e\u3057\u305f\u3002 [\u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306b\u30d5\u30a1\u30a4\u30eb\u3092\u8868\u793a] \u30a2\u30af\u30b7\u30e7\u30f3\u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+# {0} - \u8868\u793a\u53ef\u80fd\u306a\u6700\u5927\u30a4\u30d9\u30f3\u30c8\u6570
+# {1} - \u591a\u3059\u304e\u308b\u30a4\u30d9\u30f3\u30c8\u6570
+EventRoodNode.tooManyNode.displayName=\u30a4\u30d9\u30f3\u30c8\u304c\u591a\u3059\u304e\u3066\u8868\u793a\u3067\u304d\u307e\u305b\u3093\u3002 \u6700\u5927 = {0} \u3067\u3059\u3002\u305f\u3060\u3057\u3001{1} \u3092\u8868\u793a\u3067\u304d\u307e\u3059\u3002
+NodeProperty.displayName.baseType=\u57fa\u672c\u30bf\u30a4\u30d7
+NodeProperty.displayName.dateTime=\u65e5/\u6642\u9593
+NodeProperty.displayName.description=\u8a18\u8ff0
+NodeProperty.displayName.icon=\u30a2\u30a4\u30b3\u30f3
+NodeProperty.displayName.known=\u65e2\u77e5
+NodeProperty.displayName.subType=\u30b5\u30d6\u30bf\u30a4\u30d7
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java
index 56dc02daed..018adf1018 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventNode.java
@@ -45,7 +45,7 @@ import org.sleuthkit.autopsy.datamodel.DataModelActionsFactory;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor;
import org.sleuthkit.autopsy.datamodel.NodeProperty;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.actions.ViewFileInTimelineAction;
import org.sleuthkit.autopsy.timeline.ui.EventTypeUtils;
@@ -262,7 +262,7 @@ public class EventNode extends DisplayableItemNode {
* @return An EventNode with the content (and possible artifact) backing
* this event in its lookup.
*/
- public static EventNode createEventNode(final Long eventID, FilteredEventsModel eventsModel) throws TskCoreException {
+ public static EventNode createEventNode(final Long eventID, EventsModel eventsModel) throws TskCoreException {
SleuthkitCase sleuthkitCase = eventsModel.getSleuthkitCase();
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java
index e7c14d87f9..833d6ccc41 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/explorernodes/EventRootNode.java
@@ -32,7 +32,7 @@ import org.openide.util.lookup.Lookups;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNode;
import org.sleuthkit.autopsy.datamodel.DisplayableItemNodeVisitor;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.datamodel.TskCoreException;
/**
@@ -49,7 +49,7 @@ public class EventRootNode extends DisplayableItemNode {
*/
public static final int MAX_EVENTS_TO_DISPLAY = 5000;
- public EventRootNode(Collection eventIds, FilteredEventsModel filteredEvents) {
+ public EventRootNode(Collection eventIds, EventsModel filteredEvents) {
super(Children.create(new EventNodeChildFactory(eventIds, filteredEvents), true), Lookups.singleton(eventIds));
}
@@ -83,10 +83,10 @@ public class EventRootNode extends DisplayableItemNode {
/**
* filteredEvents is used to lookup the events from their IDs
*/
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
private final Map nodesMap = new HashMap<>();
- EventNodeChildFactory(Collection eventIds, FilteredEventsModel filteredEvents) {
+ EventNodeChildFactory(Collection eventIds, EventsModel filteredEvents) {
this.eventIDs = eventIds;
this.filteredEvents = filteredEvents;
}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java
index c7734dbeea..994b23d845 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/snapshot/SnapShotReportWriter.java
@@ -27,14 +27,14 @@ import javax.imageio.ImageIO;
import org.joda.time.format.DateTimeFormat;
import org.sleuthkit.autopsy.casemodule.Case;
import org.sleuthkit.autopsy.report.uisnapshot.UiSnapShotReportWriter;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
/**
* Generate and write the Timeline snapshot report to disk.
*/
public class SnapShotReportWriter extends UiSnapShotReportWriter{
- private final ZoomState zoomState;
+ private final EventsModelParams zoomState;
private final BufferedImage image;
/**
@@ -49,7 +49,7 @@ public class SnapShotReportWriter extends UiSnapShotReportWriter{
* @param generationDate The generation Date of the report.
* @param snapshot A snapshot of the view to include in the report.
*/
- public SnapShotReportWriter(Case currentCase, Path reportFolderPath, String reportName, ZoomState zoomState, Date generationDate, BufferedImage snapshot) {
+ public SnapShotReportWriter(Case currentCase, Path reportFolderPath, String reportName, EventsModelParams zoomState, Date generationDate, BufferedImage snapshot) {
super(currentCase, reportFolderPath, reportName, generationDate);
this.zoomState = zoomState;
this.image = snapshot;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java
index d9a51f2023..7a4fc4db85 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/AbstractTimeLineView.java
@@ -37,7 +37,7 @@ import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.LoggedTask;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ViewMode;
import org.sleuthkit.autopsy.timeline.events.RefreshRequestedEvent;
@@ -75,7 +75,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
private Task updateTask;
private final TimeLineController controller;
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
/**
* Constructor
@@ -86,7 +86,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
this.controller = controller;
this.filteredEvents = controller.getEventsModel();
this.filteredEvents.registerForEvents(this);
- this.filteredEvents.zoomStateProperty().addListener(updateListener);
+ this.filteredEvents.modelParamsProperty().addListener(updateListener);
TimeLineController.timeZoneProperty().addListener(updateListener);
}
@@ -170,7 +170,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
*
* @return The FilteredEventsModel for this view.
*/
- protected FilteredEventsModel getEventsModel() {
+ protected EventsModel getEventsModel() {
return filteredEvents;
}
@@ -224,7 +224,7 @@ public abstract class AbstractTimeLineView extends BorderPane {
updateTask = null;
}
//remvoe and gc updateListener
- this.filteredEvents.zoomStateProperty().removeListener(updateListener);
+ this.filteredEvents.modelParamsProperty().removeListener(updateListener);
TimeLineController.timeZoneProperty().removeListener(updateListener);
updateListener = null;
filteredEvents.unRegisterForEvents(this);
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties
old mode 100755
new mode 100644
index 5c8dacfed2..2be73fcb0d
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/Bundle_ja.properties
@@ -1,27 +1,31 @@
-Timeline.node.root=\u30eb\u30fc\u30c8
-Timeline.ui.TimeLineChart.tooltip.text=\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3067\u4e0b\u8a18\u306e\u7bc4\u56f2\u3078\u30ba\u30fc\u30e0\uff1a\n{0}\u301c{1}\n\u53f3\u30af\u30ea\u30c3\u30af\u3067\u5143\u306b\u623b\u308a\u307e\u3059\u3002
-Timeline.ui.ZoomRanges.all.text=\u5168\u3066
+/*
+ * Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30fb\u30d6\u30e9\u30a6\u30b6\u30fc
+ *
+ * Copyright 2013-15 Basis Technology Corp.
+ * \u9023\u7d61\u5148: carrier sleuthkit org
+ *
+ * Apache License, Version 2.0 (\u4ee5\u4e0b\u300c\u30e9\u30a4\u30bb\u30f3\u30b9\u300d\u3068\u3044\u3044\u307e\u3059)\u306b\u304a\u3044\u3066\u4f7f\u7528\u8a31\u8afe\u3055\u308c\u3066\u3044\u307e\u3059\u3002
+ * \u672c\u30e9\u30a4\u30bb\u30f3\u30b9\u3092\u9075\u5b88\u3059\u308b\u3053\u3068\u306a\u304f\u3057\u3066\u3001\u3053\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+ * \u672c\u30e9\u30a4\u30bb\u30f3\u30b9\u306e\u30b3\u30d4\u30fc\u306f\u6b21\u306e\u30b5\u30a4\u30c8\u3067\u53d6\u5f97\u3067\u304d\u307e\u3059\u3002
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * \u9069\u7528\u6cd5\u4ee4\u306b\u3088\u3063\u3066\u7fa9\u52d9\u4ed8\u3051\u3089\u308c\u308b\u5834\u5408\u307e\u305f\u306f\u66f8\u9762\u306b\u3066\u5408\u610f\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3092\u9664\u304d\u3001\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u306f
+ * \u660e\u793a\u7684\u3067\u3042\u308c\u9ed9\u793a\u7684\u3067\u3042\u308c\u3001\u3044\u304b\u306a\u308b\u985e\u306e\u4fdd\u8a3c\u307e\u305f\u306f\u6761\u4ef6\u306a\u3057\u306b\u3001
+ * \u672c\u30e9\u30a4\u30bb\u30f3\u30b9\u306b\u304a\u3044\u3066\u300c\u73fe\u72b6\u300d\u306e\u307e\u307e\u3067\u914d\u5e03\u3055\u308c\u307e\u3059\u3002
+ * \u672c\u30e9\u30a4\u30bb\u30f3\u30b9\u306b\u304a\u3051\u308b\u30a2\u30af\u30bb\u30b9\u6a29\u304a\u3088\u3073\u5236\u9650\u4e8b\u9805\u3092\u898f\u5b9a\u3059\u308b
+ * \u7279\u5b9a\u306e\u8a00\u8a9e\u306b\u3064\u3044\u3066\u306f\u3001\u300c\u30e9\u30a4\u30bb\u30f3\u30b9\u300d\u3092\u53c2\u7167\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+ */
-ViewFrame.histogramTask.preparing=\u6e96\u5099\u4e2d
-ViewFrame.histogramTask.queryDb=DB\u3092\u30af\u30a8\u30ea\u4e2d
-ViewFrame.histogramTask.resetUI=ui\u3092\u518d\u8a2d\u5b9a\u4e2d
-ViewFrame.histogramTask.title=\u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u3092\u518d\u30d3\u30eb\u30c9
-ViewFrame.histogramTask.updateUI2=ui\u3092\u66f4\u65b0\u4e2d
-TimeZonePanel.localRadio.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
-ViewFrame.countsToggle.text=\u30ab\u30a6\u30f3\u30c8
-ViewFrame.detailsToggle.text=\u8a73\u7d30
-ViewFrame.endLabel.text=\u30a8\u30f3\u30c9\uff1a
-ViewFrame.noEventsDialogLabel.text=\u73fe\u5728\u306e\u30ba\u30fc\u30e0\uff0f\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3067\u306f\u898b\u3048\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
-ViewFrame.resetFiltersButton.text=\u5168\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ea\u30bb\u30c3\u30c8
-ViewFrame.startLabel.text=\u30b9\u30bf\u30fc\u30c8\uff1a
-ViewFrame.viewModeLabel.text=\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u30e2\u30fc\u30c9\uff1a
-ViewFrame.zoomButton.text=\u30a4\u30d9\u30f3\u30c8\u3078\u30ba\u30fc\u30e0
-ViewFrame.zoomMenuButton.text=\u4e0b\u8a18\u3078\u30ba\u30fc\u30e0\u30a4\u30f3\uff0f\u30ba\u30fc\u30e0\u30a2\u30a6\u30c8
-*=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30d6\u30e9\u30a6\u30b6
-AbstractTimelineChart.defaultTooltip.text=\u30de\u30a6\u30b9\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u3066\u30ba\u30fc\u30e0\u3059\u308b\u30bf\u30a4\u30e0\u9593\u9694\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\u305d\u306e\u4ed6\u306e\u30a2\u30af\u30b7\u30e7\u30f3\u306f\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044
-IntervalSelector.ClearSelectedIntervalAction.tooltTipText=\u9078\u629e\u3057\u305f\u9593\u9694\u3092\u30af\u30ea\u30a2\u3059\u308b
+AbstractTimelineChart.defaultTooltip.text=\u30de\u30a6\u30b9\u3092\u30c9\u30e9\u30c3\u30b0\u3057\u3001\u30ba\u30fc\u30e0\u30a4\u30f3\u3059\u308b\u6642\u9593\u9593\u9694\u3092\u9078\u629e\u3057\u307e\u3059\u3002\n\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3001\u3055\u3089\u306a\u308b\u30a2\u30af\u30b7\u30e7\u30f3\u3092\u8868\u793a\u3057\u307e\u3059\u3002
+HistoryToolBar.historyLabel.text=\u5c65\u6b74
+IntervalSelector.ClearSelectedIntervalAction.tooltTipText=\u9078\u629e\u3057\u305f\u9593\u9694\u3092\u6d88\u53bb
IntervalSelector.ZoomAction.name=\u30ba\u30fc\u30e0
-NoEventsDialog.titledPane.text=\u898b\u308c\u308b\u30a4\u30d9\u30f3\u30c8\u304c\u3042\u308a\u307e\u305b\u3093
+NoEventsDialog.titledPane.text=\u8868\u793a\u53ef\u80fd\u306a\u30a4\u30d9\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093
+Timeline.node.root=\u30eb\u30fc\u30c8
+# {0} - \u958b\u59cb\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
+# {1} - \u7d42\u4e86\u30bf\u30a4\u30e0\u30b9\u30bf\u30f3\u30d7
+Timeline.ui.TimeLineChart.tooltip.text=\u30c0\u30d6\u30eb\u30af\u30ea\u30c3\u30af\u3057\u3066\u7bc4\u56f2\u306b\u30ba\u30fc\u30e0\u30a4\u30f3:\n{0} to {1}.\n\n\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u9589\u3058\u307e\u3059\u3002
Timeline.ui.ZoomRanges.onemin.text=1\u5206
Timeline.ui.ZoomRanges.fifteenmin.text=15\u5206
Timeline.ui.ZoomRanges.onehour.text=1\u6642\u9593
@@ -31,15 +35,38 @@ Timeline.ui.ZoomRanges.oneday.text=1\u65e5
Timeline.ui.ZoomRanges.threedays.text=3\u65e5
Timeline.ui.ZoomRanges.oneweek.text=1\u9031\u9593
Timeline.ui.ZoomRanges.twoweeks.text=2\u9031\u9593
-Timeline.ui.ZoomRanges.onemonth.text=1\u30f6\u6708
-Timeline.ui.ZoomRanges.threemonths.text=3\u30f6\u6708
-Timeline.ui.ZoomRanges.sixmonths.text=6\u30f6\u6708
+Timeline.ui.ZoomRanges.onemonth.text=1\u30f5\u6708
+Timeline.ui.ZoomRanges.threemonths.text=3\u30f5\u6708
+Timeline.ui.ZoomRanges.sixmonths.text=6\u30f5\u6708
Timeline.ui.ZoomRanges.oneyear.text=1\u5e74
Timeline.ui.ZoomRanges.threeyears.text=3\u5e74
Timeline.ui.ZoomRanges.fiveyears.text=5\u5e74
Timeline.ui.ZoomRanges.tenyears.text=10\u5e74
+Timeline.ui.ZoomRanges.all.text=\u3059\u3079\u3066
TimeLineChart.zoomHistoryActionGroup.name=\u30ba\u30fc\u30e0\u5c65\u6b74
-TimeZonePanel.title=\u6642\u9593\u3092\u6b21\u3067\u8868\u793a\uff1a
-ViewFrame.refresh=\u30ea\u30d5\u30ec\u30c3\u30b7\u30e5
-ViewFrame.tagsAddedOrDeleted=\u30bf\u30b0\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u304a\u3088\u3073\u307e\u305f\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u304b\u3082\u3057\u308c\u307e\u305b\u3093\u3002
-ViewRefreshTask.preparing=\u30ba\u30fc\u30e0\u304a\u3088\u3073\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3092\u89e3\u6790\u4e2d
+TimeZonePanel.title=\u6b21\u306b\u6642\u9593\u3092\u8868\u793a:
+ViewFrame.countsToggle.text=\u30ab\u30a6\u30f3\u30c8
+ViewFrame.detailsToggle.text=\u8a73\u7d30
+ViewFrame.endLabel.text=\u7d42\u4e86:
+ViewFrame.histogramTask.preparing=\u6e96\u5099\u4e2d
+ViewFrame.histogramTask.queryDb=FB\u3092\u30af\u30a8\u30ea\u4e2d\u3067\u3059
+ViewFrame.histogramTask.resetUI=UI\u3092\u30ea\u30bb\u30c3\u30c8\u4e2d\u3067\u3059
+ViewFrame.histogramTask.title=\u30d2\u30b9\u30c8\u30b0\u30e9\u30e0\u306e\u518d\u69cb\u7bc9\u4e2d\u3067\u3059
+ViewFrame.histogramTask.updateUI2=UI\u3092\u66f4\u65b0\u4e2d\u3067\u3059
+ViewFrame.listToggle.text=\u30ea\u30b9\u30c8
+ViewFrame.noEventsDialogLabel.text=\u73fe\u5728\u306e\u30ba\u30fc\u30e0 / \u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3067\u8868\u793a\u53ef\u80fd\u306a\u30a4\u30d9\u30f3\u30c8\u306f\u3042\u308a\u307e\u305b\u3093\u3002
+# {0} - \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u540d
+ViewFrame.notification.analysisComplete={0} \u306e\u5206\u6790\u306f\u5b8c\u4e86\u3057\u307e\u3057\u305f\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+# {0} - \u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u540d
+ViewFrame.notification.newDataSource={0} \u304c\u65b0\u3057\u3044\u30c7\u30fc\u30bf\u30bd\u30fc\u30b9\u3068\u3057\u3066\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\u3002 \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+ViewFrame.refresh.longText=\u30d3\u30e5\u30fc\u3092\u66f4\u65b0\u3057\u3001\u65b0\u305f\u306b\u66f4\u65b0\u3055\u308c\u305f\u30bf\u30b0\u306a\u3069\u3001\u8868\u793a\u3055\u308c\u3066\u3044\u306a\u3044\u3082\u306e\u306e\u3001\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u5185\u306b\u3042\u308b\u60c5\u5831\u3092\u542b\u3081\u307e\u3059\u3002
+ViewFrame.refresh.text=\u30d3\u30e5\u30fc\u3092\u66f4\u65b0
+ViewFrame.startLabel.text=\u958b\u59cb:
+ViewFrame.tagsAddedOrDeleted=\u30bf\u30b0\u304c\u4f5c\u6210\u304a\u3088\u3073/\u307e\u305f\u306f\u524a\u9664\u3055\u308c\u307e\u3057\u305f\u3002 \u30d3\u30e5\u30fc\u304c\u6700\u65b0\u3067\u306f\u306a\u3044\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002
+ViewFrame.viewModeLabel.text=\u30d3\u30e5\u30fc\u30e2\u30fc\u30c9:
+ViewFrame.zoomButton.text=\u30a4\u30d9\u30f3\u30c8\u306b\u30ba\u30fc\u30e0
+TimeZonePanel.localRadio.text=\u30ed\u30fc\u30ab\u30eb\u30bf\u30a4\u30e0\u30be\u30fc\u30f3
+TimeZonePanel.otherRadio.text=GMT / UTC
+ViewFrame.resetFiltersButton.text=\u3059\u3079\u3066\u306e\u30d5\u30a3\u30eb\u30bf\u30fc\u3092\u30ea\u30bb\u30c3\u30c8
+ViewFrame.zoomMenuButton.text=\u30ba\u30fc\u30e0\u30a4\u30f3/\u30a2\u30a6\u30c8
+ViewRefreshTask.preparing=\u30ba\u30fc\u30e0\u8a2d\u5b9a\u3068\u30d5\u30a3\u30eb\u30bf\u30fc\u8a2d\u5b9a\u3092\u5206\u6790\u4e2d\u3067\u3059
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java
index 9e780277f3..39506554ac 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/ViewFrame.java
@@ -77,7 +77,7 @@ import org.sleuthkit.autopsy.coreutils.LoggedTask;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.timeline.FXMLConstructor;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ViewMode;
import org.sleuthkit.autopsy.timeline.actions.AddManualEvent;
@@ -236,7 +236,7 @@ final public class ViewFrame extends BorderPane {
private final NotificationPane notificationPane = new NotificationPane();
private final TimeLineController controller;
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
/**
* Listen to changes in the range slider selection and forward to the
@@ -426,7 +426,7 @@ final public class ViewFrame extends BorderPane {
//listen for changes in the time range / zoom params
TimeLineController.timeZoneProperty().addListener(timeZoneProp -> refreshTimeUI());
filteredEvents.timeRangeProperty().addListener(timeRangeProp -> refreshTimeUI());
- filteredEvents.zoomStateProperty().addListener(zoomListener);
+ filteredEvents.modelParamsProperty().addListener(zoomListener);
refreshTimeUI(); //populate the view
refreshHistorgram();
@@ -474,7 +474,7 @@ final public class ViewFrame extends BorderPane {
@Subscribe
@NbBundle.Messages({
"ViewFrame.notification.cacheInvalidated=The event data has been updated, the visualization may be out of date."})
- public void handleCacheInvalidated(FilteredEventsModel.CacheInvalidatedEvent event) {
+ public void handleCacheInvalidated(EventsModel.CacheInvalidatedEvent event) {
Platform.runLater(() -> {
if (hostedView.needsRefresh() == false) {
hostedView.setNeedsRefresh();
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties
old mode 100755
new mode 100644
index e60d46f934..138bb42bfe
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/Bundle_ja.properties
@@ -1,14 +1,25 @@
-CountsViewPane.numberOfEvents=\u30a4\u30d9\u30f3\u30c8\u6570
-CountsViewPane.detailSwitchMessage=\u79d2\u3088\u308a\u5c0f\u3055\u3044\u5358\u4f4d\u306f\u3042\u308a\u307e\u305b\u3093\u3002\n\u8a73\u7d30\u30d3\u30e5\u30fc\u306b\u5909\u66f4\u3057\u307e\u3059\u304b\uff1f
-CountsViewPane.detailSwitchTitle=\u8a73\u7d30\u30d3\u30e5\u30fc\u306b\u5909\u66f4\u3057\u307e\u3059\u304b\uff1f
+CountsViewPane.detailSwitchMessage=\u79d2\u3088\u308a\u3082\u5c0f\u3055\u3044\u6642\u9593\u5206\u89e3\u80fd\u306f\u3042\u308a\u307e\u305b\u3093\u3002\n\u4ee3\u308f\u308a\u306b\u8a73\u7d30\u30d3\u30e5\u30fc\u306b\u5207\u308a\u66ff\u3048\u307e\u3059\u304b?
+CountsViewPane.detailSwitchTitle=\u8a73\u7d30\u30d3\u30e5\u30fc\u306b\u5207\u308a\u66ff\u3048\u307e\u3059\u304b?
+CountsViewPane.linearRadio.text=\u7dda\u5f62
+CountsViewPane.loggedTask.name=\u30ab\u30a6\u30f3\u30c8\u30d3\u30e5\u30fc\u306e\u66f4\u65b0\u4e2d\u3067\u3059
+CountsViewPane.loggedTask.updatingCounts=\u30d3\u30e5\u30fc\u306e\u5165\u529b\u4e2d\u3067\u3059
+CountsViewPane.logRadio.text=\u5bfe\u6570
+# {0} - \u76ee\u76db\u540d
+CountsViewPane.numberOfEvents=\u30a4\u30d9\u30f3\u30c8\u6570 ({0})
+CountsViewPane.scaleHelp.label.text=\u76ee\u76db:
+CountsViewPane.scaleHelpLinear=\u7dda\u5f62\u76ee\u76db\u306f\u591a\u304f\u306e\u4f7f\u7528\u4e8b\u4f8b\u306b\u9069\u3057\u3066\u3044\u307e\u3059\u3002 \u3053\u306e\u76ee\u76db\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u30d0\u30fc\u306e\u9ad8\u3055\u304c1\u5bfe1\u306e\u7dda\u5f62\u3067\u30ab\u30a6\u30f3\u30c8\u3092\u8868\u3057\u3001y\u8ef8\u306b\u5024\u30e9\u30d9\u30eb\u304c\u4ed8\u304d\u307e\u3059\u3002\u5024\u306e\u7bc4\u56f2\u304c\u975e\u5e38\u306b\u5927\u304d\u3044\u3068\u3001\u30ab\u30a6\u30f3\u30c8\u306e\u5c11\u306a\u3044\u6642\u9593\u5468\u671f\u306b\u5c0f\u3055\u3059\u304e\u3066\u8868\u793a\u3067\u304d\u306a\u3044\u30d0\u30fc\u304c\u3042\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002 \u30e6\u30fc\u30b6\u30fc\u304c\u3053\u308c\u3092\u5224\u5225\u3067\u304d\u308b\u3088\u3046\u306b\u3001\u30a4\u30d9\u30f3\u30c8\u306e\u3042\u308b\u30c7\u30fc\u30bf\u7bc4\u56f2\u306e\u30e9\u30d9\u30eb\u304c\u592a\u5b57\u3067\u8868\u793a\u3055\u308c\u307e\u3059\u3002 \u5c0f\u3055\u3059\u304e\u308b\u30d0\u30fc\u3092\u8868\u793a\u3059\u308b\u9078\u629e\u80a2\u306f\u6b21\u306e3\u3064\u3067\u3059: \u30bf\u30a4\u30e0\u30e9\u30a4\u30f3\u306e\u7e26\u9818\u57df\u3092\u5e83\u3052\u308b\u305f\u3081\u306b\u30a6\u30a3\u30f3\u30c9\u30a6\u30b5\u30a4\u30ba\u3092\u8abf\u6574\u3001\u3088\u308a\u5927\u304d\u3044\u30d0\u30fc\u306e\u3042\u308b\u6642\u9593\u5468\u671f\u304c\u9664\u5916\u3055\u308c\u308b\u3088\u3046\u6642\u9593\u7bc4\u56f2\u3092\u8abf\u6574\u3001\u3082\u3057\u304f\u306f\u76ee\u76db\u8a2d\u5b9a\u3092\u5bfe\u6570\u306b\u8abf\u6574
+CountsViewPane.scaleHelpLog=\u5bfe\u6570\u76ee\u76db\u306f\u3001\u5927\u304d\u3044\u6570\u5b57\u3068\u5c0f\u3055\u3044\u6570\u5b57\u306e\u5dee\u3092\u5727\u7e2e\u3059\u308b\u975e\u7dda\u5f62\u306a\u65b9\u6cd5\u3067\u30a4\u30d9\u30f3\u30c8\u6570\u3092\u8868\u3057\u307e\u3059\u3002\u5bfe\u6570\u76ee\u76db\u3092\u7528\u3044\u3066\u3082\u3001\u6975\u7aef\u306b\u5927\u304d\u3044\u30ab\u30a6\u30f3\u30c8\u5dee\u306b\u3088\u3063\u3066\u5c0f\u3055\u3059\u304e\u3066\u8868\u793a\u3067\u304d\u306a\u3044\u30d0\u30fc\u304c\u751f\u6210\u3055\u308c\u308b\u3053\u3068\u304c\u3042\u308a\u307e\u3059\u3002 \u3053\u306e\u5834\u5408\u3001\u30a4\u30d9\u30f3\u30c8\u3092\u30d5\u30a3\u30eb\u30bf\u30fc\u3057\u3066\u30ab\u30a6\u30f3\u30c8\u5dee\u3092\u7e2e\u3081\u308b\u3053\u3068\u304c\u552f\u4e00\u306e\u9078\u629e\u80a2\u3067\u3042\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 \u6ce8: \u5bfe\u6570\u76ee\u76db\u306f\u30a4\u30d9\u30f3\u30c8\u30bf\u30a4\u30d7\u3054\u3068\u306b\u500b\u5225\u306b\u9069\u7528\u3055\u308c\u308b\u305f\u3081\u3001\u8907\u5408\u30d0\u30fc\u306e\u9ad8\u3055\u306e\u610f\u5473\u306f\u76f4\u611f\u7684\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u307e\u305f\u3001\u3053\u308c\u3092\u5f37\u8abf\u3059\u308b\u305f\u3081\u306b\u3001\u5bfe\u6570\u76ee\u76db\u3092\u7528\u3044\u305fy\u8ef8\u4e0a\u306b\u30e9\u30d9\u30eb\u3092\u8868\u793a\u3057\u307e\u305b\u3093\u3002\u5bfe\u6570\u76ee\u76db\u306f\u30011\u3064\u306e\u30bf\u30a4\u30d7\u5185\u306e\u6642\u9593\u5168\u57df\u3001\u307e\u305f\u306f1\u3064\u306e\u6642\u9593\u5468\u671f\u306e\u30bf\u30a4\u30d7\u5168\u57df\u3067
+CountsViewPane.scaleHelpLog2=\u30ab\u30a6\u30f3\u30c8\u3092\u8fc5\u901f\u306b\u6bd4\u8f03\u3059\u308b\u305f\u3081\u306b\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u305f\u3060\u3057\u4e21\u65b9\u4e00\u5ea6\u306b\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002
+CountsViewPane.scaleHelpLog3=\ \u5b9f\u969b\u306e\u30ab\u30a6\u30f3\u30c8(\u30c4\u30fc\u30eb\u30c1\u30c3\u30d7\u307e\u305f\u306f\u7d50\u679c\u30d3\u30e5\u30fc\u3067\u5229\u7528\u53ef\u80fd)\u306f\u7d76\u5bfe\u6bd4\u8f03\u306b\u4f7f\u7528\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 \u614e\u91cd\u306b\u5bfe\u6570\u76ee\u76db\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+CountsViewPane.scaleLabel.text=\u76ee\u76db:
+# {0} - \u30ab\u30a6\u30f3\u30c8
+# {1} - \u30a4\u30d9\u30f3\u30c8\u30bf\u30a4\u30d7\u306e\u8868\u793a\u540d
+# {2} - \u958b\u59cb\u65e5\u6642
+# {3} - \u7d42\u4e86\u65e5\u6642
+CountsViewPane.tooltip.text={2}\n\u3068 {3}\n\u9593\u306e {0} {1} \u30a4\u30d9\u30f3\u30c8
+ScaleType.Linear=\u7dda\u5f62
+ScaleType.Logarithmic=\u5bfe\u6570
Timeline.ui.countsview.menuItem.selectEventType=\u30a4\u30d9\u30f3\u30c8\u30bf\u30a4\u30d7\u3092\u9078\u629e
Timeline.ui.countsview.menuItem.selectTimeandType=\u6642\u9593\u3068\u30bf\u30a4\u30d7\u3092\u9078\u629e
Timeline.ui.countsview.menuItem.selectTimeRange=\u6642\u9593\u7bc4\u56f2\u3092\u9078\u629e
-Timeline.ui.countsview.menuItem.zoomIntoTimeRange=\u6642\u9593\u7bc4\u56f2\u3078\u30ba\u30fc\u30e0\u30a4\u30f3
-CountsViewPane.loggedTask.name=\u30ab\u30a6\u30f3\u30c8\u30d3\u30e5\u30fc\u3092\u66f4\u65b0\u4e2d
-CountsViewPane.loggedTask.updatingCounts=\u30d3\u30b8\u30e5\u30a2\u30e9\u30a4\u30bc\u30fc\u30b7\u30e7\u30f3\uff08\u53ef\u8996\u5316\uff09\u3092\u5165\u529b\u4e2d
-CountsViewPane.tooltip.text={0} {1} \u30a4\u30d9\u30f3\u30c8\n{2}\u3068\n{3}\u306e\u9593
-CountsViewPane.linearRadio.text=\u30ea\u30cb\u30a2
-CountsViewPane.logRadio.text=\u5bfe\u6570\u7684
-CountsViewPane.scaleLabel.text=\u30b9\u30b1\u30fc\u30eb\uff1a
-*=Autopsy\u30d5\u30a9\u30ec\u30f3\u30b8\u30c3\u30af\u30d6\u30e9\u30a6\u30b6
\ No newline at end of file
+Timeline.ui.countsview.menuItem.zoomIntoTimeRange=\u6642\u9593\u7bc4\u56f2\u306b\u30ba\u30fc\u30e0\u30a4\u30f3
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
index 70197ff3e3..53e79210b2 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/countsview/CountsViewPane.java
@@ -56,7 +56,7 @@ import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.timeline.FXMLConstructor;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ViewMode;
import org.sleuthkit.autopsy.timeline.ui.AbstractTimelineChart;
@@ -374,7 +374,7 @@ public class CountsViewPane extends AbstractTimelineChart implements
private ContextMenu chartContextMenu;
private final TimeLineController controller;
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
private IntervalSelector extends String> intervalSelector;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties
old mode 100755
new mode 100644
index bf305b6d72..d7ee0e7dd5
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/Bundle_ja.properties
@@ -1,35 +1,40 @@
-DetailViewPane.loggedTask.name=\u8A73\u7D30\u30D3\u30E5\u30FC\u3092\u66F4\u65B0
-DetailViewPane.loggedTask.queryDb=\u30A4\u30D9\u30F3\u30C8\u30C7\u30FC\u30BF\u3092\u53D6\u5F97\u4E2D
-DetailViewPane.loggedTask.updateUI=\u30D3\u30B8\u30E5\u30A2\u30E9\u30A4\u30BC\u30FC\u30B7\u30E7\u30F3\u306B\u60C5\u5831\u3092\u5165\u529B\u4E2D
-EventDetailChart.chartContextMenu.placeMarker.name=\u30DE\u30FC\u30AB\u30FC\u3092\u8A2D\u7F6E
-DetailViewPan.truncateAllBox.text=\u8AAC\u660E\u3092\u524A\u9664
-DetailViewPan.truncateAllBoxMenuItem.text=\u8AAC\u660E\u3092\u524A\u9664
-DetailViewPane.advancedLayoutOptionsButtonLabel.text=\u30A2\u30C9\u30D0\u30F3\u30B9\u30EC\u30A4\u30A2\u30A6\u30C8\u30AA\u30D7\u30B7\u30E7\u30F3
-DetailViewPane.countsRadio.text=\u30AB\u30A6\u30F3\u30C8\u306E\u307F\u8868\u793A
-DetailViewPane.countsRadioMenuItem.text=\u30AB\u30A6\u30F3\u30C8\u306E\u307F\u8868\u793A
-DetailViewPane.descVisSeparatorMenuItem.text=\u8AAC\u660E\u30D3\u30B8\u30D3\u30EA\u30C6\u30A3\uFF08\u53EF\u8996\u6027\uFF09
-DetailViewPane.hiddenRadio.text=\u8AAC\u660E\u3092\u96A0\u3059
-DetailViewPane.hiddenRadioMenuItem.text=\u8AAC\u660E\u3092\u96A0\u3059
-DetailViewPane.oneEventPerRowBox.text=1\u5217\u306B\u3064\u304D1\u30A4\u30D9\u30F3\u30C8
-DetailViewPane.oneEventPerRowBoxMenuItem.text=1\u5217\u306B\u3064\u304D1\u30A4\u30D9\u30F3\u30C8
-DetailViewPane.showRadio.text=\u8A73\u7D30\u8AAC\u660E\u3092\u8868\u793A
-DetailViewPane.showRadioMenuItem.text=\u8A73\u7D30\u8AAC\u660E\u3092\u8868\u793A
-DetailViewPane.truncateSlideLabelMenuItem.text=\u8AAC\u660E\u306E\u6700\u5927\u5E45\uFF08px\uFF09
-DetailViewPane.truncateSliderLabel.text=\u8AAC\u660E\u306E\u6700\u5927\u5E45\uFF08px\uFF09\uFF1A
-DetailViewPane.bandByTypeBox.text=\u30D0\u30F3\u30C9\u30D0\u30A4\u30BF\u30A4\u30D7
-DetailViewPane.bandByTypeBoxMenuItem.text=\u30D0\u30F3\u30C9\u30D0\u30A4\u30BF\u30A4\u30D7
-CollapseClusterAction.text=\u30B3\u30E9\u30D7\u30B9
-DetailViewPane.loggedTask.backButton=\u623B\u308B\uFF08\u53D6\u6D88\uFF09
-DetailViewPane.loggedTask.continueButton=\u9032\u3080
-DetailViewPane.loggedTask.prompt={0}\u30A4\u30D9\u30F3\u30C8\u306E\u8A73\u7D30\u3092\u8868\u793A\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307E\u3059\u3002\u3053\u308C\u306F\u975E\u5E38\u306B\u6642\u9593\u304C\u304B\u304B\u308B\u3001\u307E\u305F\u306FAutopsy\u3092\u30AF\u30E9\u30C3\u30B7\u30E5\u3059\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093\u3002\n\n\u5B9F\u884C\u3057\u307E\u3059\u304B\uFF1F
-EventBundleNodeBase.toolTip.hashSetHits=\n\n\u30CF\u30C3\u30B7\u30E5\u30BB\u30C3\u30C8\u30D2\u30C3\u30C8\n{0}
-EventBundleNodeBase.toolTip.loading=\u8AAD\u307F\u8FBC\u307F\u4E2D...
-EventBundleNodeBase.toolTip.loading2=\u30C4\u30FC\u30EB\u30C1\u30C3\u30D7\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D
-EventBundleNodeBase.toolTip.tags=\n\n\u30BF\u30B0\n{0}
-EventBundleNodeBase.tooltip.text={0} {1} \u30A4\u30D9\u30F3\u30C8\n{2}\n{3}\u3068{4}\u306E\u9593
-EventStripeNode.loggedTask.name=\u30B5\u30D6\u30AF\u30E9\u30B9\u30BF\u3092\u8AAD\u307F\u8FBC\u307F\u4E2D
-ExpandClusterAction.text=\u30A8\u30AF\u30B9\u30D1\u30F3\u30C9
-GuideLine.tooltip.text={0}\n\u53F3\u30AF\u30EA\u30C3\u30AF\u3067\u524A\u9664\u3002\n\u30C9\u30E9\u30C3\u30B0\u3057\u3066\u4F4D\u7F6E\u5909\u66F4\u3002
-HideDescriptionAction.displayMsg=\u8A73\u7D30\u30D3\u30E5\u30FC\u304B\u3089\u3053\u306E\u30B0\u30EB\u30FC\u30D7\u3092\u96A0\u3059\u3002
-HideDescriptionAction.displayName=\u96A0\u3059
-UnhideDescriptionAction.displayName=\u96A0\u3057\u305F\u3082\u306E\u3092\u8868\u793A
\ No newline at end of file
+CollapseClusterAction.text=\u6298\u308a\u305f\u305f\u3080
+DetailViewPane.advancedLayoutOptionsButtonLabel.text=\u9ad8\u5ea6\u306a\u30ec\u30a4\u30a2\u30a6\u30c8\u30aa\u30d7\u30b7\u30e7\u30f3
+DetailViewPane.bandByTypeBox.text=\u30bf\u30a4\u30d7\u5225\u306b\u7d50\u5408
+DetailViewPane.countsRadio.text=\u30ab\u30a6\u30f3\u30c8\u306e\u307f\u8868\u793a
+DetailViewPane.hiddenRadio.text=\u8a18\u8ff0\u3092\u975e\u8868\u793a
+DetailViewPane.loggedTask.backButton=\u623b\u308b(\u53d6\u308a\u6d88\u3057)
+DetailViewPane.loggedTask.continueButton=\u7d9a\u884c
+DetailViewPane.loggedTask.name=\u8a73\u7d30\u30d3\u30e5\u30fc\u306e\u66f4\u65b0\u4e2d\u3067\u3059
+# {0} - \u30a4\u30d9\u30f3\u30c8\u6570
+DetailViewPane.loggedTask.prompt= {0} \u30a4\u30d9\u30f3\u30c8\u306e\u8a73\u7d30\u3092\u8868\u793a\u3057\u3088\u3046\u3068\u3057\u3066\u3044\u307e\u3059\u3002 \u3053\u308c\u306b\u306f\u6642\u9593\u304c\u304b\u304b\u308a\u3001\u4f7f\u7528\u53ef\u80fd\u306a\u30e1\u30e2\u30ea\u30fc\u304c\u6d88\u8cbb\u3055\u308c\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\n\n\u7d9a\u884c\u3057\u307e\u3059\u304b?
+DetailViewPane.loggedTask.queryDb=\u30a4\u30d9\u30f3\u30c8\u30c7\u30fc\u30bf\u306e\u691c\u7d22\u4e2d\u3067\u3059
+DetailViewPane.loggedTask.updateUI=\u30d3\u30e5\u30fc\u306e\u5165\u529b\u4e2d\u3067\u3059
+DetailViewPane.oneEventPerRowBox.text=1\u5217\u306b\u3064\u304d1\u3064
+DetailViewPane.pinnedLaneLabel.text=\u30d4\u30f3\u7559\u3081\u3057\u305f\u30a4\u30d9\u30f3\u30c8
+DetailViewPane.primaryLaneLabel.text=\u3059\u3079\u3066\u306e\u30a4\u30d9\u30f3\u30c8(\u30d5\u30a3\u30eb\u30bf\u30fc\u6e08\u307f)
+DetailViewPane.showRadio.text=\u5b8c\u5168\u306a\u8a18\u8ff0\u3092\u8868\u793a
+DetailViewPane.truncateAllBox.text=\u8a18\u8ff0\u3092\u4e00\u62ec\u524a\u9664
+DetailViewPane.truncateSliderLabel.text=\u6700\u5927\u8a18\u8ff0\u5e45(px):
+EventBundleNodeBase.toolTip.loading=\u8aad\u307f\u8fbc\u307f\u4e2d...
+EventClusterNode.loggedTask.name=\u30b5\u30d6\u30a4\u30d9\u30f3\u30c8\u3092\u8aad\u307f\u8fbc\u3080
+# {0} - \u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u30ab\u30a6\u30f3\u30c8\u6587\u5b57\u5217
+EventNodeBase.toolTip.hashSetHits=\n\n\u30cf\u30c3\u30b7\u30e5\u30bb\u30c3\u30c8\u306e\u30d2\u30c3\u30c8\n{0}
+EventNodeBase.toolTip.loading2=\u30c4\u30fc\u30eb\u30c1\u30c3\u30d7\u306e\u8aad\u307f\u8fbc\u307f\u4e2d\u3067\u3059
+# {0} - \u30bf\u30b0\u30ab\u30a6\u30f3\u30c8\u6587\u5b57\u5217
+EventNodeBase.toolTip.tags=\n\n\u30bf\u30b0\n{0}
+# {0} - \u30ab\u30a6\u30f3\u30c8
+# {1} - \u30a4\u30d9\u30f3\u30c8\u30bf\u30a4\u30d7
+# {2} - \u8a18\u8ff0
+# {3} - \u958b\u59cb\u65e5/\u6642\u9593
+# {4} - \u7d42\u4e86\u65e5/\u6642\u9593
+EventNodeBase.tooltip.text=\t{3}\n\u3068 \t{4}\n{2}\n\u9593\u306e {0} {1} \u30a4\u30d9\u30f3\u30c8
+ExpandClusterAction.text=\u5c55\u958b
+# {0} - \u30ac\u30a4\u30c9\u30e9\u30a4\u30f3\u4f4d\u7f6e\u306e\u65e5\u4ed8/\u6642\u9593
+GuideLine.tooltip.text={0}\n\u53f3\u30af\u30ea\u30c3\u30af\u3057\u3066\u524a\u9664\u3057\u307e\u3059\u3002\n\u30c9\u30e9\u30c3\u30b0\u3057\u3066\u518d\u914d\u7f6e\u3057\u307e\u3059\u3002
+HideDescriptionAction.displayMsg=\u3053\u306e\u30b0\u30eb\u30fc\u30d7\u3092\u8a73\u7d30\u30d3\u30e5\u30fc\u304b\u3089\u975e\u8868\u793a\u306b\u3057\u307e\u3059\u3002
+HideDescriptionAction.displayName=\u975e\u8868\u793a
+PinEventAction.text=\u30d4\u30f3\u7559\u3081\u3059\u308b
+PlaceMArkerAction.name=\u5834\u6240\u30de\u30fc\u30ab\u30fc
+UnhideDescriptionAction.displayName=\u518d\u8868\u793a
+UnPinEventAction.text=\u30d4\u30f3\u7559\u3081\u3092\u5916\u3059
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
index 8736c46103..004dd21a03 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/DetailViewPane.java
@@ -53,7 +53,7 @@ import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
import org.sleuthkit.autopsy.timeline.FXMLConstructor;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ViewMode;
import org.sleuthkit.autopsy.timeline.ui.AbstractTimelineChart;
@@ -61,7 +61,7 @@ import org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.DetailViewEvent;
import org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.DetailsViewModel;
import org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.EventStripe;
import org.sleuthkit.autopsy.timeline.utils.MappedList;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
import org.sleuthkit.datamodel.TimelineLevelOfDetail;
import org.sleuthkit.datamodel.TskCoreException;
@@ -99,7 +99,7 @@ final public class DetailViewPane extends AbstractTimelineChart {
this.pinnedDateAxis = pinnedDateAxis;
this.selectedNodes = selectedNodes;
- FilteredEventsModel eventsModel = getController().getEventsModel();
+ EventsModel eventsModel = getController().getEventsModel();
/*
* If the time range is changed, clear the guide line and the interval
@@ -147,7 +147,7 @@ final class DetailsChart extends Control implements TimeLineChart {
eventsModel.timeRangeProperty().addListener(observable -> clearTimeBasedUIElements());
//if the view paramaters change, clear the selection
- eventsModel.zoomStateProperty().addListener(observable -> getSelectedNodes().clear());
+ eventsModel.modelParamsProperty().addListener(observable -> getSelectedNodes().clear());
}
/**
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java
index 402cefe2b6..581b79d7d6 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventClusterNode.java
@@ -58,7 +58,7 @@ import org.sleuthkit.autopsy.timeline.ui.detailview.datamodel.SingleDetailsViewE
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.SqlFilterState;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.DescriptionFilter;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.RootFilterState;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
import org.sleuthkit.datamodel.TimelineLevelOfDetail;
import org.sleuthkit.datamodel.TskCoreException;
import org.sleuthkit.datamodel.TimelineEventType;
@@ -177,12 +177,12 @@ final class EventClusterNode extends MultiEventNodeBase(
new EventTypeFilter(getEventType()), true));
final Interval subClusterSpan = new Interval(getStartMillis(), getEndMillis() + 1000);
final TimelineEventType.HierarchyLevel eventTypeZoomLevel = eventsModel.getEventTypeZoom();
- final ZoomState zoom = new ZoomState(subClusterSpan, eventTypeZoomLevel, subClusterFilter, getDescriptionLevel());
+ final EventsModelParams zoom = new EventsModelParams(subClusterSpan, eventTypeZoomLevel, subClusterFilter, getDescriptionLevel());
DescriptionFilter descriptionFilter = new DescriptionFilter(getEvent().getDescriptionLevel(), getDescription());
/*
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java
index 8caad5f6fb..7c37c274a6 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/EventNodeBase.java
@@ -67,7 +67,7 @@ import org.joda.time.DateTime;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.coreutils.Logger;
import org.sleuthkit.autopsy.coreutils.ThreadConfined;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.events.TagsAddedEvent;
import org.sleuthkit.autopsy.timeline.events.TagsDeletedEvent;
@@ -126,7 +126,7 @@ public abstract class EventNodeBase extends StackP
final HBox controlsHBox = new HBox(5);
final HBox infoHBox = new HBox(5, eventTypeImageView, hashIV, tagIV, descrLabel, countLabel, controlsHBox);
final SleuthkitCase sleuthkitCase;
- final FilteredEventsModel eventsModel;
+ final EventsModel eventsModel;
private Timeline timeline;
private Button pinButton;
private final Border SELECTION_BORDER;
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/datamodel/DetailsViewModel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/datamodel/DetailsViewModel.java
index ff0b77d49c..4045c05ffd 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/datamodel/DetailsViewModel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/datamodel/DetailsViewModel.java
@@ -45,13 +45,13 @@ import org.joda.time.DateTimeZone;
import org.joda.time.Interval;
import org.joda.time.Period;
import org.sleuthkit.autopsy.coreutils.Logger;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.UIFilter;
import org.sleuthkit.autopsy.timeline.utils.CacheLoaderImpl;
import org.sleuthkit.autopsy.timeline.utils.RangeDivision;
import org.sleuthkit.autopsy.timeline.zooming.TimeUnits;
-import org.sleuthkit.autopsy.timeline.zooming.ZoomState;
+import org.sleuthkit.autopsy.timeline.zooming.EventsModelParams;
import org.sleuthkit.datamodel.SleuthkitCase;
import org.sleuthkit.datamodel.TimelineManager;
import org.sleuthkit.datamodel.TskCoreException;
@@ -68,12 +68,12 @@ final public class DetailsViewModel {
private final static Logger logger = Logger.getLogger(DetailsViewModel.class.getName());
- private final FilteredEventsModel eventsModel;
- private final LoadingCache> eventCache;
+ private final EventsModel eventsModel;
+ private final LoadingCache> eventCache;
private final TimelineManager eventManager;
private final SleuthkitCase sleuthkitCase;
- public DetailsViewModel(FilteredEventsModel eventsModel) {
+ public DetailsViewModel(EventsModel eventsModel) {
this.eventsModel = eventsModel;
this.eventManager = eventsModel.getEventManager();
this.sleuthkitCase = eventsModel.getSleuthkitCase();
@@ -86,7 +86,7 @@ final public class DetailsViewModel {
}
@Subscribe
- void handleCacheInvalidation(FilteredEventsModel.CacheInvalidatedEvent event) {
+ void handleCacheInvalidation(EventsModel.CacheInvalidatedEvent event) {
eventCache.invalidateAll();
}
@@ -99,7 +99,7 @@ final public class DetailsViewModel {
*
* @throws org.sleuthkit.datamodel.TskCoreException
*/
- public List getEventStripes(ZoomState zoom) throws TskCoreException {
+ public List getEventStripes(EventsModelParams zoom) throws TskCoreException {
return getEventStripes(UIFilter.getAllPassFilter(), zoom);
}
@@ -113,11 +113,11 @@ final public class DetailsViewModel {
*
* @throws org.sleuthkit.datamodel.TskCoreException
*/
- public List getEventStripes(UIFilter uiFilter, ZoomState zoom) throws TskCoreException {
+ public List getEventStripes(UIFilter uiFilter, EventsModelParams zoom) throws TskCoreException {
DateTimeZone timeZone = TimeLineController.getJodaTimeZone();
//unpack params
Interval timeRange = zoom.getTimeRange();
- TimelineLevelOfDetail descriptionLOD = zoom.getDescriptionLOD();
+ TimelineLevelOfDetail descriptionLOD = zoom.getTimelineLOD();
//intermediate results
Map> eventClusters = new HashMap<>();
@@ -156,10 +156,10 @@ final public class DetailsViewModel {
* @throws org.sleuthkit.datamodel.TskCoreException If there is an error
* querying the db.
*/
- private List getEvents(ZoomState zoom, DateTimeZone timeZone) throws TskCoreException {
+ private List getEvents(EventsModelParams zoom, DateTimeZone timeZone) throws TskCoreException {
//unpack params
Interval timeRange = zoom.getTimeRange();
- TimelineFilter.RootFilter activeFilter = zoom.getFilterState().getActiveFilter();
+ TimelineFilter.RootFilter activeFilter = zoom.getEventFilterState().getActiveFilter();
return eventManager.getEvents(timeRange, activeFilter);
}
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties
old mode 100755
new mode 100644
index 5252dcf4f3..ce6bd8ed7d
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/detailview/tree/Bundle_ja.properties
@@ -1,4 +1,4 @@
-EventsTree.Label.text=\u30BD\u30FC\u30C8\u30D0\u30A4\uFF1A
-TreeComparator.Count.displayName=\u30AB\u30A6\u30F3\u30C8
-TreeComparator.Description.displayName=\u8AAC\u660E
-TreeComparator.Type.displayName=\u30BF\u30A4\u30D7
\ No newline at end of file
+EventsTree.Label.text=\u6b21\u3067\u30bd\u30fc\u30c8:
+TreeComparator.Count.displayName=\u30ab\u30a6\u30f3\u30c8
+TreeComparator.Description.displayName=\u8a18\u8ff0
+TreeComparator.Type.displayName=\u30bf\u30a4\u30d7
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle.properties-MERGED
index 149c2da610..e637c111e2 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle.properties-MERGED
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle.properties-MERGED
@@ -1,7 +1,7 @@
FilsetSetPanel.hiddenDescriptionsPane.displayName=Hidden Descriptions
FilterSetPanel.applyButton.longText=(Re)Apply filters
FilterSetPanel.applyButton.text=Apply
-FilterSetPanel.defaultButton.text=Default
+FilterSetPanel.defaultButton.text=Reset
FilterSetPanel.hiddenDescriptionsListView.remove=Remove from list
FilterSetPanel.hiddenDescriptionsListView.unhideAndRemove=Unhide and remove from list
Timeline.ui.filtering.menuItem.all=all
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties
old mode 100755
new mode 100644
index bad4e2e9ca..6c9352b270
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/Bundle_ja.properties
@@ -1,12 +1,12 @@
-Timeline.ui.filtering.menuItem.all=\u5168\u3066
-Timeline.ui.filtering.menuItem.none=\u7121\u3057
-Timeline.ui.filtering.menuItem.only=\u4E0B\u8A18\u306B\u9650\u5B9A
-Timeline.ui.filtering.menuItem.others=\u305D\u306E\u4ED6
-Timeline.ui.filtering.menuItem.select=\u9078\u629E
-Timeline.ui.filtering.promptText=\u30D5\u30A3\u30EB\u30BF\u30B9\u30C8\u30EA\u30F3\u30B0\u3092\u5165\u529B
+FilsetSetPanel.hiddenDescriptionsPane.displayName=\u975e\u8868\u793a\u306e\u8aac\u660e
+FilterSetPanel.applyButton.longText=\u30d5\u30a3\u30eb\u30bf\u30fc\u3092(\u6700)\u9069\u7528
FilterSetPanel.applyButton.text=\u9069\u7528
-FilterSetPanel.defaultButton.text=\u30C7\u30D5\u30A9\u30EB\u30C8
-FilsetSetPanel.hiddenDescriptionsPane.displayName=\u96A0\u3055\u308C\u305F\u8AAC\u660E
-FilterSetPanel.applyButton.longText=\u30D5\u30A3\u30EB\u30BF\u30FC\u3092\uFF08\u518D\uFF09\u9069\u7528
-FilterSetPanel.hiddenDescriptionsListView.remove=\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664
-FilterSetPanel.hiddenDescriptionsListView.unhideAndRm=\u96A0\u3057\u305F\u3082\u306E\u3092\u8868\u793A\u3057\u3001\u30EA\u30B9\u30C8\u304B\u3089\u524A\u9664
\ No newline at end of file
+FilterSetPanel.defaultButton.text=\u30c7\u30d5\u30a9\u30eb\u30c8
+FilterSetPanel.hiddenDescriptionsListView.remove=\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664
+FilterSetPanel.hiddenDescriptionsListView.unhideAndRemove=\u975e\u8868\u793a\u306b\u3057\u3066\u30ea\u30b9\u30c8\u304b\u3089\u524a\u9664
+Timeline.ui.filtering.menuItem.all=\u3059\u3079\u3066
+Timeline.ui.filtering.menuItem.none=\u306a\u3057
+Timeline.ui.filtering.menuItem.only=\u306e\u307f
+Timeline.ui.filtering.menuItem.others=\u305d\u306e\u4ed6
+Timeline.ui.filtering.menuItem.select=\u9078\u629e
+Timeline.ui.filtering.promptText=\u30d5\u30a3\u30eb\u30bf\u30fc\u6587\u5b57\u5217\u3092\u5165\u529b
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
index 5d28e24c82..1fa268ffc2 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/FilterSetPanel.java
@@ -40,7 +40,7 @@ import org.controlsfx.control.action.Action;
import org.controlsfx.control.action.ActionUtils;
import org.openide.util.NbBundle;
import org.sleuthkit.autopsy.timeline.FXMLConstructor;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.actions.ResetFilters;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.DescriptionFilterState;
@@ -79,7 +79,7 @@ final public class FilterSetPanel extends BorderPane {
@FXML
private SplitPane splitPane;
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
private final TimeLineController controller;
/**
@@ -90,7 +90,7 @@ final public class FilterSetPanel extends BorderPane {
private double dividerPosition;
@NbBundle.Messages({
- "FilterSetPanel.defaultButton.text=Default",
+ "FilterSetPanel.defaultButton.text=Reset",
"FilsetSetPanel.hiddenDescriptionsPane.displayName=Hidden Descriptions"})
@FXML
void initialize() {
@@ -115,16 +115,16 @@ final public class FilterSetPanel extends BorderPane {
legendColumn.setCellFactory(col -> new LegendCell(this.controller));
//type is the only filter expanded initialy
- expansionMap.put(filteredEvents.getFilterState().getFilter(), true);
- expansionMap.put(filteredEvents.getFilterState().getEventTypeFilterState().getFilter(), true);
+ expansionMap.put(filteredEvents.getEventFilterState().getFilter(), true);
+ expansionMap.put(filteredEvents.getEventFilterState().getEventTypeFilterState().getFilter(), true);
InvalidationListener applyFiltersListener = observable -> applyFilters();
- filteredEvents.eventTypeZoomProperty().addListener(applyFiltersListener);
+ filteredEvents.eventTypesHierarchyLevelProperty().addListener(applyFiltersListener);
filteredEvents.descriptionLODProperty().addListener(applyFiltersListener);
filteredEvents.timeRangeProperty().addListener(applyFiltersListener);
- filteredEvents.filterProperty().addListener(observable -> refreshFilterUI());
+ filteredEvents.eventFilterProperty().addListener(observable -> refreshFilterUI());
refreshFilterUI();
hiddenDescriptionsListView.setItems(controller.getQuickHideFilters());
@@ -164,7 +164,7 @@ final public class FilterSetPanel extends BorderPane {
private void refreshFilterUI() {
Platform.runLater(()
- -> filterTreeTable.setRoot(new FilterTreeItem(filteredEvents.filterProperty().get().copyOf(), expansionMap)));
+ -> filterTreeTable.setRoot(new FilterTreeItem(filteredEvents.eventFilterProperty().get().copyOf(), expansionMap)));
}
private void applyFilters() {
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java
index 53ffec84a6..9a4b6cd080 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/LegendCell.java
@@ -28,13 +28,13 @@ import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import org.openide.util.NbBundle;
-import org.sleuthkit.autopsy.timeline.FilteredEventsModel;
+import org.sleuthkit.autopsy.timeline.EventsModel;
import org.sleuthkit.autopsy.timeline.TimeLineController;
import org.sleuthkit.autopsy.timeline.ui.EventTypeUtils;
import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.FilterState;
import org.sleuthkit.datamodel.TimelineEventType;
-import org.sleuthkit.datamodel.TimelineFilter.TextFilter;
import org.sleuthkit.datamodel.TimelineFilter.EventTypeFilter;
+import org.sleuthkit.autopsy.timeline.ui.filtering.datamodel.TextFilterState;
/**
* A TreeTableCell that shows an icon and color corresponding to the represented
@@ -46,7 +46,7 @@ final class LegendCell extends TreeTableCell, FilterState>> {
private final TimeLineController controller;
- private final FilteredEventsModel filteredEvents;
+ private final EventsModel filteredEvents;
//We need a controller so we can listen to changes in EventTypeZoom to show/hide legends
LegendCell(TimeLineController controller) {
@@ -65,9 +65,16 @@ final class LegendCell extends TreeTableCell, FilterState>> {
setBackground(null);
});
} else {
-
+
//TODO: make some subclasses rather than use this if else chain.
- if (item.getFilter() instanceof EventTypeFilter) {
+ if (item instanceof TextFilterState) {
+ TextFilterState filterState = (TextFilterState)item;
+ TextField textField = new TextField();
+ textField.setPromptText(Bundle.Timeline_ui_filtering_promptText());
+ textField.textProperty().bindBidirectional(filterState.descriptionSubstringProperty());
+ Platform.runLater(() -> setGraphic(textField));
+
+ } else if (item.getFilter() instanceof EventTypeFilter) {
EventTypeFilter filter = (EventTypeFilter) item.getFilter();
Rectangle rect = new Rectangle(20, 20);
@@ -75,7 +82,7 @@ final class LegendCell extends TreeTableCell, FilterState>> {
rect.setArcWidth(5);
rect.setStrokeWidth(3);
setLegendColor(filter, rect, this.filteredEvents.getEventTypeZoom());
- this.filteredEvents.eventTypeZoomProperty().addListener((obs, oldZoomLevel, newZoomLevel) -> {
+ this.filteredEvents.eventTypesHierarchyLevelProperty().addListener((obs, oldZoomLevel, newZoomLevel) -> {
setLegendColor(filter, rect, newZoomLevel);
});
@@ -88,13 +95,6 @@ final class LegendCell extends TreeTableCell, FilterState>> {
setContentDisplay(ContentDisplay.CENTER);
});
- } else if (item.getFilter() instanceof TextFilter) {
- TextFilter filter = (TextFilter) item.getFilter();
- TextField textField = new TextField();
- textField.setPromptText(Bundle.Timeline_ui_filtering_promptText());
- textField.textProperty().bindBidirectional(filter.substringProperty());
- Platform.runLater(() -> setGraphic(textField));
-
} else {
Platform.runLater(() -> {
setGraphic(null);
diff --git a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/datamodel/AbstractFilterState.java b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/datamodel/AbstractFilterState.java
index ca902eb53c..eeea44bbad 100755
--- a/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/datamodel/AbstractFilterState.java
+++ b/Core/src/org/sleuthkit/autopsy/timeline/ui/filtering/datamodel/AbstractFilterState.java
@@ -26,26 +26,41 @@ import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
/**
- * Abstract base class for FilterStates. Provides selected, disabled, and active
- * properties.
+ * An abstract base class for implementations of the FilterState interface.
+ * Filter state classes are wrappers that adapt a timeline data model filtering
+ * object for display by the timeline GUI by providing selected, disabled, and
+ * active properties for the wrapped filter.
+ *
+ * @param The type of the wrapped filter.
*/
-abstract class AbstractFilterState implements FilterState