Merge branches 'develop' and 'develop' of codeberg.org:calckey/calckey into develop

This commit is contained in:
ThatOneCalculator 2023-05-23 18:00:10 -07:00
commit c4d490c8da
15 changed files with 479 additions and 329 deletions

View File

@ -226,6 +226,8 @@ _mfm:
play: Posar en marxa MFM
warn: MFM pot contenir animacions cridaneres o que es mouen ràpidament
alwaysPlay: Reprodueix automàticament tots els MFM animats
fade: Esvair
fadeDescription: Esvaeix el contingut cap a dintre i cap en fora.
_theme:
keys:
mention: "Menció"
@ -712,6 +714,9 @@ _notification:
pollEnded: Es resultat de la enquesta ja està disponible
emptyPushNotificationMessage: Les notificacions push s'han actualitzat
youWereInvitedToGroup: "{userName} t'ha convidat a un grup"
reacted: Ha reaccionat a la teva publicació
renoted: Ha impulsat la teva publicació
voted: Ha votat a la teva enquesta
_deck:
_columns:
notifications: "Notificacions"

File diff suppressed because it is too large Load Diff

View File

@ -1962,6 +1962,9 @@ _notification:
youWereInvitedToGroup: "{userName} invited you to a group"
pollEnded: "Poll results have become available"
emptyPushNotificationMessage: "Push notifications have been updated"
reacted: "reacted to your post"
renoted: "boosted your post"
voted: "voted on your poll"
_types:
all: "All"
follow: "New followers"

View File

