diff --git a/angular.json b/angular.json index a01348f9a136f5de4bc054c13803727cee986091..c16d8983539e20a1e63b4f47b54c9b3215180a2f 100644 --- a/angular.json +++ b/angular.json @@ -23,7 +23,7 @@ ], "styles": [ "src/styles.scss", - "./node_modules/material-design-icons/iconfont/material-icons.css", + "./node_modules/material-icons/iconfont/material-icons.css", "node_modules/prismjs/themes/prism-okaidia.css", "node_modules/prismjs/plugins/line-highlight/prism-line-highlight.css", "node_modules/prismjs/plugins/line-numbers/prism-line-numbers.css", diff --git a/package.json b/package.json index 5e9dd6689e33f2560deda91d908dfa1af35d393e..e2fd9c6e2b55d1d2f83fb6c1115df94f6578759e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "is-promise": "^4.0.0", "katex": "^0.13.0", "mat-color-picker": "^1.4.3", - "material-design-icons": "^3.0.1", + "material-icons": "^1.10.1", "naughty-words": "^1.2.0", "ngx-color-picker": "^11.0.0", "ngx-joyride": "^2.4.0", diff --git a/src/app/components/shared/_dialogs/topic-cloud-administration/TopicCloudAdminData.ts b/src/app/components/shared/_dialogs/topic-cloud-administration/TopicCloudAdminData.ts index e0cc85d7b401aa39ada5ae2dee8264bcbab9d69c..3392f218aaa32ba6f7390ad8cdd64991c025496d 100644 --- a/src/app/components/shared/_dialogs/topic-cloud-administration/TopicCloudAdminData.ts +++ b/src/app/components/shared/_dialogs/topic-cloud-administration/TopicCloudAdminData.ts @@ -14,7 +14,8 @@ export enum TopicCloudAdminDataScoringKey { summedUpvotes = 'summedUpvotes', summedDownvotes = 'summedDownvotes', summedVotes = 'summedVotes', - cappedSummedVotes = 'cappedSummedVotes' + cappedSummedVotes = 'cappedSummedVotes', + controversy = 'controversy' } export type TopicCloudAdminDataScoringObject = { @@ -92,7 +93,8 @@ export const keywordsScoringMinMax: TopicCloudAdminDataScoringPreset = { summedUpvotes: { min: -5, max: 5 }, summedDownvotes: { min: -5, max: 5 }, summedVotes: { min: -5, max: 5 }, - cappedSummedVotes: { min: -5, max: 5 } + cappedSummedVotes: { min: -5, max: 5 }, + controversy: { min: -5, max: 5 } }; export enum KeywordOrFulltext { diff --git a/src/app/components/shared/comment-list/comment-list.component.html b/src/app/components/shared/comment-list/comment-list.component.html index 935914fbac71515d1a92d6fc048b5ea6b79c9c3f..ccd3370b4e788264d58ce0256901e386ac4e1d01 100644 --- a/src/app/components/shared/comment-list/comment-list.component.html +++ b/src/app/components/shared/comment-list/comment-list.component.html @@ -145,6 +145,13 @@ <span [ngClass]="{voteasc: 'down'}[filter.sortType]">{{ 'comment-list.sort-vote-desc' | translate }}</span> </button> + <button mat-menu-item + (click)="applySortingByKey('controversy')" + aria-labelledby="controversy"> + <mat-icon [ngClass]="{controversy: 'controversy'}[filter.sortType]">quickreply</mat-icon> + <span [ngClass]="{controversy: 'controversy'}[filter.sortType]">{{ 'comment-list.sort-controversy' | translate }}</span> + </button> + </mat-menu> <mat-menu #filterMenu="matMenu" @@ -171,6 +178,17 @@ [ngClass]="{bookmark: 'bookmark-icon'}[filter.filterType]">{{ 'comment-list.filter-bookmark' | translate }}</span> </button> + <button mat-menu-item + (focus)="hideCommentsList=true" + (click)="applyFilterByKey('not_bookmarked')" + aria-labelledby="not-bookmark"> + <mat-icon class="not_bookmarked" + [ngClass]="{not_bookmarked: 'not_bookmarked-icon'}[filter.filterType]">bookmark_border + </mat-icon> + <span + [ngClass]="{not_bookmarked: 'not_bookmarked-icon'}[filter.filterType]">{{ 'comment-list.filter-not_bookmarked' | translate }}</span> + </button> + <button mat-menu-item (focus)="hideCommentsList=true" (click)="applyFilterByKey('answer')" @@ -324,6 +342,7 @@ <div id="keyboard_arrow_up">{{'comment-list.a11y-keyboard_arrow_up' | translate}}</div> <div id="keyboard_arrow_down">{{'comment-list.a11y-keyboard_arrow_down' | translate}}</div> <div id="access_time">{{'comment-list.a11y-access_time' | translate}}</div> + <div id="controversy">{{'comment-list.a11y-controversy' | translate}}</div> <div id="filter_list">{{'comment-list.a11y-filter_list' | translate}}</div> <div id="check_circle">{{'comment-list.a11y-check_circle' | translate}}</div> <div id="not_interested">{{'comment-list.a11y-not_interested' | translate}}</div> @@ -331,6 +350,7 @@ <div id="moderator">{{'comment-list.a11y-moderator' | translate}}</div> <div id="lecturer">{{'comment-list.a11y-lecturer' | translate}}</div> <div id="bookmark">{{'comment-list.a11y-bookmark' | translate}}</div> + <div id="not-bookmark">{{'comment-list.a11y-not-bookmark' | translate}}</div> <div id="beamer_icon">{{'comment-list.a11y-beamer_icon' | translate}}</div> <div id="close">{{'comment-list.a11y-close' | translate}}</div> <div id="add">{{'comment-list.a11y-add' | translate}}</div> diff --git a/src/app/components/shared/comment-list/comment-list.component.scss b/src/app/components/shared/comment-list/comment-list.component.scss index 0406d467b2dcac776f2ed43c287f84adbcf72337..21ba728d218114c0327792448de2642069a127db 100644 --- a/src/app/components/shared/comment-list/comment-list.component.scss +++ b/src/app/components/shared/comment-list/comment-list.component.scss @@ -147,7 +147,11 @@ app-comment { } .bookmark-icon { - color: var(--red); + color: var(--magenta); +} + +.not_bookmarked-icon { + color: slategray; } .owner-icon { @@ -187,6 +191,10 @@ h3 { color: var(--red); } +.controversy { + color: var(--primary); +} + ::placeholder { color: var(--on-surface); filter: opacity(0.6); diff --git a/src/app/components/shared/comment-list/comment-list.filter.ts b/src/app/components/shared/comment-list/comment-list.filter.ts index 7db173bdae7263c0e9c3f62e6fef819d6dd44a68..886a31b3f08d2d4734ca2e9dc1540d0df57e7330 100644 --- a/src/app/components/shared/comment-list/comment-list.filter.ts +++ b/src/app/components/shared/comment-list/comment-list.filter.ts @@ -23,6 +23,7 @@ export enum FilterType { wrong = 'wrong', ack = 'ack', bookmark = 'bookmark', + not_bookmarked = 'not_bookmarked', moderator = 'moderator', lecturer = 'lecturer', tag = 'tag', @@ -38,7 +39,8 @@ export type FilterTypeKey = keyof typeof FilterType; export enum SortType { voteasc = 'voteasc', votedesc = 'votedesc', - time = 'time' + time = 'time', + controversy = 'controversy', } export type SortTypeKey = keyof typeof SortType; @@ -81,6 +83,19 @@ export class CommentListFilter { return new CommentListFilter(JSON.parse(localStorage.getItem(name))); } + static calculateControversy(up = 0, down = 0, normalized = true): number { + const summed = up + down; + const stretch = 10; + if (normalized) { + if (summed === 0) { + return 0; + } + return (summed - Math.abs(up - down)) * (1 - stretch / (summed + stretch)) / summed; + } else { + return (summed - Math.abs(up - down)) * (1 - stretch / (summed + stretch)); + } + } + resetToDefault() { this.period = DEFAULT_PERIOD; this.fromNow = null; @@ -209,6 +224,9 @@ export class CommentListFilter { case FilterType.bookmark: filterFunc = (c) => c.bookmark; break; + case FilterType.not_bookmarked: + filterFunc = (c) => !c.bookmark; + break; case FilterType.read: filterFunc = (c) => c.read; break; @@ -258,6 +276,9 @@ export class CommentListFilter { case SortType.time: sortFunc = (a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime(); break; + case SortType.controversy: + sortFunc = (a, b) => CommentListFilter.calculateControversy(b.upvotes, b.downvotes) - + CommentListFilter.calculateControversy(a.upvotes, a.downvotes); } if (sortFunc) { comments.sort(sortFunc); diff --git a/src/app/components/shared/header/header.component.html b/src/app/components/shared/header/header.component.html index 1cc20c002af187d61cab472283a96e5d63b9ed5c..8382f242f982b91ca719597ff3066dbc955b3030 100644 --- a/src/app/components/shared/header/header.component.html +++ b/src/app/components/shared/header/header.component.html @@ -221,7 +221,7 @@ tabindex="0" *ngIf="!router.url.endsWith('moderator/comments')" routerLink="quiz"> - <mat-icon>timer</mat-icon> + <mat-icon class="material-icons-outlined">timer</mat-icon> <span>{{'header.quiz-now' | translate}}</span> </button> diff --git a/src/app/models/export.ts b/src/app/models/export.ts index 88b6c5ab615ec6a9c6d21495c6278269b20a5408..d57b8063d5beb15194452ec6b6181c1f67fa8dd5 100644 --- a/src/app/models/export.ts +++ b/src/app/models/export.ts @@ -148,7 +148,7 @@ export class Export { let acked = this.translationPath + '.comment-acked'; let refused = this.translationPath + '.comment-refused'; let bookmarked = this.translationPath + '.comment-bookmarked'; - let notBookmarked = this.translationPath + '.comment-not-bookmarked'; + let notBookmarked = this.translationPath + '.comment-not_bookmarked'; const roles: [string, string, string] = [ this.translationPath + '.comment-user-role-participant', this.translationPath + '.comment-user-role-moderator', diff --git a/src/app/services/util/tag-cloud-data.service.ts b/src/app/services/util/tag-cloud-data.service.ts index 10e3b1351db3868554c4737f5c9376ad45036411..3ccf5532d0f0caddea5fd7519e12d88cda84164a 100644 --- a/src/app/services/util/tag-cloud-data.service.ts +++ b/src/app/services/util/tag-cloud-data.service.ts @@ -369,6 +369,7 @@ export class TagCloudDataService { tagData.cachedUpVotes * scorings.summedUpvotes.score + tagData.cachedDownVotes * scorings.summedDownvotes.score + tagData.cachedVoteCount * scorings.summedVotes.score + + CommentListFilter.calculateControversy(tagData.cachedUpVotes, tagData.cachedDownVotes, false) * scorings.controversy.score + Math.max(tagData.cachedVoteCount, 0) * scorings.cappedSummedVotes.score; } diff --git a/src/app/utils/stopwords.ts b/src/app/utils/stopwords.ts index 3625f0bda79191aa80709c35f3eecff78516627b..2ab545522864e88145f7016bec60e8412883b45c 100644 --- a/src/app/utils/stopwords.ts +++ b/src/app/utils/stopwords.ts @@ -16,6 +16,7 @@ export const stopWords = [ 'z. b.', 'Zum Beispiel', 'Beispiel', + 'Bsp', 'jede', 'jeder', 'jede/r', @@ -39,10 +40,15 @@ export const stopWords = [ 'Du musst', 'Das heißt', 'Denkst du', + 'Kannst du', + 'Nochmal', 'Teste', 'Falls', 'Nächstes', 'Gib', - 'Guten Tag' + 'Guten Tag', + 'Moin', + 'Satz', + 'Question' ]; export const superfluousSpecialCharacters = '“â€â€˜â€™â€žâ€šÂ«Â»â€¹â€ºã€Žã€ï¹ƒï¹„「ã€ï¹ï¹‚",《》〈〉\'`#&…\\/'; diff --git a/src/assets/i18n/creator/de.json b/src/assets/i18n/creator/de.json index 5ab98733f48df5b760b628c6d5383ae5e95e8013..25dcbaf2034b778b2a5b920eeba076091c252de2 100644 --- a/src/assets/i18n/creator/de.json +++ b/src/assets/i18n/creator/de.json @@ -2,6 +2,7 @@ "comment-list": { "a11y-access_time": "Sortiert Fragen nach der Uhrzeit", "a11y-add": "Option eine Frage zu stellen", + "a11y-controversy": "Sortiert Fragen nach Kontroversität", "a11y-pause": "Stoppt den Fragen -Stream", "a11y-play": "Startet den Fragen-Stream", "a11y-beamer_icon": "Filtert alle besprochenen Fragen", @@ -13,6 +14,7 @@ "a11y-moderator": "Filtert alle Fragen von Moderatoren", "a11y-lecturer": "Filtert alle Fragen von Dozenten", "a11y-bookmark": "Filtert alle Fragen mit Lesezeichen", + "a11y-not-bookmark": "Filtert alle Fragen ohne Lesezeichen", "a11y-keyboard_arrow_down": "Sortiert die Fragen nach absteigenden Bewertungen", "a11y-keyboard_arrow_up": "Sortiert die Fragen nach aufsteigenden Bewertungen", "a11y-not_interested": "Filtert alle verneinten Fragen", @@ -42,6 +44,7 @@ "filter-correct": "Bejahte Fragen", "filter-favorite": "Vorgemerkt für einen Bonus", "filter-bookmark": "Markierte Fragen", + "filter-not_bookmarked": "Fragen ohne Markierung", "filter-moderator": "Hinweise des Moderators", "filter-lecturer": "Ankündigungen", "filter-owner": "Meine Fragen", @@ -55,6 +58,7 @@ "sort-comments": "Fragen sortieren", "sort-vote-asc": "Höchste Bewertung zuerst", "sort-vote-desc": "Niedrigste Bewertung zuerst", + "sort-controversy": "Kontroverse Fragen zuerst", "sort-list-time": "Neueste Frage zuerst", "time": "Antichronologisch", "vote-asc": "Aufsteigende Bewertungen", @@ -89,7 +93,7 @@ "comment-refused": "Moderiert", "bookmark": "Lesezeichen", "comment-bookmarked": "Ja", - "comment-not-bookmarked": "Nein", + "comment-not_bookmarked": "Nein", "comment-got-favorited": "Der Autor dieser guten Frage freut sich über einen Bonus.", "upvotes": "Upvotes", "downvotes": "Downvotes", @@ -472,6 +476,8 @@ "keyword-scoring-summedVotes-info": "Summe aus den Up- und Downvotes, die auf den Kommentaren mit diesem Schlüsselwort gemacht worden sind", "keyword-scoring-cappedSummedVotes": "Summe aller Votes (>= 0)", "keyword-scoring-cappedSummedVotes-info": "(Siehe Summe aller Votes). Die Summe kann nicht unter null fallen und wird minimal 0", + "keyword-scoring-controversy": "Kontroversität einer Frage", + "keyword-scoring-controversy-info": "Bildet eine Punktzahl, die von den Upvotes und Downvotes abhängt.", "profanity": "Vulgäre Wörter mit »***« überschreiben", "hide-blacklist-words": "Themen aus der Blacklist verbergen", "sort-alpha": "Alphabetisch", diff --git a/src/assets/i18n/creator/en.json b/src/assets/i18n/creator/en.json index 60c28801b11713fd49a0a3c618bd33032ad62365..23fe04602ebf4d1849f1f8403fc1952f44e79ba9 100644 --- a/src/assets/i18n/creator/en.json +++ b/src/assets/i18n/creator/en.json @@ -2,6 +2,7 @@ "comment-list": { "a11y-access_time": "Sorts questions by time", "a11y-add": "Option to ask a question or to write a message to the audience", + "a11y-controversy": "Sorts questions by controversy", "a11y-pause": "Stops question stream", "a11y-play": "Starts question stream", "a11y-beamer_icon": "Filters all discussed questions", @@ -13,6 +14,7 @@ "a11y-moderator": "Filters all moderator questions", "a11y-lecturer": "Filters all lecturer questions", "a11y-bookmark": "Filters all bookmark questions", + "a11y-not-bookmark": "Filters all questions without bookmarks", "a11y-keyboard_arrow_down": "Sorts questions by descending votes", "a11y-keyboard_arrow_up": "Sorts questions by ascending votes", "a11y-not_interested": "Filters all questions marked as wrong", @@ -37,11 +39,12 @@ "correct": "Marked as correct", "favorite": "Bonus question", "filter-answered": "Answered questions", - "filter-unanswered": "Unanswered questions", + "filter-unanswered": "Not answered", "filter-comments": "Filter questions", "filter-correct": "Affirmed questions", "filter-favorite": "Booked for a bonus", "filter-bookmark": "Bookmarked questions", + "filter-not_bookmarked": "Not bookmarked", "filter-moderator": "Notes from the moderator", "filter-lecturer": "Announcements", "filter-owner": "My questions", @@ -55,6 +58,7 @@ "sort-comments": "Sort questions", "sort-vote-asc": "Highest rating first", "sort-vote-desc": "Lowest rating first", + "sort-controversy": "Controversial questions first", "sort-list-time": "Newest question first", "time": "Time", "unread": "Not discussed", @@ -90,7 +94,7 @@ "comment-refused": "Moderated", "bookmark": "Bookmark", "comment-bookmarked": "Yes", - "comment-not-bookmarked": "No", + "comment-not_bookmarked": "No", "comment-got-favorited": "The author of this good question is happy to receive a bonus.", "upvotes": "Upvotes", "downvotes": "Downvotes", @@ -482,6 +486,8 @@ "keyword-scoring-summedVotes-info": "Sum of the upvotes and downvotes made on the comments with this keyword", "keyword-scoring-cappedSummedVotes": "Sum of all votes (>= 0)", "keyword-scoring-cappedSummedVotes-info": "(See the sum of all votes). The sum cannot fall below zero and becomes a minimum of 0", + "keyword-scoring-controversy": "Controversy of a question", + "keyword-scoring-controversy-info": "Forms a score depending on the upvotes and downvotes.", "profanity": "Censor profanity", "hide-blacklist-words": "Hide blacklist keywords", "sort-alpha": "Alphabetically", diff --git a/src/assets/i18n/demo/demo-en.html b/src/assets/i18n/demo/demo-en.html index 340b7940dd41f4816b09b5c8cb075dc13d6534b2..ed03d6f9f32f9a7adaa8c8e23ab71e8c28c53bae 100644 --- a/src/assets/i18n/demo/demo-en.html +++ b/src/assets/i18n/demo/demo-en.html @@ -142,7 +142,7 @@ The quick location of specific questions is made possible by search, sort and filter options. The full text search also includes the answers. Sorting is possible by time and rating. - The following filter criteria can be selected: Bonus-awarded, bookmarked, answered, unanswered, and own questions. + The following filter criteria can be selected: Bonus-awarded, bookmarked, not bookmarked, answered, unanswered, and own questions. By clicking on the tag icon of a question, all questions of this category are displayed. By clicking on the user icon of a question, all questions of this user will be displayed. This allows you to assess the distribution of questions among the question posers: diff --git a/src/assets/i18n/home/de.json b/src/assets/i18n/home/de.json index 2236ca0343bb5af16b0621c571ff47ba052d5cea..833150213f8d04452dca32cf0367bcca680a0162 100644 --- a/src/assets/i18n/home/de.json +++ b/src/assets/i18n/home/de.json @@ -348,7 +348,7 @@ "comment-refused": "Moderiert", "bookmark": "Lesezeichen", "comment-bookmarked": "Ja", - "comment-not-bookmarked": "Nein", + "comment-not_bookmarked": "Nein", "upvotes": "Upvotes", "downvotes": "Downvotes", "score": "Score", diff --git a/src/assets/i18n/home/en.json b/src/assets/i18n/home/en.json index 4054fefc8381761122d9552345db245c4e1eb5df..d632863905b1f0f56bebbf95e520dbe3a0f536e0 100644 --- a/src/assets/i18n/home/en.json +++ b/src/assets/i18n/home/en.json @@ -350,7 +350,7 @@ "comment-refused": "Moderated", "bookmark": "Bookmark", "comment-bookmarked": "Yes", - "comment-not-bookmarked": "No", + "comment-not_bookmarked": "No", "upvotes": "Upvotes", "downvotes": "Downvotes", "score": "Score", diff --git a/src/assets/i18n/participant/de.json b/src/assets/i18n/participant/de.json index 8d49dcab77a105e2672f35ed275a4f5527404f43..0530a6077a155c08abfaedeb0fe358dd6237ffdd 100644 --- a/src/assets/i18n/participant/de.json +++ b/src/assets/i18n/participant/de.json @@ -2,6 +2,7 @@ "comment-list": { "a11y-access_time": "Sortiert Fragen nach der Uhrzeit", "a11y-add": "Option eine Frage zu stellen", + "a11y-controversy": "Sortiert Fragen nach Kontroversität", "a11y-pause": "Stoppt den Fragen-Stream", "a11y-play": "Startet den Fragen-Stream", "a11y-beamer_icon": "Filtert alle besprochenen Fragen", @@ -13,6 +14,7 @@ "a11y-moderator": "Filtert alle Fragen von Moderatoren", "a11y-lecturer": "Filtert alle Fragen von Dozenten", "a11y-bookmark": "Filtert alle Fragen mit Lesezeichen", + "a11y-not-bookmark": "Filtert alle Fragen ohne Lesezeichen", "a11y-keyboard_arrow_down": "Sortiert die Fragen nach absteigenden Bewertungen", "a11y-keyboard_arrow_up": "Sortiert die Fragen nach aufsteigenden Bewertungen", "a11y-not_interested": "Filtert alle verneinten Fragen", @@ -44,6 +46,7 @@ "filter-correct": "Bejahte Fragen", "filter-favorite": "Vorgemerkt für einen Bonus", "filter-bookmark": "Lesezeichen", + "filter-not_bookmarked": "Ohne Lesezeichen", "filter-moderator": "Hinweise des Moderators", "filter-lecturer": "Ankündigungen", "filter-owner": "Meine Fragen", @@ -56,6 +59,7 @@ "sort-comments": "Fragen sortieren", "sort-vote-asc": "Höchste Bewertung zuerst", "sort-vote-desc": "Niedrigste Bewertung zuerst", + "sort-controversy": "Kontroverse Fragen zuerst", "sort-list-time": "Neueste Frage zuerst", "tag": "Kategorie", "time": "Zeit", @@ -91,7 +95,7 @@ "comment-refused": "Moderiert", "bookmark": "Lesezeichen", "comment-bookmarked": "Ja", - "comment-not-bookmarked": "Nein", + "comment-not_bookmarked": "Nein", "upvotes": "Upvotes", "downvotes": "Downvotes", "score": "Score", @@ -384,6 +388,8 @@ "keyword-scoring-summedVotes-info": "Summe aus den Up- und Downvotes, die auf den Kommentaren mit diesem Schlüsselwort gemacht worden sind", "keyword-scoring-cappedSummedVotes": "Summe aller Votes (>= 0)", "keyword-scoring-cappedSummedVotes-info": "(Siehe Summe aller Votes). Die Summe kann nicht unter null fallen und wird minimal 0", + "keyword-scoring-controversy": "Kontroversität einer Frage", + "keyword-scoring-controversy-info": "Bildet eine Punktzahl, die von den Upvotes und Downvotes abhängt.", "profanity": "Vulgäre Wörter mit »***« überschreiben", "hide-blacklist-words": "Themen aus der Blacklist verbergen", "sort-alpha": "Alphabetisch", diff --git a/src/assets/i18n/participant/en.json b/src/assets/i18n/participant/en.json index f8899f26c438ee5bea69d3f20046bc2a15f7fb2e..ee4a93093b347e3e16472b63562fb9f985c5eba2 100644 --- a/src/assets/i18n/participant/en.json +++ b/src/assets/i18n/participant/en.json @@ -12,6 +12,7 @@ "comment-list": { "a11y-access_time": "Sorts questions by time", "a11y-add": "Option to ask a question", + "a11y-controversy": "Sorts questions by controversy", "a11y-pause": "Stops question stream", "a11y-play": "Starts question stream", "a11y-beamer_icon": "Filters all discussed questions", @@ -23,6 +24,7 @@ "a11y-moderator": "Filters all moderator questions", "a11y-lecturer": "Filters all lecturer questions", "a11y-bookmark": "Filters all bookmark questions", + "a11y-not-bookmark": "Filters all questions without bookmarks", "a11y-keyboard_arrow_down": "Sorts questions by descending votes", "a11y-keyboard_arrow_up": "Sorts questions by ascending votes", "a11y-not_interested": "Filters all questions marked as wrong", @@ -49,11 +51,12 @@ "correct": "Marked as correct", "favorite": "Bonus question", "filter-answered": "Answered questions", - "filter-unanswered": "Unanswered questions", + "filter-unanswered": "Not answered", "filter-comments": "Filter questions", "filter-correct": "Affirmed questions", "filter-favorite": "Booked for a bonus", "filter-bookmark": "Bookmarked questions", + "filter-not_bookmarked": "Not bookmarked", "filter-moderator": "Notes from the moderator", "filter-lecturer": "Announcements", "filter-owner": "My questions", @@ -66,6 +69,7 @@ "sort-comments": "Sort questions", "sort-vote-asc": "Highest rating first", "sort-vote-desc": "Lowest rating first", + "sort-controversy": "Controversial questions first", "sort-list-time": "Latest question first", "tag": "Tag", "time": "Time", @@ -101,7 +105,7 @@ "comment-refused": "Moderated", "bookmark": "Bookmark", "comment-bookmarked": "Yes", - "comment-not-bookmarked": "No", + "comment-not_bookmarked": "No", "upvotes": "Upvotes", "downvotes": "Downvotes", "score": "Score", @@ -390,6 +394,8 @@ "keyword-scoring-summedVotes-info": "Sum of the upvotes and downvotes made on the comments with this keyword", "keyword-scoring-cappedSummedVotes": "Sum of all votes (>= 0)", "keyword-scoring-cappedSummedVotes-info": "(See the sum of all votes). The sum cannot fall below zero and becomes a minimum of 0", + "keyword-scoring-controversy": "Controversy of a question", + "keyword-scoring-controversy-info": "Forms a score depending on the upvotes and downvotes.", "profanity": "Censor profanity", "hide-blacklist-words": "Hide blacklist keywords", "sort-alpha": "Alphabetically",