From 3f2597e45cbf7c068ed46d5b4c2f05be3b60be78 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 23 Jul 2024 16:04:38 +0100
Subject: [PATCH 01/35] Adding credibility signals feature
Add assistant text classifier UI with html formatting
first commit
added new sagas
starting to add accordion display
Displaying gcloud cred signals
tidied up list of genre, topic, persuasion
added typography
machince generated text service added
fixed subjectivity
displaying subjective sentences
displaying correct subjective sentences
tidied display of credibillity signals
using stored secrets for kinit services
removed classifiers from URL test box
added code for checking logged in for pfc
preventing pfc from being called if not logged in
removing unnnecessary imports
adding subj tooltip and pfc limit
refactored credibility signals
added messages for after logging in
login message and passing text to semantic search as variable
captialised genres
added assistant.json text
moved tooltips out to cardheader
pfc and mgt sagas work after login
typos
added comments
added embedding message
moved credsignals grid to correct card
removed console.log message
removed unnecessary tooltip
log
moved text to assistant.json
tidied code
counting categories in wrapfunc
counting categories in wrapfunc change
---
.../components/NavItems/tools/Assistant.json | 39 +
.../NavItems/Assistant/Assistant.jsx | 26 +-
.../AssistantApiHandlers/useAssistantApi.jsx | 150 +++
.../AssistantCheckStatus.jsx | 18 +
.../AssistantCredibilitySignals.jsx | 903 ++++++++++++++++++
.../AssistantTextClassification.jsx | 337 +++++++
.../AssistantTextResult.jsx | 10 +-
.../AssistantTextSpanClassification.jsx | 396 ++++++++
.../assistantTextResultStyle.css | 7 +
.../AssistantScrapeResults/assistantUtils.jsx | 205 +++-
.../components/ResultDisplayItem.jsx | 13 +-
.../NavItems/tools/SemanticSearch/index.jsx | 17 +-
src/redux/actions/tools/assistantActions.jsx | 104 ++
src/redux/reducers/assistantReducer.jsx | 51 +
src/redux/sagas/assistantSaga.jsx | 162 +++-
15 files changed, 2398 insertions(+), 40 deletions(-)
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/assistantTextResultStyle.css
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 8971587d8..464de9540 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -113,4 +113,43 @@
"extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
"extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
"embedding_not_supported":"The Assistant could not display this video content."
+ "assistant_video_download_action": "Download video",
+ "assistant_video_download_action_description": "Click here to download the video, to your machine. The download video can then be used in the assistant to access a wider range of video analysis services.",
+ "credibility_signals": "Credibility Signals",
+ "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given article.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the given article is.",
+ "importance_tooltip": "The background of highlighted sentences varies depending on the detection algorithm's rating of its importance.",
+ "confidence_tooltip_technique": "The background of the detected techniques varies depending on the detection algorithm's confidence.",
+ "confidence_tooltip_sentence": "The background of highlighted sentences varies depending on the detection algorithm's confidence.",
+ "highlight_important_sentence": "Highlight important sentences",
+ "low_importance": "Low importance",
+ "high_importance": "High importance",
+ "low_confidence": "Low confidence",
+ "high_confidence": "High confidence",
+ "colour_scale": "The colour scale is shown below:",
+ "news_framing": "Topic",
+ "news_framing_tooltip": "Given a news article, identify the frames used in the article. A frame is the perspective under which an issue or a piece of news is presented. We consider 14 frames: Economic, Capacity and resources, Morality, Fairness and equality, Legality, constitutionality and jurisprudence, Policy prescription and evaluation, Crime and punishment, Security and defense, Health and safety, Quality of life, Cultural identity, Public opinion, Political, External regulation and reputation.",
+ "news_genre": "Genre",
+ "news_genre_tooltip": "Given a news article, determine whether it is an opinion piece, aims at objective news reporting, or is a satire piece.",
+ "persuasion_techniques": "Persuasion Techniques",
+ "persuasion_techniques_tooltip": "Identifies the persuasion techniques of the text, 23 persuasion techniques are considered, although the actual number of techniques per language may vary slightly.",
+ "detected_techniques": "Detected techniques",
+ "no_detected_categories": "No detected categories",
+ "subjectivity": "Subjectivity",
+ "subjectivity_tooltip": "Identifies the subjective sentences given an article.",
+ "subjective_sentences_detected": "Subjective sentences detected",
+ "no_subjective_sentences_detected": "No subjective sentences detected",
+ "previous_fact_checks": "Previous Fact-Checks",
+ "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the top 5 results ranked by relevance. This tool is only accesible as a logged in beta tester user.",
+ "machine_generated_text": "Machine Generated Text",
+ "machine_generated_text_tooltip": "Given an article, detects whether the text has been written by human or machine with a confidence score. This tool is only accesible as a logged in beta tester user.",
+ "failed_to_load": "Failed to load.",
+ "previous_fact_checks_found": "Top 5 previous fact-checks found",
+ "login_required": "Please log in as a beta user to see results.",
+ "reanalyse_url": "Please reanalyse URL to see results.",
+ "semantic_search_result_claim": "Claim:",
+ "semantic_search_result_title": "Title:",
+ "semantic_search_result_translated_from": "Translated from",
+ "semantic_search_result_see_original": "See original",
+ "semantic_search_result_english_translation": "Show English Translation",
+ "semantic_search_rating": "Rating:",
}
\ No newline at end of file
diff --git a/src/components/NavItems/Assistant/Assistant.jsx b/src/components/NavItems/Assistant/Assistant.jsx
index a3ab327cc..cdcc397d9 100644
--- a/src/components/NavItems/Assistant/Assistant.jsx
+++ b/src/components/NavItems/Assistant/Assistant.jsx
@@ -19,6 +19,7 @@ import AssistantSCResults from "./AssistantScrapeResults/AssistantSCResults";
import AssistantTextResult from "./AssistantScrapeResults/AssistantTextResult";
import AssistantUrlSelected from "./AssistantUrlSelected";
import AssistantWarnings from "./AssistantScrapeResults/AssistantWarnings";
+import AssistantCredSignals from "./AssistantScrapeResults/AssistantCredibilitySignals";
import {
cleanAssistantState,
@@ -52,6 +53,13 @@ const Assistant = () => {
//third party check states
const neResult = useSelector((state) => state.assistant.neResultCategory);
+ const newsFramingResult = useSelector(
+ (state) => state.assistant.newsFramingResult,
+ );
+ const newsGenreResult = useSelector(
+ (state) => state.assistant.newsGenreResult,
+ );
+ const hpResult = useSelector((state) => state.assistant.hpResult);
// source credibility
const positiveSourceCred = useSelector(
@@ -79,6 +87,13 @@ const Assistant = () => {
(state) => state.assistant.dbkfMediaMatchFail,
);
const neFailState = useSelector((state) => state.assistant.neFail);
+ const newsFramingFailState = useSelector(
+ (state) => state.assistant.newsFramingFail,
+ );
+ const newsGenreFailState = useSelector(
+ (state) => state.assistant.newsGenreFail,
+ );
+ // const mtFailState = useSelector(state => state.assistant.mtFail)
//local state
const [formInput, setFormInput] = useState(inputUrl);
@@ -163,7 +178,9 @@ const Assistant = () => {
{scFailState ||
dbkfTextFailState ||
dbkfMediaFailState ||
- neFailState ? (
+ neFailState ||
+ newsFramingFailState ||
+ newsGenreFailState ? (
@@ -233,6 +250,12 @@ const Assistant = () => {
) : null}
+
+ {text ? (
+
+
+
+ ) : null}
@@ -240,5 +263,4 @@ const Assistant = () => {
);
};
-
export default Assistant;
diff --git a/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx b/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
index 472d54fa1..3a243c51c 100644
--- a/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
+++ b/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
@@ -76,16 +76,166 @@ export default function assistantApiCalls() {
return result.data;
};
+ const MAX_NUM_RETRIES = 3;
+
+ /**
+ * Calls an async function that throws an exception when it fails, will retry for numMaxRetries
+ * @param numMaxRetries Number of times the function will be retried
+ * @param asyncFunc The async function to call
+ * @param errorFunc Called when asyncFunc throws an error when there are additional retries
+ * @returns {Promise<*>} Output of asyncFunc
+ */
+ async function callAsyncWithNumRetries(
+ numMaxRetries,
+ asyncFunc,
+ errorFunc = null,
+ ) {
+ for (let retryCount = 0; retryCount < numMaxRetries; retryCount++) {
+ try {
+ return await asyncFunc();
+ } catch (e) {
+ if (retryCount + 1 >= MAX_NUM_RETRIES) {
+ throw e;
+ } else {
+ if (errorFunc) errorFunc(retryCount, e);
+ }
+ }
+ }
+ }
+
+ const callNewsFramingService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/news-framing-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to news framing service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callNewsGenreService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/news-genre-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to news genre service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callPersuasionService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/persuasion-span-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to persuasion service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
const callOcrScriptService = async () => {
const result = await axios.get(assistantEndpoint + "gcloud/ocr-scripts");
return result.data;
};
+ const callSubjectivityService = async (text) => {
+ const result = await axios.post(assistantEndpoint + "dw/subjectivity", {
+ content: text,
+ });
+
+ return result.data;
+ };
+
+ const callPrevFactChecksService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.get(
+ assistantEndpoint +
+ "kinit/prev-fact-checks" +
+ "?text=" +
+ encodeURIComponent(text), // max URL length is 2048 characters
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to previous fact checks service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callMachineGeneratedTextService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.get(
+ assistantEndpoint +
+ "kinit/machine-generated-text" +
+ "?text=" +
+ encodeURIComponent(text), // max URL length is 2048 characters
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to machine generated text service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
return {
callAssistantScraper,
callSourceCredibilityService,
callNamedEntityService,
callOcrService,
callOcrScriptService,
+ callNewsFramingService,
+ callNewsGenreService,
+ callPersuasionService,
+ callSubjectivityService,
+ callPrevFactChecksService,
+ callMachineGeneratedTextService,
};
}
diff --git a/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx b/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
index 522fe8b3a..b1978e721 100644
--- a/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
+++ b/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
@@ -34,11 +34,29 @@ const AssistantCheckStatus = () => {
const neTitle = keyword("ne_title");
const neFailState = useSelector((state) => state.assistant.neFail);
+ const newsFramingTitle = "news topic";
+ const newsFramingFailState = useSelector(
+ (state) => state.assistant.newsFramingFail
+ );
+
+ const newsGenreTitle = "news genre";
+ const newsGenreFailState = useSelector(
+ (state) => state.assistant.newsGenreFail
+ );
+
+ const persuasionTitle = "persuasion";
+ const persuasionFailState = useSelector(
+ (state) => state.assistant.persuasionFail
+ );
+
const failStates = [
{ title: scTitle, failed: scFailState },
{ title: dbkfMediaTitle, failed: dbkfMediaFailState },
{ title: dbkfTextTitle, failed: dbkfTextFailState },
{ title: neTitle, failed: neFailState },
+ { title: newsFramingTitle, failed: newsFramingFailState },
+ { title: newsGenreTitle, failed: newsGenreFailState },
+ { title: persuasionTitle, failed: persuasionFailState },
];
return (
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
new file mode 100644
index 000000000..e362611e4
--- /dev/null
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -0,0 +1,903 @@
+import React, { useState } from "react";
+import { useSelector } from "react-redux";
+
+import Box from "@mui/material/Box";
+import Card from "@mui/material/Card";
+import { CardHeader, CircularProgress, Link, styled } from "@mui/material";
+import CardContent from "@mui/material/CardContent";
+import Grid from "@mui/material/Grid";
+import Accordion from "@mui/material/Accordion";
+import AccordionSummary from "@mui/material/AccordionSummary";
+import AccordionDetails from "@mui/material/AccordionDetails";
+import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
+import Typography from "@mui/material/Typography";
+import { i18nLoadNamespace } from "components/Shared/Languages/i18nLoadNamespace";
+import useMyStyles from "../../../Shared/MaterialUiStyles/useMyStyles";
+import Tooltip from "@mui/material/Tooltip";
+import HelpOutlineOutlinedIcon from "@mui/icons-material/HelpOutlineOutlined";
+import AssistantTextClassification from "./AssistantTextClassification";
+import AssistantTextSpanClassification from "./AssistantTextSpanClassification";
+import ResultDisplayItem from "components/NavItems/tools/SemanticSearch/components/ResultDisplayItem";
+import dayjs from "dayjs";
+import LocaleData from "dayjs/plugin/localeData";
+import localizedFormat from "dayjs/plugin/localizedFormat";
+
+import Collapse from "@mui/material/Collapse";
+import Divider from "@mui/material/Divider";
+import {
+ ExpandLessOutlined,
+ ExpandMoreOutlined,
+ Remove,
+} from "@mui/icons-material";
+import TranslateIcon from "@mui/icons-material/Translate";
+import IconButton from "@mui/material/IconButton";
+import FileCopyOutlined from "@mui/icons-material/FileCopy";
+
+import { useNavigate } from "react-router-dom";
+import { getLanguageName } from "../../../Shared/Utils/languageUtils";
+
+const renderEntityKeys = (entities) => {
+ // tidy array into readable string
+ let entitiesString = Object.keys(entities)
+ .toString()
+ .replace("Important_Sentence", "")
+ .replaceAll(",", ", ")
+ .replaceAll("_", " ")
+ .trim();
+
+ // remove beginning and last hanging commas
+ if (entitiesString.slice(0, 2) === ", ") {
+ entitiesString = entitiesString.substring(2, entitiesString.length);
+ }
+ if (entitiesString.slice(-1) === ",") {
+ entitiesString = entitiesString.substring(0, entitiesString.length - 1);
+ }
+
+ return entitiesString;
+};
+
+const round = (number, decimalPlaces) => {
+ return (Math.round(number * 100) / 100).toFixed(decimalPlaces);
+};
+
+const calculateSubjectivity = (sentences) => {
+ let scoresSUBJ = [];
+ for (let i = 0; i < sentences.length; i++) {
+ if (sentences[i].label == "SUBJ") {
+ scoresSUBJ.push(Number(sentences[i].score));
+ }
+ }
+ //const scoresSumSUBJ = scoresSUBJ.reduce((partialSum, a) => partialSum + a, 0);
+ //const scoresSumSUBJPercent = (scoresSumSUBJ / sentences.length) * 100.0;
+
+ //let dp = 2;
+ return [
+ scoresSUBJ.length,
+ [
+ //round(scoresSumSUBJPercent, dp),
+ //"% (",
+ " (",
+ scoresSUBJ.length,
+ "/",
+ sentences.length,
+ ")",
+ ]
+ .toString()
+ .replaceAll(",", ""),
+ ];
+};
+
+const getExpandIcon = (loading, fail, done = null, role = null) => {
+ if (loading || fail || done || (role && !role.includes("BETA_TESTER"))) {
+ return ;
+ } else {
+ return ;
+ }
+};
+
+const renderCollapse = (
+ classes,
+ setDisplayOrigLang,
+ displayOrigLang,
+ textLang,
+ sharedKeyword,
+ keyword,
+ text,
+ displayExpander,
+ expanded,
+ setExpanded,
+) => {
+ return (
+
+
+
+
+ setDisplayOrigLang(!displayOrigLang)}
+ >
+ {textLang}
+
+
+ {
+ navigator.clipboard.writeText(text);
+ }}
+ >
+
+
+
+ {textLang && textLang !== "en" && textLang !== "" ? (
+
+
+ window.open(
+ "https://translate.google.com/?sl=auto&text=" +
+ encodeURIComponent(text) +
+ "&op=translate",
+ "_blank",
+ )
+ }
+ >
+
+
+
+ ) : null}
+
+
+ {displayExpander ? (
+ expanded ? (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ ) : (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ )
+ ) : null}
+
+
+
+ );
+};
+
+const renderCollapsePrevFactChecks = (
+ classes,
+ displayExpander,
+ expanded,
+ setExpanded,
+ navigate,
+) => {
+ const handleClick = (path) => {
+ // instead need to set parameter then load text in SemanticSearch/index.jsx
+ navigate("/app/" + path + "/assistantText");
+ };
+
+ return (
+
+
+
+
+ <>>
+
+
+
+
+ For more details see{" "}
+ handleClick("tools/semanticSearch")}
+ >
+ Fact Check Semantic Search
+ {" "}
+ tool.
+
+
+
+ {displayExpander ? (
+ expanded ? (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ ) : (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ )
+ ) : null}
+
+
+
+ );
+};
+
+const AssistantCredSignals = () => {
+ const keyword = i18nLoadNamespace("components/NavItems/tools/Assistant");
+ const sharedKeyword = i18nLoadNamespace("components/Shared/utils");
+ const classes = useMyStyles();
+
+ // displaying expanded text in AccordionDetails
+ const [displayOrigLang, setDisplayOrigLang] = useState(true);
+ const [displayExpander, setDisplayExpander] = useState(true);
+ const [expanded, setExpanded] = useState(true);
+
+ // one accordion open at once
+ const [expandedAccordion, setExpandedAccordion] = React.useState("false");
+ const handleChange = (panel) => (event, newExpanded) => {
+ setExpandedAccordion(newExpanded ? panel : false);
+ };
+
+ //style disabled accordion
+ const StyledAccordion = styled(Accordion)(({ theme }) => ({
+ ".Mui-disabled": {
+ opacity: "1 !important",
+ background: "white",
+ },
+ }));
+
+ // assistant media states
+ const text = useSelector((state) => state.assistant.urlText);
+ const textLang = useSelector((state) => state.assistant.textLang);
+ const textHtmlMap = useSelector((state) => state.assistant.urlTextHtmlMap);
+
+ // news framing (topic)
+ const newsFramingTitle = keyword("news_framing");
+ const newsFramingResult = useSelector(
+ (state) => state.assistant.newsFramingResult,
+ );
+ const newsFramingLoading = useSelector(
+ (state) => state.assistant.newsFramingLoading,
+ );
+ const newsFramingDone = useSelector(
+ (state) => state.assistant.newsFramingDone,
+ );
+ const newsFramingFail = useSelector(
+ (state) => state.assistant.newsFramingFail,
+ );
+
+ // news genre
+ const newsGenreTitle = keyword("news_genre");
+ const newsGenreResult = useSelector(
+ (state) => state.assistant.newsGenreResult,
+ );
+ const newsGenreLoading = useSelector(
+ (state) => state.assistant.newsGenreLoading,
+ );
+ const newsGenreDone = useSelector((state) => state.assistant.newsGenreDone);
+ const newsGenreFail = useSelector((state) => state.assistant.newsGenreFail);
+
+ // persuasion techniques
+ const persuasionTitle = keyword("persuasion_techniques");
+ const persuasionResult = useSelector(
+ (state) => state.assistant.persuasionResult,
+ );
+ const persuasionLoading = useSelector(
+ (state) => state.assistant.persuasionLoading,
+ );
+ const persuasionDone = useSelector((state) => state.assistant.persuasionDone);
+ const persuasionFail = useSelector((state) => state.assistant.persuasionFail);
+
+ // subjectivity
+ const subjectivityTitle = keyword("subjectivity");
+ const subjectivityResult = useSelector(
+ (state) => state.assistant.subjectivityResult,
+ );
+ const subjectivityLoading = useSelector(
+ (state) => state.assistant.subjectivityLoading,
+ );
+ const subjectivityDone = useSelector(
+ (state) => state.assistant.subjectivityDone,
+ );
+ const subjectivityFail = useSelector(
+ (state) => state.assistant.subjectivityFail,
+ );
+
+ // previous fact checks
+ const prevFactChecksTitle = keyword("previous_fact_checks");
+ const prevFactChecksResult = useSelector(
+ (state) => state.assistant.prevFactChecksResult,
+ );
+ const prevFactChecksLoading = useSelector(
+ (state) => state.assistant.prevFactChecksLoading,
+ );
+ const prevFactChecksDone = useSelector(
+ (state) => state.assistant.prevFactChecksDone,
+ );
+ const prevFactChecksFail = useSelector(
+ (state) => state.assistant.prevFactChecksFail,
+ );
+ // checking if user logged in
+ const role = useSelector((state) => state.userSession.user.roles);
+ // date information
+ dayjs.extend(LocaleData);
+ dayjs.extend(localizedFormat);
+ const globalLocaleData = dayjs.localeData();
+ // for navigating to Semantic Search with text
+ const navigate = useNavigate();
+
+ // machine generated text
+ const machineGeneratedTextTitle = keyword("machine_generated_text");
+ const machineGeneratedTextResult = useSelector(
+ (state) => state.assistant.machineGeneratedTextResult,
+ );
+ const machineGeneratedTextLoading = useSelector(
+ (state) => state.assistant.machineGeneratedTextLoading,
+ );
+ const machineGeneratedTextDone = useSelector(
+ (state) => state.assistant.machineGeneratedTextDone,
+ );
+ const machineGeneratedTextFail = useSelector(
+ (state) => state.assistant.machineGeneratedTextFail,
+ );
+
+ return (
+
+
+
+ {keyword("credibility_signals")}
+
+ }
+ action={
+ // tooltip
+ " +
+ keyword("news_framing") +
+ " " +
+ keyword("news_framing_tooltip") +
+ "
,
+ );
+ }
+ techniqueContent.push(tooltipText);
+
+ let techniquesTooltip = (
+
+ );
+
+ // Append highlighted text
+ return (
+
+
+ {spanText}
+
+
+ );
+ }
+
+ if (highlightSpan && mergedSpanIndices.length > 0) {
+ if (textHtmlMap) {
+ // Text formatted & highlighted
+ output = treeMapToElements(
+ text,
+ textHtmlMap,
+ mergedSpanIndices,
+ wrapHighlightedText,
+ );
+ } else {
+ // Plaintex & highlighted
+ output = wrapPlainTextSpan(
+ text,
+ mergedSpanIndices,
+ wrapHighlightedText,
+ );
+ }
+ } else if (textHtmlMap) {
+ // Text formatted but not highlighted
+ output = treeMapToElements(text, textHtmlMap);
+ }
+
+ return [output, categories];
+ }
+
+ // Filter for selecting all labels (currentLabel == null) or just a single label
+ const filteredClassification =
+ currentLabel !== null && currentLabel in classification
+ ? { [currentLabel]: classification[currentLabel] }
+ : classification;
+
+ // Classification variable is a map of categories where each one has a list of classified spans, we
+ // have to invert that so that we have a list of spans that contains all categories in that span
+ let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+
+ // console.log("mergedSpanIndices=", mergedSpanIndices);
+ //console.log("filteredClassification=", filteredClassification);
+
+ //let categories = {};
+ // added
+ [output, categories] = renderOnce(mergedSpanIndices, categories);
+ // need to do this only once
+ console.log("categories=", categories);
+ childToParent(categories); //it's infinitely looping
+
+ return {output};
+}
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/assistantTextResultStyle.css b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantTextResultStyle.css
new file mode 100644
index 000000000..05068361f
--- /dev/null
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantTextResultStyle.css
@@ -0,0 +1,7 @@
+.testBgSpan {
+ background: green;
+}
+
+.testBgSpan:hover {
+ background: red;
+}
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
index ac656344a..363d7bc18 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
@@ -1,4 +1,79 @@
import React from "react";
+import _ from "lodash";
+import { ColourGradientTooltipContent } from "./AssistantTextClassification";
+import Tooltip from "@mui/material/Tooltip";
+
+/**
+ * Interpolate RGB between an arbitrary range
+ * @param value
+ * @param low
+ * @param high
+ * @param rgbLow RGB Value represented as an array e.g. [255, 255, 255] for white
+ * @param rgbHigh RGB Value represented as an array e.g. [255, 255, 255] for white
+ * @returns {*[]}
+ */
+export const interpRgb = (value, low, high, rgbLow, rgbHigh) => {
+ let interp = value;
+ if (value < low) interp = low;
+ if (value > high) interp = high;
+ interp = (interp - low) / (high - low);
+
+ let output = [];
+ for (let i = 0; i < rgbLow.length; i++) {
+ let channelLow = rgbLow[i];
+ let channelHigh = rgbHigh[i];
+ let delta = channelHigh - channelLow;
+ output.push(channelLow + delta * interp);
+ }
+
+ return output;
+};
+
+/**
+ * Converts an array-based RGB representation to rgba() format used by CSS
+ * @param rgb RGB value represented as an array e.g. [255, 255, 255] for white
+ * @returns {string}
+ */
+export const rgbToString = (rgb) => {
+ return "rgba(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ",1)";
+};
+
+/**
+ * Calculates the luminance of an RGB colour
+ * @param rgb RGB value represented as an array e.g. [255, 255, 255] for white
+ * @returns {number}
+ */
+export const rgbToLuminance = (rgb) => {
+ let rgbNorm = rgb.map((c) => c / 255);
+ let rgbLinear = rgbNorm.map((c) => {
+ if (c <= 0.04045) {
+ return c / 12.92;
+ } else {
+ return Math.pow((c + 0.055) / 1.055, 2.4);
+ }
+ });
+ let luminance =
+ rgbLinear[0] * 0.2126 + rgbLinear[1] * 0.7152 + rgbLinear[2] * 0.0722;
+ return luminance;
+};
+
+/**
+ * Generate CSS gradient from a list of RGB values
+ * @param rgbList List RGB value represented as an array e.g. [[0,0,0], [255, 255, 255]] for a black to white gradient
+ * @returns {string}
+ */
+export const rgbListToGradient = (rgbList) => {
+ let gradientStr = "";
+ for (let i = 0; i < rgbList.length; i++) {
+ let colourStr = rgbToString(rgbList[i]);
+ let percentageStr = Math.round((i / (rgbList.length - 1)) * 100).toString();
+
+ if (i > 0) gradientStr += ",";
+ gradientStr += colourStr + " " + percentageStr + "%";
+ }
+ const output = "linear-gradient(90deg, " + gradientStr + ")";
+ return output;
+};
function treeMapToElementsRecursive(
text,
@@ -10,35 +85,17 @@ function treeMapToElementsRecursive(
if ("span" in treeElem) {
const span = treeElem.span;
if (spanHighlightIndices === null) {
- console.log("No span highlight: ", text.substring(span.start, span.end));
childElems.push(text.substring(span.start, span.end));
} else {
- console.log("Span highlight: ", text.substring(span.start, span.end));
let currentIndex = span.start;
for (let i = 0; i < spanHighlightIndices.length; i++) {
const hSpan = spanHighlightIndices[i];
- console.log(
- "Matching span",
- span.start,
- span.end,
- hSpan.indices[0],
- hSpan.indices[1],
- );
const hSpanStart = hSpan.indices[0];
const hSpanEnd = hSpan.indices[1];
if (
(span.start <= hSpanStart && hSpanStart <= span.end) ||
(span.start <= hSpanEnd && hSpanEnd <= span.end)
) {
- //If there's an overlap
- console.log(
- "Found lapping span ",
- span.start,
- span.end,
- hSpanStart,
- hSpanEnd,
- );
-
// If span doesn't start before the current index
if (hSpanStart > currentIndex) {
childElems.push(text.substring(currentIndex, hSpanStart));
@@ -48,15 +105,15 @@ function treeMapToElementsRecursive(
hSpanStart < span.start ? span.start : hSpanStart;
const boundedEnd = hSpanEnd > span.end ? span.end : hSpanEnd;
if (wrapFunc) {
- console.log("Wrapping: ", text.substring(boundedStart, boundedEnd));
childElems.push(
- wrapFunc(text.substring(boundedStart, boundedEnd), hSpan),
+ wrapFunc(
+ text.substring(boundedStart, boundedEnd),
+ hSpan,
+ boundedStart,
+ boundedEnd,
+ ),
);
} else {
- console.log(
- "Not wrapping: ",
- text.substring(boundedStart, boundedEnd),
- );
childElems.push(text.substring(boundedStart, boundedEnd));
}
@@ -81,17 +138,17 @@ function treeMapToElementsRecursive(
),
);
}
+
return React.createElement(treeElem.tag, null, childElems);
}
/**
- * Combines text and html tree to generate dynamic DOM elements. A handler function can be provided in order to
- * insert dynamic elements around each text span.
+ *
* @param text
* @param mapping
- * @param spanHighlightIndices Indices of text spans that should be wrapped, in the format of [{indices: [start, end]}, ...]
- * @param wrapFunc Called for each span indices in spanHighlightIndices the function should take the form of: (text, spanInfo): Element => {}
- * @returns {React.DetailedReactHTMLElement, HTMLInputElement>|*}
+ * @param spanHighlightIndices
+ * @param wrapFunc function(spanText, spanInfo)
+ * @returns Array of plaintext or components directly renderable by react
*/
export const treeMapToElements = (
text,
@@ -100,13 +157,101 @@ export const treeMapToElements = (
wrapFunc = null,
) => {
if (mapping) {
- return treeMapToElementsRecursive(
+ let output = treeMapToElementsRecursive(
text,
mapping,
spanHighlightIndices,
wrapFunc,
);
+
+ return output;
} else {
return text;
}
};
+
+/**
+ *
+ * @param text
+ * @param spanHighlightIndices
+ * @param wrapFunc
+ * @returns Array of plaintext or components directly renderable by react
+ */
+export const wrapPlainTextSpan = (text, spanHighlightIndices, wrapFunc) => {
+ let outputSentences = [];
+ const textLength = text.length;
+ let currentIndex = 0;
+
+ for (let i = 0; i < spanHighlightIndices.length; i++) {
+ const spanInfo = spanHighlightIndices[i];
+ const spanIndexStart = spanInfo.indices[0];
+ // Sometimes the end index is negative so we have to check this
+ const spanIndexEnd =
+ spanInfo.indices[1] > -1 ? spanInfo.indices[1] : textLength;
+
+ // Append but don't highlight any span before
+ if (currentIndex < spanIndexStart) {
+ outputSentences.push(text.substring(currentIndex, spanIndexStart));
+ }
+
+ const spanText = text.substring(spanIndexStart, spanIndexEnd);
+ if (wrapFunc) {
+ outputSentences.push(wrapFunc(spanText, spanInfo));
+ } else {
+ outputSentences.push(spanText);
+ }
+
+ currentIndex = spanIndexEnd;
+ }
+
+ // Append anything not highlighted
+ if (currentIndex < textLength) {
+ outputSentences.push(text.substring(currentIndex, textLength));
+ }
+
+ return outputSentences;
+};
+
+/**
+ * Classification variable is a map of categories where each one has a list of classified spans, we
+ * have to invert that so that we have a list of spans that contains all categories in that span
+ * @param filteredClassification
+ * @returns {*[]}
+ */
+export const mergeSpanIndices = (filteredClassification) => {
+ // classification variable is a map of categories where each one has a list of classified spans, we
+ // have to invert that so that we have a list of spans that contains all categories in that span
+ let mergedSpanIndices = [];
+ for (let label in filteredClassification) {
+ for (let i = 0; i < filteredClassification[label].length; i++) {
+ const spanInfo = filteredClassification[label][i];
+ let matchingSpanFound = false;
+
+ //Finds an existing matching span and append the technique, otherwise add the span to the list
+ for (let j = 0; j < mergedSpanIndices.length; j++) {
+ const mergedSpanInfo = mergedSpanIndices[j];
+ if (
+ spanInfo["indices"][0] === mergedSpanInfo["indices"][0] &&
+ spanInfo["indices"][1] === mergedSpanInfo["indices"][1]
+ ) {
+ //Add technique to existing span
+ mergedSpanInfo["techniques"][label] = spanInfo["score"];
+ matchingSpanFound = true;
+ }
+ }
+ if (!matchingSpanFound) {
+ mergedSpanIndices.push({
+ indices: spanInfo["indices"],
+ techniques: { [label]: spanInfo["score"] },
+ });
+ }
+ }
+ }
+
+ //Sort the spans by start index
+ mergedSpanIndices = _.orderBy(mergedSpanIndices, (obj) => {
+ return obj.indices[0];
+ });
+
+ return mergedSpanIndices;
+};
diff --git a/src/components/NavItems/tools/SemanticSearch/components/ResultDisplayItem.jsx b/src/components/NavItems/tools/SemanticSearch/components/ResultDisplayItem.jsx
index f5d80b3b9..5c05e9a87 100644
--- a/src/components/NavItems/tools/SemanticSearch/components/ResultDisplayItem.jsx
+++ b/src/components/NavItems/tools/SemanticSearch/components/ResultDisplayItem.jsx
@@ -1,4 +1,5 @@
import React, { useState } from "react";
+import { useLocation } from "react-router-dom";
import {
Avatar,
Box,
@@ -26,7 +27,13 @@ const ResultDisplayItem = ({
domainUrl,
imageUrl,
}) => {
- const keyword = i18nLoadNamespace("components/NavItems/tools/SemanticSearch");
+ const path = useLocation();
+ let keyword;
+ if (path.pathname.includes("/app/assistant")) {
+ keyword = i18nLoadNamespace("components/NavItems/tools/Assistant");
+ } else {
+ keyword = i18nLoadNamespace("components/NavItems/tools/SemanticSearch");
+ }
const [showOriginalClaim, setShowOriginalClaim] = useState(false);
const [showOriginalTitle, setShowOriginalTitle] = useState(false);
@@ -58,7 +65,7 @@ const ResultDisplayItem = ({
spacing={2}
>
-
+
{keyword("semantic_search_result_claim")}{" "}
{showOriginalClaim ? claimOriginalLanguage : claim}
@@ -81,7 +88,7 @@ const ResultDisplayItem = ({
)}
-
+
{keyword("semantic_search_result_title")}{" "}
{showOriginalTitle ? titleOriginalLanguage : title}
diff --git a/src/components/NavItems/tools/SemanticSearch/index.jsx b/src/components/NavItems/tools/SemanticSearch/index.jsx
index 83af9cbd2..53b6de4c7 100644
--- a/src/components/NavItems/tools/SemanticSearch/index.jsx
+++ b/src/components/NavItems/tools/SemanticSearch/index.jsx
@@ -1,5 +1,5 @@
import React, { useEffect, useState } from "react";
-
+import { useParams } from "react-router-dom";
import {
Alert,
Backdrop,
@@ -44,6 +44,10 @@ const SemanticSearch = () => {
const currentLang = useSelector((state) => state.language);
+ const text = useSelector((state) => state.assistant.urlText);
+
+ const { url } = useParams();
+
/**
* Helper function to return a list of language keys supported if the localized language is in duplicate keys
* @param localizedLanguageName {string} the localized language to search keys for
@@ -218,6 +222,17 @@ const SemanticSearch = () => {
setLanguageFilter(loadLanguages);
}, [currentLang]);
+ useEffect(() => {
+ //takes in text parameter from url
+ if (url) {
+ const uri = url !== null ? decodeURIComponent(url) : undefined;
+ if (uri === "assistantText" && text) {
+ setSearchString(text);
+ handleSubmit();
+ }
+ }
+ }, [url]);
+
const handleSubmit = async () => {
setIsLoading(true);
setHasUserSubmittedForm(true);
diff --git a/src/redux/actions/tools/assistantActions.jsx b/src/redux/actions/tools/assistantActions.jsx
index 5c8f59886..eb1104982 100644
--- a/src/redux/actions/tools/assistantActions.jsx
+++ b/src/redux/actions/tools/assistantActions.jsx
@@ -163,6 +163,110 @@ export const setDbkfVideoMatchDetails = (
};
};
+export const setHpDetails = (hpResult, hpLoading, hpDone, hpFail) => {
+ return {
+ type: "SET_HP_DETAILS",
+ payload: {
+ hpResult: hpResult,
+ hpLoading: hpLoading,
+ hpDone: hpDone,
+ hpFail: hpFail,
+ },
+ };
+};
+
+export const setNewsTopicDetails = (ntResult, ntLoading, ntDone, ntFail) => {
+ return {
+ type: "SET_NEWS_TOPIC_DETAILS",
+ payload: {
+ newsFramingResult: ntResult,
+ newsFramingLoading: ntLoading,
+ newsFramingDone: ntDone,
+ newsFramingFail: ntFail,
+ },
+ };
+};
+
+export const setNewsGenreDetails = (ngResult, ngLoading, ngDone, ngFail) => {
+ return {
+ type: "SET_NEWS_GENRE_DETAILS",
+ payload: {
+ newsGenreResult: ngResult,
+ newsGenreLoading: ngLoading,
+ newsGenreDone: ngDone,
+ newsGenreFail: ngFail,
+ },
+ };
+};
+
+export const setPersuasionDetails = (
+ perResult,
+ perLoading,
+ perDone,
+ perFail,
+) => {
+ return {
+ type: "SET_PERSUASION_DETAILS",
+ payload: {
+ persuasionResult: perResult,
+ persuasionLoading: perLoading,
+ persuasionDone: perDone,
+ persuasionFail: perFail,
+ },
+ };
+};
+
+export const setSubjectivityDetails = (
+ subResult,
+ subLoading,
+ subDone,
+ subFail,
+) => {
+ return {
+ type: "SET_SUBJECTIVITY_DETAILS",
+ payload: {
+ subjectivityResult: subResult,
+ subjectivityLoading: subLoading,
+ subjectivityDone: subDone,
+ subjectivityFail: subFail,
+ },
+ };
+};
+
+export const setPrevFactChecksDetails = (
+ pfcResult,
+ pfcLoading,
+ pfcDone,
+ pfcFail,
+) => {
+ return {
+ type: "SET_PREV_FACT_CHECKS_DETAILS",
+ payload: {
+ prevFactChecksResult: pfcResult,
+ prevFactChecksLoading: pfcLoading,
+ prevFactChecksDone: pfcDone,
+ prevFactChecksFail: pfcFail,
+ },
+ };
+};
+
+export const setMachineGeneratedTextDetails = (
+ mgtResult,
+ mgtLoading,
+ mgtDone,
+ mgtFail,
+) => {
+ return {
+ type: "SET_MACHINE_GENERATED_TEXT_DETAILS",
+ payload: {
+ machineGeneratedTextResult: mgtResult,
+ machineGeneratedTextLoading: mgtLoading,
+ machineGeneratedTextDone: mgtDone,
+ machineGeneratedTextFail: mgtFail,
+ },
+ };
+};
+
export const setNeDetails = (
neResultCategory,
neResultCount,
diff --git a/src/redux/reducers/assistantReducer.jsx b/src/redux/reducers/assistantReducer.jsx
index 55a0b70e1..286a80982 100644
--- a/src/redux/reducers/assistantReducer.jsx
+++ b/src/redux/reducers/assistantReducer.jsx
@@ -43,6 +43,36 @@ const defaultState = {
neDone: false,
neFail: false,
+ newsFramingResult: null,
+ newsFramingLoading: false,
+ newsFramingDone: false,
+ newsFramingFail: false,
+
+ newsGenreResult: null,
+ newsGenreLoading: false,
+ newsGenreDone: false,
+ newsGenreFail: false,
+
+ persuasionResult: null,
+ persuasionLoading: false,
+ persuasionDone: false,
+ persuasionFail: false,
+
+ subjectivityResult: null,
+ subjectivityLoading: false,
+ subjectivityTextDone: false,
+ subjectivityTextFail: false,
+
+ prevFactChecksResult: null,
+ prevFactChecksLoading: false,
+ prevFactChecksDone: false,
+ prevFactChecksFail: false,
+
+ machineGeneratedTextResult: null,
+ machineGeneratedTextLoading: false,
+ machineGeneratedTextDone: false,
+ machineGeneratedTextFail: false,
+
loading: false,
warningExpanded: false,
assuranceExpanded: false,
@@ -64,6 +94,12 @@ const assistantReducer = (state = defaultState, action) => {
case "SET_DBKF_IMAGE_MATCH_DETAILS":
case "SET_DBKF_VIDEO_MATCH_DETAILS":
case "SET_NE_DETAILS":
+ case "SET_NEWS_TOPIC_DETAILS":
+ case "SET_NEWS_GENRE_DETAILS":
+ case "SET_PERSUASION_DETAILS":
+ case "SET_SUBJECTIVITY_DETAILS":
+ case "SET_PREV_FACT_CHECKS_DETAILS":
+ case "SET_MACHINE_GENERATED_TEXT_DETAILS":
case "SET_LOADING":
case "SET_WARNING_EXPANDED":
case "SET_ASSURANCE_EXPANDED":
@@ -117,6 +153,21 @@ const assistantReducer = (state = defaultState, action) => {
neDone: false,
neFail: false,
+ // subjectivityResult: null,
+ // subjectivityLoading: false,
+ // subjectivityTextDone: false,
+ // subjectivityTextFail: false,
+
+ // prevFactChecksResult: null,
+ // prevFactChecksLoading: false,
+ // prevFactChecksDone: false,
+ // prevFactChecksFail: false,
+
+ // machineGeneratedTextResult: null,
+ // machineGeneratedTextLoading: false,
+ // machineGeneratedTextDone: false,
+ // machineGeneratedTextFail: false,
+
loading: false,
warningExpanded: false,
assuranceExpanded: false,
diff --git a/src/redux/sagas/assistantSaga.jsx b/src/redux/sagas/assistantSaga.jsx
index 4d25451b4..8a923ade3 100644
--- a/src/redux/sagas/assistantSaga.jsx
+++ b/src/redux/sagas/assistantSaga.jsx
@@ -12,6 +12,12 @@ import {
setInputSourceCredDetails,
setInputUrl,
setNeDetails,
+ setNewsGenreDetails,
+ setNewsTopicDetails,
+ setPersuasionDetails,
+ setSubjectivityDetails,
+ setPrevFactChecksDetails,
+ setMachineGeneratedTextDetails,
setProcessUrl,
setProcessUrlActions,
setScrapedData,
@@ -76,6 +82,18 @@ function* getDbkfTextMatchSaga() {
yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handleDbkfTextCall);
}
+function* getNewsTopicSaga() {
+ yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handleNewsTopicCall);
+}
+
+function* getNewsGenreSaga() {
+ yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handleNewsGenreCall);
+}
+
+function* getPersuasionSaga() {
+ yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handlePersuasionCall);
+}
+
function* getSourceCredSaga() {
yield takeLatest(
["SET_INPUT_URL", "CLEAN_STATE"],
@@ -87,6 +105,24 @@ function* getNamedEntitySaga() {
yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handleNamedEntityCall);
}
+function* getSubjectivitySaga() {
+ yield takeLatest(["SET_SCRAPED_DATA", "CLEAN_STATE"], handleSubjectivityCall);
+}
+
+function* getPrevFactChecksSaga() {
+ yield takeLatest(
+ ["SET_SCRAPED_DATA", "AUTH_USER_LOGIN", "CLEAN_STATE"],
+ handlePrevFactChecksCall,
+ );
+}
+
+function* getMachineGeneratedTextSaga() {
+ yield takeLatest(
+ ["SET_SCRAPED_DATA", "AUTH_USER_LOGIN", "CLEAN_STATE"],
+ handleMachineGeneratedTextCall,
+ );
+}
+
/**
* NON-API HANDLERS
**/
@@ -349,6 +385,124 @@ function* handleDbkfTextCall(action) {
}
}
+function* handleNewsTopicCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ if (text) {
+ yield put(setNewsTopicDetails(null, true, false, false));
+
+ const result = yield call(assistantApi.callNewsFramingService, text);
+ yield put(setNewsTopicDetails(result, false, true, false));
+ }
+ } catch (error) {
+ yield put(setNewsTopicDetails(null, false, false, true));
+ }
+}
+
+function* handleNewsGenreCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ if (text) {
+ yield put(setNewsGenreDetails(null, true, false, false));
+
+ const result = yield call(assistantApi.callNewsGenreService, text);
+ yield put(setNewsGenreDetails(result, false, true, false));
+ }
+ } catch (error) {
+ yield put(setNewsGenreDetails(null, false, false, true));
+ }
+}
+
+function* handlePersuasionCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ if (text) {
+ yield put(setPersuasionDetails(null, true, false, false));
+
+ const result = yield call(assistantApi.callPersuasionService, text);
+ yield put(setPersuasionDetails(result, false, true, false));
+ }
+ } catch (error) {
+ yield put(setPersuasionDetails(null, false, false, true));
+ }
+}
+
+function* handleSubjectivityCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ if (text) {
+ yield put(setSubjectivityDetails(null, true, false, false));
+
+ const result = yield call(assistantApi.callSubjectivityService, text);
+
+ yield put(setSubjectivityDetails(result, false, true, false));
+ }
+ } catch (error) {
+ yield put(setSubjectivityDetails(null, false, false, true));
+ }
+}
+
+function* handlePrevFactChecksCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ // this prevents the call from happening if not correct user status
+ const role = yield select((state) => state.userSession.user.roles);
+
+ if (text && role.includes("BETA_TESTER")) {
+ yield put(setPrevFactChecksDetails(null, true, false, false));
+
+ const result = yield call(assistantApi.callPrevFactChecksService, text);
+
+ yield put(
+ setPrevFactChecksDetails(result.fact_checks, false, true, false),
+ );
+ }
+ } catch (error) {
+ yield put(setPrevFactChecksDetails(null, false, false, true));
+ }
+}
+
+function* handleMachineGeneratedTextCall(action) {
+ if (action.type === "CLEAN_STATE") return;
+
+ try {
+ const text = yield select((state) => state.assistant.urlText);
+
+ // this prevents the call from happening if not correct user status
+
+ //yield take("SET_SCRAPED_DATA"); // wait until linkList has been created
+ const role = yield select((state) => state.userSession.user.roles);
+
+ if (text && role.includes("BETA_TESTER")) {
+ yield put(setMachineGeneratedTextDetails(null, true, false, false));
+
+ const result = yield call(
+ assistantApi.callMachineGeneratedTextService,
+ text,
+ );
+
+ yield put(setMachineGeneratedTextDetails(result, false, true, false));
+ }
+ } catch (error) {
+ yield put(setMachineGeneratedTextDetails(null, false, false, true));
+ }
+}
+
function* handleNamedEntityCall(action) {
if (action.type === "CLEAN_STATE") return;
@@ -689,7 +843,7 @@ const filterSourceCredibilityResults = (
linkList,
trafficLightColors,
) => {
- if (!originalResult.length) {
+ if (!originalResult) {
return [null, null, null, null];
}
let sourceCredibility = originalResult;
@@ -868,5 +1022,11 @@ export default function* assistantSaga() {
fork(getNamedEntitySaga),
fork(getAssistantScrapeSaga),
fork(getUploadSaga),
+ fork(getNewsTopicSaga),
+ fork(getNewsGenreSaga),
+ fork(getPersuasionSaga),
+ fork(getSubjectivitySaga),
+ fork(getPrevFactChecksSaga),
+ fork(getMachineGeneratedTextSaga),
]);
}
From 405e575fbb96029cd67c8eb1a2ad7cb24ea4d97f Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 23 Jul 2024 16:22:24 +0100
Subject: [PATCH 02/35] counting categories in wrapfunc change
---
.../components/NavItems/tools/Assistant.json | 230 +++++++++---------
1 file changed, 115 insertions(+), 115 deletions(-)
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 464de9540..fe1a72e98 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -1,118 +1,118 @@
{
- "assistant_title": "Assistant",
- "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case",
- "assistant_choose": "Choose what you want to analyse",
- "assistant_webpage_header": "Webpage link",
- "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.",
- "assistant_file_header": "Local file",
- "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image",
- "assistant_choose_tool": "Choose the tool you want to use",
- "upload_video": "Video",
- "upload_image": "Image",
- "assistant_urlbox": "URL",
- "assistant_give_url": "Give the URL of the page to analyse",
- "assistant_paste_url": "Paste the URL here",
- "please_give_a_correct_link": "The link provided is incorrect or not supported.",
- "button_analyse": "Analyse",
- "button_clean": "Remove",
- "save": "Save",
- "source_credibility_title": "Source Credibility",
- "source_credibility_byline": "The source has been found as part of a credibility check",
- "link_explorer_title": "Link Explorer",
- "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility",
- "text_title": "Text",
- "text_intro": "The following text has been found on the page",
- "dbkf_title": "DBKF Check",
- "expand_text": "Expand Text",
- "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.",
- "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.",
- "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.",
- "media_title": "Media",
- "images_label": "Images",
- "videos_label": "Videos",
- "media_found": "The following media has been found on the page",
- "media_below": "Select the media you would like to verify",
- "media_to_process": "Media to Process",
- "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.",
- "things_you_can_do_header": "Potential Tools",
- "things_you_can_do": "Below are the tools you can use on this media type",
- "navbar_analysis_image": "Image Analysis",
- "navbar_analysis_video": "Video Analysis",
- "navbar_keyframes": "Keyframes",
- "navbar_thumbnails": "Thumbnails",
- "navbar_twitter": "Tw. search",
- "navbar_magnifier": "Magnifier",
- "navbar_metadata": "Metadata",
- "navbar_rights": "Video rights",
- "navbar_forensic": "Forensic",
- "navbar_ocr": "OCR",
- "navbar_twitter_sna": "Fact Check",
- "navbar_assistant": "Assistant",
- "assistant_help_title": "Assistant Help",
- "assistant_help_1": " The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
",
- "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
",
- "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
",
- "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page For a detailed breakdown of the tools and checks run by the assistant, see: this page",
- "enter_url": "Enter URL",
- "mode_label": "URL mode",
- "url_text": "URL Text",
- "url_media": "URL Media",
- "media_text": "Extracted Media Text",
- "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.",
- "text_warning": "Warnings found against text. See warning box.",
- "image_warning": "Warnings found against image. See warning box.",
- "warning_title": "Warning",
- "warning_subtitle": "Some elements of this content have been flagged",
- "status_title": "Status",
- "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.",
- "named_entity_title": "Text entities",
- "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes",
- "domain_scope": "Domain:",
- "account_scope": "Account:",
- "labelled_as": "has been labelled as:",
- "commented_as": "with the following comment:",
- "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of",
- "image_analysis_text": "Retrieve contextual information about the image",
- "video_analysis_text": "Retrieve contextual information about the video",
- "keyframes_text": "Fragment the video",
- "thumbnails_text": "Reverse search on thumbnails from the video",
- "magnifier_text": "Examine the image thoroughly",
- "metadata_text": "Retrieve image/video metadata",
- "rights_text": "Retrieve information solely about video rights",
- "forensic_text": "Detect any image manipulation",
- "ocr_text": "Extract any text from the image",
- "hyperpartisan_title": "Hyperpartisan service",
- "dbkf_text_title": "Database of known fakes text search",
- "dbkf_media_title": "Database of known fakes media search",
- "ne_title": "Named entity search",
- "ocr_title": "OCR search",
- "source_cred_title": "Source credibility service",
- "mt_title": "Machine translation service",
- "translate": "Translate (beta)",
- "copy_link": "Copy link",
- "archive_link": "Archive",
- "this": "This ",
- "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:",
- "source_credibility_warning_account": "account has been mentioned in a lookup against:",
- "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page",
- "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page",
- "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:",
- "source_cred_popup_header_account": "The account has been found in the following reports listed by:",
- "url_domain_analysis": "URL Domain Analysis",
- "fact_checker": "Fact checker",
- "warning": "Warning",
- "mentions": "Mentions",
- "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.",
- "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.",
- "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.",
- "extracted_urls": "Extracted URLs",
- "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis",
- "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
- "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "embedding_not_supported":"The Assistant could not display this video content."
+ "assistant_title": "Assistant",
+ "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case",
+ "assistant_choose": "Choose what you want to analyse",
+ "assistant_webpage_header": "Webpage link",
+ "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.",
+ "assistant_file_header": "Local file",
+ "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image",
+ "assistant_choose_tool": "Choose the tool you want to use",
+ "upload_video": "Video",
+ "upload_image": "Image",
+ "assistant_urlbox": "URL",
+ "assistant_give_url": "Give the URL of the page to analyse",
+ "assistant_paste_url": "Paste the URL here",
+ "please_give_a_correct_link": "The link provided is incorrect or not supported.",
+ "button_analyse": "Analyse",
+ "button_clean": "Remove",
+ "save": "Save",
+ "source_credibility_title": "Source Credibility",
+ "source_credibility_byline": "The source has been found as part of a credibility check",
+ "link_explorer_title": "Link Explorer",
+ "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility",
+ "text_title": "Text",
+ "text_intro": "The following text has been found on the page",
+ "dbkf_title": "DBKF Check",
+ "expand_text": "Expand Text",
+ "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.",
+ "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.",
+ "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.",
+ "media_title": "Media",
+ "images_label": "Images",
+ "videos_label": "Videos",
+ "media_found": "The following media has been found on the page",
+ "media_below": "Select the media you would like to verify",
+ "media_to_process": "Media to Process",
+ "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.",
+ "things_you_can_do_header": "Potential Tools",
+ "things_you_can_do": "Below are the tools you can use on this media type",
+ "navbar_analysis_image": "Image Analysis",
+ "navbar_analysis_video": "Video Analysis",
+ "navbar_keyframes": "Keyframes",
+ "navbar_thumbnails": "Thumbnails",
+ "navbar_twitter": "Tw. search",
+ "navbar_magnifier": "Magnifier",
+ "navbar_metadata": "Metadata",
+ "navbar_rights": "Video rights",
+ "navbar_forensic": "Forensic",
+ "navbar_ocr": "OCR",
+ "navbar_twitter_sna": "Fact Check",
+ "navbar_assistant": "Assistant",
+ "assistant_help_title": "Assistant Help",
+ "assistant_help_1": " The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
",
+ "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
",
+ "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
",
+ "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page For a detailed breakdown of the tools and checks run by the assistant, see: this page",
+ "enter_url": "Enter URL",
+ "mode_label": "URL mode",
+ "url_text": "URL Text",
+ "url_media": "URL Media",
+ "media_text": "Extracted Media Text",
+ "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.",
+ "text_warning": "Warnings found against text. See warning box.",
+ "image_warning": "Warnings found against image. See warning box.",
+ "warning_title": "Warning",
+ "warning_subtitle": "Some elements of this content have been flagged",
+ "status_title": "Status",
+ "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.",
+ "named_entity_title": "Text entities",
+ "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of",
+ "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of",
+ "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes",
+ "domain_scope": "Domain:",
+ "account_scope": "Account:",
+ "labelled_as": "has been labelled as:",
+ "commented_as": "with the following comment:",
+ "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of",
+ "image_analysis_text": "Retrieve contextual information about the image",
+ "video_analysis_text": "Retrieve contextual information about the video",
+ "keyframes_text": "Fragment the video",
+ "thumbnails_text": "Reverse search on thumbnails from the video",
+ "magnifier_text": "Examine the image thoroughly",
+ "metadata_text": "Retrieve image/video metadata",
+ "rights_text": "Retrieve information solely about video rights",
+ "forensic_text": "Detect any image manipulation",
+ "ocr_text": "Extract any text from the image",
+ "hyperpartisan_title": "Hyperpartisan service",
+ "dbkf_text_title": "Database of known fakes text search",
+ "dbkf_media_title": "Database of known fakes media search",
+ "ne_title": "Named entity search",
+ "ocr_title": "OCR search",
+ "source_cred_title": "Source credibility service",
+ "mt_title": "Machine translation service",
+ "translate": "Translate (beta)",
+ "copy_link": "Copy link",
+ "archive_link": "Archive",
+ "this": "This ",
+ "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:",
+ "source_credibility_warning_account": "account has been mentioned in a lookup against:",
+ "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page",
+ "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page",
+ "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
+ "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:",
+ "source_cred_popup_header_account": "The account has been found in the following reports listed by:",
+ "url_domain_analysis": "URL Domain Analysis",
+ "fact_checker": "Fact checker",
+ "warning": "Warning",
+ "mentions": "Mentions",
+ "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.",
+ "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.",
+ "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.",
+ "extracted_urls": "Extracted URLs",
+ "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis",
+ "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
+ "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
+ "embedding_not_supported":"The Assistant could not display this video content.",
"assistant_video_download_action": "Download video",
"assistant_video_download_action_description": "Click here to download the video, to your machine. The download video can then be used in the assistant to access a wider range of video analysis services.",
"credibility_signals": "Credibility Signals",
@@ -151,5 +151,5 @@
"semantic_search_result_translated_from": "Translated from",
"semantic_search_result_see_original": "See original",
"semantic_search_result_english_translation": "Show English Translation",
- "semantic_search_rating": "Rating:",
+ "semantic_search_rating": "Rating:"
}
\ No newline at end of file
From d4bc942c4ef5deb26093f81b1c6d1d18315daa15 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Wed, 24 Jul 2024 16:30:28 +0100
Subject: [PATCH 03/35] Subjectivty confidence colour blue
---
.../ExtractedSourceCredibilityDBKFDialog.jsx | 46 +-
.../AssistantCredibilitySignals.jsx | 2 -
.../AssistantTextClassification.jsx | 24 +-
.../AssistantTextSpanClassification.jsx | 440 +++++++++++-------
4 files changed, 317 insertions(+), 195 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx b/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
index 4992f0403..45ab449e7 100644
--- a/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
+++ b/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
@@ -139,28 +139,30 @@ const ExtractedSourceCredibilityDBKFDialog = ({
? sourceCredibilityResults.map((value, key) => (
}>
- {sourceCredibilityResults[
- key
- ].credibilityScope.includes("/") ? (
-
- {` ${keyword("this")}`}
- {getUrlTypeFromCredScope(
- value.credibilityScope,
- )}
- {` ${keyword(
- "source_credibility_warning_account",
- )} ${" "}${value.credibilitySource}`}
-
- ) : sourceCredibilityResults[key]
- .credibilityScope ? (
-
- {` ${keyword(
- "source_cred_popup_header_domain",
- )} ${
- sourceCredibilityResults[key]
- .credibilitySource
- } `}
-
+ {sourceCredibilityResults[key] ? (
+ sourceCredibilityResults[
+ key
+ ].credibilityScope.includes("/") ? (
+
+ {` ${keyword("this")}`}
+ {getUrlTypeFromCredScope(
+ value.credibilityScope,
+ )}
+ {` ${keyword(
+ "source_credibility_warning_account",
+ )} ${" "}${value.credibilitySource}`}
+
+ ) : sourceCredibilityResults[key]
+ .credibilityScope ? (
+
+ {` ${keyword(
+ "source_cred_popup_header_domain",
+ )} ${
+ sourceCredibilityResults[key]
+ .credibilitySource
+ } `}
+
+ ) : null
) : null}
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index e362611e4..c314d618d 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -621,8 +621,6 @@ const AssistantCredSignals = () => {
- {console.log("sub=", subjectivityResult)}
-
{/* Subjectivity */}
{keyword("confidence_tooltip_sentence")}
;
textLow = keyword("low_importance");
textHigh = keyword("high_importance");
+ rgbLow = configs.importanceRgbLow;
+ rgbHigh = configs.importanceRgbHigh;
}
const importanceTooltipContent = (
);
const confidenceTooltipContent = (
@@ -130,8 +134,8 @@ export default function AssistantTextClassification({
tooltipText={importanceTooltipContent}
thresholdLow={configs.importanceThresholdLow}
thresholdHigh={configs.importanceThresholdHigh}
- rgbLow={configs.importanceRgbLow}
- rgbHigh={configs.importanceRgbHigh}
+ rgbLow={rgbLow}
+ rgbHigh={rgbHigh}
textHtmlMap={textHtmlMap}
/>
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
index 33e2f1d31..f9bc4dce7 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
@@ -26,6 +26,10 @@ import {
import { ColourGradientTooltipContent } from "./AssistantTextClassification";
import { styled } from "@mui/system";
+// Had to create a custom styled span as the default style attribute does not support
+// :hover metaclass
+const StyledSpan = styled("span")();
+
export default function AssistantTextSpanClassification({
text,
classification,
@@ -93,35 +97,151 @@ export default function AssistantTextSpanClassification({
setCurrentLabel(categoryKey);
}
- // collecting categories from MultiCategoryClassifiedText to pass to CategoriesListToggle
- let [categories, setCategories] = useState({});
- const childToParent = (childdata) => {
- setCategories(childdata);
- console.log("setting chdildata through childToParent()=", childdata);
- };
+ // // collecting categories from MultiCategoryClassifiedText to pass to CategoriesListToggle
+ // let [categories, setCategories] = useState({});
+ // const childToParent = (childdata) => {
+ // setCategories(childdata);
+ // console.log("setting chdildata through childToParent()=", childdata);
+ // };
// instead of calculating within the Text child and passing to Category child, lift state up to parent
// do all calculations here and children only render
+ // // Filter for selecting all labels (currentLabel == null) or just a single label
+ // const filteredClassification =
+ // currentLabel !== null && currentLabel in classification
+ // ? { [currentLabel]: classification[currentLabel] }
+ // : classification;
+
+ // Classification variable is a map of categories where each one has a list of classified spans, we
+ // have to invert that so that we have a list of spans that contains all categories in that span
+ let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+
+ let categories = {};
+ let countWrapSentences = 0;
+ let output = text;
+
+ //function renderOnce(mergedSpanIndices) {
+ function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
+ let backgroundRgb = [210, 210, 210];
+ let backgroundRgbHover = [255, 100, 100];
+ let textColour = "black";
+
+ let techniqueContent = [];
+ techniqueContent.push(
,
- );
- }
- techniqueContent.push(tooltipText);
-
- let techniquesTooltip = (
-
- );
-
- // Append highlighted text
- return (
-
-
- {spanText}
-
-
- );
- }
-
- if (highlightSpan && mergedSpanIndices.length > 0) {
- if (textHtmlMap) {
- // Text formatted & highlighted
- output = treeMapToElements(
- text,
- textHtmlMap,
- mergedSpanIndices,
- wrapHighlightedText,
- );
- } else {
- // Plaintex & highlighted
- output = wrapPlainTextSpan(
- text,
- mergedSpanIndices,
- wrapHighlightedText,
- );
- }
- } else if (textHtmlMap) {
- // Text formatted but not highlighted
- output = treeMapToElements(text, textHtmlMap);
- }
-
- return [output, categories];
- }
-
- // Filter for selecting all labels (currentLabel == null) or just a single label
- const filteredClassification =
- currentLabel !== null && currentLabel in classification
- ? { [currentLabel]: classification[currentLabel] }
- : classification;
-
- // Classification variable is a map of categories where each one has a list of classified spans, we
- // have to invert that so that we have a list of spans that contains all categories in that span
- let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+ // // Filter for selecting all labels (currentLabel == null) or just a single label
+ // const filteredClassification =
+ // currentLabel !== null && currentLabel in classification
+ // ? { [currentLabel]: classification[currentLabel] }
+ // : classification;
+
+ // // Classification variable is a map of categories where each one has a list of classified spans, we
+ // // have to invert that so that we have a list of spans that contains all categories in that span
+ // let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+
+ // //function renderOnce(mergedSpanIndices) {
+ // function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
+ // let backgroundRgb = [210, 210, 210];
+ // let backgroundRgbHover = [255, 100, 100];
+ // let textColour = "black";
+
+ // let techniqueContent = [];
+ // techniqueContent.push(
,
+ // );
+ // }
+ // techniqueContent.push(tooltipText);
+
+ // let techniquesTooltip = (
+ //
+ // );
+
+ // // Append highlighted text
+ // return (
+ //
+ //
+ // {spanText}
+ //
+ //
+ // );
+ // }
+
+ // if (highlightSpan && mergedSpanIndices.length > 0) {
+ // if (textHtmlMap) {
+ // // Text formatted & highlighted
+ // output = treeMapToElements(
+ // text,
+ // textHtmlMap,
+ // mergedSpanIndices,
+ // wrapHighlightedText,
+ // );
+ // } else {
+ // // Plaintex & highlighted
+ // output = wrapPlainTextSpan(
+ // text,
+ // mergedSpanIndices,
+ // wrapHighlightedText,
+ // );
+ // }
+ // } else if (textHtmlMap) {
+ // // Text formatted but not highlighted
+ // output = treeMapToElements(text, textHtmlMap);
+ // }
+
+ // return [output, categories];
+ //}
// console.log("mergedSpanIndices=", mergedSpanIndices);
//console.log("filteredClassification=", filteredClassification);
//let categories = {};
// added
- [output, categories] = renderOnce(mergedSpanIndices, categories);
+ //[output, categories] = renderOnce(mergedSpanIndices);
// need to do this only once
- console.log("categories=", categories);
- childToParent(categories); //it's infinitely looping
+ //console.log("categories=", categories);
+ //childToParent(categories); //it's infinitely looping
return {output};
}
From f0bf706f3e2d538fb79908f18dc5bfe368824056 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Wed, 24 Jul 2024 17:09:24 +0100
Subject: [PATCH 04/35] refactoring pertech code
---
.../AssistantTextSpanClassification.jsx | 118 +++++++++---------
1 file changed, 61 insertions(+), 57 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
index f9bc4dce7..a4b671a47 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
@@ -115,10 +115,10 @@ export default function AssistantTextSpanClassification({
// Classification variable is a map of categories where each one has a list of classified spans, we
// have to invert that so that we have a list of spans that contains all categories in that span
- let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+ //let mergedSpanIndices = mergeSpanIndices(filteredClassification);
let categories = {};
- let countWrapSentences = 0;
+ //let countWrapSentences = 0;
let output = text;
//function renderOnce(mergedSpanIndices) {
@@ -134,13 +134,13 @@ export default function AssistantTextSpanClassification({
const techniqueScore = spanInfo.techniques[persuasionTechnique];
// collect category information for highlighted spans
- countWrapSentences += 1;
+ //countWrapSentences += 1;
if (categories[persuasionTechnique]) {
categories[persuasionTechnique].push({
indices: [spanStart, spandEnd],
score: techniqueScore,
});
- console.log("OLD categories (", countWrapSentences, ")=", categories);
+ //console.log("OLD categories (", countWrapSentences, ")=", categories);
} else {
categories[persuasionTechnique] = [
{
@@ -148,7 +148,7 @@ export default function AssistantTextSpanClassification({
score: techniqueScore,
},
];
- console.log("NEW categories (", countWrapSentences, ")=", categories);
+ //console.log("NEW categories (", countWrapSentences, ")=", categories);
}
let techniqueBackgroundRgb = interpRgb(
@@ -205,32 +205,34 @@ export default function AssistantTextSpanClassification({
);
}
- if (doHighlightSentence && mergedSpanIndices.length > 0) {
- if (textHtmlMap) {
- // Text formatted & highlighted
- output = treeMapToElements(
- text,
- textHtmlMap,
- mergedSpanIndices,
- wrapHighlightedText,
- );
- } else {
- // Plaintex & highlighted
- output = wrapPlainTextSpan(text, mergedSpanIndices, wrapHighlightedText);
- }
- } else if (textHtmlMap) {
- // Text formatted but not highlighted
- output = treeMapToElements(text, textHtmlMap);
- }
+ // if (doHighlightSentence && mergedSpanIndices.length > 0) {
+ // if (textHtmlMap) {
+ // // Text formatted & highlighted
+ // output = treeMapToElements(
+ // text,
+ // textHtmlMap,
+ // mergedSpanIndices,
+ // wrapHighlightedText,
+ // );
+ // } else {
+ // // Plaintex & highlighted
+ // output = wrapPlainTextSpan(text, mergedSpanIndices, wrapHighlightedText);
+ // }
+ // } else if (textHtmlMap) {
+ // // Text formatted but not highlighted
+ // output = treeMapToElements(text, textHtmlMap);
+ // }
+
+ console.log("categories(parent)=", categories);
return (
+ {console.log("categories(between childs)=", categories)}
0) {
output.push();
}
@@ -355,6 +361,7 @@ export function CategoriesListToggle({
);
index++;
}
+ console.log(output);
return {output};
}
@@ -364,9 +371,9 @@ export function CategoriesListToggle({
export function MultiCategoryClassifiedText({
text,
- // classification,
- // currentLabel,
- // highlightSpan,
+ classification,
+ currentLabel,
+ highlightSpan,
// tooltipText,
// thresholdLowText,
// thresholdHighText,
@@ -375,21 +382,22 @@ export function MultiCategoryClassifiedText({
// rgbLow,
// rgbHigh,
// detectedTechniquesText,
- // textHtmlMap = null,
+ textHtmlMap = null,
+ wrapHighlightedText,
//childToParent,
//categories,
}) {
let output = text; //Defaults to text output
- // // Filter for selecting all labels (currentLabel == null) or just a single label
- // const filteredClassification =
- // currentLabel !== null && currentLabel in classification
- // ? { [currentLabel]: classification[currentLabel] }
- // : classification;
+ // Filter for selecting all labels (currentLabel == null) or just a single label
+ const filteredClassification =
+ currentLabel !== null && currentLabel in classification
+ ? { [currentLabel]: classification[currentLabel] }
+ : classification;
// // Classification variable is a map of categories where each one has a list of classified spans, we
// // have to invert that so that we have a list of spans that contains all categories in that span
- // let mergedSpanIndices = mergeSpanIndices(filteredClassification);
+ let mergedSpanIndices = mergeSpanIndices(filteredClassification);
// //function renderOnce(mergedSpanIndices) {
// function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
@@ -475,27 +483,23 @@ export function MultiCategoryClassifiedText({
// );
// }
- // if (highlightSpan && mergedSpanIndices.length > 0) {
- // if (textHtmlMap) {
- // // Text formatted & highlighted
- // output = treeMapToElements(
- // text,
- // textHtmlMap,
- // mergedSpanIndices,
- // wrapHighlightedText,
- // );
- // } else {
- // // Plaintex & highlighted
- // output = wrapPlainTextSpan(
- // text,
- // mergedSpanIndices,
- // wrapHighlightedText,
- // );
- // }
- // } else if (textHtmlMap) {
- // // Text formatted but not highlighted
- // output = treeMapToElements(text, textHtmlMap);
- // }
+ if (highlightSpan && mergedSpanIndices.length > 0) {
+ if (textHtmlMap) {
+ // Text formatted & highlighted
+ output = treeMapToElements(
+ text,
+ textHtmlMap,
+ mergedSpanIndices,
+ wrapHighlightedText,
+ );
+ } else {
+ // Plaintex & highlighted
+ output = wrapPlainTextSpan(text, mergedSpanIndices, wrapHighlightedText);
+ }
+ } else if (textHtmlMap) {
+ // Text formatted but not highlighted
+ output = treeMapToElements(text, textHtmlMap);
+ }
// return [output, categories];
//}
From cedfadbbf5de49664b0f5ccae58be0b29b29bc4b Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Mon, 29 Jul 2024 13:54:08 +0100
Subject: [PATCH 05/35] refactor for correct persuasion techniques
---
.../AssistantCredibilitySignals.jsx | 2 -
.../AssistantTextSpanClassification.jsx | 287 +++++-------------
2 files changed, 76 insertions(+), 213 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index c314d618d..8c2d9e346 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -548,8 +548,6 @@ const AssistantCredSignals = () => {
- {console.log("per=", persuasionResult)}
-
{/* Persuasion Techniques */}
{
- // setCategories(childdata);
- // console.log("setting chdildata through childToParent()=", childdata);
- // };
-
- // instead of calculating within the Text child and passing to Category child, lift state up to parent
- // do all calculations here and children only render
-
- // // Filter for selecting all labels (currentLabel == null) or just a single label
- // const filteredClassification =
- // currentLabel !== null && currentLabel in classification
- // ? { [currentLabel]: classification[currentLabel] }
- // : classification;
-
- // Classification variable is a map of categories where each one has a list of classified spans, we
- // have to invert that so that we have a list of spans that contains all categories in that span
- //let mergedSpanIndices = mergeSpanIndices(filteredClassification);
-
+ // finding categories and their spans with scores, and the text for each category
let categories = {};
- //let countWrapSentences = 0;
- let output = text;
+ let categoriesText = {};
- //function renderOnce(mergedSpanIndices) {
+ // wrap function for calculating spanhighlights and categories
function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
let backgroundRgb = [210, 210, 210];
let backgroundRgbHover = [255, 100, 100];
@@ -134,13 +114,12 @@ export default function AssistantTextSpanClassification({
const techniqueScore = spanInfo.techniques[persuasionTechnique];
// collect category information for highlighted spans
- //countWrapSentences += 1;
+ let span = {
+ indices: [spanStart, spandEnd],
+ score: techniqueScore,
+ };
if (categories[persuasionTechnique]) {
- categories[persuasionTechnique].push({
- indices: [spanStart, spandEnd],
- score: techniqueScore,
- });
- //console.log("OLD categories (", countWrapSentences, ")=", categories);
+ categories[persuasionTechnique].push(span);
} else {
categories[persuasionTechnique] = [
{
@@ -148,7 +127,6 @@ export default function AssistantTextSpanClassification({
score: techniqueScore,
},
];
- //console.log("NEW categories (", countWrapSentences, ")=", categories);
}
let techniqueBackgroundRgb = interpRgb(
@@ -205,50 +183,67 @@ export default function AssistantTextSpanClassification({
);
}
- // if (doHighlightSentence && mergedSpanIndices.length > 0) {
- // if (textHtmlMap) {
- // // Text formatted & highlighted
- // output = treeMapToElements(
- // text,
- // textHtmlMap,
- // mergedSpanIndices,
- // wrapHighlightedText,
- // );
- // } else {
- // // Plaintex & highlighted
- // output = wrapPlainTextSpan(text, mergedSpanIndices, wrapHighlightedText);
- // }
- // } else if (textHtmlMap) {
- // // Text formatted but not highlighted
- // output = treeMapToElements(text, textHtmlMap);
- // }
-
- console.log("categories(parent)=", categories);
+ // combine all sentences for an overall category
+ let collectFilteredClassification = {};
+ for (let category in filteredClassification) {
+ collectFilteredClassification[category] = {
+ [category]: filteredClassification[category],
+ };
+ }
+ const allCategoriesLabel = "all";
+ collectFilteredClassification[allCategoriesLabel] = filteredClassification;
+
+ console.log("filteredClassification=", filteredClassification);
+ console.log("collectFilteredClassification=", collectFilteredClassification);
+
+ // find the highlighted spans for each category and overall category
+ for (let collection in collectFilteredClassification) {
+ let output;
+
+ // Classification variable is a map of categories where each one has a list of classified spans, we
+ // have to invert that so that we have a list of spans that contains all categories in that span
+ let mergedSpanIndices = mergeSpanIndices(
+ collectFilteredClassification[collection],
+ );
+
+ if (doHighlightSentence && mergedSpanIndices.length > 0) {
+ if (textHtmlMap) {
+ // Text formatted & highlighted
+ output = treeMapToElements(
+ text,
+ textHtmlMap,
+ mergedSpanIndices,
+ wrapHighlightedText,
+ );
+ } else {
+ // Plaintex & highlighted
+ output = wrapPlainTextSpan(
+ text,
+ mergedSpanIndices,
+ wrapHighlightedText,
+ );
+ }
+ } else if (textHtmlMap) {
+ // Text formatted but not highlighted
+ output = treeMapToElements(text, textHtmlMap);
+ }
+
+ //categoriesText[category] = output;
+ categoriesText[collection] = output;
+ }
+
+ console.log("categories=", categories);
return (
- {console.log("categories(between childs)=", categories)}
@@ -289,6 +285,7 @@ export function CategoriesListToggle({
rgbLow,
rgbHigh,
noCategoriesText,
+ allCategoriesLabel,
onCategoryChange = () => {},
}) {
if (categories.length < 1) return
{noCategoriesText}
;
@@ -316,7 +313,10 @@ export function CategoriesListToggle({
}
for (const category in categories) {
- console.log("category=", category);
+ // don't display overall category
+ if (category == allCategoriesLabel) {
+ continue;
+ }
if (index > 0) {
output.push();
@@ -335,7 +335,8 @@ export function CategoriesListToggle({
const itemText = category.replaceAll("_", " ");
const itemChip = (
-
+ // length is divided by 2 because of overall category duplicating the results
+
);
output.push(
@@ -361,158 +362,22 @@ export function CategoriesListToggle({
);
index++;
}
- console.log(output);
+
return {output};
}
-// // Had to create a custom styled span as the default style attribute does not support
-// // :hover metaclass
-// const StyledSpan = styled("span")();
-
export function MultiCategoryClassifiedText({
- text,
- classification,
+ categoriesText,
currentLabel,
- highlightSpan,
- // tooltipText,
- // thresholdLowText,
- // thresholdHighText,
- // thresholdLow,
- // thresholdHigh,
- // rgbLow,
- // rgbHigh,
- // detectedTechniquesText,
- textHtmlMap = null,
- wrapHighlightedText,
- //childToParent,
- //categories,
+ allCategoriesLabel,
}) {
- let output = text; //Defaults to text output
-
// Filter for selecting all labels (currentLabel == null) or just a single label
- const filteredClassification =
- currentLabel !== null && currentLabel in classification
- ? { [currentLabel]: classification[currentLabel] }
- : classification;
-
- // // Classification variable is a map of categories where each one has a list of classified spans, we
- // // have to invert that so that we have a list of spans that contains all categories in that span
- let mergedSpanIndices = mergeSpanIndices(filteredClassification);
-
- // //function renderOnce(mergedSpanIndices) {
- // function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
- // let backgroundRgb = [210, 210, 210];
- // let backgroundRgbHover = [255, 100, 100];
- // let textColour = "black";
-
- // let techniqueContent = [];
- // techniqueContent.push(
,
- // );
- // }
- // techniqueContent.push(tooltipText);
-
- // let techniquesTooltip = (
- //
- // );
-
- // // Append highlighted text
- // return (
- //
- //
- // {spanText}
- //
- //
- // );
- // }
-
- if (highlightSpan && mergedSpanIndices.length > 0) {
- if (textHtmlMap) {
- // Text formatted & highlighted
- output = treeMapToElements(
- text,
- textHtmlMap,
- mergedSpanIndices,
- wrapHighlightedText,
- );
- } else {
- // Plaintex & highlighted
- output = wrapPlainTextSpan(text, mergedSpanIndices, wrapHighlightedText);
- }
- } else if (textHtmlMap) {
- // Text formatted but not highlighted
- output = treeMapToElements(text, textHtmlMap);
- }
-
- // return [output, categories];
- //}
-
- // console.log("mergedSpanIndices=", mergedSpanIndices);
- //console.log("filteredClassification=", filteredClassification);
+ const category =
+ currentLabel !== null && currentLabel in categoriesText
+ ? currentLabel
+ : allCategoriesLabel;
- //let categories = {};
- // added
- //[output, categories] = renderOnce(mergedSpanIndices);
- // need to do this only once
- //console.log("categories=", categories);
- //childToParent(categories); //it's infinitely looping
+ let output = categoriesText[category];
return {output};
}
From 41d26e4685c14410cd7dab6274da25bd9cda2826 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Mon, 29 Jul 2024 14:04:56 +0100
Subject: [PATCH 06/35] added/removed comments
---
.../AssistantScrapeResults/assistantUtils.jsx | 23 +++++++++++++++++++
src/redux/reducers/assistantReducer.jsx | 15 ------------
2 files changed, 23 insertions(+), 15 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
index 363d7bc18..46b23403d 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/assistantUtils.jsx
@@ -85,17 +85,35 @@ function treeMapToElementsRecursive(
if ("span" in treeElem) {
const span = treeElem.span;
if (spanHighlightIndices === null) {
+ // console.log("No span highlight: ", text.substring(span.start, span.end));
childElems.push(text.substring(span.start, span.end));
} else {
+ // console.log("Span highlight: ", text.substring(span.start, span.end));
let currentIndex = span.start;
for (let i = 0; i < spanHighlightIndices.length; i++) {
const hSpan = spanHighlightIndices[i];
+ // console.log(
+ // "Matching span",
+ // span.start,
+ // span.end,
+ // hSpan.indices[0],
+ // hSpan.indices[1],
+ // );
const hSpanStart = hSpan.indices[0];
const hSpanEnd = hSpan.indices[1];
if (
(span.start <= hSpanStart && hSpanStart <= span.end) ||
(span.start <= hSpanEnd && hSpanEnd <= span.end)
) {
+ // //If there's an overlap
+ // console.log(
+ // "Found lapping span ",
+ // span.start,
+ // span.end,
+ // hSpanStart,
+ // hSpanEnd,
+ // );
+
// If span doesn't start before the current index
if (hSpanStart > currentIndex) {
childElems.push(text.substring(currentIndex, hSpanStart));
@@ -105,6 +123,7 @@ function treeMapToElementsRecursive(
hSpanStart < span.start ? span.start : hSpanStart;
const boundedEnd = hSpanEnd > span.end ? span.end : hSpanEnd;
if (wrapFunc) {
+ // console.log("Wrapping: ", text.substring(boundedStart, boundedEnd));
childElems.push(
wrapFunc(
text.substring(boundedStart, boundedEnd),
@@ -114,6 +133,10 @@ function treeMapToElementsRecursive(
),
);
} else {
+ // console.log(
+ // "Not wrapping: ",
+ // text.substring(boundedStart, boundedEnd),
+ // );
childElems.push(text.substring(boundedStart, boundedEnd));
}
diff --git a/src/redux/reducers/assistantReducer.jsx b/src/redux/reducers/assistantReducer.jsx
index 286a80982..caf1b8750 100644
--- a/src/redux/reducers/assistantReducer.jsx
+++ b/src/redux/reducers/assistantReducer.jsx
@@ -153,21 +153,6 @@ const assistantReducer = (state = defaultState, action) => {
neDone: false,
neFail: false,
- // subjectivityResult: null,
- // subjectivityLoading: false,
- // subjectivityTextDone: false,
- // subjectivityTextFail: false,
-
- // prevFactChecksResult: null,
- // prevFactChecksLoading: false,
- // prevFactChecksDone: false,
- // prevFactChecksFail: false,
-
- // machineGeneratedTextResult: null,
- // machineGeneratedTextLoading: false,
- // machineGeneratedTextDone: false,
- // machineGeneratedTextFail: false,
-
loading: false,
warningExpanded: false,
assuranceExpanded: false,
From eda948f0bf31238eec7cb249b741033f5e659af3 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 30 Jul 2024 09:31:59 +0100
Subject: [PATCH 07/35] updated tooltip text
---
.../components/NavItems/tools/Assistant.json | 20 +++++++++----------
1 file changed, 10 insertions(+), 10 deletions(-)
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index fe1a72e98..f7021475e 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -116,7 +116,7 @@
"assistant_video_download_action": "Download video",
"assistant_video_download_action_description": "Click here to download the video, to your machine. The download video can then be used in the assistant to access a wider range of video analysis services.",
"credibility_signals": "Credibility Signals",
- "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given article.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the given article is.",
+ "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given page.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the source is. For more information on these signals, please see this page.",
"importance_tooltip": "The background of highlighted sentences varies depending on the detection algorithm's rating of its importance.",
"confidence_tooltip_technique": "The background of the detected techniques varies depending on the detection algorithm's confidence.",
"confidence_tooltip_sentence": "The background of highlighted sentences varies depending on the detection algorithm's confidence.",
@@ -127,25 +127,25 @@
"high_confidence": "High confidence",
"colour_scale": "The colour scale is shown below:",
"news_framing": "Topic",
- "news_framing_tooltip": "Given a news article, identify the frames used in the article. A frame is the perspective under which an issue or a piece of news is presented. We consider 14 frames: Economic, Capacity and resources, Morality, Fairness and equality, Legality, constitutionality and jurisprudence, Policy prescription and evaluation, Crime and punishment, Security and defense, Health and safety, Quality of life, Cultural identity, Public opinion, Political, External regulation and reputation.",
+ "news_framing_tooltip": "Identify the topics used in the extracted text. A topic is the perspective under which an issue or a piece of news is presented. A total of 9 different topics are considered.",
"news_genre": "Genre",
- "news_genre_tooltip": "Given a news article, determine whether it is an opinion piece, aims at objective news reporting, or is a satire piece.",
+ "news_genre_tooltip": "Determine whether the text is most likely to be an opinion piece, objective news reporting, or satire.",
"persuasion_techniques": "Persuasion Techniques",
- "persuasion_techniques_tooltip": "Identifies the persuasion techniques of the text, 23 persuasion techniques are considered, although the actual number of techniques per language may vary slightly.",
+ "persuasion_techniques_tooltip": "Identify the persuasion techniques of the extracted text. This service annotates particular sentences within the text that use these techniques. A total of 23 different techniques are considered.",
"detected_techniques": "Detected techniques",
"no_detected_categories": "No detected categories",
"subjectivity": "Subjectivity",
- "subjectivity_tooltip": "Identifies the subjective sentences given an article.",
+ "subjectivity_tooltip": "Identify the subjective sentences of the extracted text.",
"subjective_sentences_detected": "Subjective sentences detected",
"no_subjective_sentences_detected": "No subjective sentences detected",
"previous_fact_checks": "Previous Fact-Checks",
- "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the top 5 results ranked by relevance. This tool is only accesible as a logged in beta tester user.",
+ "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
"machine_generated_text": "Machine Generated Text",
- "machine_generated_text_tooltip": "Given an article, detects whether the text has been written by human or machine with a confidence score. This tool is only accesible as a logged in beta tester user.",
- "failed_to_load": "Failed to load.",
+ "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
+ "failed_to_load": "Failed to load",
"previous_fact_checks_found": "Top 5 previous fact-checks found",
- "login_required": "Please log in as a beta user to see results.",
- "reanalyse_url": "Please reanalyse URL to see results.",
+ "login_required": "Please log in as a beta user to see results",
+ "reanalyse_url": "Please reanalyse URL to see results",
"semantic_search_result_claim": "Claim:",
"semantic_search_result_title": "Title:",
"semantic_search_result_translated_from": "Translated from",
From c2be123b06133a1d431cd38f4d14c530e5505be8 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 30 Jul 2024 11:11:45 +0100
Subject: [PATCH 08/35] remove console.log
---
.../AssistantTextSpanClassification.jsx | 5 -----
1 file changed, 5 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
index 3a77e8725..234b781df 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
@@ -193,9 +193,6 @@ export default function AssistantTextSpanClassification({
const allCategoriesLabel = "all";
collectFilteredClassification[allCategoriesLabel] = filteredClassification;
- console.log("filteredClassification=", filteredClassification);
- console.log("collectFilteredClassification=", collectFilteredClassification);
-
// find the highlighted spans for each category and overall category
for (let collection in collectFilteredClassification) {
let output;
@@ -232,8 +229,6 @@ export default function AssistantTextSpanClassification({
categoriesText[collection] = output;
}
- console.log("categories=", categories);
-
return (
From 6915331f37f33aaff44018390fa267a455d3aae7 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 30 Jul 2024 15:47:22 +0100
Subject: [PATCH 09/35] fixes for persuasion techniques
---
.../components/NavItems/tools/Assistant.json | 2 +
.../AssistantCredibilitySignals.jsx | 35 +++++------
.../AssistantTextClassification.jsx | 1 -
.../AssistantTextSpanClassification.jsx | 59 +++++++++++++------
4 files changed, 60 insertions(+), 37 deletions(-)
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index f7021475e..1384ca919 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -140,6 +140,8 @@
"no_subjective_sentences_detected": "No subjective sentences detected",
"previous_fact_checks": "Previous Fact-Checks",
"previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
+ "more_details": "For more details see",
+ "fact_check_semantic_search": "Fact Check Semantic Search",
"machine_generated_text": "Machine Generated Text",
"machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
"failed_to_load": "Failed to load",
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index 8c2d9e346..054bb10d9 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -67,21 +67,10 @@ const calculateSubjectivity = (sentences) => {
scoresSUBJ.push(Number(sentences[i].score));
}
}
- //const scoresSumSUBJ = scoresSUBJ.reduce((partialSum, a) => partialSum + a, 0);
- //const scoresSumSUBJPercent = (scoresSumSUBJ / sentences.length) * 100.0;
- //let dp = 2;
return [
scoresSUBJ.length,
- [
- //round(scoresSumSUBJPercent, dp),
- //"% (",
- " (",
- scoresSUBJ.length,
- "/",
- sentences.length,
- ")",
- ]
+ [" (", scoresSUBJ.length, "/", sentences.length, ")"]
.toString()
.replaceAll(",", ""),
];
@@ -89,6 +78,7 @@ const calculateSubjectivity = (sentences) => {
const getExpandIcon = (loading, fail, done = null, role = null) => {
if (loading || fail || done || (role && !role.includes("BETA_TESTER"))) {
+ // "done" is for when subjectivityDone = true but subjectivityResult.entities = {}
return ;
} else {
return ;
@@ -176,6 +166,7 @@ const renderCollapsePrevFactChecks = (
expanded,
setExpanded,
navigate,
+ keyword,
) => {
const handleClick = (path) => {
// instead need to set parameter then load text in SemanticSearch/index.jsx
@@ -192,14 +183,13 @@ const renderCollapsePrevFactChecks = (
- For more details see{" "}
+ {keyword("more_details")}{" "}
handleClick("tools/semanticSearch")}
>
- Fact Check Semantic Search
- {" "}
- tool.
+ {keyword("fact_check_semantic_search")}
+
@@ -620,10 +610,20 @@ const AssistantCredSignals = () => {
{/* Subjectivity */}
+ {console.log(
+ subjectivityLoading,
+ subjectivityFail,
+ subjectivityDone,
+ subjectivityResult,
+ )}
{
expanded,
setExpanded,
navigate,
+ keyword,
)}
)}
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx
index cbba0b314..5e1c92bca 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx
@@ -253,7 +253,6 @@ export function ClassifiedText({
rgbLow,
rgbHigh,
);
- //console.log(spanText, spanInfo, backgroundRgb);
let bgLuminance = rgbToLuminance(backgroundRgb);
let textColour = "white";
if (bgLuminance > 0.7) textColour = "black";
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
index 234b781df..a3ab96c3e 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
@@ -101,6 +101,16 @@ export default function AssistantTextSpanClassification({
let categories = {};
let categoriesText = {};
+ // combine all sentences for an overall category
+ let collectFilteredClassification = {};
+ for (let category in filteredClassification) {
+ collectFilteredClassification[category] = {
+ [category]: filteredClassification[category],
+ };
+ }
+ const allCategoriesLabel = "all";
+ collectFilteredClassification[allCategoriesLabel] = filteredClassification;
+
// wrap function for calculating spanhighlights and categories
function wrapHighlightedText(spanText, spanInfo, spanStart, spandEnd) {
let backgroundRgb = [210, 210, 210];
@@ -114,12 +124,15 @@ export default function AssistantTextSpanClassification({
const techniqueScore = spanInfo.techniques[persuasionTechnique];
// collect category information for highlighted spans
- let span = {
- indices: [spanStart, spandEnd],
- score: techniqueScore,
- };
+ // let span = {
+ // indices: [spanStart, spandEnd],
+ // score: techniqueScore,
+ // };
if (categories[persuasionTechnique]) {
- categories[persuasionTechnique].push(span);
+ categories[persuasionTechnique].push({
+ indices: [spanStart, spandEnd],
+ score: techniqueScore,
+ });
} else {
categories[persuasionTechnique] = [
{
@@ -183,16 +196,6 @@ export default function AssistantTextSpanClassification({
);
}
- // combine all sentences for an overall category
- let collectFilteredClassification = {};
- for (let category in filteredClassification) {
- collectFilteredClassification[category] = {
- [category]: filteredClassification[category],
- };
- }
- const allCategoriesLabel = "all";
- collectFilteredClassification[allCategoriesLabel] = filteredClassification;
-
// find the highlighted spans for each category and overall category
for (let collection in collectFilteredClassification) {
let output;
@@ -225,10 +228,29 @@ export default function AssistantTextSpanClassification({
output = treeMapToElements(text, textHtmlMap);
}
- //categoriesText[category] = output;
categoriesText[collection] = output;
}
+ // console.log("categories=", categories);
+ // console.log("categoriesText=", categoriesText);
+
+ // remove duplicate spans from array of categories
+ // duplicates occur as categories are counted then repeated for category allCategoriesLabel
+ let uniqueCategories = {};
+ for (let cat in categories) {
+ uniqueCategories[cat] = categories[cat].filter((value, index) => {
+ const _value = JSON.stringify(value);
+ return (
+ index ===
+ categories[cat].findIndex((obj) => {
+ return JSON.stringify(obj) === _value;
+ })
+ );
+ });
+ }
+
+ // console.log("uniqueCategories=", uniqueCategories);
+
return (
@@ -257,7 +279,7 @@ export default function AssistantTextSpanClassification({
/>
+
);
output.push(
From 5a15f26e6abd46314a1ef50bf12f19c491a57490 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 30 Jul 2024 16:20:00 +0100
Subject: [PATCH 10/35] fixes for subjectivity
---
.../AssistantCredibilitySignals.jsx | 16 ++++++----------
1 file changed, 6 insertions(+), 10 deletions(-)
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index 054bb10d9..384b5e989 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -78,7 +78,7 @@ const calculateSubjectivity = (sentences) => {
const getExpandIcon = (loading, fail, done = null, role = null) => {
if (loading || fail || done || (role && !role.includes("BETA_TESTER"))) {
- // "done" is for when subjectivityDone = true but subjectivityResult.entities = {}
+ // "done" is for when subjectivityDone = true and subjectivityResult.entities.length
return ;
} else {
return ;
@@ -610,27 +610,23 @@ const AssistantCredSignals = () => {
{/* Subjectivity */}
- {console.log(
- subjectivityLoading,
- subjectivityFail,
- subjectivityDone,
- subjectivityResult,
- )}
From 596ed86e575ccd180c90bde6979943ebb5f487d1 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Tue, 30 Jul 2024 16:53:08 +0100
Subject: [PATCH 11/35] edited keyword for semantic search
---
public/locales/en/components/NavItems/tools/Assistant.json | 2 +-
.../AssistantScrapeResults/AssistantCredibilitySignals.jsx | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 1384ca919..6371d75a5 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -141,7 +141,7 @@
"previous_fact_checks": "Previous Fact-Checks",
"previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
"more_details": "For more details see",
- "fact_check_semantic_search": "Fact Check Semantic Search",
+ "semantic_search_title": "Fact Check Semantic Search",
"machine_generated_text": "Machine Generated Text",
"machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
"failed_to_load": "Failed to load",
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index 384b5e989..9ad87bb32 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -188,7 +188,7 @@ const renderCollapsePrevFactChecks = (
sx={{ cursor: "pointer" }}
onClick={() => handleClick("tools/semanticSearch")}
>
- {keyword("fact_check_semantic_search")}
+ {keyword("semantic_search_title")}
From 0360b0fba96779f20b2f60b64e86935422354d5b Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Mon, 5 Aug 2024 14:40:14 +0100
Subject: [PATCH 12/35] changed mgt.pred to use keyword
---
.../en/components/NavItems/tools/Assistant.json | 10 +++++++---
.../AssistantCredibilitySignals.jsx | 3 +--
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 6371d75a5..ca61e0ae2 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -142,8 +142,6 @@
"previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
"more_details": "For more details see",
"semantic_search_title": "Fact Check Semantic Search",
- "machine_generated_text": "Machine Generated Text",
- "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
"failed_to_load": "Failed to load",
"previous_fact_checks_found": "Top 5 previous fact-checks found",
"login_required": "Please log in as a beta user to see results",
@@ -153,5 +151,11 @@
"semantic_search_result_translated_from": "Translated from",
"semantic_search_result_see_original": "See original",
"semantic_search_result_english_translation": "Show English Translation",
- "semantic_search_rating": "Rating:"
+ "semantic_search_rating": "Rating:",
+ "machine_generated_text": "Machine Generated Text",
+ "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
+ "highly_likely_human": "Highly likely human written with score ",
+ "likely_human": "Likely human written with score ",
+ "likely_machine": "Likely machine generated with score ",
+ "highly_likely_machine": "Highly likely machine generated with score "
}
\ No newline at end of file
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
index 9ad87bb32..9d102bee4 100644
--- a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -862,8 +862,7 @@ const AssistantCredSignals = () => {
- {machineGeneratedTextResult.pred}
- {" with score "}
+ {keyword(machineGeneratedTextResult.pred)}
{round(machineGeneratedTextResult.score, 4)}
)}
From 50153f342e8ebdcc388f371b0087025c0f88cd87 Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Mon, 5 Aug 2024 14:48:53 +0100
Subject: [PATCH 13/35] Adding credibility signals feature
Add assistant text classifier UI with html formatting
first commit
added new sagas
starting to add accordion display
Displaying gcloud cred signals
tidied up list of genre, topic, persuasion
added typography
machince generated text service added
fixed subjectivity
displaying subjective sentences
displaying correct subjective sentences
tidied display of credibillity signals
using stored secrets for kinit services
removed classifiers from URL test box
added code for checking logged in for pfc
preventing pfc from being called if not logged in
removing unnnecessary imports
adding subj tooltip and pfc limit
refactored credibility signals
added messages for after logging in
login message and passing text to semantic search as variable
captialised genres
added assistant.json text
moved tooltips out to cardheader
pfc and mgt sagas work after login
typos
added comments
added embedding message
moved credsignals grid to correct card
removed console.log message
removed unnecessary tooltip
log
moved text to assistant.json
tidied code
counting categories in wrapfunc
counting categories in wrapfunc change
counting categories in wrapfunc change
Subjectivty confidence colour blue
refactoring pertech code
refactor for correct persuasion techniques
added/removed comments
updated tooltip text
remove console.log
fixes for persuasion techniques
fixes for subjectivity
edited keyword for semantic search
changed mgt.pred to use keyword
---
.../components/NavItems/tools/Assistant.json | 273 +++---
.../NavItems/Assistant/Assistant.jsx | 26 +-
.../AssistantApiHandlers/useAssistantApi.jsx | 150 +++
.../AssistantCheckStatus.jsx | 18 +
.../ExtractedSourceCredibilityDBKFDialog.jsx | 46 +-
.../AssistantCredibilitySignals.jsx | 895 ++++++++++++++++++
.../AssistantTextClassification.jsx | 340 +++++++
.../AssistantTextResult.jsx | 10 +-
.../AssistantTextSpanClassification.jsx | 399 ++++++++
.../assistantTextResultStyle.css | 7 +
.../AssistantScrapeResults/assistantUtils.jsx | 226 ++++-
.../components/ResultDisplayItem.jsx | 13 +-
.../NavItems/tools/SemanticSearch/index.jsx | 17 +-
src/redux/actions/tools/assistantActions.jsx | 104 ++
src/redux/reducers/assistantReducer.jsx | 36 +
src/redux/sagas/assistantSaga.jsx | 162 +++-
16 files changed, 2547 insertions(+), 175 deletions(-)
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextClassification.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/AssistantTextSpanClassification.jsx
create mode 100644 src/components/NavItems/Assistant/AssistantScrapeResults/assistantTextResultStyle.css
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 8971587d8..ca61e0ae2 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -1,116 +1,161 @@
{
- "assistant_title": "Assistant",
- "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case",
- "assistant_choose": "Choose what you want to analyse",
- "assistant_webpage_header": "Webpage link",
- "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.",
- "assistant_file_header": "Local file",
- "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image",
- "assistant_choose_tool": "Choose the tool you want to use",
- "upload_video": "Video",
- "upload_image": "Image",
- "assistant_urlbox": "URL",
- "assistant_give_url": "Give the URL of the page to analyse",
- "assistant_paste_url": "Paste the URL here",
- "please_give_a_correct_link": "The link provided is incorrect or not supported.",
- "button_analyse": "Analyse",
- "button_clean": "Remove",
- "save": "Save",
- "source_credibility_title": "Source Credibility",
- "source_credibility_byline": "The source has been found as part of a credibility check",
- "link_explorer_title": "Link Explorer",
- "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility",
- "text_title": "Text",
- "text_intro": "The following text has been found on the page",
- "dbkf_title": "DBKF Check",
- "expand_text": "Expand Text",
- "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.",
- "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.",
- "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.",
- "media_title": "Media",
- "images_label": "Images",
- "videos_label": "Videos",
- "media_found": "The following media has been found on the page",
- "media_below": "Select the media you would like to verify",
- "media_to_process": "Media to Process",
- "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.",
- "things_you_can_do_header": "Potential Tools",
- "things_you_can_do": "Below are the tools you can use on this media type",
- "navbar_analysis_image": "Image Analysis",
- "navbar_analysis_video": "Video Analysis",
- "navbar_keyframes": "Keyframes",
- "navbar_thumbnails": "Thumbnails",
- "navbar_twitter": "Tw. search",
- "navbar_magnifier": "Magnifier",
- "navbar_metadata": "Metadata",
- "navbar_rights": "Video rights",
- "navbar_forensic": "Forensic",
- "navbar_ocr": "OCR",
- "navbar_twitter_sna": "Fact Check",
- "navbar_assistant": "Assistant",
- "assistant_help_title": "Assistant Help",
- "assistant_help_1": " The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
",
- "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
",
- "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
",
- "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page For a detailed breakdown of the tools and checks run by the assistant, see: this page",
- "enter_url": "Enter URL",
- "mode_label": "URL mode",
- "url_text": "URL Text",
- "url_media": "URL Media",
- "media_text": "Extracted Media Text",
- "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.",
- "text_warning": "Warnings found against text. See warning box.",
- "image_warning": "Warnings found against image. See warning box.",
- "warning_title": "Warning",
- "warning_subtitle": "Some elements of this content have been flagged",
- "status_title": "Status",
- "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.",
- "named_entity_title": "Text entities",
- "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes",
- "domain_scope": "Domain:",
- "account_scope": "Account:",
- "labelled_as": "has been labelled as:",
- "commented_as": "with the following comment:",
- "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of",
- "image_analysis_text": "Retrieve contextual information about the image",
- "video_analysis_text": "Retrieve contextual information about the video",
- "keyframes_text": "Fragment the video",
- "thumbnails_text": "Reverse search on thumbnails from the video",
- "magnifier_text": "Examine the image thoroughly",
- "metadata_text": "Retrieve image/video metadata",
- "rights_text": "Retrieve information solely about video rights",
- "forensic_text": "Detect any image manipulation",
- "ocr_text": "Extract any text from the image",
- "hyperpartisan_title": "Hyperpartisan service",
- "dbkf_text_title": "Database of known fakes text search",
- "dbkf_media_title": "Database of known fakes media search",
- "ne_title": "Named entity search",
- "ocr_title": "OCR search",
- "source_cred_title": "Source credibility service",
- "mt_title": "Machine translation service",
- "translate": "Translate (beta)",
- "copy_link": "Copy link",
- "archive_link": "Archive",
- "this": "This ",
- "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:",
- "source_credibility_warning_account": "account has been mentioned in a lookup against:",
- "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page",
- "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page",
- "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:",
- "source_cred_popup_header_account": "The account has been found in the following reports listed by:",
- "url_domain_analysis": "URL Domain Analysis",
- "fact_checker": "Fact checker",
- "warning": "Warning",
- "mentions": "Mentions",
- "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.",
- "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.",
- "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.",
- "extracted_urls": "Extracted URLs",
- "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis",
- "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
- "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "embedding_not_supported":"The Assistant could not display this video content."
+ "assistant_title": "Assistant",
+ "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case",
+ "assistant_choose": "Choose what you want to analyse",
+ "assistant_webpage_header": "Webpage link",
+ "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.",
+ "assistant_file_header": "Local file",
+ "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image",
+ "assistant_choose_tool": "Choose the tool you want to use",
+ "upload_video": "Video",
+ "upload_image": "Image",
+ "assistant_urlbox": "URL",
+ "assistant_give_url": "Give the URL of the page to analyse",
+ "assistant_paste_url": "Paste the URL here",
+ "please_give_a_correct_link": "The link provided is incorrect or not supported.",
+ "button_analyse": "Analyse",
+ "button_clean": "Remove",
+ "save": "Save",
+ "source_credibility_title": "Source Credibility",
+ "source_credibility_byline": "The source has been found as part of a credibility check",
+ "link_explorer_title": "Link Explorer",
+ "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility",
+ "text_title": "Text",
+ "text_intro": "The following text has been found on the page",
+ "dbkf_title": "DBKF Check",
+ "expand_text": "Expand Text",
+ "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.",
+ "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.",
+ "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.",
+ "media_title": "Media",
+ "images_label": "Images",
+ "videos_label": "Videos",
+ "media_found": "The following media has been found on the page",
+ "media_below": "Select the media you would like to verify",
+ "media_to_process": "Media to Process",
+ "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.",
+ "things_you_can_do_header": "Potential Tools",
+ "things_you_can_do": "Below are the tools you can use on this media type",
+ "navbar_analysis_image": "Image Analysis",
+ "navbar_analysis_video": "Video Analysis",
+ "navbar_keyframes": "Keyframes",
+ "navbar_thumbnails": "Thumbnails",
+ "navbar_twitter": "Tw. search",
+ "navbar_magnifier": "Magnifier",
+ "navbar_metadata": "Metadata",
+ "navbar_rights": "Video rights",
+ "navbar_forensic": "Forensic",
+ "navbar_ocr": "OCR",
+ "navbar_twitter_sna": "Fact Check",
+ "navbar_assistant": "Assistant",
+ "assistant_help_title": "Assistant Help",
+ "assistant_help_1": " The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
",
+ "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
",
+ "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
",
+ "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page For a detailed breakdown of the tools and checks run by the assistant, see: this page",
+ "enter_url": "Enter URL",
+ "mode_label": "URL mode",
+ "url_text": "URL Text",
+ "url_media": "URL Media",
+ "media_text": "Extracted Media Text",
+ "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.",
+ "text_warning": "Warnings found against text. See warning box.",
+ "image_warning": "Warnings found against image. See warning box.",
+ "warning_title": "Warning",
+ "warning_subtitle": "Some elements of this content have been flagged",
+ "status_title": "Status",
+ "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.",
+ "named_entity_title": "Text entities",
+ "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of",
+ "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of",
+ "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes",
+ "domain_scope": "Domain:",
+ "account_scope": "Account:",
+ "labelled_as": "has been labelled as:",
+ "commented_as": "with the following comment:",
+ "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of",
+ "image_analysis_text": "Retrieve contextual information about the image",
+ "video_analysis_text": "Retrieve contextual information about the video",
+ "keyframes_text": "Fragment the video",
+ "thumbnails_text": "Reverse search on thumbnails from the video",
+ "magnifier_text": "Examine the image thoroughly",
+ "metadata_text": "Retrieve image/video metadata",
+ "rights_text": "Retrieve information solely about video rights",
+ "forensic_text": "Detect any image manipulation",
+ "ocr_text": "Extract any text from the image",
+ "hyperpartisan_title": "Hyperpartisan service",
+ "dbkf_text_title": "Database of known fakes text search",
+ "dbkf_media_title": "Database of known fakes media search",
+ "ne_title": "Named entity search",
+ "ocr_title": "OCR search",
+ "source_cred_title": "Source credibility service",
+ "mt_title": "Machine translation service",
+ "translate": "Translate (beta)",
+ "copy_link": "Copy link",
+ "archive_link": "Archive",
+ "this": "This ",
+ "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:",
+ "source_credibility_warning_account": "account has been mentioned in a lookup against:",
+ "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page",
+ "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page",
+ "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
+ "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:",
+ "source_cred_popup_header_account": "The account has been found in the following reports listed by:",
+ "url_domain_analysis": "URL Domain Analysis",
+ "fact_checker": "Fact checker",
+ "warning": "Warning",
+ "mentions": "Mentions",
+ "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.",
+ "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.",
+ "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.",
+ "extracted_urls": "Extracted URLs",
+ "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis",
+ "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
+ "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
+ "embedding_not_supported":"The Assistant could not display this video content.",
+ "assistant_video_download_action": "Download video",
+ "assistant_video_download_action_description": "Click here to download the video, to your machine. The download video can then be used in the assistant to access a wider range of video analysis services.",
+ "credibility_signals": "Credibility Signals",
+ "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given page.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the source is. For more information on these signals, please see this page.",
+ "importance_tooltip": "The background of highlighted sentences varies depending on the detection algorithm's rating of its importance.",
+ "confidence_tooltip_technique": "The background of the detected techniques varies depending on the detection algorithm's confidence.",
+ "confidence_tooltip_sentence": "The background of highlighted sentences varies depending on the detection algorithm's confidence.",
+ "highlight_important_sentence": "Highlight important sentences",
+ "low_importance": "Low importance",
+ "high_importance": "High importance",
+ "low_confidence": "Low confidence",
+ "high_confidence": "High confidence",
+ "colour_scale": "The colour scale is shown below:",
+ "news_framing": "Topic",
+ "news_framing_tooltip": "Identify the topics used in the extracted text. A topic is the perspective under which an issue or a piece of news is presented. A total of 9 different topics are considered.",
+ "news_genre": "Genre",
+ "news_genre_tooltip": "Determine whether the text is most likely to be an opinion piece, objective news reporting, or satire.",
+ "persuasion_techniques": "Persuasion Techniques",
+ "persuasion_techniques_tooltip": "Identify the persuasion techniques of the extracted text. This service annotates particular sentences within the text that use these techniques. A total of 23 different techniques are considered.",
+ "detected_techniques": "Detected techniques",
+ "no_detected_categories": "No detected categories",
+ "subjectivity": "Subjectivity",
+ "subjectivity_tooltip": "Identify the subjective sentences of the extracted text.",
+ "subjective_sentences_detected": "Subjective sentences detected",
+ "no_subjective_sentences_detected": "No subjective sentences detected",
+ "previous_fact_checks": "Previous Fact-Checks",
+ "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
+ "more_details": "For more details see",
+ "semantic_search_title": "Fact Check Semantic Search",
+ "failed_to_load": "Failed to load",
+ "previous_fact_checks_found": "Top 5 previous fact-checks found",
+ "login_required": "Please log in as a beta user to see results",
+ "reanalyse_url": "Please reanalyse URL to see results",
+ "semantic_search_result_claim": "Claim:",
+ "semantic_search_result_title": "Title:",
+ "semantic_search_result_translated_from": "Translated from",
+ "semantic_search_result_see_original": "See original",
+ "semantic_search_result_english_translation": "Show English Translation",
+ "semantic_search_rating": "Rating:",
+ "machine_generated_text": "Machine Generated Text",
+ "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
+ "highly_likely_human": "Highly likely human written with score ",
+ "likely_human": "Likely human written with score ",
+ "likely_machine": "Likely machine generated with score ",
+ "highly_likely_machine": "Highly likely machine generated with score "
}
\ No newline at end of file
diff --git a/src/components/NavItems/Assistant/Assistant.jsx b/src/components/NavItems/Assistant/Assistant.jsx
index a3ab327cc..cdcc397d9 100644
--- a/src/components/NavItems/Assistant/Assistant.jsx
+++ b/src/components/NavItems/Assistant/Assistant.jsx
@@ -19,6 +19,7 @@ import AssistantSCResults from "./AssistantScrapeResults/AssistantSCResults";
import AssistantTextResult from "./AssistantScrapeResults/AssistantTextResult";
import AssistantUrlSelected from "./AssistantUrlSelected";
import AssistantWarnings from "./AssistantScrapeResults/AssistantWarnings";
+import AssistantCredSignals from "./AssistantScrapeResults/AssistantCredibilitySignals";
import {
cleanAssistantState,
@@ -52,6 +53,13 @@ const Assistant = () => {
//third party check states
const neResult = useSelector((state) => state.assistant.neResultCategory);
+ const newsFramingResult = useSelector(
+ (state) => state.assistant.newsFramingResult,
+ );
+ const newsGenreResult = useSelector(
+ (state) => state.assistant.newsGenreResult,
+ );
+ const hpResult = useSelector((state) => state.assistant.hpResult);
// source credibility
const positiveSourceCred = useSelector(
@@ -79,6 +87,13 @@ const Assistant = () => {
(state) => state.assistant.dbkfMediaMatchFail,
);
const neFailState = useSelector((state) => state.assistant.neFail);
+ const newsFramingFailState = useSelector(
+ (state) => state.assistant.newsFramingFail,
+ );
+ const newsGenreFailState = useSelector(
+ (state) => state.assistant.newsGenreFail,
+ );
+ // const mtFailState = useSelector(state => state.assistant.mtFail)
//local state
const [formInput, setFormInput] = useState(inputUrl);
@@ -163,7 +178,9 @@ const Assistant = () => {
{scFailState ||
dbkfTextFailState ||
dbkfMediaFailState ||
- neFailState ? (
+ neFailState ||
+ newsFramingFailState ||
+ newsGenreFailState ? (
@@ -233,6 +250,12 @@ const Assistant = () => {
) : null}
+
+ {text ? (
+
+
+
+ ) : null}
@@ -240,5 +263,4 @@ const Assistant = () => {
);
};
-
export default Assistant;
diff --git a/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx b/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
index 472d54fa1..3a243c51c 100644
--- a/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
+++ b/src/components/NavItems/Assistant/AssistantApiHandlers/useAssistantApi.jsx
@@ -76,16 +76,166 @@ export default function assistantApiCalls() {
return result.data;
};
+ const MAX_NUM_RETRIES = 3;
+
+ /**
+ * Calls an async function that throws an exception when it fails, will retry for numMaxRetries
+ * @param numMaxRetries Number of times the function will be retried
+ * @param asyncFunc The async function to call
+ * @param errorFunc Called when asyncFunc throws an error when there are additional retries
+ * @returns {Promise<*>} Output of asyncFunc
+ */
+ async function callAsyncWithNumRetries(
+ numMaxRetries,
+ asyncFunc,
+ errorFunc = null,
+ ) {
+ for (let retryCount = 0; retryCount < numMaxRetries; retryCount++) {
+ try {
+ return await asyncFunc();
+ } catch (e) {
+ if (retryCount + 1 >= MAX_NUM_RETRIES) {
+ throw e;
+ } else {
+ if (errorFunc) errorFunc(retryCount, e);
+ }
+ }
+ }
+ }
+
+ const callNewsFramingService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/news-framing-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to news framing service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callNewsGenreService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/news-genre-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to news genre service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callPersuasionService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.post(
+ assistantEndpoint + "gcloud/persuasion-span-clfr",
+ { text: text },
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to persuasion service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
const callOcrScriptService = async () => {
const result = await axios.get(assistantEndpoint + "gcloud/ocr-scripts");
return result.data;
};
+ const callSubjectivityService = async (text) => {
+ const result = await axios.post(assistantEndpoint + "dw/subjectivity", {
+ content: text,
+ });
+
+ return result.data;
+ };
+
+ const callPrevFactChecksService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.get(
+ assistantEndpoint +
+ "kinit/prev-fact-checks" +
+ "?text=" +
+ encodeURIComponent(text), // max URL length is 2048 characters
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to previous fact checks service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
+ const callMachineGeneratedTextService = async (text) => {
+ return await callAsyncWithNumRetries(
+ MAX_NUM_RETRIES,
+ async () => {
+ const result = await axios.get(
+ assistantEndpoint +
+ "kinit/machine-generated-text" +
+ "?text=" +
+ encodeURIComponent(text), // max URL length is 2048 characters
+ );
+ return result.data;
+ },
+ (numTries) => {
+ console.log(
+ "Could not connect to machine generated text service, tries " +
+ (numTries + 1) +
+ "/" +
+ MAX_NUM_RETRIES,
+ );
+ },
+ );
+ };
+
return {
callAssistantScraper,
callSourceCredibilityService,
callNamedEntityService,
callOcrService,
callOcrScriptService,
+ callNewsFramingService,
+ callNewsGenreService,
+ callPersuasionService,
+ callSubjectivityService,
+ callPrevFactChecksService,
+ callMachineGeneratedTextService,
};
}
diff --git a/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx b/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
index 522fe8b3a..b1978e721 100644
--- a/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
+++ b/src/components/NavItems/Assistant/AssistantCheckResults/AssistantCheckStatus.jsx
@@ -34,11 +34,29 @@ const AssistantCheckStatus = () => {
const neTitle = keyword("ne_title");
const neFailState = useSelector((state) => state.assistant.neFail);
+ const newsFramingTitle = "news topic";
+ const newsFramingFailState = useSelector(
+ (state) => state.assistant.newsFramingFail
+ );
+
+ const newsGenreTitle = "news genre";
+ const newsGenreFailState = useSelector(
+ (state) => state.assistant.newsGenreFail
+ );
+
+ const persuasionTitle = "persuasion";
+ const persuasionFailState = useSelector(
+ (state) => state.assistant.persuasionFail
+ );
+
const failStates = [
{ title: scTitle, failed: scFailState },
{ title: dbkfMediaTitle, failed: dbkfMediaFailState },
{ title: dbkfTextTitle, failed: dbkfTextFailState },
{ title: neTitle, failed: neFailState },
+ { title: newsFramingTitle, failed: newsFramingFailState },
+ { title: newsGenreTitle, failed: newsGenreFailState },
+ { title: persuasionTitle, failed: persuasionFailState },
];
return (
diff --git a/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx b/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
index 4992f0403..45ab449e7 100644
--- a/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
+++ b/src/components/NavItems/Assistant/AssistantCheckResults/ExtractedSourceCredibilityDBKFDialog.jsx
@@ -139,28 +139,30 @@ const ExtractedSourceCredibilityDBKFDialog = ({
? sourceCredibilityResults.map((value, key) => (
}>
- {sourceCredibilityResults[
- key
- ].credibilityScope.includes("/") ? (
-
- {` ${keyword("this")}`}
- {getUrlTypeFromCredScope(
- value.credibilityScope,
- )}
- {` ${keyword(
- "source_credibility_warning_account",
- )} ${" "}${value.credibilitySource}`}
-
- ) : sourceCredibilityResults[key]
- .credibilityScope ? (
-
- {` ${keyword(
- "source_cred_popup_header_domain",
- )} ${
- sourceCredibilityResults[key]
- .credibilitySource
- } `}
-
+ {sourceCredibilityResults[key] ? (
+ sourceCredibilityResults[
+ key
+ ].credibilityScope.includes("/") ? (
+
+ {` ${keyword("this")}`}
+ {getUrlTypeFromCredScope(
+ value.credibilityScope,
+ )}
+ {` ${keyword(
+ "source_credibility_warning_account",
+ )} ${" "}${value.credibilitySource}`}
+
+ ) : sourceCredibilityResults[key]
+ .credibilityScope ? (
+
+ {` ${keyword(
+ "source_cred_popup_header_domain",
+ )} ${
+ sourceCredibilityResults[key]
+ .credibilitySource
+ } `}
+
+ ) : null
) : null}
diff --git a/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
new file mode 100644
index 000000000..9d102bee4
--- /dev/null
+++ b/src/components/NavItems/Assistant/AssistantScrapeResults/AssistantCredibilitySignals.jsx
@@ -0,0 +1,895 @@
+import React, { useState } from "react";
+import { useSelector } from "react-redux";
+
+import Box from "@mui/material/Box";
+import Card from "@mui/material/Card";
+import { CardHeader, CircularProgress, Link, styled } from "@mui/material";
+import CardContent from "@mui/material/CardContent";
+import Grid from "@mui/material/Grid";
+import Accordion from "@mui/material/Accordion";
+import AccordionSummary from "@mui/material/AccordionSummary";
+import AccordionDetails from "@mui/material/AccordionDetails";
+import ExpandMoreIcon from "@mui/icons-material/ExpandMore";
+import Typography from "@mui/material/Typography";
+import { i18nLoadNamespace } from "components/Shared/Languages/i18nLoadNamespace";
+import useMyStyles from "../../../Shared/MaterialUiStyles/useMyStyles";
+import Tooltip from "@mui/material/Tooltip";
+import HelpOutlineOutlinedIcon from "@mui/icons-material/HelpOutlineOutlined";
+import AssistantTextClassification from "./AssistantTextClassification";
+import AssistantTextSpanClassification from "./AssistantTextSpanClassification";
+import ResultDisplayItem from "components/NavItems/tools/SemanticSearch/components/ResultDisplayItem";
+import dayjs from "dayjs";
+import LocaleData from "dayjs/plugin/localeData";
+import localizedFormat from "dayjs/plugin/localizedFormat";
+
+import Collapse from "@mui/material/Collapse";
+import Divider from "@mui/material/Divider";
+import {
+ ExpandLessOutlined,
+ ExpandMoreOutlined,
+ Remove,
+} from "@mui/icons-material";
+import TranslateIcon from "@mui/icons-material/Translate";
+import IconButton from "@mui/material/IconButton";
+import FileCopyOutlined from "@mui/icons-material/FileCopy";
+
+import { useNavigate } from "react-router-dom";
+import { getLanguageName } from "../../../Shared/Utils/languageUtils";
+
+const renderEntityKeys = (entities) => {
+ // tidy array into readable string
+ let entitiesString = Object.keys(entities)
+ .toString()
+ .replace("Important_Sentence", "")
+ .replaceAll(",", ", ")
+ .replaceAll("_", " ")
+ .trim();
+
+ // remove beginning and last hanging commas
+ if (entitiesString.slice(0, 2) === ", ") {
+ entitiesString = entitiesString.substring(2, entitiesString.length);
+ }
+ if (entitiesString.slice(-1) === ",") {
+ entitiesString = entitiesString.substring(0, entitiesString.length - 1);
+ }
+
+ return entitiesString;
+};
+
+const round = (number, decimalPlaces) => {
+ return (Math.round(number * 100) / 100).toFixed(decimalPlaces);
+};
+
+const calculateSubjectivity = (sentences) => {
+ let scoresSUBJ = [];
+ for (let i = 0; i < sentences.length; i++) {
+ if (sentences[i].label == "SUBJ") {
+ scoresSUBJ.push(Number(sentences[i].score));
+ }
+ }
+
+ return [
+ scoresSUBJ.length,
+ [" (", scoresSUBJ.length, "/", sentences.length, ")"]
+ .toString()
+ .replaceAll(",", ""),
+ ];
+};
+
+const getExpandIcon = (loading, fail, done = null, role = null) => {
+ if (loading || fail || done || (role && !role.includes("BETA_TESTER"))) {
+ // "done" is for when subjectivityDone = true and subjectivityResult.entities.length
+ return ;
+ } else {
+ return ;
+ }
+};
+
+const renderCollapse = (
+ classes,
+ setDisplayOrigLang,
+ displayOrigLang,
+ textLang,
+ sharedKeyword,
+ keyword,
+ text,
+ displayExpander,
+ expanded,
+ setExpanded,
+) => {
+ return (
+
+
+
+
+ setDisplayOrigLang(!displayOrigLang)}
+ >
+ {textLang}
+
+
+ {
+ navigator.clipboard.writeText(text);
+ }}
+ >
+
+
+
+ {textLang && textLang !== "en" && textLang !== "" ? (
+
+
+ window.open(
+ "https://translate.google.com/?sl=auto&text=" +
+ encodeURIComponent(text) +
+ "&op=translate",
+ "_blank",
+ )
+ }
+ >
+
+
+
+ ) : null}
+
+
+ {displayExpander ? (
+ expanded ? (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ ) : (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ )
+ ) : null}
+
+
+
+ );
+};
+
+const renderCollapsePrevFactChecks = (
+ classes,
+ displayExpander,
+ expanded,
+ setExpanded,
+ navigate,
+ keyword,
+) => {
+ const handleClick = (path) => {
+ // instead need to set parameter then load text in SemanticSearch/index.jsx
+ navigate("/app/" + path + "/assistantText");
+ };
+
+ return (
+
+
+
+
+ <>>
+
+
+
+
+ {keyword("more_details")}{" "}
+ handleClick("tools/semanticSearch")}
+ >
+ {keyword("semantic_search_title")}
+
+
+
+
+ {displayExpander ? (
+ expanded ? (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ ) : (
+ {
+ setExpanded(!expanded);
+ }}
+ />
+ )
+ ) : null}
+
+
+
+ );
+};
+
+const AssistantCredSignals = () => {
+ const keyword = i18nLoadNamespace("components/NavItems/tools/Assistant");
+ const sharedKeyword = i18nLoadNamespace("components/Shared/utils");
+ const classes = useMyStyles();
+
+ // displaying expanded text in AccordionDetails
+ const [displayOrigLang, setDisplayOrigLang] = useState(true);
+ const [displayExpander, setDisplayExpander] = useState(true);
+ const [expanded, setExpanded] = useState(true);
+
+ // one accordion open at once
+ const [expandedAccordion, setExpandedAccordion] = React.useState("false");
+ const handleChange = (panel) => (event, newExpanded) => {
+ setExpandedAccordion(newExpanded ? panel : false);
+ };
+
+ //style disabled accordion
+ const StyledAccordion = styled(Accordion)(({ theme }) => ({
+ ".Mui-disabled": {
+ opacity: "1 !important",
+ background: "white",
+ },
+ }));
+
+ // assistant media states
+ const text = useSelector((state) => state.assistant.urlText);
+ const textLang = useSelector((state) => state.assistant.textLang);
+ const textHtmlMap = useSelector((state) => state.assistant.urlTextHtmlMap);
+
+ // news framing (topic)
+ const newsFramingTitle = keyword("news_framing");
+ const newsFramingResult = useSelector(
+ (state) => state.assistant.newsFramingResult,
+ );
+ const newsFramingLoading = useSelector(
+ (state) => state.assistant.newsFramingLoading,
+ );
+ const newsFramingDone = useSelector(
+ (state) => state.assistant.newsFramingDone,
+ );
+ const newsFramingFail = useSelector(
+ (state) => state.assistant.newsFramingFail,
+ );
+
+ // news genre
+ const newsGenreTitle = keyword("news_genre");
+ const newsGenreResult = useSelector(
+ (state) => state.assistant.newsGenreResult,
+ );
+ const newsGenreLoading = useSelector(
+ (state) => state.assistant.newsGenreLoading,
+ );
+ const newsGenreDone = useSelector((state) => state.assistant.newsGenreDone);
+ const newsGenreFail = useSelector((state) => state.assistant.newsGenreFail);
+
+ // persuasion techniques
+ const persuasionTitle = keyword("persuasion_techniques");
+ const persuasionResult = useSelector(
+ (state) => state.assistant.persuasionResult,
+ );
+ const persuasionLoading = useSelector(
+ (state) => state.assistant.persuasionLoading,
+ );
+ const persuasionDone = useSelector((state) => state.assistant.persuasionDone);
+ const persuasionFail = useSelector((state) => state.assistant.persuasionFail);
+
+ // subjectivity
+ const subjectivityTitle = keyword("subjectivity");
+ const subjectivityResult = useSelector(
+ (state) => state.assistant.subjectivityResult,
+ );
+ const subjectivityLoading = useSelector(
+ (state) => state.assistant.subjectivityLoading,
+ );
+ const subjectivityDone = useSelector(
+ (state) => state.assistant.subjectivityDone,
+ );
+ const subjectivityFail = useSelector(
+ (state) => state.assistant.subjectivityFail,
+ );
+
+ // previous fact checks
+ const prevFactChecksTitle = keyword("previous_fact_checks");
+ const prevFactChecksResult = useSelector(
+ (state) => state.assistant.prevFactChecksResult,
+ );
+ const prevFactChecksLoading = useSelector(
+ (state) => state.assistant.prevFactChecksLoading,
+ );
+ const prevFactChecksDone = useSelector(
+ (state) => state.assistant.prevFactChecksDone,
+ );
+ const prevFactChecksFail = useSelector(
+ (state) => state.assistant.prevFactChecksFail,
+ );
+ // checking if user logged in
+ const role = useSelector((state) => state.userSession.user.roles);
+ // date information
+ dayjs.extend(LocaleData);
+ dayjs.extend(localizedFormat);
+ const globalLocaleData = dayjs.localeData();
+ // for navigating to Semantic Search with text
+ const navigate = useNavigate();
+
+ // machine generated text
+ const machineGeneratedTextTitle = keyword("machine_generated_text");
+ const machineGeneratedTextResult = useSelector(
+ (state) => state.assistant.machineGeneratedTextResult,
+ );
+ const machineGeneratedTextLoading = useSelector(
+ (state) => state.assistant.machineGeneratedTextLoading,
+ );
+ const machineGeneratedTextDone = useSelector(
+ (state) => state.assistant.machineGeneratedTextDone,
+ );
+ const machineGeneratedTextFail = useSelector(
+ (state) => state.assistant.machineGeneratedTextFail,
+ );
+
+ return (
+
+
+
+ {keyword("credibility_signals")}
+
+ }
+ action={
+ // tooltip
+ " +
+ keyword("news_framing") +
+ " " +
+ keyword("news_framing_tooltip") +
+ "
'", "credibility_signals": "\u0625\u0634\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0635\u062f\u0627\u0642\u064a\u0629", "credibility_signals_tooltip": "\u0645\u0627 \u0647\u0630\u0627\u061f\u064a\u0639\u0631\u0636 \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0625\u0634\u0627\u0631\u0627\u062a \u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0645\u062e\u062a\u0644\u0641\u0629 \u0645\u0633\u062a\u0645\u062f\u0629 \u0645\u0646 \u062a\u0637\u0628\u064a\u0642 \u0645\u0635\u0646\u0641\u0627\u062a \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a \u0639\u0644\u0649 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c \u0645\u0646 \u0635\u0641\u062d\u0629 \u0645\u0639\u064a\u0646\u0629.\u0645\u0627\u0630\u0627 \u064a\u0645\u0643\u0646\u0646\u064a \u0623\u0646 \u0623\u0641\u0639\u0644 \u0628\u0647\u0630\u0647 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062a\u061f\u062a\u0642\u062f\u0645 \u0646\u062a\u0627\u0626\u062c \u0625\u0634\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0647\u0630\u0647 \u0646\u0638\u0631\u0629 \u0639\u0627\u0645\u0629 \u0645\u0641\u0635\u0644\u0629 \u0639\u0644\u0649 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c \u0645\u0645\u0627 \u064a\u0633\u0645\u062d \u0644\u0644\u0642\u0627\u0631\u0626 \u0628\u062a\u062d\u062f\u064a\u062f \u0645\u062f\u0649 \u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0623\u0648 \u0645\u0648\u062b\u0648\u0642\u064a\u0629 \u0627\u0644\u0645\u0635\u062f\u0631. \u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u062d\u0648\u0644 \u0647\u0630\u0647 \u0627\u0644\u0625\u0634\u0627\u0631\u0627\u062a\u060c \u064a\u0631\u062c\u0649 \u0627\u0644\u0627\u0637\u0644\u0627\u0639 \u0639\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629.", "importance_tooltip": "\u062a\u062e\u062a\u0644\u0641 \u062e\u0644\u0641\u064a\u0629 \u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0645\u0645\u064a\u0632\u0629 \u062d\u0633\u0628 \u062a\u0642\u064a\u064a\u0645 \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629 \u0627\u0644\u0643\u0634\u0641 \u0644\u0623\u0647\u0645\u064a\u062a\u0647\u0627.", "confidence_tooltip_technique": "\u062a\u062e\u062a\u0644\u0641 \u062e\u0644\u0641\u064a\u0629 \u0627\u0644\u062a\u0642\u0646\u064a\u0627\u062a \u0627\u0644\u0645\u0643\u062a\u0634\u0641\u0629 \u062d\u0633\u0628 \u062b\u0642\u0629 \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629 \u0627\u0644\u0643\u0634\u0641.", "confidence_tooltip_sentence": "\u062a\u062e\u062a\u0644\u0641 \u062e\u0644\u0641\u064a\u0629 \u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0645\u0645\u064a\u0632\u0629 \u062d\u0633\u0628 \u062b\u0642\u0629 \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629 \u0627\u0644\u0627\u0643\u062a\u0634\u0627\u0641.", "highlight_important_sentence": "\u062a\u0633\u0644\u064a\u0637 \u0627\u0644\u0636\u0648\u0621 \u0639\u0644\u0649 \u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0645\u0647\u0645\u0629", "low_importance": "\u0623\u0647\u0645\u064a\u0629 \u0645\u0646\u062e\u0641\u0636\u0629", "high_importance": "\u0623\u0647\u0645\u064a\u0629 \u0639\u0627\u0644\u064a\u0629", "low_confidence": "\u062b\u0642\u0629 \u0645\u0646\u062e\u0641\u0636\u0629", "high_confidence": "\u062b\u0642\u0629 \u0639\u0627\u0644\u064a\u0629", "colour_scale": "\u064a\u0638\u0647\u0631 \u0645\u0642\u064a\u0627\u0633 \u0627\u0644\u0623\u0644\u0648\u0627\u0646 \u0623\u062f\u0646\u0627\u0647: ", "news_framing": "\u0639\u0646\u0648\u0627\u0646", "news_framing_tooltip": "\u062d\u062f\u062f \u0627\u0644\u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629 \u0641\u064a \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c. \u0627\u0644\u0645\u0648\u0636\u0648\u0639 \u0647\u0648 \u0627\u0644\u0645\u0646\u0638\u0648\u0631 \u0627\u0644\u0630\u064a \u064a\u062a\u0645 \u0645\u0646 \u062e\u0644\u0627\u0644\u0647 \u062a\u0642\u062f\u064a\u0645 \u0642\u0636\u064a\u0629 \u0623\u0648 \u062e\u0628\u0631. \u064a\u062a\u0645 \u0627\u0644\u0646\u0638\u0631 \u0641\u064a \u0625\u062c\u0645\u0627\u0644\u064a 9 \u0645\u0648\u0636\u0648\u0639\u0627\u062a \u0645\u062e\u062a\u0644\u0641\u0629.", "Economy_and_Resources": "\u0627\u0644\u0627\u0642\u062a\u0635\u0627\u062f \u0648\u0627\u0644\u0645\u0648\u0627\u0631\u062f", "Religious_Ethical_and_Cultural": "\u0627\u0644\u062f\u064a\u0646\u064a \u0648\u0627\u0644\u0623\u062e\u0644\u0627\u0642\u064a \u0648\u0627\u0644\u062b\u0642\u0627\u0641\u064a", "Fairness_Equality_and_Rights": "\u0627\u0644\u0639\u062f\u0627\u0644\u0629 \u0648\u0627\u0644\u0645\u0633\u0627\u0648\u0627\u0629 \u0648\u0627\u0644\u062d\u0642\u0648\u0642", "Law_and_Justice_System": "\u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0642\u0627\u0646\u0648\u0646\u064a \u0648\u0627\u0644\u0639\u062f\u0627\u0644\u0629", "Crime_and_Punishment": "\u0627\u0644\u062c\u0631\u064a\u0645\u0629 \u0648\u0627\u0644\u0639\u0642\u0627\u0628", "Security_Defense_and_Well_being": "\u0627\u0644\u0623\u0645\u0646 \u0648\u0627\u0644\u062f\u0641\u0627\u0639 \u0648\u0627\u0644\u0631\u0641\u0627\u0647\u064a\u0629", "Health_and_Safety": "\u0627\u0644\u0635\u062d\u0629 \u0648\u0627\u0644\u0633\u0644\u0627\u0645\u0629", "Politics": "\u0633\u064a\u0627\u0633\u0629", "International_Relations": "\u0627\u0644\u0639\u0644\u0627\u0642\u0627\u062a \u0627\u0644\u062f\u0648\u0644\u064a\u0629", "news_genre": "\u0627\u0644\u0646\u0648\u0639", "news_genre_tooltip": "\u062d\u062f\u062f \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0646\u0635 \u0645\u0646 \u0627\u0644\u0645\u0631\u062c\u062d \u0623\u0646 \u064a\u0643\u0648\u0646 \u0645\u0642\u0627\u0644 \u0631\u0623\u064a\u060c \u0623\u0648 \u062a\u0642\u0631\u064a\u0631\u064b\u0627 \u0625\u062e\u0628\u0627\u0631\u064a\u064b\u0627 \u0645\u0648\u0636\u0648\u0639\u064a\u064b\u0627\u060c \u0623\u0648 \u0647\u062c\u0627\u0621\u064b.", "Opinion": "\u0623\u062e\u0628\u0627\u0631 \u0645\u062a\u062d\u064a\u0632\u0629", "Reporting": "\u062a\u0642\u0631\u064a\u0631 \u0645\u0648\u0636\u0648\u0639\u064a", "Satire": "\u0627\u0644\u0647\u062c\u0627\u0621", "persuasion_techniques": "\u062a\u0642\u0646\u064a\u0627\u062a \u0627\u0644\u0625\u0642\u0646\u0627\u0639", "persuasion_techniques_tooltip": "\u062a\u062d\u062f\u064a\u062f \u062a\u0642\u0646\u064a\u0627\u062a \u0627\u0644\u0625\u0642\u0646\u0627\u0639 \u0641\u064a \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c. \u062a\u0639\u0645\u0644 \u0647\u0630\u0647 \u0627\u0644\u062e\u062f\u0645\u0629 \u0639\u0644\u0649 \u0634\u0631\u062d \u062c\u0645\u0644 \u0645\u0639\u064a\u0646\u0629 \u062f\u0627\u062e\u0644 \u0627\u0644\u0646\u0635 \u062a\u0633\u062a\u062e\u062f\u0645 \u0647\u0630\u0647 \u0627\u0644\u062a\u0642\u0646\u064a\u0627\u062a. \u064a\u062a\u0645 \u0627\u0644\u0646\u0638\u0631 \u0641\u064a \u0645\u0627 \u0645\u062c\u0645\u0648\u0639\u0647 23 \u062a\u0642\u0646\u064a\u0629 \u0645\u062e\u062a\u0644\u0641\u0629.", "detected_techniques": "\u0627\u0644\u062a\u0642\u0646\u064a\u0627\u062a \u0627\u0644\u0645\u0643\u062a\u0634\u0641\u0629", "no_detected_categories": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0641\u0626\u0627\u062a", "Appeal_to_Authority": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0633\u0644\u0637\u0629", "Appeal_to_Popularity": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0634\u0639\u0628\u064a\u0629", "Appeal_to_Values": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0642\u064a\u0645", "Appeal_to_Fear-Prejudice": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u062e\u0648\u0641/\u0627\u0644\u062a\u062d\u064a\u0632", "Flag_Waving": "\u0627\u0644\u062a\u0644\u0648\u064a\u062d \u0628\u0627\u0644\u0639\u0644\u0645", "Causal_Oversimplification": "\u0627\u0644\u0627\u062e\u062a\u0632\u0627\u0644 \u0627\u0644\u0633\u0628\u0628\u064a \u0627\u0644\u0645\u0641\u0631\u0637", "False_Dilemma-No_Choice": "\u062e\u064a\u0627\u0631 \u0632\u0627\u0626\u0641 \u0623\u0648 \u0628\u062f\u0648\u0646 \u0627\u062e\u062a\u064a\u0627\u0631", "Consequential_Oversimplification": "\u062a\u0628\u0633\u064a\u0637 \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0645\u062a\u0631\u062a\u0628\u0629 \u0639\u0644\u064a\u0647\u0627 Konsequente", "Straw_Man": "\u0627\u0644\u0631\u062c\u0644 \u0627\u0644\u0642\u0634", "Red_Herring": "\u0634\u0627\u0634\u0629 \u062f\u062e\u0627\u0646", "Whataboutism": "\u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0627\u0644\u0642\u0636\u0627\u064a\u0627", "Slogans": "\u0627\u0644\u0634\u0639\u0627\u0631\u0627\u062a", "Appeal_to_Time": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0648\u0642\u062a", "Conversation_Killer": "\u0642\u0627\u062a\u0644 \u0627\u0644\u0645\u062d\u0627\u062f\u062b\u0629", "Loaded_Language": "\u0644\u063a\u0629 \u0645\u062d\u0645\u0644\u0629", "Repetition": "\u0627\u0644\u062a\u0643\u0631\u0627\u0631", "Exaggeration-Minimisation": "\u0627\u0644\u0645\u0628\u0627\u0644\u063a\u0629 \u0623\u0648 \u0627\u0644\u062a\u0642\u0644\u064a\u0644", "Obfuscation-Vagueness-Confusion": "\u0627\u0644\u062a\u0639\u062a\u064a\u0645 - \u0627\u0644\u063a\u0645\u0648\u0636 \u0623\u0648 \u0627\u0644\u0627\u0631\u062a\u0628\u0627\u0643", "Name_Calling-Labeling": "\u0627\u0644\u062a\u0633\u0645\u064a\u0629 \u0623\u0648 \u0627\u0644\u062a\u0633\u0645\u064a\u0629", "Doubt": "\u0627\u0644\u0634\u0643", "Guilt_by_Association": "\u0627\u0644\u0630\u0646\u0628 \u0628\u0627\u0644\u0627\u0631\u062a\u0628\u0627\u0637", "Appeal_to_Hypocrisy": "\u0627\u0644\u0627\u062d\u062a\u0643\u0627\u0645 \u0625\u0644\u0649 \u0627\u0644\u0646\u0641\u0627\u0642", "Questioning_the_Reputation": "\u0627\u0644\u062a\u0634\u0643\u064a\u0643 \u0641\u064a \u0627\u0644\u0633\u0645\u0639\u0629", "subjectivity": "\u0627\u0644\u0630\u0627\u062a\u064a\u0629", "subjectivity_tooltip": "\u062d\u062f\u062f \u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0630\u0627\u062a\u064a\u0629 \u0644\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c.", "subjective_sentences_detected": "\u062a\u0645 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0627\u0644\u062c\u0645\u0644 \u0627\u0644\u0645\u0648\u0636\u0648\u0639\u064a\u0629", "none_detected": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0623\u064a \u0634\u064a\u0621", "previous_fact_checks": "\u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642 \u0627\u0644\u0633\u0627\u0628\u0642\u0629", "previous_fact_checks_tooltip": "\u062a\u0639\u0645\u0644 \u0623\u062f\u0627\u0629 \u0627\u0644\u0628\u062d\u062b \u0627\u0644\u062f\u0644\u0627\u0644\u064a \u0644\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642 \u0639\u0644\u0649 \u062a\u062d\u062f\u064a\u062f \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c \u0642\u062f \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641\u0647 \u0645\u0633\u0628\u0642\u064b\u0627 \u0641\u064a \u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642. \u0648\u062a\u0639\u0631\u0636 \u0623\u062d\u062f\u062b \u0627\u0644\u0645\u0637\u0627\u0628\u0642\u0627\u062a\u060c \u0628\u062d\u062f \u0623\u0642\u0635\u0649 5. \u0648\u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u0623\u062f\u0627\u0629 \u062d\u0627\u0644\u064a\u064b\u0627 \u0625\u0644\u0627 \u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a.", "more_details": "\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0627\u0644\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0646\u0638\u0631", "semantic_search_title": "\u0627\u0644\u0628\u062d\u062b \u0627\u0644\u062f\u0644\u0627\u0644\u064a \u0639\u0646 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642", "failed_to_load": "\u0641\u0634\u0644 \u0641\u064a \u0627\u0644\u062a\u062d\u0645\u064a\u0644", "previous_fact_checks_found": "\u0623\u0647\u0645 5 \u0639\u0645\u0644\u064a\u0627\u062a \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642 \u0627\u0644\u0633\u0627\u0628\u0642\u0629 \u0627\u0644\u062a\u064a \u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u064a\u0647\u0627", "login_required": "\u064a\u0631\u062c\u0649 \u062a\u0633\u062c\u064a\u0644 \u0627\u0644\u062f\u062e\u0648\u0644 \u0643\u0645\u0633\u062a\u062e\u062f\u0645 \u062a\u062c\u0631\u064a\u0628\u064a \u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0646\u062a\u0627\u0626\u062c", "reanalyse_url": "\u064a\u0631\u062c\u0649 \u0625\u0639\u0627\u062f\u0629 \u062a\u062d\u0644\u064a\u0644 \u0639\u0646\u0648\u0627\u0646 URL \u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0646\u062a\u0627\u0626\u062c", "semantic_search_result_claim": "\u0645\u0637\u0627\u0644\u0628\u0629: ", "semantic_search_result_title": "\u0639\u0646\u0648\u0627\u0646: ", "semantic_search_result_translated_from": "\u062a\u0631\u062c\u0645\u062a \u0645\u0646", "semantic_search_result_see_original": "\u0394\u03b5\u03af\u03c4\u03b5 \u03c4\u03bf \u03c0\u03c1\u03c9\u03c4\u03cc\u03c4\u03c5\u03c0\u03bf", "semantic_search_result_english_translation": "\u0639\u0631\u0636 \u0627\u0644\u062a\u0631\u062c\u0645\u0629 \u0627\u0644\u0627\u0646\u062c\u0644\u064a\u0632\u064a\u0629", "semantic_search_rating": "\u062a\u0642\u064a\u064a\u0645: ", "machine_generated_text": "\u0646\u0635 \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647 \u0622\u0644\u064a\u064b\u0627", "machine_generated_text_tooltip": "\u062d\u062f\u062f \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0646\u0635 \u0627\u0644\u0645\u0633\u062a\u062e\u0631\u062c \u0642\u062f \u0643\u062a\u0628\u0647 \u0625\u0646\u0633\u0627\u0646 \u0623\u0645 \u0622\u0644\u0629. \u0644\u0627 \u064a\u0645\u0643\u0646 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0647\u0630\u0647 \u0627\u0644\u0623\u062f\u0627\u0629 \u062d\u0627\u0644\u064a\u064b\u0627 \u0625\u0644\u0627 \u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a \u0627\u0644\u0625\u0635\u062f\u0627\u0631 \u0627\u0644\u062a\u062c\u0631\u064a\u0628\u064a.", "highly_likely_human": " \u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0645\u0644 \u062c\u062f\u064b\u0627 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0645\u0643\u062a\u0648\u0628\u064b\u0627 \u0645\u0646 \u0642\u0628\u0644 \u0625\u0646\u0633\u0627\u0646 \u0628\u062f\u0631\u062c\u0629", "likely_human": " \u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0645\u0644 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0645\u0643\u062a\u0648\u0628\u064b\u0627 \u0645\u0646 \u0642\u0628\u0644 \u0625\u0646\u0633\u0627\u0646 \u0628\u062f\u0631\u062c\u0629", "likely_machine": " \u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0645\u0644 \u0623\u0646 \u064a\u0643\u0648\u0646 \u062a\u0645 \u062a\u0648\u0644\u064a\u062f\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 \u0622\u0644\u0629 \u0628\u062f\u0631\u062c\u0629", "highly_likely_machine": "\u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0645\u0644 \u062c\u062f\u064b\u0627 \u0623\u0646 \u064a\u0643\u0648\u0646 \u062a\u0645 \u062a\u0648\u0644\u064a\u062f\u0647 \u0628\u0648\u0627\u0633\u0637\u0629 \u0622\u0644\u0629 \u0628\u062f\u0631\u062c\u0629"}
\ No newline at end of file
diff --git a/public/locales/ar/components/NavItems/tools/C2pa.json b/public/locales/ar/components/NavItems/tools/C2pa.json
new file mode 100644
index 000000000..a0004db12
--- /dev/null
+++ b/public/locales/ar/components/NavItems/tools/C2pa.json
@@ -0,0 +1 @@
+{"c2pa_title": "C2pa", "c2pa_description": "\u064a\u0642\u0631\u0623 \u0628\u064a\u0627\u0646\u0627\u062a C2pa \u0644\u0635\u0648\u0631\u0629.", "c2pa_results_title": "\u0646\u062a\u0627\u0626\u062c", "c2pa_information": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a c2pa", "no_c2pa_info": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a c2pa \u0645\u062a\u0627\u062d\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629.", "content_credentials_unknown_source": "\u062a\u0645 \u0625\u0635\u062f\u0627\u0631 \u0647\u0630\u0647 \u0627\u0644\u0634\u0647\u0627\u062f\u0629 \u0645\u0646 \u0642\u0628\u0644 \u0645\u0635\u062f\u0631 \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641.", "content_credentials_invalid": "\u0647\u0630\u0647 \u0627\u0644\u0634\u0647\u0627\u062f\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d\u0629\u060c \u0645\u0645\u0627 \u064a\u0639\u0646\u064a \u0623\u0646 \u0623\u064a \u0634\u062e\u0635 \u064a\u0645\u0643\u0646 \u0623\u0646 \u064a\u0643\u0648\u0646 \u0642\u062f \u0639\u062f\u0644 \u0645\u0639\u0644\u0648\u0645\u0627\u062a c2pa \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629.", "content_credentials_title": "\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0627\u0639\u062a\u0645\u0627\u062f \u0644\u0644\u0645\u062d\u062a\u0648\u0649", "content_credentials_issuer": "\u0627\u0644\u0645\u064f\u0635\u062f\u0650\u0631: ", "content_credentials_date_issued": "\u062a\u0627\u0631\u064a\u062e \u0627\u0644\u0625\u0635\u062f\u0627\u0631: ", "credit_title": "\u0627\u0644\u0627\u0626\u062a\u0645\u0627\u0646", "credit_producer": "\u062a\u0645 \u0627\u0644\u0625\u0646\u062a\u0627\u062c \u0628\u0648\u0627\u0633\u0637\u0629: ", "credit_social": "\u0648\u0633\u0627\u0626\u0644 \u0627\u0644\u062a\u0648\u0627\u0635\u0644 \u0627\u0644\u0627\u062c\u062a\u0645\u0627\u0639\u064a", "credit_no_info": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u0645\u0646\u062a\u062c \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629", "capture_info_title": "\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0627\u0644\u062a\u0642\u0627\u0637", "capture_info_make": "\u062a\u0635\u0646\u064a\u0639: ", "capture_info_model": "\u0646\u0645\u0648\u0630\u062c: ", "capture_info_date": "\u062a\u0627\u0631\u064a\u062e: ", "capture_info_longitude": "\u062e\u0637 \u0627\u0644\u0637\u0648\u0644: ", "capture_info_latitude": "\u062e\u0637 \u0627\u0644\u0639\u0631\u0636: ", "capture_info_more_results": "\u0634\u0627\u0647\u062f \u0627\u0644\u0645\u0632\u064a\u062f \u0645\u0646 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0627\u0644\u062a\u0642\u0627\u0637", "capture_info_hide": "\u0625\u062e\u0641\u0627\u0621 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0627\u0644\u062a\u0642\u0627\u0637", "capture_no_info": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0642\u0627\u0637 \u0645\u062a\u0627\u062d\u0629.", "process_title": "\u0639\u0645\u0644\u064a\u0629 \u0627\u0644\u0625\u0646\u0634\u0627\u0621", "process_edits": "\u062a\u0639\u062f\u064a\u0644\u0627\u062a", "process_ingredients": "\u0645\u0643\u0648\u0646\u0627\u062a", "process_no_info": "\u0644\u0627 \u062a\u0648\u062c\u062f \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0639\u0646 \u0627\u0644\u0639\u0645\u0644\u064a\u0629 \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629.", "previous_image": "\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0633\u0627\u0628\u0642\u0629", "first_image": "\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0623\u0648\u0644\u0649", "content_credential_explanation": "\u0627\u0644\u062c\u0647\u0629 \u0627\u0644\u0645\u064f\u0635\u062f\u0631\u0629 \u0647\u064a \u0627\u0644\u0645\u0646\u0638\u0645\u0629 \u0623\u0648 \u0627\u0644\u062c\u0647\u0627\u0632 \u0623\u0648 \u0627\u0644\u0641\u0631\u062f \u0627\u0644\u0630\u064a \u0633\u062c\u0644 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0648\u0648\u0642\u0639 \u0639\u0644\u0649 \u0634\u0647\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u062a\u064a \u062a\u0635\u0627\u062f\u0642 \u0639\u0644\u0649 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0641\u064a \u0627\u0644\u0645\u0644\u0641.", "credit_explanation": "\u0647\u0630\u0647 \u0647\u064a \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u064a \u0627\u062e\u062a\u0627\u0631 \u0645\u0646\u062a\u062c \u0647\u0630\u0647 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647\u0627.", "capture_info_explanation": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0645\u0623\u062e\u0648\u0630\u0629 \u0645\u0646 \u0627\u0644\u0643\u0627\u0645\u064a\u0631\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u0629 \u0644\u0627\u0644\u062a\u0642\u0627\u0637 \u0627\u0644\u0635\u0648\u0631\u0629. \u064a\u0645\u0643\u0646 \u062a\u062d\u0631\u064a\u0631 \u0647\u0630\u0647 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0645\u0646 \u0642\u0628\u0644 \u0627\u0644\u0645\u0646\u062a\u062c.", "process_explanation": "\u062a\u0645 \u062a\u0633\u062c\u064a\u0644 \u0647\u0630\u0647 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u062a\u0637\u0628\u064a\u0642 \u0623\u0648 \u0627\u0644\u062c\u0647\u0627\u0632 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0644\u0625\u0646\u062a\u0627\u062c \u0627\u0644\u0635\u0648\u0631\u0629.", "child_depth_exceeded": "\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u062a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0627\u0644\u0639\u062f\u064a\u062f \u0645\u0646 \u0627\u0644\u0645\u0643\u0648\u0646\u0627\u062a\u060c \u062a\u0639\u0630\u0631 \u0642\u0631\u0627\u0621\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629.", "submit_button": "\u0625\u0631\u0633\u0627\u0644", "button_localfile": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "image_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629", "placeholder": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "geo_maps": "\u0627\u0641\u062a\u062d \u0641\u064a \u062e\u0631\u0627\u0626\u0637 \u062c\u0648\u062c\u0644"}
\ No newline at end of file
diff --git a/public/locales/ar/components/NavItems/tools/Deepfake.json b/public/locales/ar/components/NavItems/tools/Deepfake.json
index dccbfe81c..af670be03 100644
--- a/public/locales/ar/components/NavItems/tools/Deepfake.json
+++ b/public/locales/ar/components/NavItems/tools/Deepfake.json
@@ -1 +1 @@
-{"deepfake_label": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637", "deepfake_name": "\u062a\u0632\u0648\u064a\u0631 \u0639\u0645\u064a\u0642", "deepfake_placeholder": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "deepfake_support": "\u0645\u062a\u0635\u0641\u062d\u0643 \u0627\u0644\u062d\u0627\u0644\u064a \u0644\u0627 \u064a\u062f\u0639\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_clips": "\u0645\u0642\u0627\u0637\u0639 \u0641\u064a\u062f\u064a\u0648", "deepfake_select": "\u062d\u062f\u062f \u0644\u0642\u0637\u0629 \u0644\u0631\u0624\u064a\u0629 \u0646\u062a\u0627\u0626\u062c \u0627\u0644\u062a\u062d\u0644\u064a\u0644 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0642\u0637\u0639", "deepfake_clip": "\u0645\u0642\u0637\u0639 \u0645\u062d\u062f\u062f", "deepfake_faces": "\u0627\u0644\u0648\u062c\u0648\u0647 \u0627\u0644\u0645\u0639\u0631\u0641\u0629", "deepfake_video": "\u062a\u0645 \u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_results": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0645\u062d\u062f\u062f", "deepfake_error_400": "\u062e\u0637\u0623: \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0647 \u064a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062c\u0645\u0647\u0648\u0631", "deepfake_error_500": "\u062e\u0637\u0623 \u062f\u0627\u062e\u0644\u064a \u0641\u064a \u0627\u0644\u062e\u062f\u0645\u0629", "deepfake_error_413": "\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064a\u0631 \u062c\u062f\u064b\u0627", "deepfake_error_422": "\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064a\u0631 \u062c\u062f\u064b\u0627", "deepfake_image_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629", "deepfake_video_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_title_what": "\u0645\u0627 \u0647\u064a \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0635\u063a\u0631\u0629 (\u0627\u0644\u063a\u0644\u0627\u0641)", "deepfake_filters_explanation_image": "\u0634\u0631\u062d \u0627\u0644\u0635\u0648\u0631\u0629", "deepfake_filters_explanation_video": "\u0634\u0631\u062d \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_image_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "deepfake_image_faceswap_name": "\u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0647", "deepfake_image_faceswap_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0648\u062c\u0647 \u0627\u0644\u0634\u062e\u0635 \u0642\u062f \u062a\u0645 \u0627\u0633\u062a\u0628\u062f\u0627\u0644\u0647 \u0641\u064a \u0627\u0644\u0635\u0648\u0631\u0629.", "deepfake_image_gan_name": "GAN", "deepfake_image_gan_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0629 \u0627\u0644\u062e\u0635\u0648\u0645\u0629 \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a\u0629 (GAN).", "deepfake_image_diffusion_name": " \u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646", "deepfake_image_diffusion_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0634\u0628\u0643\u0629 \u0639\u0635\u0628\u064a\u0629 \u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631.", "deepfake_image_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641 \u062a\u0645", "deepfake_image_detection_alert_2": "\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "deepfake_video_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "deepfake_video_videoreport_name": "Mever Deepfake \u0643\u0627\u0634\u0641 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_video_videoreport_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0642\u062f \u062a\u0645 \u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0648\u062c\u0647 \u0627\u0644\u0634\u062e\u0635 \u0641\u064a \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_video_ftcn_name": "\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0644\u062a\u0648\u0627\u0621 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644", "deepfake_video_ftcn_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0627\u0646\u062d\u0631\u0627\u0641\u0627\u062a \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0630\u0627\u062a \u0627\u0644\u0648\u062c\u0648\u0647.", "deepfake_video_facereenact_name": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0645\u062b\u064a\u0644 \u0627\u0644\u0648\u062c\u0647", "deepfake_video_facereenact_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0648\u062c\u0648\u0647 \u0627\u0644\u0645\u0648\u062c\u0648\u062f\u0629 \u0641\u064a \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0642\u062f \u062a\u0645 \u062a\u0631\u0643\u064a\u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0627\u0644\u0646\u0642\u0644 \u0645\u0646 \u0634\u0643\u0644 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0635\u062f\u0631 \u0625\u0644\u0649 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0633\u062a\u0647\u062f\u0641 \u0645\u0639 \u0627\u0644\u062d\u0641\u0627\u0638 \u0639\u0644\u0649 \u0645\u0638\u0647\u0631 \u0648\u0647\u0648\u064a\u0629 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0633\u062a\u0647\u062f\u0641.", "deepfake_video_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641", "deepfake_video_detection_alert_2": "\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "button_remove": "\u0625\u0632\u0627\u0644\u0629", "deepfake_no_face_detection": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0648\u062c\u0647 \u0645\u0643\u062a\u0634\u0641", "button_localfile": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "submit_button": "\u0625\u0631\u0633\u0627\u0644", "gauge_detection": "\u0627\u0644\u0643\u0634\u0641", "gauge_no_detection": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0643\u0634\u0641", "gauge_additional_results": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641", "gauge_additional_results_hide": "\u0625\u062e\u0641\u0627\u0621 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641", "deepfake_image_rating": "\u0627\u0644\u0634\u0631\u062d: \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629 Faceswap \u0641\u064a \u0625\u0636\u0627\u0641\u0629 InVID-WeVerify \u062a\u062c\u062f :", "deepfake_image_rating_4": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627\u064b \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0648\u0647", "deepfake_image_rating_3": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0648\u0647", "deepfake_image_rating_2": "\u0623\u062f\u0644\u0629 \u0645\u062a\u0648\u0633\u0637\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u062d\u0627\u0633\u0645\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0643\u0648\u0646 \u0642\u062f \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0648\u0647. \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0627\u0643\u062a\u0634\u0627\u0641 \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0635\u0648\u0631\u0629.", "deepfake_image_rating_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u062d\u0627\u0633\u0645\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0643\u0648\u0646 \u0642\u062f \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0648\u0647. \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0627\u0643\u062a\u0634\u0627\u0641 \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0635\u0648\u0631\u0629.", "deepfake_video_rating": "\u0627\u0644\u0634\u0631\u062d: \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0627\u062a \u0625\u0636\u0627\u0641\u0629 InVID-WeVerify \u062a\u062c\u062f:", "deepfake_video_rating_4": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627\u064b \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0648\u062c\u0648\u0647 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a.", "deepfake_video_rating_3": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0648\u062c\u0648\u0647 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a.", "deepfake_video_rating_2": "\u0647\u0646\u0627\u0643 \u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u062d\u0627\u0633\u0645\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0642\u062f \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0648\u062c\u0648\u0647 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0627\u0643\u062a\u0634\u0627\u0641 \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_video_rating_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u062d\u0627\u0633\u0645\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0642\u062f \u064a\u062d\u062a\u0648\u064a \u0639\u0644\u0649 \u0648\u062c\u0648\u0647 \u062a\u0645 \u0627\u0644\u062a\u0644\u0627\u0639\u0628 \u0628\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a. \u0639\u062f\u0645 \u0648\u062c\u0648\u062f \u0627\u0643\u062a\u0634\u0627\u0641 \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u062a\u062d\u0631\u064a\u0631 \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_button_copy_text_1": "\u0646\u0633\u062e \u0627\u0644\u0646\u0635", "deepfake_button_copy_text_2": "\u062a\u0645 \u0646\u0633\u062e \u0627\u0644\u0646\u0635!", "gauge_alert_label_4": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u064b\u0627", "gauge_alert_label_3": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629", "gauge_alert_label_2": "\u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_alert_label_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_probability_text": "\u0627\u062d\u062a\u0645\u0627\u0644\u064a\u0629:", "gauge_generic_detection_text": "", "gauge_scale_explanation_link": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "gauge_scale_modal_explanation_title": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "gauge_scale_modal_explanation_rating_1": "<50 % - \u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_scale_modal_explanation_rating_2": "\u226550 % - \u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_scale_modal_explanation_rating_3": "\u226570 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u226570 % - Starke Beweise", "gauge_scale_modal_explanation_rating_4": "\u226590 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627\u064b", "gauge_download_gauge_button": "\u062a\u062d\u0645\u064a\u0644 \u0645\u062e\u0637\u0637 \u0627\u0644\u0642\u064a\u0627\u0633 \u0643\u0645\u0644\u0641 jpeg"}
\ No newline at end of file
+{"deepfake_label": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637", "deepfake_name": "\u062a\u0632\u0648\u064a\u0631 \u0639\u0645\u064a\u0642", "deepfake_placeholder": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "deepfake_support": "\u0645\u062a\u0635\u0641\u062d\u0643 \u0627\u0644\u062d\u0627\u0644\u064a \u0644\u0627 \u064a\u062f\u0639\u0645 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_clips": "\u0645\u0642\u0627\u0637\u0639 \u0641\u064a\u062f\u064a\u0648", "deepfake_select": "\u062d\u062f\u062f \u0644\u0642\u0637\u0629 \u0644\u0631\u0624\u064a\u0629 \u0646\u062a\u0627\u0626\u062c \u0627\u0644\u062a\u062d\u0644\u064a\u0644 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0642\u0637\u0639", "deepfake_clip": "\u0645\u0642\u0637\u0639 \u0645\u062d\u062f\u062f", "deepfake_faces": "\u0627\u0644\u0648\u062c\u0648\u0647 \u0627\u0644\u0645\u0639\u0631\u0641\u0629", "deepfake_video": "\u062a\u0645 \u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_results": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0645\u062d\u062f\u062f", "deepfake_error_400": "\u062e\u0637\u0623: \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0647 \u064a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0627\u0644\u0648\u0635\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062c\u0645\u0647\u0648\u0631", "deepfake_error_500": "\u062e\u0637\u0623 \u062f\u0627\u062e\u0644\u064a \u0641\u064a \u0627\u0644\u062e\u062f\u0645\u0629", "deepfake_error_413": "\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064a\u0631 \u062c\u062f\u064b\u0627", "deepfake_error_422": "\u0627\u0644\u0645\u0644\u0641 \u0643\u0628\u064a\u0631 \u062c\u062f\u064b\u0627", "deepfake_image_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629", "deepfake_video_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_title_what": "\u0645\u0627 \u0647\u064a \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0635\u063a\u0631\u0629 (\u0627\u0644\u063a\u0644\u0627\u0641)", "deepfake_filters_explanation_image": "\u0634\u0631\u062d \u0627\u0644\u0635\u0648\u0631\u0629", "deepfake_filters_explanation_video": "\u0634\u0631\u062d \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_image_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "deepfake_image_faceswap_name": "\u062a\u0628\u062f\u064a\u0644 \u0627\u0644\u0648\u062c\u0647", "deepfake_image_faceswap_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0648\u062c\u0647 \u0627\u0644\u0634\u062e\u0635 \u0642\u062f \u062a\u0645 \u0627\u0633\u062a\u0628\u062f\u0627\u0644\u0647 \u0641\u064a \u0627\u0644\u0635\u0648\u0631\u0629.", "deepfake_image_gan_name": "GAN", "deepfake_image_gan_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0629 \u0627\u0644\u062e\u0635\u0648\u0645\u0629 \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a\u0629 (GAN).", "deepfake_image_diffusion_name": " \u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646", "deepfake_image_diffusion_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0634\u0628\u0643\u0629 \u0639\u0635\u0628\u064a\u0629 \u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631.", "deepfake_image_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641 \u062a\u0645", "deepfake_image_detection_alert_2": "\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "deepfake_video_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "deepfake_video_videoreport_name": "Mever Deepfake \u0643\u0627\u0634\u0641 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "deepfake_video_videoreport_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0642\u062f \u062a\u0645 \u0627\u0633\u062a\u0628\u062f\u0627\u0644 \u0648\u062c\u0647 \u0627\u0644\u0634\u062e\u0635 \u0641\u064a \u0627\u0644\u0641\u064a\u062f\u064a\u0648.", "deepfake_video_ftcn_name": "\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0644\u062a\u0648\u0627\u0621 \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644", "deepfake_video_ftcn_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0627\u0646\u062d\u0631\u0627\u0641\u0627\u062a \u0627\u0644\u0632\u0645\u0646\u064a\u0629 \u0644\u0645\u0642\u0627\u0637\u0639 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0630\u0627\u062a \u0627\u0644\u0648\u062c\u0648\u0647.", "deepfake_video_facereenact_name": "\u0625\u0639\u0627\u062f\u0629 \u062a\u0645\u062b\u064a\u0644 \u0627\u0644\u0648\u062c\u0647", "deepfake_video_facereenact_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0648\u062c\u0648\u0647 \u0627\u0644\u0645\u0648\u062c\u0648\u062f\u0629 \u0641\u064a \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u0642\u062f \u062a\u0645 \u062a\u0631\u0643\u064a\u0628\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0627\u0644\u0646\u0642\u0644 \u0645\u0646 \u0634\u0643\u0644 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0635\u062f\u0631 \u0625\u0644\u0649 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0633\u062a\u0647\u062f\u0641 \u0645\u0639 \u0627\u0644\u062d\u0641\u0627\u0638 \u0639\u0644\u0649 \u0645\u0638\u0647\u0631 \u0648\u0647\u0648\u064a\u0629 \u0627\u0644\u0648\u062c\u0647 \u0627\u0644\u0645\u0633\u062a\u0647\u062f\u0641.", "deepfake_video_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0623\u0646 \u0647\u0630\u0627 \u0627\u0644\u0641\u064a\u062f\u064a\u0648 \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641", "deepfake_video_detection_alert_2": "\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "button_remove": "\u0625\u0632\u0627\u0644\u0629", "deepfake_no_face_detection": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0648\u062c\u0647 \u0645\u0643\u062a\u0634\u0641", "button_localfile": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "submit_button": "\u0625\u0631\u0633\u0627\u0644"}
\ No newline at end of file
diff --git a/public/locales/ar/components/NavItems/tools/SyntheticImageDetection.json b/public/locales/ar/components/NavItems/tools/SyntheticImageDetection.json
index b8fa54628..622185444 100644
--- a/public/locales/ar/components/NavItems/tools/SyntheticImageDetection.json
+++ b/public/locales/ar/components/NavItems/tools/SyntheticImageDetection.json
@@ -1 +1 @@
-{"synthetic_image_detection_label": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637", "synthetic_image_detection_name": "\u0643\u0634\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_placeholder": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "synthetic_image_detection_results": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0645\u062d\u062f\u062f", "synthetic_image_detection_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629", "synthetic_image_detection_gan_name": "GAN", "synthetic_image_detection_gan_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0629 \u0627\u0644\u062e\u0635\u0648\u0645\u0629 \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a\u0629 (GAN).", "synthetic_image_detection_diffusion_name": "\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646", "synthetic_image_detection_diffusion_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0634\u0628\u0643\u0629 \u0639\u0635\u0628\u064a\u0629 \u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631.", "synthetic_image_detection_progan_name": "ProGAN", "synthetic_image_detection_progan_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0634\u0643\u0644 \u0643\u0627\u0645\u0644 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c ProGAN \u0623 \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0637\u0628\u0642\u0629 \u0628\u062f\u0627\u064a\u0629 \u0644\u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0628\u0642\u0627\u064a\u0627 \u0648\u0628\u062f\u0648\u0646 \u062a\u062e\u0641\u064a\u0636 \u0641\u064a \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649.", "synthetic_image_detection_adm_name": " ADM", "synthetic_image_detection_adm_description": " .\u060c \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0637\u0628\u0642\u0629 \u0628\u062f\u0627\u064a\u0629 \u0644\u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0628\u0642\u0627\u064a\u0627 \u0648\u0628\u062f\u0648\u0646 \u062a\u062e\u0641\u064a\u0636 \u0641\u064a \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649. \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0644\u064a\u0633 \u0645\u0639\u062a\u0645\u062f\u064b\u0627 \u0645\u0633\u0628\u0642\u064b\u0627 \u0648\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u062a\u0639\u0632\u064a\u0632\u0627\u062a \u0642\u0648\u064a\u0629 \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0627\u0644\u062a\u0634\u0648\u064a\u0634 \u0648\u0627\u0644\u0636\u063a\u0637 \u0648\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u063a\u0627\u0648\u0633\u064a\u0629 \u0648\u0627\u0644\u062a\u062d\u0648\u0644\u0627\u062a \u0627\u0644\u0647\u0646\u062f\u0633\u064a\u0629 \u0648\u0627\u0644\u0642\u0637\u0639 \u0648\u062a\u063a\u064a\u064a\u0631\u0627\u062a \u0627\u0644\u0633\u0637\u0648\u0639 \u0648\u0627\u0644\u062a\u0628\u0627\u064a\u0646.", "synthetic_image_detection_progan_rine_mever_name": "ProGAN RINE", "synthetic_image_detection_progan_rine_mever_description": "\u064a\u0643\u062a\u0634\u0641 \u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644. \u0625\u0646\u0647 \u0645\u062a\u062e\u0635\u0635 \u0641\u064a \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0627\u062a \u0627\u0644\u062e\u0635\u0645 \u0627\u0644\u0627\u0646\u062a\u0627\u062c\u064a\u0629 (GAN). \u062a\u0633\u062a\u062e\u0631\u062c \u062a\u0642\u0646\u064a\u0629 CLIP (\u0627\u0644\u062a\u062f\u0631\u064a\u0628 \u0627\u0644\u0645\u0633\u0628\u0642 \u0628\u0627\u0644\u0644\u063a\u0629 \u0648\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062a\u0628\u0627\u064a\u0646\u064a) \u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631\u0629.", "synthetic_image_detection_ldm_rine_mever_name": "LDM RINE", "synthetic_image_detection_ldm_rine_mever_description": "\u064a\u0643\u062a\u0634\u0641 \u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644. \u0625\u0646\u0647 \u0645\u062a\u062e\u0635\u0635 \u0641\u064a \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646\u0629 (LDM)\u060c \u0645\u0639 \u0639\u0631\u0636 \u0623\u062f\u0627\u0621 \u0643\u0634\u0641 \u0642\u0648\u064a \u0639\u0628\u0631 \u0639\u062f\u0629 \u0637\u0631\u0642 \u062a\u0648\u0644\u064a\u062f\u064a\u0629 \u0623\u062e\u0631\u0649. \u062a\u0633\u062a\u062e\u0631\u062c \u062a\u0642\u0646\u064a\u0629 CLIP (\u0627\u0644\u062a\u062f\u0631\u064a\u0628 \u0627\u0644\u0645\u0633\u0628\u0642 \u0628\u0627\u0644\u0644\u063a\u0629 \u0648\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062a\u0628\u0627\u064a\u0646\u064a) \u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631\u0629.", "synthetic_image_detection_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "synthetic_image_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641 \u062a\u0645", "synthetic_image_detection_alert_2": " \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "synthetic_image_detection_error_400": "\u062e\u0637\u0623: \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0647 \u064a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0635\u0648\u0631\u0629 \u0645\u062a\u0627\u062d\u0629 \u0639\u0644\u0646\u064a\u0627\u064b \u0628\u0623\u0628\u0639\u0627\u062f \u062a\u062a\u0631\u0627\u0648\u062d \u0628\u064a\u0646 128x128 \u0648 2000x2000 \u0628\u0643\u0633\u0644.", "gauge_detection_error_generic": "\u062d\u062f\u062b \u062e\u0637\u0623. \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0623\u0648 \u062c\u0631\u0628 \u0635\u0648\u0631\u0629 \u0645\u062e\u062a\u0644\u0641\u0629.", "gauge_detection_algorithms_errors": "\u0623\u062d\u062f \u0623\u0648 \u0623\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0627\u062a \u0642\u062f \u0639\u0627\u062f\u062a \u0628\u0623\u062e\u0637\u0627\u0621. \u0642\u062f \u062a\u0643\u0648\u0646 \u0627\u0644\u062a\u062d\u0644\u064a\u0644\u0627\u062a \u063a\u064a\u0631 \u0645\u0643\u062a\u0645\u0644\u0629. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0647\u0627 \u0623\u0628\u0639\u0627\u062f \u0628\u064a\u0646 128x128 \u0648 2000x2000 \u0628\u0643\u0633\u0644.", "synthetic_image_detection_not_found": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0643\u0634\u0641", "submit_button": "\u0625\u0631\u0633\u0627\u0644", "button_localfile": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "gauge_detection": "\u0627\u0644\u0643\u0634\u0641", "gauge_no_detection": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0643\u0634\u0641", "gauge_additional_results": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641", "gauge_additional_results_hide": "\u0625\u062e\u0641\u0627\u0621 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641", "synthetic_image_detection_rating": "\u062a\u0648\u0636\u064a\u062d: \u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0643\u0627\u0634\u0641 veraAI \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u0627\u0644\u0645\u0633\u0627\u0639\u062f InVID-WeVerify\u062a\u0641\u0633\u064a:", "synthetic_image_detection_rating_4": "\u062f\u0644\u0627\u0626\u0644 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_rating_3": "\u062f\u0644\u0627\u0626\u0644 \u0642\u0648\u064a\u0629 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_rating_2": "\u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646\u0647\u0627 \u063a\u064a\u0631 \u0642\u0627\u0637\u0639\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629. \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u0627\u0644\u0643\u0634\u0641 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0645 \u062a\u0643\u0646 \u0645\u062d\u0631\u0641\u0629 \u0628\u0639\u062f \u0630\u0644\u0643.", "synthetic_image_detection_rating_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0642\u0627\u0637\u0639\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629. \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u0627\u0644\u0643\u0634\u0641 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0645 \u062a\u0643\u0646 \u0645\u062d\u0631\u0641\u0629 \u0628\u0639\u062f \u0630\u0644\u0643.", "synthetic_image_detection_button_copy_text_1": "\u0646\u0633\u062e \u0627\u0644\u0646\u0635", "synthetic_image_detection_button_copy_text_2": "\u062a\u0645 \u0646\u0633\u062e \u0627\u0644\u0646\u0635!", "gauge_alert_label_4": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u064b\u0627", "gauge_alert_label_3": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629", "gauge_alert_label_2": "\u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_alert_label_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_probability_text": "\u0627\u062d\u062a\u0645\u0627\u0644\u064a\u0629:", "gauge_generic_detection_text": "\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0635\u0648\u0631\u0629 \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a", "gauge_scale_explanation_link": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "gauge_scale_modal_explanation_title": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "gauge_scale_modal_explanation_rating_1": "<50 % - \u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_scale_modal_explanation_rating_2": "\u226550 % - \u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "gauge_scale_modal_explanation_rating_3": "\u226570 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 (\u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a)", "gauge_scale_modal_explanation_rating_4": "\u226590 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627\u064b (\u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a)", "gauge_download_gauge_button": "\u062a\u062d\u0645\u064a\u0644 \u0645\u062e\u0637\u0637 \u0627\u0644\u0642\u064a\u0627\u0633 \u0643\u0645\u0644\u0641 jpeg"}
\ No newline at end of file
+{"synthetic_image_detection_label": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0648\u0633\u0627\u0626\u0637", "synthetic_image_detection_name": "\u0643\u0634\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_placeholder": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "synthetic_image_detection_image_type": "\u0646\u0648\u0639 \u0627\u0644\u0635\u0648\u0631\u0629", "synthetic_image_detection_results": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0645\u0642\u0637\u0639 \u0627\u0644\u0645\u062d\u062f\u062f", "synthetic_image_detection_link": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629", "synthetic_image_detection_gan_name": "GAN", "synthetic_image_detection_gan_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0629 \u0627\u0644\u062e\u0635\u0648\u0645\u0629 \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a\u0629 (GAN).", "synthetic_image_detection_diffusion_name": "\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646", "synthetic_image_detection_diffusion_description": "\u062a\u0647\u062f\u0641 \u0647\u0630\u0647 \u0627\u0644\u0637\u0631\u064a\u0642\u0629 \u0625\u0644\u0649 \u0627\u0643\u062a\u0634\u0627\u0641 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646\u062a \u0627\u0644\u0635\u0648\u0631\u0629 \u0642\u062f \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0645\u0646 \u062e\u0644\u0627\u0644 \u0634\u0628\u0643\u0629 \u0639\u0635\u0628\u064a\u0629 \u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631.", "synthetic_image_detection_progan_name": "ProGAN", "synthetic_image_detection_progan_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0634\u0643\u0644 \u0643\u0627\u0645\u0644 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c ProGAN \u0623 \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0637\u0628\u0642\u0629 \u0628\u062f\u0627\u064a\u0629 \u0644\u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0628\u0642\u0627\u064a\u0627 \u0648\u0628\u062f\u0648\u0646 \u062a\u062e\u0641\u064a\u0636 \u0641\u064a \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649.", "synthetic_image_detection_adm_name": " ADM", "synthetic_image_detection_adm_description": " .\u060c \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0637\u0628\u0642\u0629 \u0628\u062f\u0627\u064a\u0629 \u0644\u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0628\u0642\u0627\u064a\u0627 \u0648\u0628\u062f\u0648\u0646 \u062a\u062e\u0641\u064a\u0636 \u0641\u064a \u0627\u0644\u0637\u0628\u0642\u0629 \u0627\u0644\u0623\u0648\u0644\u0649. \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0644\u064a\u0633 \u0645\u0639\u062a\u0645\u062f\u064b\u0627 \u0645\u0633\u0628\u0642\u064b\u0627 \u0648\u064a\u062a\u0645 \u0625\u062c\u0631\u0627\u0621 \u062a\u0639\u0632\u064a\u0632\u0627\u062a \u0642\u0648\u064a\u0629 \u0628\u0645\u0627 \u0641\u064a \u0630\u0644\u0643 \u0627\u0644\u062a\u0634\u0648\u064a\u0634 \u0648\u0627\u0644\u0636\u063a\u0637 \u0648\u0625\u0636\u0627\u0641\u0629 \u0627\u0644\u0636\u0648\u0636\u0627\u0621 \u0627\u0644\u063a\u0627\u0648\u0633\u064a\u0629 \u0648\u0627\u0644\u062a\u062d\u0648\u0644\u0627\u062a \u0627\u0644\u0647\u0646\u062f\u0633\u064a\u0629 \u0648\u0627\u0644\u0642\u0637\u0639 \u0648\u062a\u063a\u064a\u064a\u0631\u0627\u062a \u0627\u0644\u0633\u0637\u0648\u0639 \u0648\u0627\u0644\u062a\u0628\u0627\u064a\u0646.", "synthetic_image_detection_progan_rine_mever_name": "ProGAN RINE", "synthetic_image_detection_progan_rine_mever_description": "\u064a\u0643\u062a\u0634\u0641 \u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644. \u0625\u0646\u0647 \u0645\u062a\u062e\u0635\u0635 \u0641\u064a \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0634\u0628\u0643\u0627\u062a \u0627\u0644\u062e\u0635\u0645 \u0627\u0644\u0627\u0646\u062a\u0627\u062c\u064a\u0629 (GAN). \u062a\u0633\u062a\u062e\u0631\u062c \u062a\u0642\u0646\u064a\u0629 CLIP (\u0627\u0644\u062a\u062f\u0631\u064a\u0628 \u0627\u0644\u0645\u0633\u0628\u0642 \u0628\u0627\u0644\u0644\u063a\u0629 \u0648\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062a\u0628\u0627\u064a\u0646\u064a) \u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631\u0629.", "synthetic_image_detection_ldm_rine_mever_name": "LDM RINE", "synthetic_image_detection_ldm_rine_mever_description": "\u064a\u0643\u062a\u0634\u0641 \u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u0628\u0627\u0644\u0643\u0627\u0645\u0644. \u0625\u0646\u0647 \u0645\u062a\u062e\u0635\u0635 \u0641\u064a \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646\u0629 (LDM)\u060c \u0645\u0639 \u0639\u0631\u0636 \u0623\u062f\u0627\u0621 \u0643\u0634\u0641 \u0642\u0648\u064a \u0639\u0628\u0631 \u0639\u062f\u0629 \u0637\u0631\u0642 \u062a\u0648\u0644\u064a\u062f\u064a\u0629 \u0623\u062e\u0631\u0649. \u062a\u0633\u062a\u062e\u0631\u062c \u062a\u0642\u0646\u064a\u0629 CLIP (\u0627\u0644\u062a\u062f\u0631\u064a\u0628 \u0627\u0644\u0645\u0633\u0628\u0642 \u0628\u0627\u0644\u0644\u063a\u0629 \u0648\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u062a\u0628\u0627\u064a\u0646\u064a) \u0627\u0644\u0633\u0645\u0627\u062a \u0627\u0644\u0631\u0626\u064a\u0633\u064a\u0629 \u0645\u0646 \u0627\u0644\u0635\u0648\u0631\u0629.", "synthetic_image_detection_title": "\u0646\u062a\u0627\u0626\u062c \u0627\u0644\u0643\u0634\u0641", "synthetic_image_detection_ldm-webp_r50_grip_name": "LDM WebP r50", "synthetic_image_detection_ldm-webp_r50_grip_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u062a\u0645\u0627\u0645\u064b\u0627 \u0628\u062a\u0646\u0633\u064a\u0642 webp \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646 \u0623\u0648 \u0627\u0644\u0628\u0646\u0649 \u0627\u0644\u0645\u0645\u0627\u062b\u0644\u0629. \u064a\u0639\u062f \u0647\u064a\u0643\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0645\u062a\u063a\u064a\u0631\u064b\u0627 \u0645\u0646 ResNet-50\u060c \u062a\u0645 \u062a\u062f\u0631\u064a\u0628\u0647 \u0644\u0627\u0644\u062a\u0642\u0627\u0637 \u0627\u0644\u0642\u0637\u0639 \u0627\u0644\u0623\u062b\u0631\u064a\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u0627\u0644\u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u062a\u064a \u064a\u0642\u062f\u0645\u0647\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a.", "synthetic_image_detection_gigagan-webp_r50_grip_name": "GigaGAN WebP r50", "synthetic_image_detection_gigagan-webp_r50_grip_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u062a\u0645\u0627\u0645\u064b\u0627 \u0628\u062a\u0646\u0633\u064a\u0642 webp \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 GigaGAN \u0623\u0648 \u0627\u0644\u0628\u0646\u0649 \u0627\u0644\u0645\u0645\u0627\u062b\u0644\u0629. \u064a\u0639\u062f \u0647\u064a\u0643\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0645\u062a\u063a\u064a\u0631\u064b\u0627 \u0645\u0646 ResNet-50\u060c \u062a\u0645 \u062a\u062f\u0631\u064a\u0628\u0647 \u0644\u0627\u0644\u062a\u0642\u0627\u0637 \u0627\u0644\u0642\u0637\u0639 \u0627\u0644\u0623\u062b\u0631\u064a\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u0627\u0644\u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u062a\u064a \u064a\u0642\u062f\u0645\u0647\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a.", "synthetic_image_detection_progan-webp_r50_grip_name": "ProGAN WebP r50", "synthetic_image_detection_progan-webp_r50_grip_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u062a\u0645\u0627\u0645\u064b\u0627 \u0628\u062a\u0646\u0633\u064a\u0642 webp \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 ProGAN \u0623\u0648 \u0627\u0644\u0628\u0646\u0649 \u0627\u0644\u0645\u0645\u0627\u062b\u0644\u0629. \u064a\u0639\u062f \u0647\u064a\u0643\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0645\u062a\u063a\u064a\u0631\u064b\u0627 \u0645\u0646 ResNet-50\u060c \u062a\u0645 \u062a\u062f\u0631\u064a\u0628\u0647 \u0644\u0627\u0644\u062a\u0642\u0627\u0637 \u0627\u0644\u0642\u0637\u0639 \u0627\u0644\u0623\u062b\u0631\u064a\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u0627\u0644\u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u062a\u064a \u064a\u0642\u062f\u0645\u0647\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a.", "synthetic_image_detection_ldm_r50_mever_name": "LDM r50", "synthetic_image_detection_ldm_r50_mever_description": "\u064a\u0645\u0643\u0646 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0643\u062a\u0634\u0627\u0641 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629 \u062a\u0645\u0627\u0645\u064b\u0627 \u0627\u0644\u062a\u064a \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0646\u0645\u0627\u0630\u062c \u0627\u0644\u0627\u0646\u062a\u0634\u0627\u0631 \u0627\u0644\u0643\u0627\u0645\u0646 \u0623\u0648 \u0627\u0644\u0628\u0646\u0649 \u0627\u0644\u0645\u0645\u0627\u062b\u0644\u0629. \u064a\u0639\u062f \u0647\u064a\u0643\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0645\u062a\u063a\u064a\u0631\u064b\u0627 \u0645\u0646 ResNet-50\u060c \u062a\u0645 \u062a\u062f\u0631\u064a\u0628\u0647 \u0644\u0627\u0644\u062a\u0642\u0627\u0637 \u0627\u0644\u0642\u0637\u0639 \u0627\u0644\u0623\u062b\u0631\u064a\u0629 \u0645\u0646\u062e\u0641\u0636\u0629 \u0627\u0644\u0645\u0633\u062a\u0648\u0649 \u0627\u0644\u062a\u064a \u064a\u0642\u062f\u0645\u0647\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062a\u0648\u0644\u064a\u062f\u064a.", "synthetic_image_detection_alert": " \u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0627\u0633\u062a\u062e\u062f\u0627\u0645 \u0645\u0644\u0641 \u062a\u0645", "synthetic_image_detection_alert_2": " \u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629", "synthetic_image_detection_error_400": "\u062e\u0637\u0623: \u0631\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631\u0629 \u063a\u064a\u0631 \u0635\u0627\u0644\u062d. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0647 \u064a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0635\u0648\u0631\u0629 \u0645\u062a\u0627\u062d\u0629 \u0639\u0644\u0646\u064a\u0627\u064b \u0628\u0623\u0628\u0639\u0627\u062f \u062a\u062a\u0631\u0627\u0648\u062d \u0628\u064a\u0646 128x128 \u0648 2000x2000 \u0628\u0643\u0633\u0644.", "synthetic_image_detection_error_generic": "\u062d\u062f\u062b \u062e\u0637\u0623. \u064a\u0631\u062c\u0649 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649 \u0623\u0648 \u062c\u0631\u0628 \u0635\u0648\u0631\u0629 \u0645\u062e\u062a\u0644\u0641\u0629.", "synthetic_image_detection_algorithms_errors": "\u0623\u062d\u062f \u0623\u0648 \u0623\u0643\u062b\u0631 \u0645\u0646 \u0627\u0644\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0627\u062a \u0642\u062f \u0639\u0627\u062f\u062a \u0628\u0623\u062e\u0637\u0627\u0621. \u0642\u062f \u062a\u0643\u0648\u0646 \u0627\u0644\u062a\u062d\u0644\u064a\u0644\u0627\u062a \u063a\u064a\u0631 \u0645\u0643\u062a\u0645\u0644\u0629. \u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0647\u0627 \u0623\u0628\u0639\u0627\u062f \u0628\u064a\u0646 128x128 \u0648 2000x2000 \u0628\u0643\u0633\u0644.", "synthetic_image_detection_not_found": "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0643\u0634\u0641", "submit_button": "\u0625\u0631\u0633\u0627\u0644", "button_localfile": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "synthetic_image_detection_gauge_detection": "\u0627\u0644\u0643\u0634\u0641", "synthetic_image_detection_gauge_no_detection": "\u0644\u0627 \u064a\u0648\u062c\u062f \u0643\u0634\u0641", "synthetic_image_detection_additional_results": "\u0639\u0631\u0636 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0642\u062f\u0645\u0629", "synthetic_image_detection_additional_results_hide": "\u0625\u062e\u0641\u0627\u0621 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0642\u062f\u0645\u0629", "synthetic_image_detection_ndd_additional_results": "\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0635\u0648\u0631 \u0645\u0645\u0627\u062b\u0644\u0629", "synthetic_image_detection_ndd_additional_results_hide": "\u0625\u062e\u0641\u0627\u0621 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0635\u0648\u0631 \u0645\u0645\u0627\u062b\u0644\u0629", "synthetic_image_detection_rating": "\u062a\u0648\u0636\u064a\u062d: \u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0643\u0627\u0634\u0641 veraAI \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u0627\u0644\u0645\u0633\u0627\u0639\u062f InVID-WeVerify\u062a\u0641\u0633\u064a:", "synthetic_image_detection_rating_4": "\u062f\u0644\u0627\u0626\u0644 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_rating_3": "\u062f\u0644\u0627\u0626\u0644 \u0642\u0648\u064a\u0629 \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629", "synthetic_image_detection_rating_2": "\u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646\u0647\u0627 \u063a\u064a\u0631 \u0642\u0627\u0637\u0639\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629. \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u0627\u0644\u0643\u0634\u0641 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0645 \u062a\u0643\u0646 \u0645\u062d\u0631\u0641\u0629 \u0628\u0639\u062f \u0630\u0644\u0643.", "synthetic_image_detection_rating_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0642\u0627\u0637\u0639\u0629) \u062a\u0634\u064a\u0631 \u0625\u0644\u0649 \u0623\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0648\u0631\u0629 \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0643\u0648\u0646 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629. \u0644\u0627 \u064a\u0636\u0645\u0646 \u0639\u062f\u0645 \u0627\u0644\u0643\u0634\u0641 \u0623\u0646 \u0627\u0644\u0635\u0648\u0631\u0629 \u0644\u0645 \u062a\u0643\u0646 \u0645\u062d\u0631\u0641\u0629 \u0628\u0639\u062f \u0630\u0644\u0643.", "synthetic_image_detection_button_copy_text_1": "\u0646\u0633\u062e \u0627\u0644\u0646\u0635", "synthetic_image_detection_button_copy_text_2": "\u062a\u0645 \u0646\u0633\u062e \u0627\u0644\u0646\u0635!", "synthetic_image_detection_alert_label_4": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u064b\u0627", "synthetic_image_detection_alert_label_3": "\u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629", "synthetic_image_detection_alert_label_2": "\u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "synthetic_image_detection_alert_label_1": "\u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "synthetic_image_detection_probability_text": "\u0627\u062d\u062a\u0645\u0627\u0644\u064a\u0629:", "synthetic_image_detection_generic_detection_text": "\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0635\u0648\u0631\u0629 \u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a", "synthetic_image_detection_scale_explanation_link": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "synthetic_image_detection_scale_modal_explanation_title": "\u0645\u0627\u0630\u0627 \u062a\u0639\u0646\u064a \u0623\u0644\u0648\u0627\u0646 \u0627\u0644\u0639\u062f\u0627\u062f\u061f", "synthetic_image_detection_scale_modal_explanation_rating_1": "<50 % - \u0623\u062f\u0644\u0629 \u0636\u0639\u064a\u0641\u0629 (\u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "synthetic_image_detection_scale_modal_explanation_rating_2": "\u226550 % - \u0623\u062f\u0644\u0629 \u0645\u0639\u062a\u062f\u0644\u0629 (\u0645\u0634\u0628\u0648\u0647\u0629 \u0648\u0644\u0643\u0646 \u063a\u064a\u0631 \u0646\u0647\u0627\u0626\u064a\u0629)", "synthetic_image_detection_scale_modal_explanation_rating_3": "\u226570 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 (\u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a)", "synthetic_image_detection_scale_modal_explanation_rating_4": "\u226590 % - \u0623\u062f\u0644\u0629 \u0642\u0648\u064a\u0629 \u062c\u062f\u0627\u064b (\u062a\u0645 \u0625\u0646\u0634\u0627\u0624\u0647\u0627 \u0628\u0648\u0627\u0633\u0637\u0629 \u0627\u0644\u0630\u0643\u0627\u0621 \u0627\u0644\u0627\u0635\u0637\u0646\u0627\u0639\u064a)", "synthetic_image_detection_download_gauge_button": "\u062a\u062d\u0645\u064a\u0644 \u0645\u062e\u0637\u0637 \u0627\u0644\u0642\u064a\u0627\u0633 \u0643\u0645\u0644\u0641 jpeg", "synthetic_image_detection_ndd_info": "\u062a\u0645 \u0627\u0643\u062a\u0634\u0627\u0641 \u0635\u0648\u0631 \u0645\u0645\u0627\u062b\u0644\u0629 \u0639\u0644\u0649 \u0623\u0646\u0647\u0627 \u0627\u0635\u0637\u0646\u0627\u0639\u064a\u0629. \u0627\u0646\u0638\u0631 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0643\u0634\u0641 \u0639\u0646 \u0627\u0644\u0635\u0648\u0631 \u0627\u0644\u0645\u0634\u0627\u0628\u0647\u0629 \u0623\u062f\u0646\u0627\u0647.", "synthetic_image_detection_ndd_table_header_1": "\u0645\u0639\u0631\u0641", "synthetic_image_detection_ndd_table_header_2": "\u0635\u0648\u0631\u0629", "synthetic_image_detection_ndd_table_header_3": "\u0627\u0644\u062e\u0648\u0627\u0631\u0632\u0645\u064a\u0629 #", "synthetic_image_detection_ndd_table_header_4": "\u0627\u0644\u0646\u062a\u064a\u062c\u0629 #", "synthetic_image_detection_ndd_table_header_5": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0623\u0631\u0634\u064a\u0641", "synthetic_image_detection_ndd_table_header_6": "\u0631\u0648\u0627\u0628\u0637 \u0627\u0644\u0635\u0648\u0631", "synthetic_image_detection_ndd_table_header_7": "\u0641\u062a\u062d \u0627\u0644\u062a\u062d\u0644\u064a\u0644"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavBar.json b/public/locales/en/components/NavBar.json
index b86681b32..bb09b17a0 100644
--- a/public/locales/en/components/NavBar.json
+++ b/public/locales/en/components/NavBar.json
@@ -1 +1 @@
-{"navbar_tools": "Tools", "navbar_about": "About", "navbar_tuto": "Tutorial", "navbar_twitter_sna": "Twitter SNA.", "navbar_classroom": "Classroom", "navbar_quiz": "Demo", "navbar_analysis": "Video analysis", "navbar_keyframes": "Keyframes", "navbar_thumbnails": "Thumbnails", "navbar_twitter": "X. search", "navbar_magnifier": "Magnifier", "navbar_metadata_video": "Metadata", "navbar_metadata_image": "Metadata", "navbar_rights": "Video rights", "navbar_forensic": "Forensic", "navbar_factCheck": "Fact Check", "navbar_covidsearch": "Factcheck search", "navbar_assistant": "Assistant", "navbar_xnetwork": "Xnetwork", "navbar_ocr": "OCR", "navbar_gif": "CheckGif", "navbar_archiving": "Archiving", "cookies_decline": "Decline", "cookies_accept": "Accept", "cookies_message": "We use your browser local storage for your preferences (language, features) to make it work properly. We do not use any cookies : therefore no personal data will be saved and your browsing data will not be tracked. Nevertheless, we need your consent to use Matomo for the sole purpose of understanding which tools are being used and how, in order to enhance the verification plugin. If you do not consent, Matomo will be disabled as well as your preferences when you close your session.", "navbar_analysis_image": "Image Analysis", "navbar_analysis_video": "Video Analysis", "navbar_twitter_crowdtangle": "CSV Analysis", "navbar_synthetic_image_detection": "Synthetic image", "navbar_loccus": "Loccus", "navbar_semantic_search": "Fact Check Semantic Search", "navbar_deepfake_image": "Deepfake", "navbar_geolocation": "Geolocalizer", "navbar_verification": "Verification", "navbar_verification_short": "Verifi...", "navbar_learning": "Learning", "navbar_learning_short": "Learning", "navbar_more": "More", "navbar_more_short": "More", "navbar_deepfake_video": "Deepfake", "navbar_category_general": "General", "navbar_category_video": "Video", "navbar_category_image": "Image", "navbar_category_audio": "Audio", "navbar_category_search": "Search", "navbar_category_data": "Data analysis", "navbar_category_other": "Other tools", "navbar_collapse": "Hide"}
\ No newline at end of file
+{"navbar_tools": "Tools", "navbar_about": "About", "navbar_tuto": "Tutorial", "navbar_twitter_sna": "Twitter SNA.", "navbar_classroom": "Classroom", "navbar_quiz": "Demo", "navbar_analysis": "Video analysis", "navbar_keyframes": "Keyframes", "navbar_thumbnails": "Thumbnails", "navbar_twitter": "X. search", "navbar_magnifier": "Magnifier", "navbar_metadata_video": "Metadata", "navbar_metadata_image": "Metadata", "navbar_rights": "Video rights", "navbar_forensic": "Forensic", "navbar_factCheck": "Fact Check", "navbar_covidsearch": "Factcheck search", "navbar_assistant": "Assistant", "navbar_xnetwork": "Xnetwork", "navbar_ocr": "OCR", "navbar_gif": "CheckGif", "navbar_archiving": "Archiving", "cookies_decline": "Decline", "cookies_accept": "Accept", "cookies_message": "We use your browser local storage for your preferences (language, features) to make it work properly. We do not use any cookies : therefore no personal data will be saved and your browsing data will not be tracked. Nevertheless, we need your consent to use Matomo for the sole purpose of understanding which tools are being used and how, in order to enhance the verification plugin. If you do not consent, Matomo will be disabled as well as your preferences when you close your session.", "navbar_analysis_image": "Image Analysis", "navbar_analysis_video": "Video Analysis", "navbar_twitter_crowdtangle": "CSV Analysis", "navbar_synthetic_image_detection": "Synthetic image", "navbar_loccus": "Loccus", "navbar_semantic_search": "Fact Check Semantic Search", "navbar_deepfake_image": "Deepfake", "navbar_geolocation": "Geolocalizer", "navbar_verification": "Verification", "navbar_verification_short": "Verifi...", "navbar_learning": "Learning", "navbar_learning_short": "Learning", "navbar_more": "More", "navbar_more_short": "More", "navbar_deepfake_video": "Deepfake", "navbar_category_general": "General", "navbar_category_video": "Video", "navbar_category_image": "Image", "navbar_category_audio": "Audio", "navbar_category_search": "Search", "navbar_category_data": "Data analysis", "navbar_category_other": "Other tools", "navbar_collapse": "Hide", "navbar_c2pa": "C2pa"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/Alltools.json b/public/locales/en/components/NavItems/tools/Alltools.json
index 1561d45bb..fc4382194 100644
--- a/public/locales/en/components/NavItems/tools/Alltools.json
+++ b/public/locales/en/components/NavItems/tools/Alltools.json
@@ -1 +1 @@
-{"navbar_tools": "Tools", "navbar_analysis_video": "Video analysis", "navbar_analysis_image": "Image analysis", "navbar_keyframes": "Keyframes", "navbar_thumbnails": "Thumbnails", "navbar_twitter": "X search", "navbar_magnifier": "Magnifier", "navbar_metadata_video": "Metadata", "navbar_metadata_image": "Metadata", "navbar_rights": "Video rights", "navbar_forensic": "Forensic", "navbar_twitter_sna": "Twitter SNA.", "navbar_ocr": "OCR", "navbar_covidsearch": "Factchecks", "navbar_xnetwork": "XNetwork", "navbar_gif": "CheckGif", "navbar_twitter_sna_description": "It performs social network analysis on Twitter (on registration; deprecated since July 1st 2023 due to X/Twitter code changes)", "navbar_archiving": "Archiving", "navbar_analysis_description": "It brings you the contextual information of a Youtube or public Facebook video. Twitter does not work anymore due to their change of API policy.", "navbar_analysis_image_description": "It brings you contextual information of an image posted on Facebook.", "navbar_keyframes_description": "It fragments a YouTube or a Facebook public video into keyframes for reverse image search", "navbar_thumbnails_description": "It extracts and performs a reverse search of the thumbnails of a Youtube video", "navbar_twitter_description": "It performs advanced search queries on X (ex-Twitter) including by time interval up to the minute", "navbar_magnifier_description": "It provides a magnifying lens and a photo editor to help you examine an image thoroughly", "navbar_metadata_description": "It extract metadata for jpeg images and videos (in mp4 or m4v format)", "navbar_rights_description": "It provides information about the legal rights of a Youtube or Twitter video", "navbar_forensic_description": "It provides an enhanced toolkit to detect image forgeries", "navbar_covidsearch_description": "It provides a customised search engine of Factchecks.", "navbar_xnetwork_description": "It provides a customised search engine for cross-network queries.", "navbar_ocr_description": "It provides optical character recognition for texts in images", "navbar_gif_description": "It compares an original image and a tampered one (including if the image has been cropped) and generates a GIF as output", "navbar_archiving_description": "Archive web pages to the Wayback Machine", "api_help_video": "https://www.youtube.com/embed/eEVTYq1LMxM?rel=0", "keyframes_help_video": "https://www.youtube.com/embed/iNs8y5DoxP8?rel=0", "thumbnails_help_video": "https://www.youtube.com/embed/Vn0XGlOkSRQ?rel=0", "twitter_help_video": "https://www.youtube.com/embed/wzMCtpENuHA?rel=0", "magnifier_help_video": "https://www.youtube.com/embed/JljRs8p4aK4?rel=0", "metadata_help_video": "https://www.youtube.com/embed/Mg6Z-Jc54yo?rel=0", "copyright_help_video": "https://www.youtube.com/embed/NjTXsbF5Wu8?rel=0", "forensic_help_video": "https://www.youtube.com/embed/de862rAPne4?rel=0", "close": "Close", "category_video": "Video", "category_image": "Image", "category_audio": "Audio", "category_search": "Search", "category_data": "Data analysis", "category_other": "Other tools", "navbar_conversation": "Twitter Conversation", "navbar_conversation_description": "It provides a straightforward way of exploring a Twitter based conversation.", "navbar_twitter_crowdtangle": "CSV Analysis", "navbar_twitter_crowdtangle_description": "It performs social network analysis from a CrowdTangle export", "navbar_deepfake_image": "Deepfake", "navbar_deepfake_image_description": "It tries to detect if an image has been manipulated through face swapping.", "navbar_geolocation": "Geolocalizer", "navbar_geolocation_description": "Is uses an algorithm to try to geolocalize an image", "navbar_deepfake_video": "Deepfake", "navbar_deepfake_video_description": "It uses a machine learning classifier which returns the probability that a video contains AI manipulated faces (face swapping and face reenactment).", "navbar_synthetic_image_detection": "Synthetic image", "navbar_synthetic_image_detection_description": "It returns the probability whether an image is AI-generated", "navbar_loccus": "Loccus", "navbar_loccus_description": "It detects AI-generated text-to-speech (voice cloning by AI)", "navbar_semantic_search": "Fact Check semantic search", "navbar_semantic_search_description": "A semantic search engine for fact checks."}
\ No newline at end of file
+{"navbar_tools": "Tools", "navbar_analysis_video": "Video analysis", "navbar_analysis_image": "Image analysis", "navbar_keyframes": "Keyframes", "navbar_thumbnails": "Thumbnails", "navbar_twitter": "X search", "navbar_magnifier": "Magnifier", "navbar_metadata": "Metadata", "navbar_metadata_video": "Metadata", "navbar_metadata_image": "Metadata", "navbar_rights": "Video rights", "navbar_forensic": "Forensic", "navbar_twitter_sna": "Twitter SNA.", "navbar_ocr": "OCR", "navbar_covidsearch": "Factchecks", "navbar_xnetwork": "XNetwork", "navbar_gif": "CheckGif", "navbar_twitter_sna_description": "It performs social network analysis on Twitter (on registration; deprecated since July 1st 2023 due to X/Twitter code changes)", "navbar_archiving": "Archiving", "navbar_analysis_description": "It brings you the contextual information of a Youtube or public Facebook video. Twitter does not work anymore due to their change of API policy.", "navbar_analysis_image_description": "It brings you contextual information of an image posted on Facebook.", "navbar_keyframes_description": "It fragments a YouTube or a Facebook public video into keyframes for reverse image search", "navbar_thumbnails_description": "It extracts and performs a reverse search of the thumbnails of a Youtube video", "navbar_twitter_description": "It performs advanced search queries on X (ex-Twitter) including by time interval up to the minute", "navbar_magnifier_description": "It provides a magnifying lens and a photo editor to help you examine an image thoroughly", "navbar_metadata_description": "It extract metadata for jpeg images and videos (in mp4 or m4v format)", "navbar_rights_description": "It provides information about the legal rights of a Youtube or Twitter video", "navbar_forensic_description": "It provides an enhanced toolkit to detect image forgeries", "navbar_covidsearch_description": "It provides a customised search engine of Factchecks.", "navbar_xnetwork_description": "It provides a customised search engine for cross-network queries.", "navbar_ocr_description": "It provides optical character recognition for texts in images", "navbar_gif_description": "It compares an original image and a tampered one (including if the image has been cropped) and generates a GIF as output", "navbar_archiving_description": "Archive web pages to the Wayback Machine", "api_help_video": "https://www.youtube.com/embed/eEVTYq1LMxM?rel=0", "keyframes_help_video": "https://www.youtube.com/embed/iNs8y5DoxP8?rel=0", "thumbnails_help_video": "https://www.youtube.com/embed/Vn0XGlOkSRQ?rel=0", "twitter_help_video": "https://www.youtube.com/embed/wzMCtpENuHA?rel=0", "magnifier_help_video": "https://www.youtube.com/embed/JljRs8p4aK4?rel=0", "metadata_help_video": "https://www.youtube.com/embed/Mg6Z-Jc54yo?rel=0", "copyright_help_video": "https://www.youtube.com/embed/NjTXsbF5Wu8?rel=0", "forensic_help_video": "https://www.youtube.com/embed/de862rAPne4?rel=0", "close": "Close", "category_video": "Video", "category_image": "Image", "category_audio": "Audio", "category_search": "Search", "category_data": "Data analysis", "category_other": "Other tools", "navbar_conversation": "Twitter Conversation", "navbar_conversation_description": "It provides a straightforward way of exploring a Twitter based conversation.", "navbar_twitter_crowdtangle": "CSV Analysis", "navbar_twitter_crowdtangle_description": "It performs social network analysis from a CrowdTangle export", "navbar_deepfake_image": "Deepfake", "navbar_deepfake_image_description": "It tries to detect if an image has been manipulated through face swapping.", "navbar_geolocation": "Geolocalizer", "navbar_geolocation_description": "Is uses an algorithm to try to geolocalize an image", "navbar_deepfake_video": "Deepfake", "navbar_deepfake_video_description": "It uses a machine learning classifier which returns the probability that a video contains AI manipulated faces (face swapping and face reenactment).", "navbar_synthetic_image_detection": "Synthetic image", "navbar_synthetic_image_detection_description": "It returns the probability whether an image is AI-generated", "navbar_loccus": "Loccus", "navbar_loccus_description": "It detects AI-generated text-to-speech (voice cloning by AI)", "navbar_semantic_search": "Fact Check semantic search", "navbar_semantic_search_description": "A semantic search engine for fact checks.", "navbar_c2pa": "C2pa", "navbar_c2pa_description": "It reads an image's C2pa data."}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/Analysis.json b/public/locales/en/components/NavItems/tools/Analysis.json
index 1a56a003d..c865e2d51 100644
--- a/public/locales/en/components/NavItems/tools/Analysis.json
+++ b/public/locales/en/components/NavItems/tools/Analysis.json
@@ -1 +1 @@
-{"api_title": "Video contextual verification", "api_input": "Youtube or Facebook link", "api_input_placeholder": "Paste here the link", "api_repro": "Reprocess", "api_comments": "All comments", "button_submit": "Submit", "facebook_video_name_1": "Video id", "image_id": "Image id", "facebook_video_name_2": "Video title", "facebook_video_name_3": "Duration", "facebook_video_name_4": "Content category", "facebook_video_name_5": "Content tags", "facebook_video_name_6": "Video description", "facebook_video_name_7": "Like count", "facebook_video_name_8": "Updated time", "facebook_video_name_9": "Created time", "facebook_image_caption": "Caption", "facebook_comment_title": "Comments", "facebook_comment_name_1": "Video comment count", "facebook_delete_result": "Remove result", "image_comment_count": "Image comment count", "facebook_comment_name_2": "Number verification comments", "twitter_user_name_13": "Created", "twitter_user_name_4": "Profile", "button_reverse_twitter": "X (ex-Twitter) search", "youtube_video_name1_2": "Video description", "twitter_video_name_3": "Origin", "twitter_video_name_4": "Likes count", "twitter_video_name_5": "Retweets count", "twitter_video_name_6": "Hashtags", "twitter_video_name_7": "Urls included", "twitter_video_name_8": "Mentionned by", "twitter_video_name_9": "Language", "twitter_video_name_10": "Thumbnail", "twitter_video_name_11": "Size", "twitter_video_name_12": "Duration", "twitter_video_name_13": "Locations mentioned", "twitter_video_name_14": "Embedded YouTube", "twitter_video_name_15": "Created", "twitter_video_name_16": "Video", "twitter_user_title": "Public User", "twitter_user_name_2": "Screen name", "twitter_user_name_3": "Location", "twitter_user_name_5": "Description", "twitter_user_name_6": "Protected user", "twitter_user_name_7": "Verified user", "twitter_user_name_8": "Followers", "twitter_user_name_9": "Following", "twitter_user_name_10": "Lists", "twitter_user_name_11": "Tweets liked", "twitter_user_name_12": "Tweets count", "youtube_comment_title": "Video comments:", "youtube_comment_name_2": "Verification comments number", "navbar_thumbnails": "Thumbnails", "youtube_video_name2_1": "Video view count", "youtube_video_name2_2": "Like count", "youtube_video_name2_3": "Dislike count", "youtube_video_name2_4": "Duration", "youtube_video_name2_5": "Licensed content", "youtube_video_name2_6": "Upload time", "youtube_channel_name_2": "Channel created time", "youtube_channel_name_3": "Channel view count", "youtube_channel_name_4": "Channel page", "youtube_channel_name_5": "Number of subscribers", "youtube_channel_title": "Channel:", "youtube_comment_name_1": "Video comment count", "convert_to_local_time": "Convert to local time", "table_error_unavailable": "This url is not valid", "table_error_no_image_id": "We cannot extract an image ID from the submitted URL. Please note also that Facebook does not allow us to process photos from Users or Groups.", "table_error_no_video_id": "We cannot extract an video ID from the submitted URL. Please note also that Facebook does not allow us to process videos from Users or Groups.", "table_error_unavailable_image": "This image is not available", "table_error_unavailable_video": "We cannot process this video. Please note also that Facebook does not allow us to process videos from Users or Groups.", "table_error_unsupported_platform": "Content from this platform are not supported by this service", "page_number": "out of", "api_title_image": "Image contextual verification", "link_comments": "Comments that contain links", "api_comments_verified": "Verification comments", "intro_tip": "Tip", "platform": "Platform", "source": "Source", "image_link": "Image link", "twitter_search": "Search on Twitter", "comments_links": "Number of comments that contain links", "facebook_tip": "This kind of Facebook link or shortener is not working properly. Try to click on the video and to get the url address instead.", "api_input_image": "Facebook link", "image_description": "Image description", "video_description": "Video description", "twitter_reply": "All replies", "twitter_reply_verified": "Verification replies", "twitter_reply_link": "Replies that contain links", "twitter_replies": "Replies", "twitter_video_replies": "Video replies", "video_card_header": "Source of the video", "image_card_header": "Source of the image", "user": "User", "profile_creator": "Profile", "cardheader_results": "Results"}
\ No newline at end of file
+{"api_title": "Video contextual verification", "api_input": "Youtube or Facebook link", "api_input_placeholder": "Paste here the link", "api_repro": "Reprocess", "api_comments": "All comments", "button_submit": "Submit", "facebook_video_name_1": "Video id", "image_id": "Image id", "facebook_video_name_2": "Video title", "facebook_video_name_3": "Duration", "facebook_video_name_4": "Content category", "facebook_video_name_5": "Content tags", "facebook_video_name_6": "Video description", "facebook_video_name_7": "Like count", "facebook_video_name_8": "Updated time", "facebook_video_name_9": "Created time", "facebook_image_caption": "Caption", "facebook_comment_title": "Comments", "facebook_comment_name_1": "Video comment count", "facebook_delete_result": "Remove result", "image_comment_count": "Image comment count", "facebook_comment_name_2": "Number verification comments", "twitter_user_name_13": "Created", "twitter_user_name_4": "Profile", "button_reverse_twitter": "X (ex-Twitter) search", "youtube_video_name1_2": "Video description", "twitter_video_name_3": "Origin", "twitter_video_name_4": "Likes count", "twitter_video_name_5": "Retweets count", "twitter_video_name_6": "Hashtags", "twitter_video_name_7": "Urls included", "twitter_video_name_8": "Mentionned by", "twitter_video_name_9": "Language", "twitter_video_name_10": "Thumbnail", "twitter_video_name_11": "Size", "twitter_video_name_12": "Duration", "twitter_video_name_13": "Locations mentioned", "twitter_video_name_14": "Embedded YouTube", "twitter_video_name_15": "Created", "twitter_video_name_16": "Video", "twitter_user_title": "Public User", "twitter_user_name_2": "Screen name", "twitter_user_name_3": "Location", "twitter_user_name_5": "Description", "twitter_user_name_6": "Protected user", "twitter_user_name_7": "Verified user", "twitter_user_name_8": "Followers", "twitter_user_name_9": "Following", "twitter_user_name_10": "Lists", "twitter_user_name_11": "Tweets liked", "twitter_user_name_12": "Tweets count", "youtube_comment_title": "Video comments:", "youtube_comment_name_2": "Verification comments number", "navbar_thumbnails": "Thumbnails", "youtube_video_name2_1": "Video view count", "youtube_video_name2_2": "Like count", "youtube_video_name2_3": "Dislike count", "youtube_video_name2_4": "Duration", "youtube_video_name2_5": "Licensed content", "youtube_video_name2_6": "Upload time", "youtube_channel_name_2": "Channel created time", "youtube_channel_name_3": "Channel view count", "youtube_channel_name_4": "Channel page", "youtube_channel_name_5": "Number of subscribers", "youtube_channel_title": "Channel:", "youtube_comment_name_1": "Video comment count", "convert_to_local_time": "Convert to local time", "table_error_unavailable": "This url is not valid", "table_error_no_image_id": "We cannot extract an image ID from the submitted URL. Please note also that Facebook does not allow us to process photos from Users or Groups.", "table_error_no_video_id": "We cannot extract an video ID from the submitted URL. Please note also that Facebook does not allow us to process videos from Users or Groups.", "table_error_unavailable_image": "This image is not available", "table_error_unavailable_video": "We cannot process this video. Please note also that Facebook does not allow us to process videos from Users or Groups.", "table_error_unsupported_platform": "Content from this platform are not supported by this service", "page_number": "out of", "api_title_image": "Image contextual verification", "link_comments": "Comments that contain links", "api_comments_verified": "Verification comments", "intro_tip": "Tip", "platform": "Platform", "source": "Source", "image_link": "Image link", "twitter_search": "Search on Twitter", "comments_links": "Number of comments that contain links", "facebook_tip": "This kind of Facebook link or shortener is not working properly. Try to click on the video and to get the url address instead.", "api_input_image": "Facebook link", "image_description": "Image description", "video_description": "Video description", "twitter_reply": "All replies", "twitter_reply_verified": "Verification replies", "twitter_reply_link": "Replies that contain links", "twitter_replies": "Replies", "twitter_video_replies": "Video replies", "video_card_header": "Source of the video", "image_card_header": "Source of the image", "user": "User", "profile_creator": "Profile", "cardheader_results": "Results", "analysis_service_error": "Service call error"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/Assistant.json b/public/locales/en/components/NavItems/tools/Assistant.json
index 25bcb0e58..aa5e68c6d 100644
--- a/public/locales/en/components/NavItems/tools/Assistant.json
+++ b/public/locales/en/components/NavItems/tools/Assistant.json
@@ -1,196 +1 @@
-{
- "assistant_title": "Assistant",
- "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case",
- "assistant_choose": "Choose what you want to analyse",
- "assistant_webpage_header": "Webpage link",
- "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.",
- "assistant_file_header": "Local file",
- "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image",
- "assistant_choose_tool": "Choose the tool you want to use",
- "upload_video": "Video",
- "upload_image": "Image",
- "assistant_urlbox": "URL",
- "assistant_give_url": "Give the URL of the page to analyse",
- "assistant_paste_url": "Paste the URL here",
- "please_give_a_correct_link": "The link provided is incorrect or not supported.",
- "button_analyse": "Analyse",
- "button_clean": "Remove",
- "save": "Save",
- "source_credibility_title": "Source Credibility",
- "source_credibility_byline": "The source has been found as part of a credibility check",
- "link_explorer_title": "Link Explorer",
- "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility",
- "text_title": "Text",
- "text_intro": "The following text has been found on the page",
- "dbkf_title": "DBKF Check",
- "expand_text": "Expand Text",
- "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.",
- "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.",
- "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.",
- "media_title": "Media",
- "images_label": "Images",
- "videos_label": "Videos",
- "media_found": "The following media has been found on the page",
- "media_below": "Select the media you would like to verify",
- "media_to_process": "Media to Process",
- "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.",
- "things_you_can_do_header": "Potential Tools",
- "things_you_can_do": "Below are the tools you can use on this media type",
- "navbar_analysis_image": "Image Analysis",
- "navbar_analysis_video": "Video Analysis",
- "navbar_keyframes": "Keyframes",
- "navbar_thumbnails": "Thumbnails",
- "navbar_twitter": "Tw. search",
- "navbar_magnifier": "Magnifier",
- "navbar_metadata": "Metadata",
- "navbar_rights": "Video rights",
- "navbar_forensic": "Forensic",
- "navbar_ocr": "OCR",
- "navbar_twitter_sna": "Fact Check",
- "navbar_assistant": "Assistant",
- "assistant_help_title": "Assistant Help",
- "assistant_help_1": " The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
",
- "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
",
- "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
",
- "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page For a detailed breakdown of the tools and checks run by the assistant, see: this page",
- "enter_url": "Enter URL",
- "mode_label": "URL mode",
- "url_text": "URL Text",
- "url_media": "URL Media",
- "media_text": "Extracted Media Text",
- "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.",
- "text_warning": "Warnings found against text. See warning box.",
- "image_warning": "Warnings found against image. See warning box.",
- "warning_title": "Warning",
- "warning_subtitle": "Some elements of this content have been flagged",
- "status_title": "Status",
- "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.",
- "named_entity_title": "Text entities",
- "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of",
- "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes",
- "domain_scope": "Domain:",
- "account_scope": "Account:",
- "labelled_as": "has been labelled as:",
- "commented_as": "with the following comment:",
- "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of",
- "image_analysis_text": "Retrieve contextual information about the image",
- "video_analysis_text": "Retrieve contextual information about the video",
- "keyframes_text": "Fragment the video",
- "thumbnails_text": "Reverse search on thumbnails from the video",
- "magnifier_text": "Examine the image thoroughly",
- "metadata_text": "Retrieve image/video metadata",
- "rights_text": "Retrieve information solely about video rights",
- "forensic_text": "Detect any image manipulation",
- "ocr_text": "Extract any text from the image",
- "hyperpartisan_title": "Hyperpartisan service",
- "dbkf_text_title": "Database of known fakes text search",
- "dbkf_media_title": "Database of known fakes media search",
- "ne_title": "Named entity search",
- "ocr_title": "OCR search",
- "source_cred_title": "Source credibility service",
- "mt_title": "Machine translation service",
- "translate": "Translate (beta)",
- "copy_link": "Copy link",
- "archive_link": "Archive",
- "this": "This ",
- "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:",
- "source_credibility_warning_account": "account has been mentioned in a lookup against:",
- "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page",
- "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page",
- "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:",
- "source_cred_popup_header_account": "The account has been found in the following reports listed by:",
- "url_domain_analysis": "URL Domain Analysis",
- "fact_checker": "Fact checker",
- "warning": "Warning",
- "mentions": "Mentions",
- "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.",
- "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.",
- "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.",
- "extracted_urls": "Extracted URLs",
- "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis",
- "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.",
- "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page",
- "embedding_not_supported":"The Assistant could not display this video content.",
- "assistant_video_download_action": "Download video",
- "assistant_video_download_action_description": "Click here to download the video, to your machine. The download video can then be used in the assistant to access a wider range of video analysis services.",
- "credibility_signals": "Credibility Signals",
- "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given page.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the source is. For more information on these signals, please see this page.",
- "importance_tooltip": "The background of highlighted sentences varies depending on the detection algorithm's rating of its importance.",
- "confidence_tooltip_technique": "The background of the detected techniques varies depending on the detection algorithm's confidence.",
- "confidence_tooltip_sentence": "The background of highlighted sentences varies depending on the detection algorithm's confidence.",
- "highlight_important_sentence": "Highlight important sentences",
- "low_importance": "Low importance",
- "high_importance": "High importance",
- "low_confidence": "Low confidence",
- "high_confidence": "High confidence",
- "colour_scale": "The colour scale is shown below:",
- "news_framing": "Topic",
- "news_framing_tooltip": "Identify the topics used in the extracted text. A topic is the perspective under which an issue or a piece of news is presented. A total of 9 different topics are considered.",
- "Economy_and_Resources": "Economy and Resources",
- "Religious_Ethical_and_Cultural": "Religious, Ethical and Cultural",
- "Fairness_Equality_and_Rights": "Fairness, Equality and Rights",
- "Law_and_Justice_System": "Law and Justice System",
- "Crime_and_Punishment": "Crime and Punishment",
- "Security_Defense_and_Well_being": "Security, Defense and Well-being",
- "Health_and_Safety": "Health and Safety",
- "Politics": "Politics",
- "International_Relations": "International Relations",
- "news_genre": "Genre",
- "news_genre_tooltip": "Determine whether the text is most likely to be an opinion piece, objective news reporting, or satire.",
- "Opinion": "Opinionated News",
- "Reporting": "Objective reporting",
- "Satire": "Satire",
- "persuasion_techniques": "Persuasion Techniques",
- "persuasion_techniques_tooltip": "Identify the persuasion techniques of the extracted text. This service annotates particular sentences within the text that use these techniques. A total of 23 different techniques are considered.",
- "Appeal_to_Authority": "Appeal to Authority",
- "Appeal_to_Popularity": "Appeal to Popularity",
- "Appeal_to_Values": "Appeal to values",
- "Appeal_to_Fear-Prejudice": "Appeal to fear/prejudice",
- "Flag_Waving": "Flag Waving",
- "Causal_Oversimplification": "Causal oversimplification",
- "False_Dilemma-No_Choice": "False dilemma or no choice",
- "Consequential_Oversimplification": "Consequential oversimplification",
- "Straw_Man": "Straw man",
- "Red_Herring": "Red herring",
- "Whataboutism": "Whataboutism",
- "Slogans": "Slogans",
- "Appeal_to_Time": "Appeal to time",
- "Conversation_Killer": "Conversation killer",
- "Loaded_Language": "Loaded language",
- "Repetition": "Repetition",
- "Exaggeration-Minimisation": "Exaggeration or minimisation",
- "Obfuscation_Vagueness-Confusion": "Obfuscation - vagueness or confusion",
- "Name_Calling-Labeling": "Name calling or labeling",
- "Doubt": "Doubt",
- "Guilt_by_Association": "Guilt by association",
- "Appeal_to_Hypocrisy": "Appeal to Hypocrisy",
- "Questioning_the_Reputation": "Questioning the reputation",
- "detected_techniques": "Detected techniques",
- "no_detected_categories": "No detected categories",
- "subjectivity": "Subjectivity",
- "subjectivity_tooltip": "Identify the subjective sentences of the extracted text.",
- "subjective_sentences_detected": "Subjective sentences detected",
- "none_detected": "None detected",
- "previous_fact_checks": "Previous Fact-Checks",
- "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.",
- "more_details": "For more details see",
- "semantic_search_title": "Fact Check Semantic Search",
- "failed_to_load": "Failed to load",
- "previous_fact_checks_found": "Top 5 previous fact-checks found",
- "login_required": "Please log in as a beta user to see results",
- "reanalyse_url": "Please reanalyse URL to see results",
- "semantic_search_result_claim": "Claim:",
- "semantic_search_result_title": "Title:",
- "semantic_search_result_translated_from": "Translated from",
- "semantic_search_result_see_original": "See original",
- "semantic_search_result_english_translation": "Show English Translation",
- "semantic_search_rating": "Rating:",
- "machine_generated_text": "Machine Generated Text",
- "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.",
- "highly_likely_human": "Highly likely human written with score ",
- "likely_human": "Likely human written with score ",
- "likely_machine": "Likely machine generated with score ",
- "highly_likely_machine": "Highly likely machine generated with score "
- }
\ No newline at end of file
+{"assistant_title": "Assistant", "assistant_intro": "The assistant will help you to analyse a webpage, an image or a video file and suggest which WeVerify tools are useful for each case", "assistant_choose": "Choose what you want to analyse", "assistant_webpage_header": "Webpage link", "assistant_webpage_text": "Insert the link of a webpage, and the assistant will suggest the most useful tools for the contents of the given page.", "assistant_file_header": "Local file", "assistant_file_text": "The assistant will suggest the most useful tools depending on if the file is a video or image", "assistant_choose_tool": "Choose the tool you want to use", "upload_video": "Video", "upload_image": "Image", "assistant_urlbox": "URL", "assistant_give_url": "Give the URL of the page to analyse", "assistant_paste_url": "Paste the URL here", "please_give_a_correct_link": "The link provided is incorrect or not supported.", "button_analyse": "Analyse", "button_clean": "Remove", "save": "Save", "source_credibility_title": "Source Credibility", "source_credibility_byline": "The source has been found as part of a credibility check", "link_explorer_title": "Link Explorer", "link_explorer_byline": "The following URLs have been extracted from the page, and their domains have been checked for credibility", "text_title": "Text", "text_intro": "The following text has been found on the page", "dbkf_title": "DBKF Check", "expand_text": "Expand Text", "dbkf_error": "An issue has occurred when trying to connect to the database of known fakes. Some results may be omitted from this page. If the problem persists, please contact support.", "sc_failed": "The source credibility check has failed. Some results may not be displayed. If the problem persists, please contact support.", "link_tooltip": "What is this?The scores displayed in this section give an indication of how reliable the web source listed can be considered. Scores range from 0-100.In most cases, the source checked for credibility will be the URL domain. In some cases where this is not useful a more relevant part of the URL has been checked against. In all cases, the full URL and the domain against which the source credibility check was carried on are listed in the form URL : domain-for-check. How are these calculated?Various institutions analyse sources (particularly domains) across the web to evaluate how reliable they are likely to be based on various metrics.Here, datasets assessing web domain reliability have been pulled mainly from Open Sources and the WeVerify DBKF database.Since the metrics or scores from each of these sources do not necessarily overlap and cannot easily be compared, all scores from any given institution are mapped to a single number between 0-100.For any URL, a list of all institutions which gave the relevant domain a score has been listed, along with the (mapped) results they gave.The final result displayed for any domain is the lowest score from the various sources.", "media_title": "Media", "images_label": "Images", "videos_label": "Videos", "media_found": "The following media has been found on the page", "media_below": "Select the media you would like to verify", "media_to_process": "Media to Process", "assistant_error": "An unexpected assistant error has occurred. If the problem persists, contact support.", "things_you_can_do_header": "Potential Tools", "things_you_can_do": "Below are the tools you can use on this media type", "navbar_analysis_image": "Image Analysis", "navbar_analysis_video": "Video Analysis", "navbar_keyframes": "Keyframes", "navbar_thumbnails": "Thumbnails", "navbar_twitter": "Tw. search", "navbar_magnifier": "Magnifier", "navbar_metadata": "Metadata", "navbar_rights": "Video rights", "navbar_forensic": "Forensic", "navbar_ocr": "OCR", "navbar_twitter_sna": "Fact Check", "navbar_assistant": "Assistant", "assistant_help_title": "Assistant Help", "assistant_help_1": "The WeVerify toolkit (this plugin) has multiple tools which can help in the verification of content on social networks, designed to help journalists save time and be more efficient in their fact checking tasks. A full list of these tools can be found in the tutorial section of this plugin. Given the multiple tools and services available, the weverify assistant has been designed to guide users to the services available to them given the nature of the content they would like to check.
", "assistant_help_2": "How does the assistant work? Users can choose to upload their own media to be checked (an image or a video), in which case verification tools on the plugin which support media upload will be listed. An alternative option is to enter a URL which needs verification or fact checking. Once a URL in entered, the assistant attempts to extract any text, images or videos it can find on the page. Any extracted text or media are then used to suggest the potential actions which can be carried out. Currently, there are three major components to this:
Text Checks: displaying any text found on the page, and running a selection of post processing/verification tools against it
Media Checks: displaying any media found on the page, and if selected, giving the list of tools available on the WeVerify plugin to process selected media
Verification Checks: checks against elements of the URL which do not fall under either text or media, such as the domain of the website
More information on each of these can be found in the links below.
", "assistant_help_3": "Which URLS are supported? Currently, there is dedicated support for links for the following types of URLs:
Facebook photo or video posts
Twitter statuses
Youtube video links
Instagram posts
Tiktok posts
Dailymotion video links
Vimeo video links
Liveleak video links
Other generic links can also be entered and the assistant will attempt to retrieve what it can. However, any results (particularly on the extraction of images and text) on generic links may be much more generalised.
", "assistant_help_4": "More information For a detailed breakdown of the type of URLs supported by the assistant, see this page. For a detailed breakdown of the tools and checks run by the assistant, see: this page.", "enter_url": "Enter URL", "mode_label": "URL mode", "url_text": "URL Text", "url_media": "URL Media", "media_text": "Extracted Media Text", "download_video": "The video has been extracted but cannot be processed using the direct URL. Please open it in a new tab using the link below, download it, and use the assistant to see which tools can be used on the downloaded video.", "text_warning": "Warnings found against text. See warning box.", "image_warning": "Warnings found against image. See warning box.", "warning_title": "Warning", "warning_subtitle": "Some elements of this content have been flagged", "status_title": "Status", "status_subtitle": "Note: one or more of the automated checks have resulted in an error. Some results may be omitted from this page.", "named_entity_title": "Text entities", "dbkf_image_warning": "The image from this URL has matched against the following from the database of known fakes with a similarity score of", "dbkf_video_warning": "The video from this URL has matched against the following from the database of known fakes with a similarity score of", "dbkf_text_warning": "The text from this URL has matched against the following from the database of known fakes", "labelled_as": "It has been labelled as:", "commented_as": "with the following comment:", "hp_warning": "The text from this URL has returned an unusually high hyperpartisan score of", "image_analysis_text": "Retrieve contextual information about the image", "video_analysis_text": "Retrieve contextual information about the video", "keyframes_text": "Fragment the video", "thumbnails_text": "Reverse search on thumbnails from the video", "magnifier_text": "Examine the image thoroughly", "metadata_text": "Retrieve image/video metadata", "rights_text": "Retrieve information solely about video rights", "forensic_text": "Detect any image manipulation", "ocr_text": "Extract any text from the image", "hyperpartisan_title": "Hyperpartisan service", "dbkf_text_title": "Database of known fakes text search", "dbkf_media_title": "Database of known fakes media search", "ne_title": "Named entity search", "ocr_title": "OCR search", "source_cred_title": "Source credibility service", "mt_title": "Machine translation service", "translate": "Translate (beta)", "copy_link": "Copy link", "archive_link": "Archive", "this": "This ", "source_credibility_warning_domain": "The domain has been mentioned in a lookup against:", "source_credibility_warning_account": "The account has been mentioned in a lookup against:", "source_cred_popup_header_domain": "The domain has been found in the following reports listed by:", "source_cred_popup_header_account": "The account has been found in the following reports listed by:", "domain_scope": "Domain:", "account_scope": "Account:", "text_tooltip": "What is this?Any text which can be extracted from the given URL is displayed hereHow is this used?Various text processing tools are run against this text:
The language is detected and displayed
The named entities in the text are extracted and displayed (people, locations, organisations etc.)
The first 500 characters in the text are sent to be checked against the database of known fakes. The results of this check (if any) are listed in the Warnings section
For more information, see: this page.", "media_tooltip": "What is this?Any images or videos which can be extracted from the URL have been displayed here.What can I do with these?For any selected image/video, a list of relevant tools from the plugin which can process this media are given. Selecting any of these will redirect the media to the selected tool. Alongside this, the assistant will reverse search the media against the database of known fakes. If any results are found, these will be displayed in the Warnings section. For more information, see: this page.", "sc_tooltip": "What is this?For every URL entered, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page", "url_domain_analysis": "URL Domain Analysis", "fact_checker": "Fact checker", "warning": "Warning", "mentions": "Mentions", "assistant_error_instagram": "The assistant has failed to retrieve this instagram post. Please open this URL in a new tab (you may need to log in to instagram), then use the ASSISTANT FOR CURRENT PAGE button to retry.", "assistant_error_server_error": "The assistant could not process the link provided due to a problem with the server, please try again later. If the problem persists please contact support.", "assistant_error_connection_error": "The assistant is having issues connecting to the server, please try again later.", "extracted_urls": "Extracted URLs", "extracted_urls_url_domain_analysis": "Extracted URLs with URL Domain Analysis", "extracted_urls_url_domain_analysis_failed": "Extracted URLs with URL Domain Analysis has failed.", "extracted_urls_tooltip": "What is this?For every URL extracted from the original URL, we run either the domain (if this is a non social media URL) or the account (if this is a social media URL) against our URL domain analysis service. The results of this check are shown here.What can I do with these? The domain analysis service intends to collect information about a domain/account from multiple sources. From here, we intend to inform the user whether any of the sources we collect from hold information on the domain/account of the URL entered. The result is split into three types:
Warning: domain listed by source which explicitly lists potentially untrustworthy domains
Fact checker: domain listed by source which explicitly lists fact checkers
Mentions: domain listed by source which lists a mix of trustworthy and untrustworthy domains
Since this is information collected from multiple sources, we have given the source we have taken the details from and if provided, any evidence the source itself has given so users can check the validity of claims made about a domain. For more information on sources and data collection, see this page.", "assistant_video_download_action": "Download video", "assistant_video_download_action_description": "Click here to download the video. The downloaded video can then be used in the assistant to access a wider range of video analysis services.", "embedding_not_supported": "The Assistant could not display this video content.", "assistant_video_download_generic": "Other video analysis services may be available", "assistant_video_download_generic_description": "
More analysis tools are available when uploading video files.
Assistant does not support the direct downloading from this service but it may be possible use external tools. The downloaded videos can be uploaded to assistant for access to more analysis services.
More analysis tools are available when uploading video files.
Assistant does not support the direct downloading of TikTok video but you can go to the TikTok page and right click the video to download it directly.
", "credibility_signals": "Credibility Signals", "credibility_signals_tooltip": "What is this?This section displays various credibility signals derived by applying AI classifiers to the extracted text of a given page.What can I do with these?The results of these credibility signals give a detailed overview of the extracted text which allows the reader to decide how credible or reliable the source is. For more information on these signals, please see this page.", "importance_tooltip": "The background of highlighted sentences varies depending on the detection algorithm's rating of its importance.", "confidence_tooltip_technique": "The background of the detected techniques varies depending on the detection algorithm's confidence.", "confidence_tooltip_sentence": "The background of highlighted sentences varies depending on the detection algorithm's confidence.", "highlight_important_sentence": "Highlight important sentences", "low_importance": "Low importance", "high_importance": "High importance", "low_confidence": "Low confidence", "high_confidence": "High confidence", "colour_scale": "The colour scale is shown below: ", "news_framing": "Topic", "news_framing_tooltip": "Identify the topics used in the extracted text. A topic is the perspective under which an issue or a piece of news is presented. A total of 9 different topics are considered.", "Economy_and_Resources": "Economy and Resources", "Religious_Ethical_and_Cultural": "Religious, Ethical and Cultural", "Fairness_Equality_and_Rights": "Fairness, Equality and Rights", "Law_and_Justice_System": "Law and Justice System", "Crime_and_Punishment": "Crime and Punishment", "Security_Defense_and_Well_being": "Security, Defense and Well-being", "Health_and_Safety": "Health and Safety", "Politics": "Politics", "International_Relations": "International Relations", "news_genre": "Genre", "news_genre_tooltip": "Determine whether the text is most likely to be an opinion piece, objective news reporting, or satire.", "Opinion": "Opinionated News", "Reporting": "Objective reporting", "Satire": "Satire", "persuasion_techniques": "Persuasion Techniques", "persuasion_techniques_tooltip": "Identify the persuasion techniques of the extracted text. This service annotates particular sentences within the text that use these techniques. A total of 23 different techniques are considered.", "detected_techniques": "Detected techniques", "no_detected_categories": "No detected categories", "Appeal_to_Authority": "Appeal to Authority", "Appeal_to_Popularity": "Appeal to Popularity", "Appeal_to_Values": "Appeal to values", "Appeal_to_Fear-Prejudice": "Appeal to fear/prejudice", "Flag_Waving": "Flag Waving", "Causal_Oversimplification": "Causal oversimplification", "False_Dilemma-No_Choice": "False dilemma or no choice", "Consequential_Oversimplification": "Consequential oversimplification", "Straw_Man": "Straw man", "Red_Herring": "Red herring", "Whataboutism": "Whataboutism", "Slogans": "Slogans", "Appeal_to_Time": "Appeal to time", "Conversation_Killer": "Conversation killer", "Loaded_Language": "Loaded language", "Repetition": "Repetition", "Exaggeration-Minimisation": "Exaggeration or minimisation", "Obfuscation-Vagueness-Confusion": "Obfuscation - vagueness or confusion", "Name_Calling-Labeling": "Name calling or labeling", "Doubt": "Doubt", "Guilt_by_Association": "Guilt by association", "Appeal_to_Hypocrisy": "Appeal to Hypocrisy", "Questioning_the_Reputation": "Questioning the reputation", "subjectivity": "Subjectivity", "subjectivity_tooltip": "Identify the subjective sentences of the extracted text.", "subjective_sentences_detected": "Subjective sentences detected", "none_detected": "None detected", "previous_fact_checks": "Previous Fact-Checks", "previous_fact_checks_tooltip": "The Fact Check Semantic Search tool identifies whether the extracted text has previously been detected in a fact check database. It displays the most recent matches, up to a maximum of 5. This tool is currently only accessible to beta users.", "more_details": "For more details see", "semantic_search_title": "Fact Check Semantic Search", "failed_to_load": "Failed to load", "previous_fact_checks_found": "Top 5 previous fact-checks found", "login_required": "Please log in as a beta user to see results", "reanalyse_url": "Please reanalyse URL to see results", "semantic_search_result_claim": "Claim: ", "semantic_search_result_title": "Title: ", "semantic_search_result_translated_from": "Translated from", "semantic_search_result_see_original": "See original", "semantic_search_result_english_translation": "Show English Translation", "semantic_search_rating": "Rating: ", "machine_generated_text": "Machine Generated Text", "machine_generated_text_tooltip": "Determine whether the extracted text has been written by human or machine. This tool is currently only accessible to beta users.", "highly_likely_human": "Highly likely human written with score ", "likely_human": "Likely human written with score ", "likely_machine": "Likely machine generated with score ", "highly_likely_machine": "Highly likely machine generated with score"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/C2pa.json b/public/locales/en/components/NavItems/tools/C2pa.json
new file mode 100644
index 000000000..ff37f2caf
--- /dev/null
+++ b/public/locales/en/components/NavItems/tools/C2pa.json
@@ -0,0 +1 @@
+{"c2pa_title": "C2pa", "c2pa_description": "It reads an image's C2pa data.", "c2pa_results_title": "Results", "c2pa_information": "C2pa information", "no_c2pa_info": "No c2pa data available for this image.", "content_credentials_unknown_source": "This content credential was issued by an unknown source.", "content_credentials_invalid": "This content credential is not valid, meaning anyone could have modified this image's c2pa information.", "content_credentials_title": "Content credentials", "content_credentials_issuer": "Issuer: ", "content_credentials_date_issued": "Date issued: ", "credit_title": "Credit", "credit_producer": "Produced by:", "credit_social": "Socials", "credit_no_info": "No producer information for this image", "capture_info_title": "Capture Information", "capture_info_make": "Make: ", "capture_info_model": "Model: ", "capture_info_date": "Date: ", "capture_info_longitude": "Longitude: ", "capture_info_latitude": "Latitude: ", "capture_info_more_results": "See more capture information", "capture_info_hide": "Hide capture information", "capture_no_info": "No capture information available.", "process_title": "Creation Process", "process_edits": "Edits", "process_ingredients": "Ingredients", "process_no_info": "No process information for this image.", "previous_image": "Previous image", "first_image": "First image", "content_credential_explanation": "The issuer is the organisation, device or individual that recorded the information and signed the Content Credential validating the manifest containing this data.", "credit_explanation": "This is information the producer of this data chose to share.", "capture_info_explanation": "Data sourced from the camera used to capture the image. This data can be edited by the producer.", "process_explanation": "This information was recorded by the app or device used to produce the image.", "child_depth_exceeded": "The main image has too many ingredients, the data of this image could not be read.", "submit_button": "Submit", "button_localfile": "Local file", "image_link": "Image link", "placeholder": "Paste the URL here", "geo_maps": "Open in Google Maps"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/Deepfake.json b/public/locales/en/components/NavItems/tools/Deepfake.json
index 03e9da623..8a4a7bca9 100644
--- a/public/locales/en/components/NavItems/tools/Deepfake.json
+++ b/public/locales/en/components/NavItems/tools/Deepfake.json
@@ -1 +1 @@
-{"deepfake_label": "Media link", "deepfake_name": "Deepfake", "deepfake_placeholder": "Paste the URL here", "deepfake_support": "Your browser does not support the video tag.", "deepfake_clips": "Clips of the video", "deepfake_select": "Select a shot to see the analysis results of that clip", "deepfake_clip": "Clip selected", "deepfake_faces": "Faces recognized", "deepfake_video": "Video analysed", "deepfake_results": "Results of the clip selected", "deepfake_error_400": "Error: Invalid image link. Ensure it points to a publicly accessible", "deepfake_error_500": "Service internal error", "deepfake_error_413": "The file is too large", "deepfake_error_422": "The file is too large", "deepfake_image_link": "Image link", "deepfake_video_link": "Video link", "deepfake_title_what": "What are Thumbnails", "deepfake_filters_explanation_image": "Explanation image", "deepfake_filters_explanation_video": "Explanation video", "deepfake_image_title": "Detection results", "deepfake_image_faceswap_name": "Faceswap", "deepfake_image_faceswap_description": "This method aims to detect if the person's face has been replaced in the picture.", "deepfake_image_gan_name": "GAN", "deepfake_image_gan_description": "This method aims to detect if the image has been generated by a Generative Adversarial Network (GAN).", "deepfake_image_diffusion_name": "Latent Diffusion model", "deepfake_image_diffusion_description": "This method aims to detect if the image has been generated through a latent diffusion model neural network.", "deepfake_image_detection_alert": "This image has been detected as generated with a ", "deepfake_image_detection_alert_2": "algorithm", "deepfake_video_title": "Detection results", "deepfake_video_videoreport_name": "Mever Deepfake Video detector", "deepfake_video_videoreport_description": "This method aims to detect if the person's face has been replaced in the video.", "deepfake_video_ftcn_name": "Fully Temporal Convolution Network", "deepfake_video_ftcn_description": "This method aims to detect temporal anomalies for videos with faces.", "deepfake_video_facereenact_name": "Face Reenactment", "deepfake_video_facereenact_description": "This method aims to detect if the faces in the video have been synthesized with a transfer from a source face shape to a target face while preserving the appearance and the identity of the target face.", "deepfake_video_detection_alert": "This video has been detected as generated with a ", "deepfake_video_detection_alert_2": "algorithm", "button_remove": "Remove", "deepfake_no_face_detection": "No face detected", "button_localfile": "Local file", "submit_button": "Submit", "gauge_detection": "Detection", "gauge_no_detection": "No detection", "gauge_additional_results": "Detection details", "gauge_additional_results_hide": "Hide detection details", "deepfake_image_rating": "Explanation: The Faceswap algorithm of the InVID-WeVerify plugin finds ", "deepfake_image_rating_4": "very strong evidence suggesting that this image has been manipulated through face swapping.", "deepfake_image_rating_3": "strong evidence suggesting that this image has been manipulated through face swapping.", "deepfake_image_rating_2": "moderate evidence (suspicious but non conclusive) suggesting that this image could be manipulated through face swapping. The absence of detection does not guarantee the image is not post-edited.", "deepfake_image_rating_1": "weak evidence (non conclusive) suggesting that this image could be manipulated through face swapping. The absence of detection does not guarantee the image is not post-edited.", "deepfake_video_rating": "Explanation: The algorithms of the InVID-WeVerify plugin find ", "deepfake_video_rating_4": "very strong evidence suggesting that this video conatins AI manipulated faces.", "deepfake_video_rating_3": "strong evidence suggesting that this video conatins AI manipulated faces.", "deepfake_video_rating_2": "moderate evidence (suspicious but non conclusive) suggesting that this video could conatin AI manipulated faces. The absence of detection does not guarantee the video is not post-edited.", "deepfake_video_rating_1": "weak evidence (non conclusive) suggesting that this video could contain AI manipulated faces. The absence of detection does not guarantee the video is not post-edited.", "deepfake_button_copy_text_1": "Copy text", "deepfake_button_copy_text_2": "Text copied!", "gauge_alert_label_4": "Very strong evidence", "gauge_alert_label_3": "Strong evidence", "gauge_alert_label_2": "Moderate evidence (suspicious but non conclusive)", "gauge_alert_label_1": "Weak evidence (non conclusive)", "gauge_probability_text": "Probability:", "gauge_generic_detection_text": "", "gauge_scale_explanation_link": "What do the gauge colors mean?", "gauge_scale_modal_explanation_title": "What do the gauge colors mean?", "gauge_scale_modal_explanation_rating_1": "<50% - Weak evidence (non-conclusive)", "gauge_scale_modal_explanation_rating_2": "\u226550% - Moderate evidence (suspicious but non-conclusive)", "gauge_scale_modal_explanation_rating_3": "\u226570% - Strong evidence", "gauge_scale_modal_explanation_rating_4": "\u226590% - Very strong evidence", "gauge_download_gauge_button": "Download Gauge Chart as jpeg file"}
\ No newline at end of file
+{"deepfake_label": "Media link", "deepfake_name": "Deepfake", "deepfake_placeholder": "Paste the URL here", "deepfake_support": "Your browser does not support the video tag.", "deepfake_clips": "Clips of the video", "deepfake_select": "Select a shot to see the analysis results of that clip", "deepfake_clip": "Clip selected", "deepfake_faces": "Faces recognized", "deepfake_video": "Video analysed", "deepfake_results": "Results of the clip selected", "deepfake_error_400": "Error: Invalid image link. Ensure it points to a publicly accessible", "deepfake_error_500": "Service internal error", "deepfake_error_413": "The file is too large", "deepfake_error_422": "The file is too large", "deepfake_image_link": "Image link", "deepfake_video_link": "Video link", "deepfake_title_what": "What are Thumbnails", "deepfake_filters_explanation_image": "Explanation image", "deepfake_filters_explanation_video": "Explanation video", "deepfake_image_title": "Detection results", "deepfake_image_faceswap_name": "Faceswap", "deepfake_image_faceswap_description": "This method aims to detect if the person's face has been replaced in the picture.", "deepfake_image_gan_name": "GAN", "deepfake_image_gan_description": "This method aims to detect if the image has been generated by a Generative Adversarial Network (GAN).", "deepfake_image_diffusion_name": "Latent Diffusion model", "deepfake_image_diffusion_description": "This method aims to detect if the image has been generated through a latent diffusion model neural network.", "deepfake_image_detection_alert": "This image has been detected as generated with a ", "deepfake_image_detection_alert_2": "algorithm", "deepfake_video_title": "Detection results", "deepfake_video_videoreport_name": "Mever Deepfake Video detector", "deepfake_video_videoreport_description": "This method aims to detect if the person's face has been replaced in the video.", "deepfake_video_ftcn_name": "Fully Temporal Convolution Network", "deepfake_video_ftcn_description": "This method aims to detect temporal anomalies for videos with faces.", "deepfake_video_facereenact_name": "Face Reenactment", "deepfake_video_facereenact_description": "This method aims to detect if the faces in the video have been synthesized with a transfer from a source face shape to a target face while preserving the appearance and the identity of the target face.", "deepfake_video_detection_alert": "This video has been detected as generated with a ", "deepfake_video_detection_alert_2": "algorithm", "button_remove": "Remove", "deepfake_no_face_detection": "No face detected", "button_localfile": "Local file", "submit_button": "Submit"}
\ No newline at end of file
diff --git a/public/locales/en/components/NavItems/tools/SyntheticImageDetection.json b/public/locales/en/components/NavItems/tools/SyntheticImageDetection.json
index 4f0d3acc5..87e325c21 100644
--- a/public/locales/en/components/NavItems/tools/SyntheticImageDetection.json
+++ b/public/locales/en/components/NavItems/tools/SyntheticImageDetection.json
@@ -1 +1 @@
-{"synthetic_image_detection_label": "Media link", "synthetic_image_detection_name": "Synthetic Image Detection", "synthetic_image_detection_placeholder": "Paste the URL here", "synthetic_image_detection_results": "Results of the clip selected", "synthetic_image_detection_link": "Image link", "synthetic_image_detection_gan_name": "GAN", "synthetic_image_detection_gan_description": "This method aims to detect if the image has been generated by a Generative Adversarial Network (GAN).", "synthetic_image_detection_diffusion_name": "Latent Diffusion model", "synthetic_image_detection_diffusion_description": "This method aims to detect if the image has been generated through a latent diffusion model neural network.", "synthetic_image_detection_progan_name": "ProGAN", "synthetic_image_detection_progan_description": "This model can detect fully synthetic images generated by ProGAN Models or architectures that are similar. ", "synthetic_image_detection_adm_name": " ADM", "synthetic_image_detection_adm_description": "This model can detect fully synthetic images generated by ADMs or architectures that are similar.", "synthetic_image_detection_progan_rine_mever_name": "ProGAN RINE", "synthetic_image_detection_progan_rine_mever_description": "This model detects fully synthetic images. It specializes in detecting images generated by Generative Adversarial Networks (GAN). The CLIP (Contrastive Language-Image Pre-training) technology extracts key characteristics from the image.", "synthetic_image_detection_ldm_rine_mever_name": "LDM RINE", "synthetic_image_detection_ldm_rine_mever_description": "This model detects fully synthetic images. It specializes in detecting images generated by Latent Diffusion Models (LDM), while exhibiting strong detection performance across several other generative methods. The CLIP (Contrastive Language-Image Pre-training) technology extracts key characteristics from the image.", "synthetic_image_detection_title": "Detection results", "synthetic_image_detection_alert": "This image has been detected as generated with a ", "synthetic_image_detection_alert_2": " algorithm", "synthetic_image_detection_error_400": "Error: Invalid image link. Ensure it points to a publicly accessible image with dimensions between 128x128 and 2000x2000 pixels.", "gauge_detection_error_generic": "An error happened. Please try again or try a different image", "gauge_detection_algorithms_errors": "One or more algorithms returned errors. The analysis may be incomplete. Make sure the image has dimensions between 128x128 and 2000x2000 pixels.", "synthetic_image_detection_not_found": "No detection found", "submit_button": "Submit", "button_localfile": "Local file", "gauge_detection": "Detection", "gauge_no_detection": "No detection", "gauge_additional_results": "Detection details", "gauge_additional_results_hide": "Hide detection details", "synthetic_image_detection_rating": "Explanation: The veraAI detector of the InVID-WeVerify plugin finds ", "synthetic_image_detection_rating_4": "very strong evidence suggesting that this image is synthetic", "synthetic_image_detection_rating_3": "strong evidence suggesting that this image is synthetic", "synthetic_image_detection_rating_2": "moderate evidence (suspicious but non conclusive) suggesting that this image could be synthetic. The absence of detection does not guarantee the image is not post-edited.", "synthetic_image_detection_rating_1": "weak evidence (non conclusive) suggesting that this image could be synthetic. The absence of detection does not guarantee the image is not post-edited.", "synthetic_image_detection_button_copy_text_1": "Copy text", "synthetic_image_detection_button_copy_text_2": "Text copied!", "gauge_alert_label_4": "Very strong evidence", "gauge_alert_label_3": "Strong evidence", "gauge_alert_label_2": "Moderate evidence (suspicious but non conclusive)", "gauge_alert_label_1": "Weak evidence (non conclusive)", "gauge_probability_text": "Probability:", "gauge_generic_detection_text": "AI-Generated image detected", "gauge_scale_explanation_link": "What do the gauge colors mean?", "gauge_scale_modal_explanation_title": "What do the gauge colors mean?", "gauge_scale_modal_explanation_rating_1": "<50% - Weak evidence (non-conclusive)", "gauge_scale_modal_explanation_rating_2": "\u226550% - Moderate evidence (suspicious but non-conclusive)", "gauge_scale_modal_explanation_rating_3": "\u226570% - Strong evidence (AI-generated)", "gauge_scale_modal_explanation_rating_4": "\u226590% - Very strong evidence (AI-generated)", "gauge_download_gauge_button": "Download Gauge Chart as jpeg file"}
\ No newline at end of file
+{"synthetic_image_detection_label": "Media link", "synthetic_image_detection_name": "Synthetic Image Detection", "synthetic_image_detection_placeholder": "Paste the URL here", "synthetic_image_detection_image_type": "Image type", "synthetic_image_detection_results": "Results of the clip selected", "synthetic_image_detection_link": "Image link", "synthetic_image_detection_gan_name": "GAN", "synthetic_image_detection_gan_description": "This method aims to detect if the image has been generated by a Generative Adversarial Network (GAN).", "synthetic_image_detection_diffusion_name": "Latent Diffusion model", "synthetic_image_detection_diffusion_description": "This method aims to detect if the image has been generated through a latent diffusion model neural network.", "synthetic_image_detection_progan_name": "ProGAN", "synthetic_image_detection_progan_description": "This model can detect fully synthetic images generated by ProGAN Models or architectures that are similar. ", "synthetic_image_detection_adm_name": " ADM", "synthetic_image_detection_adm_description": "This model can detect fully synthetic images generated by ADMs or architectures that are similar.", "synthetic_image_detection_progan_rine_mever_name": "ProGAN RINE", "synthetic_image_detection_progan_rine_mever_description": "This model detects fully synthetic images. It specializes in detecting images generated by Generative Adversarial Networks (GAN). The CLIP (Contrastive Language-Image Pre-training) technology extracts key characteristics from the image.", "synthetic_image_detection_ldm_rine_mever_name": "LDM RINE", "synthetic_image_detection_ldm_rine_mever_description": "This model detects fully synthetic images. It specializes in detecting images generated by Latent Diffusion Models (LDM), while exhibiting strong detection performance across several other generative methods. The CLIP (Contrastive Language-Image Pre-training) technology extracts key characteristics from the image.", "synthetic_image_detection_title": "Detection results", "synthetic_image_detection_ldm-webp_r50_grip_name": "LDM WebP r50", "synthetic_image_detection_ldm-webp_r50_grip_description": "This model can detect fully synthetic images of webp format generated by Latent Diffusion Models or architectures that are similar. The model's architecture is a variant of ResNet-50, trained to capture low-level artifacts introduced by the generative model.", "synthetic_image_detection_gigagan-webp_r50_grip_name": "GigaGAN WebP r50", "synthetic_image_detection_gigagan-webp_r50_grip_description": "This model can detect fully synthetic images of webp format generated by GigaGAN or architectures that are similar. The model's architecture is a variant of ResNet-50, trained to capture low-level artifacts introduced by the generative model.", "synthetic_image_detection_progan-webp_r50_grip_name": "ProGAN WebP r50", "synthetic_image_detection_progan-webp_r50_grip_description": "This model can detect fully synthetic images of webp format generated by ProGAN or architectures that are similar. The model's architecture is a variant of ResNet-50, trained to capture low-level artifacts introduced by the generative model.", "synthetic_image_detection_ldm_r50_mever_name": "LDM r50", "synthetic_image_detection_ldm_r50_mever_description": "This model can detect fully synthetic images generated by Latent Diffusion Models or architectures that are similar. The model's architecture is a variant of ResNet-50, trained to capture low-level artifacts introduced by the generative model.", "synthetic_image_detection_alert": "This image has been detected as generated with a ", "synthetic_image_detection_alert_2": " algorithm", "synthetic_image_detection_error_400": "Error: Invalid image link. Ensure it points to a publicly accessible image with dimensions between 128x128 and 2000x2000 pixels.", "synthetic_image_detection_error_generic": "An error happened. Please try again or try a different image", "synthetic_image_detection_algorithms_errors": "One or more algorithms returned errors. The analysis may be incomplete. Make sure the image has dimensions between 128x128 and 2000x2000 pixels.", "synthetic_image_detection_not_found": "No detection found", "submit_button": "Submit", "button_localfile": "Local file", "synthetic_image_detection_gauge_detection": "Detection", "synthetic_image_detection_gauge_no_detection": "No detection", "synthetic_image_detection_additional_results": "View Detection for Submitted Image", "synthetic_image_detection_additional_results_hide": "Hide Detection for Submitted Image", "synthetic_image_detection_ndd_additional_results": "Detection details for similar images", "synthetic_image_detection_ndd_additional_results_hide": "Hide detection details for similar images", "synthetic_image_detection_rating": "Explanation: The veraAI detector of the InVID-WeVerify plugin finds ", "synthetic_image_detection_rating_4": "very strong evidence suggesting that this image is synthetic", "synthetic_image_detection_rating_3": "strong evidence suggesting that this image is synthetic", "synthetic_image_detection_rating_2": "moderate evidence (suspicious but non conclusive) suggesting that this image could be synthetic. The absence of detection does not guarantee the image is not post-edited.", "synthetic_image_detection_rating_1": "weak evidence (non conclusive) suggesting that this image could be synthetic. The absence of detection does not guarantee the image is not post-edited.", "synthetic_image_detection_button_copy_text_1": "Copy text", "synthetic_image_detection_button_copy_text_2": "Text copied!", "synthetic_image_detection_alert_label_4": "Very strong evidence", "synthetic_image_detection_alert_label_3": "Strong evidence", "synthetic_image_detection_alert_label_2": "Moderate evidence (suspicious but non conclusive)", "synthetic_image_detection_alert_label_1": "Weak evidence (non conclusive)", "synthetic_image_detection_probability_text": "Probability:", "synthetic_image_detection_generic_detection_text": "AI-Generated image detected", "synthetic_image_detection_scale_explanation_link": "What do the gauge colors mean?", "synthetic_image_detection_scale_modal_explanation_title": "What do the gauge colors mean?", "synthetic_image_detection_scale_modal_explanation_rating_1": "<50% - Weak evidence (non-conclusive)", "synthetic_image_detection_scale_modal_explanation_rating_2": "\u226550% - Moderate evidence (suspicious but non-conclusive)", "synthetic_image_detection_scale_modal_explanation_rating_3": "\u226570% - Strong evidence (AI-generated)", "synthetic_image_detection_scale_modal_explanation_rating_4": "\u226590% - Very strong evidence (AI-generated)", "synthetic_image_detection_download_gauge_button": "Download Gauge Chart as jpeg file", "synthetic_image_detection_ndd_info": "Similar images were detected as synthetic. See detection details for similar images below.", "synthetic_image_detection_ndd_table_header_1": "ID", "synthetic_image_detection_ndd_table_header_2": "Image", "synthetic_image_detection_ndd_table_header_3": "Algorithm #", "synthetic_image_detection_ndd_table_header_4": "Score #", "synthetic_image_detection_ndd_table_header_5": "Archive URL", "synthetic_image_detection_ndd_table_header_6": "Image URLs", "synthetic_image_detection_ndd_table_header_7": "Open analysis"}
\ No newline at end of file
From 2023bb43cb50a3016f95d1a1ae0e99ad2ef35eee Mon Sep 17 00:00:00 2001
From: Rosanna Milner
Date: Wed, 14 Aug 2024 21:17:36 +0100
Subject: [PATCH 28/35] offline translations
---
public/locales/ar/components/NavItems/tools/Assistant.json | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/public/locales/ar/components/NavItems/tools/Assistant.json b/public/locales/ar/components/NavItems/tools/Assistant.json
index 73471bade..56f60ad30 100644
--- a/public/locales/ar/components/NavItems/tools/Assistant.json
+++ b/public/locales/ar/components/NavItems/tools/Assistant.json
@@ -1 +1 @@
-{"assistant_title": "\u0627\u0644\u0645\u0633\u0627\u0639\u062f", "assistant_intro": "\u064a\u062f\u0639\u0645\u0643 \u0627\u0644\u0645\u0633\u0627\u0639\u062f \u0645\u0646 \u062e\u0644\u0627\u0644 \u062a\u062d\u0644\u064a\u0644 \u0635\u0641\u062d\u0629 \u0648\u064a\u0628 \u0623\u0648 \u0635\u0648\u0631\u0629 \u0623\u0648 \u0645\u0644\u0641 \u0641\u064a\u062f\u064a\u0648 \u0648\u064a\u0642\u062a\u0631\u062d \u0623\u062f\u0648\u0627\u062a Weverify \u0645\u0641\u064a\u062f\u0629 \u0644\u0643\u0644 \u062d\u0627\u0644\u0629", "assistant_choose": "\u0627\u062e\u062a\u0631 \u0645\u0627 \u062a\u0631\u064a\u062f \u062a\u062d\u0644\u064a\u0644\u0647", "assistant_webpage_header": "\u0631\u0627\u0628\u0637 \u0635\u0641\u062d\u0629 \u0627\u0644\u0648\u064a\u0628", "assistant_webpage_text": "\u0623\u062f\u062e\u0644 \u0631\u0627\u0628\u0637 \u0635\u0641\u062d\u0629 \u0627\u0644\u0648\u064a\u0628\u060c \u0648\u0633\u064a\u0642\u062a\u0631\u062d \u0627\u0644\u0645\u0633\u0627\u0639\u062f \u0623\u0643\u062b\u0631 \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0645\u0641\u064a\u062f\u0629 \u0644\u0645\u062d\u062a\u0648\u064a\u0627\u062a \u0627\u0644\u0635\u0641\u062d\u0629 \u0627\u0644\u0645\u062d\u062f\u062f\u0629.", "assistant_file_header": "\u0645\u0644\u0641 \u0645\u062d\u0644\u064a", "assistant_file_text": "\u0633\u064a\u0642\u062a\u0631\u062d \u0627\u0644\u0645\u0633\u0627\u0639\u062f \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0623\u0646\u0633\u0628 \u0627\u0639\u062a\u0645\u0627\u062f\u064b\u0627 \u0639\u0644\u0649 \u0645\u0627 \u0625\u0630\u0627 \u0643\u0627\u0646 \u0627\u0644\u0645\u0644\u0641 \u0645\u0642\u0637\u0639\u064b\u0627 \u0623\u0648 \u0635\u0648\u0631\u0629", "assistant_choose_tool": "\u0627\u062e\u062a\u0631 \u0627\u0644\u0623\u062f\u0627\u0629 \u0627\u0644\u062a\u064a \u062a\u0631\u064a\u062f \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627", "upload_video": "\u0641\u064a\u062f\u064a\u0648", "upload_image": "\u0635\u0648\u0631\u0629", "assistant_urlbox": "\u0639\u0646\u0648\u0627\u0646 URL", "assistant_give_url": "\u0636\u0639 \u0639\u0646\u0648\u0627\u0646 URL \u0644\u0644\u0635\u0641\u062d\u0629 \u0644\u062a\u062d\u0644\u064a\u0647\u0627", "assistant_paste_url": "\u0627\u0644\u0635\u0642 \u0639\u0646\u0648\u0627\u0646 URL \u0647\u0646\u0627", "please_give_a_correct_link": "\u0627\u0644\u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u0642\u062f\u0645 \u063a\u064a\u0631 \u0635\u062d\u064a\u062d \u0623\u0648 \u063a\u064a\u0631 \u0645\u062f\u0639\u0648\u0645.", "button_analyse": "\u062a\u062d\u0644\u064a\u0644", "button_clean": "\u0625\u0632\u0627\u0644\u0629", "save": "\u062d\u0641\u0638", "source_credibility_title": "\u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0627\u0644\u0645\u0635\u062f\u0631", "source_credibility_byline": "\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0645\u0635\u062f\u0631 \u0643\u062c\u0632\u0621 \u0645\u0646 \u0641\u062d\u0635 \u0627\u0644\u0645\u0635\u062f\u0627\u0642\u064a\u0629", "link_explorer_title": "\u0631\u0627\u0628\u0637 \u0627\u0644\u0645\u0633\u062a\u0643\u0634\u0641", "link_explorer_byline": "\u062a\u0645 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0639\u0646\u0627\u0648\u064a\u0646 URL \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0645\u0646 \u0627\u0644\u0635\u0641\u062d\u0629\u060c \u0648\u062a\u0645 \u0641\u062d\u0635 \u0645\u062f\u0649 \u0645\u0635\u062f\u0627\u0642\u064a\u062a\u0647\u0627", "text_title": "\u0646\u0635", "text_intro": "\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0646\u0635 \u0627\u0644\u062a\u0627\u0644\u064a \u0641\u064a \u0627\u0644\u0635\u0641\u062d\u0629", "dbkf_title": "\u0641\u062d\u0635 DBKF", "expand_text": "\u062a\u0648\u0633\u064a\u0639 \u0627\u0644\u0646\u0635", "dbkf_error": "\u062d\u062f\u062b\u062a \u0645\u0634\u0643\u0644\u0629 \u0639\u0646\u062f \u0645\u062d\u0627\u0648\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 \u0628\u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0645\u0648\u0627\u062f \u0627\u0644\u0645\u0632\u064a\u0641\u0629 \u0627\u0644\u0645\u0639\u0631\u0648\u0641\u0629. \u0642\u062f \u064a\u062a\u0645 \u062d\u0630\u0641 \u0628\u0639\u0636 \u0627\u0644\u0646\u062a\u0627\u0626\u062c \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629. \u0625\u0630\u0627 \u0627\u0633\u062a\u0645\u0631\u062a \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u060c \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0648\u0627\u0635\u0644 \u0645\u0639 \u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0641\u0646\u064a.", "sc_failed": "\u0641\u0634\u0644 \u0641\u062d\u0635 \u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0627\u0644\u0645\u0635\u062f\u0631. \u0642\u062f \u0644\u0627 \u064a\u062a\u0645 \u0639\u0631\u0636 \u0628\u0639\u0636 \u0627\u0644\u0646\u062a\u0627\u0626\u062c. \u0625\u0630\u0627 \u0627\u0633\u062a\u0645\u0631\u062a \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u060c \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0648\u0627\u0635\u0644 \u0645\u0639 \u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0641\u0646\u064a.", "link_tooltip": " \u0645\u0627 \u0647\u0630\u0627\u061f \u062a\u0639\u0637\u064a \u0627\u0644\u062f\u0631\u062c\u0627\u062a \u0627\u0644\u0645\u0639\u0631\u0648\u0636\u0629 \u0641\u064a \u0647\u0630\u0627 \u0627\u0644\u0642\u0633\u0645 \u0625\u0634\u0627\u0631\u0629 \u0625\u0644\u0649 \u0645\u062f\u0649 \u0645\u0648\u062b\u0648\u0642\u064a\u0629 \u0645\u0635\u062f\u0631 \u0627\u0644\u0648\u064a\u0628 \u0627\u0644\u0645\u062f\u0631\u062c. \u062a\u062a\u0631\u0627\u0648\u062d \u0627\u0644\u062f\u0631\u062c\u0627\u062a \u0645\u0646 0-100. \u0641\u064a \u0645\u0639\u0638\u0645 \u0627\u0644\u062d\u0627\u0644\u0627\u062a\u060c \u064a\u0643\u0648\u0646 \u0627\u0644\u0645\u0635\u062f\u0631 \u0627\u0644\u0630\u064a \u062a\u0645 \u0641\u062d\u0635\u0647 \u0645\u0635\u062f\u0627\u0642\u064a\u062a\u0647 \u0647\u0648 \u0645\u062c\u0627\u0644 URL. \u0641\u064a \u0628\u0639\u0636 \u0627\u0644\u062d\u0627\u0644\u0627\u062a \u0627\u0644\u062a\u064a \u0644\u0627 \u064a\u0643\u0648\u0646 \u0641\u064a\u0647\u0627 \u0647\u0630\u0627 \u0645\u0641\u064a\u062f\u064b\u0627\u060c \u064a\u062a\u0645 \u0641\u062d\u0635 \u062c\u0632\u0621\u064d \u0623\u0643\u062b\u0631 \u062f\u0644\u0627\u0644\u0629 \u0645\u0646 \u0639\u0646\u0648\u0627\u0646 URL. \u0641\u064a \u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0627\u0644\u0627\u062a\u060c \u064a\u062a\u0645 \u0625\u062f\u0631\u0627\u062c \u0639\u0646\u0648\u0627\u0646 URL \u0627\u0644\u0643\u0627\u0645\u0644 \u0648\u0627\u0644\u0645\u062c\u0627\u0644 \u0627\u0644\u0630\u064a \u062a\u0645 \u0641\u064a\u0647 \u0641\u062d\u0635 \u0645\u0635\u062f\u0627\u0642\u064a\u0629 \u0627\u0644\u0645\u0635\u062f\u0631 \u0639\u0644\u0649 \u0627\u0644\u0634\u0643\u0644 \u0627\u0644\u062a\u0627\u0644\u064a: \u0639\u0646\u0648\u0627\u0646 URL-: \u0627\u0644\u0645\u062c\u0627\u0644 \u0644\u0644\u062a\u062d\u0642\u0642. \u0643\u064a\u0641 \u064a\u062a\u0645 \u062d\u0633\u0627\u0628\u0647\u0627\u061f \u062a\u0642\u0648\u0645 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u0627\u0644\u0645\u062e\u062a\u0644\u0641\u0629 \u0628\u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u0645\u0635\u0627\u062f\u0631 (\u062e\u0627\u0635\u0629 \u0627\u0644\u0645\u062c\u0627\u0644\u0627\u062a) \u0639\u0628\u0631 \u0627\u0644\u0648\u064a\u0628 \u0644\u062a\u0642\u064a\u064a\u0645 \u0645\u062f\u0649 \u0645\u0648\u062b\u0648\u0642\u064a\u062a\u0647\u0627 \u0627\u0644\u062a\u064a \u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0645\u0644 \u0623\u0646 \u062a\u0633\u062a\u0646\u062f \u0625\u0644\u0649 \u0645\u0642\u0627\u064a\u064a\u0633 \u0645\u062e\u062a\u0644\u0641\u0629. < /br> \u0647\u0646\u0627\u060c \u062a\u0645 \u0633\u062d\u0628 \u0645\u062c\u0645\u0648\u0639\u0627\u062a \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u064a \u062a\u0642\u064a\u0645 \u0645\u0648\u062b\u0648\u0642\u064a\u0629 \u0645\u062c\u0627\u0644 \u0627\u0644\u0648\u064a\u0628 \u0628\u0634\u0643\u0644 \u0623\u0633\u0627\u0633\u064a \u0645\u0646 \u0627\u0644\u0645\u0635\u0627\u062f\u0631 \u0627\u0644\u0645\u0641\u062a\u0648\u062d\u0629 \u0648\u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a WeVerify DBKF.< /br> \u0646\u0638\u0631\u0627 \u0644\u0623\u0646 \u0627\u0644\u0645\u0642\u0627\u064a\u064a\u0633 \u0623\u0648 \u0627\u0644\u062f\u0631\u062c\u0627\u062a \u0645\u0646 \u0643\u0644 \u0645\u0646 \u0647\u0630\u0647 \u0627\u0644\u0645\u0635\u0627\u062f\u0631 \u0644\u0627 \u062a\u062a\u062f\u0627\u062e\u0644 \u0628\u0627\u0644\u0636\u0631\u0648\u0631\u0629 \u0648\u0644\u0627 \u064a\u0645\u0643\u0646 \u0645\u0642\u0627\u0631\u0646\u062a\u0647\u0627 \u0628\u0633\u0647\u0648\u0644\u0629 \u060c \u064a\u062a\u0645 \u062a\u0639\u064a\u064a\u0646 \u062c\u0645\u064a\u0639 \u0627\u0644\u062f\u0631\u062c\u0627\u062a \u0645\u0646 \u0623\u064a \u0645\u0624\u0633\u0633\u0629 \u0645\u0639\u064a\u0646\u0629 \u0625\u0644\u0649 \u0631\u0642\u0645 \u0648\u0627\u062d\u062f \u0628\u064a\u0646 0-100. < /br> \u0628\u0627\u0644\u0646\u0633\u0628\u0629 \u0644\u0623\u064a \u0639\u0646\u0648\u0627\u0646 URL \u060c \u062a\u0645 \u0625\u062f\u0631\u0627\u062c \u0642\u0627\u0626\u0645\u0629 \u0628\u062c\u0645\u064a\u0639 \u0627\u0644\u0645\u0624\u0633\u0633\u0627\u062a \u0627\u0644\u062a\u064a \u0623\u0639\u0637\u062a \u0627\u0644\u0646\u0637\u0627\u0642 \u0630\u064a \u0627\u0644\u0635\u0644\u0629 \u062f\u0631\u062c\u0629 \u060c \u0625\u0644\u0649 \u062c\u0627\u0646\u0628 \u0627\u0644\u0646\u062a\u0627\u0626\u062c (\u0627\u0644\u0645\u0639\u064a\u0646\u0629) \u0627\u0644\u062a\u064a \u0642\u062f\u0645\u0648\u0647\u0627. \u0627\u0644\u0646\u062a\u064a\u062c\u0629 \u0627\u0644\u0646\u0647\u0627\u0626\u064a\u0629 \u0627\u0644\u0645\u0639\u0631\u0648\u0636\u0629 \u0644\u0623\u064a \u0645\u062c\u0627\u0644 \u0647\u064a \u0623\u062f\u0646\u0649 \u062f\u0631\u062c\u0629 \u0645\u0646 \u0627\u0644\u0645\u0635\u0627\u062f\u0631 \u0627\u0644\u0645\u062e\u062a\u0644\u0641\u0629. ", "media_title": "\u0648\u0633\u0627\u0626\u0644 \u0627\u0644\u0625\u0639\u0644\u0627\u0645", "images_label": "\u0627\u0644\u0635\u0648\u0631", "videos_label": "\u0623\u0634\u0631\u0637\u0629 \u0641\u064a\u062f\u064a\u0648", "media_found": "\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0639\u0644\u0649 \u0627\u0644\u0635\u0641\u062d\u0629", "media_below": "\u062d\u062f\u062f \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0627\u0644\u062a\u064a \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646\u0647\u0627", "media_to_process": "\u0648\u0633\u0627\u0626\u0637 \u0644\u0644\u0645\u0639\u0627\u0644\u062c\u0629", "assistant_error": "\u062d\u062f\u062b \u062e\u0637\u0623 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639 \u0641\u064a \u0627\u0644\u0645\u0633\u0627\u0639\u062f. \u0625\u0630\u0627 \u0627\u0633\u062a\u0645\u0631\u062a \u0627\u0644\u0645\u0634\u0643\u0644\u0629\u060c \u062a\u0648\u0627\u0635\u0644 \u0645\u0639 \u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0641\u0646\u064a", "things_you_can_do_header": "\u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u0645\u062d\u062a\u0645\u0644\u0629", "things_you_can_do": "\u0641\u064a\u0645\u0627 \u064a\u0644\u064a \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0627\u0644\u062a\u064a \u064a\u0645\u0643\u0646\u0643 \u0627\u0633\u062a\u062e\u062f\u0627\u0645\u0647\u0627 \u0639\u0644\u0649 \u0646\u0648\u0639 \u0627\u0644\u0648\u0633\u0627\u0626\u0637 \u0647\u0630\u0647", "navbar_analysis_image": "\u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u0635\u0648\u0631", "navbar_analysis_video": "\u062a\u062d\u0644\u064a\u0644 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "navbar_keyframes": "\u0625\u0637\u0627\u0631\u0627\u062a \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d", "navbar_thumbnails": "\u0627\u0644\u0635\u0648\u0631\u0629 \u0627\u0644\u0645\u0635\u063a\u0631\u0629", "navbar_twitter": "TW. \u0628\u062d\u062b", "navbar_magnifier": "\u0627\u0644\u0645\u0643\u0628\u0631", "navbar_metadata": "\u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0648\u0635\u0641\u064a\u0629", "navbar_rights": "\u062d\u0642\u0648\u0642 \u0627\u0644\u0641\u064a\u062f\u064a\u0648", "navbar_forensic": "\u0627\u0644\u062a\u062d\u0642\u0642 \u0627\u0644\u0631\u0642\u0645\u064a \u0644\u0644\u0635\u0648\u0631", "navbar_ocr": "OCR", "navbar_twitter_sna": "\u062a\u062f\u0642\u064a\u0642 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0629", "navbar_assistant": "\u0627\u0644\u0645\u0633\u0627\u0639\u062f", "assistant_help_title": "\u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0641\u0646\u064a", "assistant_help_1": "\u062a\u062d\u062a\u0648\u064a \u0645\u062c\u0645\u0648\u0639\u0629 \u0623\u062f\u0648\u0627\u062a WeVerify (\u0647\u0630\u0627 \u0627\u0644\u0645\u0643\u0648\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u064a) \u0639\u0644\u0649 \u0623\u062f\u0648\u0627\u062a \u0645\u062a\u0639\u062f\u062f\u0629 \u064a\u0645\u0643\u0646 \u0623\u0646 \u062a\u0633\u0627\u0639\u062f \u0641\u064a \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0639\u0644\u0649 \u0627\u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0627\u062c\u062a\u0645\u0627\u0639\u064a\u0629 \u060c \u0648\u0647\u064a \u0645\u0635\u0645\u0645\u0629 \u0644\u0645\u0633\u0627\u0639\u062f\u0629 \u0627\u0644\u0635\u062d\u0641\u064a\u064a\u0646 \u0639\u0644\u0649 \u062a\u0648\u0641\u064a\u0631 \u0627\u0644\u0648\u0642\u062a \u0648\u0623\u0646 \u064a\u0643\u0648\u0646\u0648\u0627 \u0623\u0643\u062b\u0631 \u0643\u0641\u0627\u0621\u0629 \u0641\u064a \u0645\u0647\u0627\u0645 \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646 \u0627\u0644\u062d\u0642\u0627\u0626\u0642. \u064a\u0645\u0643\u0646 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0642\u0627\u0626\u0645\u0629 \u0643\u0627\u0645\u0644\u0629 \u0628\u0647\u0630\u0647 \u0627\u0644\u0623\u062f\u0648\u0627\u062a \u0641\u064a \u0642\u0633\u0645 \u0627\u0644\u0628\u0631\u0646\u0627\u0645\u062c \u0627\u0644\u062a\u0639\u0644\u064a\u0645\u064a \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0643\u0648\u0646 \u0627\u0644\u0625\u0636\u0627\u0641\u064a. \u0646\u0638\u0631\u0627 \u0644\u0644\u0623\u062f\u0648\u0627\u062a \u0648\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062a\u0639\u062f\u062f\u0629 \u0627\u0644\u0645\u062a\u0627\u062d\u0629 \u060c \u062a\u0645 \u062a\u0635\u0645\u064a\u0645 \u0645\u0633\u0627\u0639\u062f weverify \u0644\u062a\u0648\u062c\u064a\u0647 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645\u064a\u0646 \u0625\u0644\u0649 \u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062a\u0627\u062d\u0629 \u0644\u0647\u0645 \u0646\u0638\u0631\u0627 \u0644\u0637\u0628\u064a\u0639\u0629 \u0627\u0644\u0645\u062d\u062a\u0648\u0649 \u0627\u0644\u0630\u064a \u064a\u0631\u063a\u0628\u0648\u0646 \u0641\u064a \u0627\u0644\u062a\u062d\u0642\u0642 \u0645\u0646\u0647.