@ -102,7 +102,7 @@ unfollow: "Ontvolgen"
followRequestPending: "Wachten op goedkeuring volgverzoek"
enterEmoji: "Voer een emoji in"
renote: "Boost"
unrenote: "Stop herdelen"
unrenote: "Boost intrekken"
renoted: "Boosted."
cantRenote: "Dit bericht kan niet worden geboost."
cantReRenote: "Een boost kan niet worden geboost."
@ -145,7 +145,7 @@ autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de v
al volgt"
addAccount: "Account toevoegen"
loginFailed: "Aanmelding mislukt."
showOnRemote: "Toon op de externe instantie."
showOnRemote: "Bekijk op de externe server"
general: "Algemeen"
wallpaper: "Achtergrond"
setWallpaper: "Achtergrond instellen"
@ -164,7 +164,7 @@ selectUser: "Kies een gebruiker"
recipient: "Ontvanger(s)"
annotation: "Reacties"
federation: "Federatie"
instances: "Server"
instances: "Servers"
registeredAt: "Geregistreerd op"
latestRequestSentAt: "Laatste aanvraag verstuurd"
latestRequestReceivedAt: "Laatste aanvraag ontvangen"
@ -189,8 +189,8 @@ instanceInfo: "Serverinformatie"
statistics: "Statistieken"
clearQueue: "Wachtrij wissen"
clearQueueConfirmTitle: "Weet je zeker dat je de wachtrji leeg wil maken?"
clearQueueConfirmText: "Niet-bezorgde biljetten die nog in de wachtrij staan, worden
niet gefedereerd. Meestal is deze operatie niet nodig."
clearQueueConfirmText: "Niet-bezorgde posts die nog in de wachtrij staan, worden niet
gefedereerd. Meestal is deze operatie niet nodig."
clearCachedFiles: "Cache opschonen"
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache
wilt verwijderen?"
@ -519,3 +519,117 @@ renoteUnmute: Ontdemp boosts
jumpToPrevious: Spring naar vorige
caseSensitive: Hoofdlettergevoelig
cw: Inhoudswaarschuwing
recaptcha: reCAPTCHA
enableRecaptcha: reCAPTCHA inschakelen
recaptchaSiteKey: Site sleutel
notFoundDescription: Een pagina met deze URL kon niet worden gevonden.
uploadFolder: Standaard map voor uploads
markAsReadAllNotifications: Markeer alle notificaties als gelezen
text: Tekst
enable: Inschakelen
or: Of
language: Taal
securityKey: Veiligheidssleutel
groupInvited: Je bent voor een groep uitgenodigd
docSource: Bron van dit document
createAccount: Maak account aan
groupName: Groepsnaam
members: Leden
messagingWithUser: Privé chat
messagingWithGroup: Groepschat
title: Titel
createGroup: Maak een groep
ownedGroups: Beheerde groepen
invites: Uitnodigingen
useOsNativeEmojis: Gebruik je standaard besturingssysteem Emojis
disableDrawer: Gebruik niet de lade-stijl menus
joinOrCreateGroup: Krijg een uitnodiging voor een groep of maak er zelf eentje aan.
noHistory: Geen geschiedenis beschikbaar
signinHistory: Inloggeschiedenis
available: Beschikbaar
unavailable: Niet beschikbaar
tooShort: Te kort
signinFailed: Niet gelukt om in te loggen. Gebruikersnaam of wachtwoord is incorrect.
tapSecurityKey: Tik je veiligheidssleutel aan
recaptchaSecretKey: Geheime sleutel
antennas: Antennes
antennaUsersDescription: Zet één gebruikersnaam per regel neer
notesAndReplies: Posts en antwoorden
withFiles: Met bestanden
popularUsers: Populaire gebruikers
recentlyUpdatedUsers: Recente actieve gebruikers
recentlyRegisteredUsers: Nieuwe gebruikers
recentlyDiscoveredUsers: Nieuwe ontdekte gebruikers
exploreUsersCount: Er zijn {count} gebruikers
about: Over
exploreFediverse: Ontdek de Fediverse
popularTags: Populaire labels
moderation: Moderatie
nUsersMentioned: Genoemd door {n} gebruikers
markAsReadAllUnreadNotes: Markeer alle posts als gelezen
markAsReadAllTalkMessages: Markeer alle berichten als gelezen
help: Help
inputMessageHere: Schrijf hier je bericht
close: Sluiten
group: Groep
groups: Groepen
newMessageExists: Er zijn nieuwe berichten
next: Volgende
noteOf: Post door {user}
inviteToGroup: Nodig uit voor de groep
quoteAttached: Quote
noMessagesYet: Nog geen berichten
weakPassword: Zwak wachtwoord
normalPassword: Middelmatig wachtwoord
strongPassword: Sterk wachtwoord
onlyOneFileCanBeAttached: Je kan maar één bestand toevoegen aan je bericht
invitationCode: Uitnodigingscode
checking: Controleren...
uiLanguage: Gebruikersinterface taal
aboutX: Over {x}
youHaveNoGroups: Je hebt geen groepen
disableAnimatedMfm: Schakel MFM met animaties uit
passwordMatched: Komt overeen
passwordNotMatched: Komt niet overeen
signinWith: Log in met {x}
fontSize: Tekstgrootte
openImageInNewTab: Open afbeeldingen in een nieuwe tab
category: Categorie
tags: Labels
existingAccount: Bestaand account
regenerate: Hernieuwen
dayOverDayChanges: Verschillen met gisteren
appearance: Uiterlijk
local: Lokaal
remote: Extern
total: Totaal
weekOverWeekChanges: Verschillen met vorige week
hcaptcha: hCaptcha
enableHcaptcha: hCaptcha inschakelen
hcaptchaSiteKey: Site sleutel
hcaptchaSecretKey: Geheime sleutel
withReplies: Met antwoorden
twoStepAuthentication: Tweefactorauthenticatie
moderator: Moderator
invitations: Uitnodigingen
tooLong: Te lang
doing: Verwerken...
silencedInstances: Gedempte Servers
cacheRemoteFilesDescription: Als deze instelling is uitgeschakeld, worden externe
bestanden direct van de externe server geladen. Het uitschakelen zal opslagruimte
verminderen, maar verkeer zal toenemen, omdat er geen thumbnails gemaakt zullen
worden.
flagSpeakAsCatDescription: Je posts zullen worden ge-'nyanified' als je in kat-modus
zit
avoidMultiCaptchaConfirm: Het gebruik van meerdere Captcha systemen kan voor storing
zorgen tussen ze. Wil je de andere actieve Captcha systemen uitschakelen? Als je
ze ingeschakeld wilt houden, klik op annuleren.
silence: Dempen
silenceConfirm: Weet je zeker dat je deze gebruiker wilt dempen?
unsilence: Ontdempen
unsilenceConfirm: Weet je zeker dat je het dempen van deze gebruiker ongedaan wilt
maken?
silenceThisInstance: Demp deze server
silenced: Gedempt
disablingTimelinesInfo: Beheerders en moderators zullen altijd toegang hebben tot
alle tijdlijnen, zelfs als deze uitgeschakeld zijn.

View File

@ -2,6 +2,7 @@ import define from "../../../define.js";
import { Emojis } from "@/models/index.js";
import { toPuny } from "@/misc/convert-host.js";
import { makePaginationQuery } from "../../../common/make-pagination-query.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["admin"],
@ -106,7 +107,9 @@ export default define(meta, paramDef, async (ps) => {
}
if (ps.query) {
q.andWhere("emoji.name like :query", { query: `%${ps.query}%` });
q.andWhere("emoji.name like :query", {
query: `%${sqlLikeEscape(ps.query)}%`,
});
}
const emojis = await q.orderBy("emoji.id", "DESC").take(ps.limit).getMany();

View File

@ -2,6 +2,7 @@ import define from "../../../define.js";
import { Emojis } from "@/models/index.js";
import { makePaginationQuery } from "../../../common/make-pagination-query.js";
import type { Emoji } from "@/models/entities/emoji.js";
//import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["admin"],
@ -96,7 +97,7 @@ export default define(meta, paramDef, async (ps) => {
let emojis: Emoji[];
if (ps.query) {
//q.andWhere('emoji.name ILIKE :q', { q: `%${ps.query}%` });
//q.andWhere('emoji.name ILIKE :q', { q: `%${sqlLikeEscape(ps.query)}%` });
//const emojis = await q.take(ps.limit).getMany();
emojis = await q.getMany();

View File

@ -1,5 +1,6 @@
import { Users } from "@/models/index.js";
import define from "../../define.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["admin"],
@ -106,7 +107,7 @@ export default define(meta, paramDef, async (ps, me) => {
if (ps.username) {
query.andWhere("user.usernameLower like :username", {
username: `${ps.username.toLowerCase()}%`,
username: `${sqlLikeEscape(ps.username.toLowerCase())}%`,
});
}

View File

@ -2,6 +2,7 @@ import config from "@/config/index.js";
import define from "../../define.js";
import { Instances } from "@/models/index.js";
import { fetchMeta } from "@/misc/fetch-meta.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["federation"],
@ -178,7 +179,7 @@ export default define(meta, paramDef, async (ps, me) => {
if (ps.host) {
query.andWhere("instance.host like :host", {
host: `%${ps.host.toLowerCase()}%`,
host: `%${sqlLikeEscape(ps.host.toLowerCase())}%`,
});
}

View File

@ -1,5 +1,6 @@
import define from "../../define.js";
import { Hashtags } from "@/models/index.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["hashtags"],
@ -31,7 +32,9 @@ export const paramDef = {
export default define(meta, paramDef, async (ps) => {
const hashtags = await Hashtags.createQueryBuilder("tag")
.where("tag.name like :q", { q: `${ps.query.toLowerCase()}%` })
.where("tag.name like :q", {
q: `${sqlLikeEscape(ps.query.toLowerCase())}%`,
})
.orderBy("tag.count", "DESC")
.groupBy("tag.id")
.take(ps.limit)

View File

@ -9,6 +9,7 @@ import { makePaginationQuery } from "../../common/make-pagination-query.js";
import { generateVisibilityQuery } from "../../common/generate-visibility-query.js";
import { generateMutedUserQuery } from "../../common/generate-muted-user-query.js";
import { generateBlockedUserQuery } from "../../common/generate-block-query.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["notes"],
@ -77,7 +78,7 @@ export default define(meta, paramDef, async (ps, me) => {
}
query
.andWhere("note.text ILIKE :q", { q: `%${ps.query}%` })
.andWhere("note.text ILIKE :q", { q: `%${sqlLikeEscape(ps.query)}%` })
.innerJoinAndSelect("note.user", "user")
.leftJoinAndSelect("user.avatar", "avatar")
.leftJoinAndSelect("user.banner", "banner")

View File

@ -3,6 +3,7 @@ import { Followings, Users } from "@/models/index.js";
import { USER_ACTIVE_THRESHOLD } from "@/const.js";
import type { User } from "@/models/entities/user.js";
import define from "../../define.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["users"],
@ -44,11 +45,13 @@ export default define(meta, paramDef, async (ps, me) => {
if (ps.host) {
const q = Users.createQueryBuilder("user")
.where("user.isSuspended = FALSE")
.andWhere("user.host LIKE :host", { host: `${ps.host.toLowerCase()}%` });
.andWhere("user.host LIKE :host", {
host: `${sqlLikeEscape(ps.host.toLowerCase())}%`,
});
if (ps.username) {
q.andWhere("user.usernameLower LIKE :username", {
username: `${ps.username.toLowerCase()}%`,
username: `${sqlLikeEscape(ps.username.toLowerCase())}%`,
});
}
@ -71,7 +74,7 @@ export default define(meta, paramDef, async (ps, me) => {
.andWhere("user.id != :meId", { meId: me.id })
.andWhere("user.isSuspended = FALSE")
.andWhere("user.usernameLower LIKE :username", {
username: `${ps.username.toLowerCase()}%`,
username: `${sqlLikeEscape(ps.username.toLowerCase())}%`,
})
.andWhere(
new Brackets((qb) => {
@ -95,7 +98,7 @@ export default define(meta, paramDef, async (ps, me) => {
.andWhere("user.id != :meId", { meId: me.id })
.andWhere("user.isSuspended = FALSE")
.andWhere("user.usernameLower LIKE :username", {
username: `${ps.username.toLowerCase()}%`,
username: `${sqlLikeEscape(ps.username.toLowerCase())}%`,
})
.andWhere("user.updatedAt IS NOT NULL");
@ -112,7 +115,7 @@ export default define(meta, paramDef, async (ps, me) => {
users = await Users.createQueryBuilder("user")
.where("user.isSuspended = FALSE")
.andWhere("user.usernameLower LIKE :username", {
username: `${ps.username.toLowerCase()}%`,
username: `${sqlLikeEscape(ps.username.toLowerCase())}%`,
})
.andWhere("user.updatedAt IS NOT NULL")
.orderBy("user.updatedAt", "DESC")

View File

@ -2,6 +2,7 @@ import { Brackets } from "typeorm";
import { UserProfiles, Users } from "@/models/index.js";
import type { User } from "@/models/entities/user.js";
import define from "../../define.js";
import { sqlLikeEscape } from "@/misc/sql-like-escape.js";
export const meta = {
tags: ["users"],
@ -50,7 +51,7 @@ export default define(meta, paramDef, async (ps, me) => {
if (isUsername) {
const usernameQuery = Users.createQueryBuilder("user")
.where("user.usernameLower LIKE :username", {
username: `${ps.query.replace("@", "").toLowerCase()}%`,
username: `${sqlLikeEscape(ps.query.replace("@", "").toLowerCase())}%`,
})
.andWhere(
new Brackets((qb) => {
@ -77,12 +78,14 @@ export default define(meta, paramDef, async (ps, me) => {
const nameQuery = Users.createQueryBuilder("user")
.where(
new Brackets((qb) => {
qb.where("user.name ILIKE :query", { query: `%${ps.query}%` });
qb.where("user.name ILIKE :query", {
query: `%${sqlLikeEscape(ps.query)}%`,
});
// Also search username if it qualifies as username
if (Users.validateLocalUsername(ps.query)) {
qb.orWhere("user.usernameLower LIKE :username", {
username: `%${ps.query.toLowerCase()}%`,
username: `%${sqlLikeEscape(ps.query.toLowerCase())}%`,
});
}
}),
@ -113,7 +116,7 @@ export default define(meta, paramDef, async (ps, me) => {
const profQuery = UserProfiles.createQueryBuilder("prof")
.select("prof.userId")
.where("prof.description ILIKE :query", {
query: `%${ps.query}%`,
query: `%${sqlLikeEscape(ps.query)}%`,
});
if (ps.origin === "local") {

View File

@ -5,7 +5,7 @@
v-show="!isDeleted"
ref="el"
v-hotkey="keymap"
v-size="{ max: [500, 450, 350, 300] }"
v-size="{ max: [500, 450, 350] }"
class="tkcbzcuz note-container"
:tabindex="!isDeleted ? '-1' : null"
:class="{ renote: isRenote }"

View File

@ -1,8 +1,8 @@
<template>
<div
ref="elRef"
v-size="{ max: [500, 600] }"
class="qglefbjs"
v-size="{ max: [500, 450] }"
class="qglefbjs notification"
:class="notification.type"
>
<div class="head">
@ -114,6 +114,7 @@
:to="notePage(notification.note)"
:title="getNoteSummary(notification.note)"
>
<span>{{ i18n.ts._notification.reacted }}</span>
<i class="ph-quotes ph-fill ph-lg"></i>
<Mfm
:text="getNoteSummary(notification.note)"
@ -129,6 +130,7 @@
:to="notePage(notification.note)"
:title="getNoteSummary(notification.note.renote)"
>
<span>{{ i18n.ts._notification.renoted }}</span>
<i class="ph-quotes ph-fill ph-lg"></i>
<Mfm
:text="getNoteSummary(notification.note.renote)"
@ -183,6 +185,7 @@
:to="notePage(notification.note)"
:title="getNoteSummary(notification.note)"
>
<span>{{ i18n.ts._notification.voted }}</span>
<i class="ph-quotes ph-fill ph-lg"></i>
<Mfm
:text="getNoteSummary(notification.note)"
@ -210,7 +213,7 @@
<span
v-if="notification.type === 'follow'"
class="text"
style="opacity: 0.6"
style="opacity: 0.7"
>{{ i18n.ts.youGotNewFollower }}
<div v-if="full">
<MkFollowButton
@ -221,13 +224,13 @@
<span
v-if="notification.type === 'followRequestAccepted'"
class="text"
style="opacity: 0.6"
style="opacity: 0.7"
>{{ i18n.ts.followRequestAccepted }}</span
>
<span
v-if="notification.type === 'receiveFollowRequest'"
class="text"
style="opacity: 0.6"
style="opacity: 0.7"
>{{ i18n.ts.receiveFollowRequest }}
<div v-if="full && !followRequestDone">
<button class="_textButton" @click="acceptFollowRequest()">
@ -242,7 +245,7 @@
<span
v-if="notification.type === 'groupInvited'"
class="text"
style="opacity: 0.6"
style="opacity: 0.7"
>{{ i18n.ts.groupInvited }}:
<b>{{ notification.invitation.group.name }}</b>
<div v-if="full && !groupInviteDone">
@ -389,14 +392,13 @@ useTooltip(reactionRef, (showing) => {
display: flex;
contain: content;
&.max-width_600px {
padding: 16px;
font-size: 0.9em;
}
&.max-width_500px {
padding: 12px;
font-size: 0.85em;
padding-block: 16px;
font-size: 0.9em;
}
&.max-width_450px {
padding: 12px 16px;
}
> .head {
@ -509,9 +511,17 @@ useTooltip(reactionRef, (showing) => {
> .text {
white-space: nowrap;
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
> span:first-child {
opacity: .7;
&::after { content: ": " }
}
> i {
vertical-align: super;
font-size: 50%;

View File

@ -361,7 +361,7 @@ onMounted(() => {
> span {
font-size: 1em;
color: var(--accent);
:global(span) {
:deep(span) {
white-space: nowrap;
}
}