Update - This is an automated commit

mane
Mia Raindrops 3 months ago
parent a70a7a3983
commit fff87a11d8
Signed by: Mia Raindrops
GPG Key ID: EFBDC68435A574B7

@ -71,6 +71,7 @@ if (!isset($id)):
<div>
<?= $data["contents"] ?>
</div>
<small class="text-muted"><?= str_replace("%1", timeAgo($data["update"]), l("lang_time_update")) ?></small>
<?php else: ?>
<p class="text-muted"><?= l("lang_articles_empty") ?></p>
<?php endif; ?>

@ -55,7 +55,7 @@ if (!isset($_PROFILE["requests"][$id])):
<span><?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/" . $id . ".json") ? $data["first_name"] . " " . $data["last_name"] : $data["title"] ?></span>
<span style="float: right;"><input id="form-btn" type="button" value="<?= l("lang_edit_save") ?>" class="btn btn-outline-primary" <?= $_PROFILE["blocked"] >= 2 ? "disabled" : "" ?>> <a href="/<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/" . $id . ".json") ? "people" : "articles" ?>/<?= $id ?>" class="btn btn-outline-dark"><?= l("lang_edit_cancel") ?></a></span>
<?php else: ?>
<span><?= $data["nick_name"] ?? $data["first_name"] . " " . $data["last_name"] ?><?php if (isset($data["nick_name"]) && trim($data["nick_name"]) !== ""): ?> <small><small><small>(<?= $data["first_name"] . " " . $data["last_name"] ?>)</small></small></small><?php endif; ?><?php if ($data["plus"]): ?> <small><small><small><small><small><small><span class="badge badge-plus rounded-pill" style="vertical-align: middle; margin-top: -5px;">PLUS</span></small></small></small></small></small></small><?php endif; ?></span>
<span><?= $data["nick_name"] ?? $data["first_name"] . " " . $data["last_name"] ?><?php if (isset($data["nick_name"]) && trim($data["nick_name"]) !== ""): ?> <small><small><small>(<?= $data["first_name"] . " " . $data["last_name"] ?>)</small></small></small><?php endif; ?><?php if ($data["plus"] && !$data["ultra"]): ?> <small><small><small><small><small><small><span class="badge badge-plus rounded-pill" style="vertical-align: middle; margin-top: -5px;">PLUS</span></small></small></small></small></small></small><?php elseif ($data["plus"] && $data["ultra"]): ?> <small><small><small><small><small><small><span class="badge badge-ultra rounded-pill" style="vertical-align: middle; margin-top: -5px;">ULTRA</span></small></small></small></small></small></small><?php endif; ?></span>
<span style="float: right;"><input id="form-btn" type="button" value="<?= l($id === $_USER ? "lang_profile_save" : "lang_edit_save") ?>" class="btn btn-outline-primary" <?= $_PROFILE["blocked"] >= 1 ? "disabled" : "" ?>> <a href="/<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/" . $id . ".json") ? "people" : (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/articles/" . $id . ".json") ? "articles" : (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gallery/" . $id . ".json") ? "gallery" : "profile")) ?>/<?= $id ?>" class="btn btn-outline-dark"><?= l("lang_edit_cancel") ?></a></span>
<?php endif; ?>
</span>

@ -66,6 +66,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/" . $id . ".j
if ($_PROFILE["blocked"] >= $blockLevel) die();
$_PROFILE["contents"] = $_POST["contents"];
$_PROFILE["update"] = date('c');
}
if ($id === $_USER) {

@ -69,9 +69,10 @@ if (!isset($id)):
<div>
<?php if (isset($data["images"]) && count($data["images"]) > 0): ?>
<?php if (isset($data["contents"]) && trim($data["contents"] !== "")): ?>
<p>
<div>
<?= $data["contents"] ?>
</p>
</div>
<small class="text-muted"><?= str_replace("%1", timeAgo($data["update"]), l("lang_time_update")) ?></small>
<?php endif; ?>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); grid-gap: 20px;">

@ -65,12 +65,13 @@ if (!isset($id)):
<span style="float: right;"><a href="/edit/<?= $id ?>" class="btn btn-outline-dark"><?= l("lang_people_edit") ?></a></span>
</h1>
<div style="display: grid; grid-template-columns: 1fr 400px; grid-gap: 20px;">
<div style="display: grid; grid-template-columns: 1fr 400px; grid-gap: 20px;" id="infobox">
<div>
<?php if (isset($data["contents"]) && trim($data["contents"] !== "")): ?>
<div>
<?= $data["contents"] ?>
</div>
<small class="text-muted"><?= str_replace("%1", timeAgo($data["update"]), l("lang_time_update")) ?></small>
<?php else: ?>
<p class="text-muted"><?= l("lang_people_empty") ?></p>
<?php endif; ?>

@ -35,7 +35,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/navigation.php";
<div class="container">
<br><br>
<h1>
<span><?= $data["nick_name"] ?? $data["first_name"] . " " . $data["last_name"] ?><?php if (isset($data["nick_name"]) && trim($data["nick_name"]) !== ""): ?> <small><small><small>(<?= $data["first_name"] . " " . $data["last_name"] ?>)</small></small></small><?php endif; ?><?php if ($data["plus"]): ?> <small><small><small><small><small><small><span class="badge badge-plus rounded-pill" style="vertical-align: middle; margin-top: -5px;">PLUS</span></small></small></small></small></small></small><?php endif; ?></span>
<span><?= $data["nick_name"] ?? $data["first_name"] . " " . $data["last_name"] ?><?php if (isset($data["nick_name"]) && trim($data["nick_name"]) !== ""): ?> <small><small><small>(<?= $data["first_name"] . " " . $data["last_name"] ?>)</small></small></small><?php endif; ?><?php if ($data["plus"] && !$data["ultra"]): ?> <small><small><small><small><small><small><span class="badge badge-plus rounded-pill" style="vertical-align: middle; margin-top: -5px;">PLUS</span></small></small></small></small></small></small><?php elseif ($data["plus"] && $data["ultra"]): ?> <small><small><small><small><small><small><span class="badge badge-ultra rounded-pill" style="vertical-align: middle; margin-top: -5px;">ULTRA</span></small></small></small></small></small></small><?php endif; ?></span>
<span style="float: right;"><?php if ($id === $_USER): ?><a href="/edit/<?= $id ?>" class="btn btn-outline-dark"><?= l("lang_people_edit") ?></a><?php endif; ?>
<div class="dropdown" style="display: inline-block;">
<button type="button" class="btn btn-outline-dark dropdown-toggle" data-bs-toggle="dropdown"><?= l("lang_profile_options") ?></button>
@ -118,6 +118,7 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/navigation.php";
<div>
<?= $data["contents"] ?>
</div>
<small class="text-muted"><?= str_replace("%1", timeAgo($data["update"]), l("lang_time_update")) ?></small>
<?php else: ?>
<p class="text-muted"><?= l("lang_profile_empty") ?></p>
<?php endif; ?>

@ -23,7 +23,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $reques
while (trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $request["author"] . ".json")) === "") {}
$profile = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $request["author"] . ".json")), true);
loadLang(json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $profile["language"] . ".json")), true), "lang");
loadLang(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $profile["language"] . ".json"), true), "lang");
$index = array_search($id, $profile["requests"]);
@ -49,6 +49,7 @@ if ($request["type"] === "galleryupload" && !isset($_GET['mark'])) {
"author" => $request["author"],
"date" => $request["date"]
];
$gallery["update"] = date('c');
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gallery/" . $request["id"] . ".json", utf8_encode(json_encode($gallery)));
}
@ -62,6 +63,7 @@ if (($request["type"] === "gallerymeta" || $request["type"] === "article" || $re
$d = json_decode(utf8_decode(file_get_contents($file)), true);
$d["contents"] = $request["contents"];
$d["update"] = date('c');
file_put_contents($file, utf8_encode(json_encode($d)));
}

@ -18,6 +18,8 @@ if (isset($_GET["skel"])) {
$_POST["contents"] = json_encode($d);
}
$d["update"] = date('c');
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/" . $_GET["skel"] . "/" . $id . ".json", utf8_encode(json_encode(json_decode($_POST["contents"]), JSON_PRETTY_PRINT)));
header("Location: /admin/edit/?id=$id");
die();

@ -23,7 +23,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $reques
while (trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $request["author"] . ".json")) === "") {}
$profile = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $request["author"] . ".json")), true);
loadLang(json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $profile["language"] . ".json")), true), "lang");
loadLang(json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $profile["language"] . ".json"), true), "lang");
$index = array_search($id, $profile["requests"]);
@ -33,7 +33,7 @@ if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $reques
$profile["alerts"][] = [
"title" => l("lang_notifications_reject_title"),
"message" => str_replace("%2", timeAgo($request["date"]), str_replace("%1", l("lang_request_types_" . $request["type"]), l("lang_notifications_reject_message"))),
"message" => str_replace("%3", date('H:i', strtotime($request["date"])), str_replace("%2", formatDate($request["date"]), str_replace("%1", l("lang_request_types_" . $request["type"]), l("lang_notifications_reject_message")))),
"date" => date('c'),
"read" => false
];

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M5 9a7 7 0 0 1 14 0c0 2.025-.67 4.236-1.85 5.956-1.042 1.52-2.543 2.731-4.4 2.992v.302c0 .414.336.75.75.75h3.25A2.25 2.25 0 0 1 19 21.25v1a.75.75 0 0 1-1.5 0v-1a.75.75 0 0 0-.75-.75H13.5a2.25 2.25 0 0 1-2.25-2.25v-.302c-1.857-.261-3.358-1.473-4.4-2.992C5.67 13.236 5 11.025 5 9Zm7.92-3.894a.75.75 0 0 0-.344 1.46 2.505 2.505 0 0 1 1.856 1.853.75.75 0 1 0 1.46-.347 4.005 4.005 0 0 0-2.972-2.966Z" fill="#084298"/></svg>

After

Width:  |  Height:  |  Size: 523 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.5 2v3.252a.75.75 0 0 0 1.5 0V2h1v4.251a.75.75 0 0 0 1.5 0V2h1.75a.75.75 0 0 1 .75.75V11H5V2.75A.75.75 0 0 1 5.75 2h6.75ZM5 12.5v1.752a2.25 2.25 0 0 0 2.25 2.25H10V20a2 2 0 1 0 4 0v-3.498h2.75a2.25 2.25 0 0 0 2.25-2.25V12.5H5Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 357 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2c5.523 0 10 4.477 10 10s-4.477 10-10 10a9.96 9.96 0 0 1-4.644-1.142l-4.29 1.117a.85.85 0 0 1-1.037-1.036l1.116-4.289A9.959 9.959 0 0 1 2 12C2 6.477 6.477 2 12 2Zm0 13.5a1 1 0 1 0 0 2 1 1 0 0 0 0-2Zm0-8.75A2.75 2.75 0 0 0 9.25 9.5a.75.75 0 0 0 1.493.102l.014-.23a1.25 1.25 0 0 1 2.493.128c0 .539-.135.805-.645 1.332l-.304.31c-.754.784-1.051 1.347-1.051 2.358a.75.75 0 0 0 1.5 0c0-.539.135-.805.645-1.332l.304-.31c.754-.784 1.051-1.347 1.051-2.358A2.75 2.75 0 0 0 12 6.75Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 603 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 4.354v6.651l7.442-.001L17.72 9.28a.75.75 0 0 1-.073-.976l.073-.084a.75.75 0 0 1 .976-.073l.084.073 2.997 2.997a.75.75 0 0 1 .073.976l-.073.084-2.996 3.004a.75.75 0 0 1-1.134-.975l.072-.085 1.713-1.717-7.431.001L12 19.25a.75.75 0 0 1-.88.739l-8.5-1.502A.75.75 0 0 1 2 17.75V5.75a.75.75 0 0 1 .628-.74l8.5-1.396a.75.75 0 0 1 .872.74ZM8.502 11.5a1.002 1.002 0 1 0 0 2.004 1.002 1.002 0 0 0 0-2.004Z" fill="#000000"/><path d="M13 18.501h.765l.102-.006a.75.75 0 0 0 .648-.745l-.007-4.25H13v5.001ZM13.002 10 13 8.725V5h.745a.75.75 0 0 1 .743.647l.007.102.007 4.251h-1.5Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 696 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18 17.5v1.25A2.25 2.25 0 0 1 15.75 21h-7.5A2.25 2.25 0 0 1 6 18.75v-1.251l-1.75.001A2.25 2.25 0 0 1 2 15.25V9.254a3.25 3.25 0 0 1 3.25-3.25l.749-.001L6 5.25A2.25 2.25 0 0 1 8.25 3h7.502a2.25 2.25 0 0 1 2.25 2.25v.753h.75a3.254 3.254 0 0 1 3.252 3.25l.003 5.997a2.249 2.249 0 0 1-2.248 2.25H18Zm-2.25-4h-7.5a.75.75 0 0 0-.75.75v4.5c0 .414.336.75.75.75h7.5a.75.75 0 0 0 .75-.75v-4.5a.75.75 0 0 0-.75-.75Zm.002-9H8.25a.75.75 0 0 0-.75.75l-.001.753h9.003V5.25a.75.75 0 0 0-.75-.75Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 606 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3 5.75A.75.75 0 0 1 3.75 5c2.663 0 5.258-.943 7.8-2.85a.75.75 0 0 1 .9 0C14.992 4.057 17.587 5 20.25 5a.75.75 0 0 1 .75.75V11c0 5.001-2.958 8.676-8.725 10.948a.75.75 0 0 1-.55 0C5.958 19.676 3 16 3 11V5.75Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 335 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 2a4 4 0 0 1 4 4v2h2.5A1.5 1.5 0 0 1 20 9.5v11a1.5 1.5 0 0 1-1.5 1.5h-13A1.5 1.5 0 0 1 4 20.5v-11A1.5 1.5 0 0 1 5.5 8H8V6a4 4 0 0 1 4-4Zm0 11.5a1.5 1.5 0 1 0 0 3 1.5 1.5 0 0 0 0-3ZM12 4a2 2 0 0 0-2 2v2h4V6a2 2 0 0 0-2-2Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 351 B

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12.34 4.07a2.25 2.25 0 0 1 2.756 1.59l2.758 10.29a2.25 2.25 0 0 1-1.592 2.756l-4.595 1.23a2.25 2.25 0 0 1-2.756-1.592L6.157 8.058a2.25 2.25 0 0 1 1.59-2.755L12.34 4.07Zm2.35 11.21a.75.75 0 0 0-.919-.531l-1.932.518-.096.033a.75.75 0 0 0 .484 1.415l1.932-.517.097-.033a.75.75 0 0 0 .434-.886ZM18.678 2.393a.75.75 0 0 1 1.018-.3c.319.175.754.51 1.183 1.031.432.525.765 1.144.956 1.86A4.877 4.877 0 0 1 21.72 7.9a3.75 3.75 0 0 1-.307.68.75.75 0 0 1-1.328-.69l.047-.09a3.398 3.398 0 0 0 .255-2.429 3.401 3.401 0 0 0-.666-1.294c-.294-.357-.581-.579-.745-.668a.75.75 0 0 1-.298-1.017Z" fill="#000000"/><path d="M17.5 4.444a.75.75 0 0 1 1.051-.142c.134.101.306.265.478.491.188.249.334.525.416.831.117.437.093.872-.013 1.284l-.052.177a1.801 1.801 0 0 1-.048.131.75.75 0 0 1-1.417-.483l.05-.148a1.065 1.065 0 0 0 .03-.573.933.933 0 0 0-.162-.313 1.367 1.367 0 0 0-.158-.176l-.033-.028a.75.75 0 0 1-.142-1.051ZM2.539 15.411a.75.75 0 0 1 1.344.659l-.095.193a3.536 3.536 0 0 0-.168 2.335c.134.5.363.935.661 1.309.258.322.51.539.68.652l.067.042a.75.75 0 1 1-.75 1.299c-.315-.182-.745-.527-1.168-1.057a5.044 5.044 0 0 1-.94-1.857 5.017 5.017 0 0 1 .086-2.914c.1-.3.204-.524.283-.66Z" fill="#000000"/><path d="M4.674 16.757a.75.75 0 0 1 1.418.477l-.049.148a1.074 1.074 0 0 0-.03.574c.029.103.085.21.164.316.06.079.118.14.158.178l.033.028a.75.75 0 0 1-.915 1.188 2.606 2.606 0 0 1-.475-.493 2.42 2.42 0 0 1-.413-.828 2.515 2.515 0 0 1 .01-1.282l.052-.176a1.82 1.82 0 0 1 .047-.13Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
<svg width="24" height="24" fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M2 6.75C2 5.784 2.784 5 3.75 5h13.5c.966 0 1.75.784 1.75 1.75v8.5A1.75 1.75 0 0 1 17.25 17H3.75A1.75 1.75 0 0 1 2 15.25v-8.5Zm3-.5v1a.75.75 0 0 1-.75.75h-1v1.5h1A2.25 2.25 0 0 0 6.5 7.25v-1H5Zm5.5 7.25a2.25 2.25 0 1 0 0-4.5 2.25 2.25 0 0 0 0 4.5Zm-7.25.5h1a.75.75 0 0 1 .75.75v1h1.5v-1a2.25 2.25 0 0 0-2.25-2.25h-1V14Zm12.75.75a.75.75 0 0 1 .75-.75h1v-1.5h-1a2.25 2.25 0 0 0-2.25 2.25v1H16v-1Zm0-7.5v-1h-1.5v1a2.25 2.25 0 0 0 2.25 2.25h1V8h-1a.75.75 0 0 1-.75-.75Z" fill="#000000"/><path d="M4.401 18.5A2.999 2.999 0 0 0 7 20h10.25A4.75 4.75 0 0 0 22 15.25V10c0-1.11-.603-2.08-1.5-2.599v7.849a3.25 3.25 0 0 1-3.25 3.25H4.401Z" fill="#000000"/></svg>

After

Width:  |  Height:  |  Size: 753 B

@ -1,5 +1,5 @@
<script src="/editor/editor.js"></script>
<?php if (l("lang__name") !== "en"): ?><script src="/editor/translations/<?= l("lang__name") ?>.js"></script><?php endif; ?>
<script src="/ckeditor/editor.js"></script>
<?php if (l("lang__name") !== "en"): ?><script src="/ckeditor/translations/<?= l("lang__name") ?>.js"></script><?php endif; ?>
<script>
let editor;

@ -9,7 +9,7 @@
<div style="background-color:#eee;border-radius: 10px;padding:50px;margin: 50px 10px 10px;">
<div class="container" style="opacity: .5;">
%2<br>
Delta - © 2020-%3 Equestria.dev
Delta - © 2019-%3 Delta Technologies, 2022-%3 Equestria.dev
</div>
</div>

@ -39,6 +39,49 @@ function sendCode($email, $code) {
$mail->send();
}
function sendAlerts($email, $alerts) {
global $emailConfig;
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = 'in-v3.mailjet.com';
$mail->SMTPAuth = true;
$mail->Username = $emailConfig["username"];
$mail->Password = $emailConfig["password"];
$mail->SMTPSecure = "none";
$mail->Port = 587;
$mail->setFrom('delta@auto.minteck.org', 'Delta');
$mail->addAddress($email);
$mail->addReplyTo('contact@minteck.org', 'Equestria.dev');
$mail->isHTML();
if (count($alerts) > 1) {
$mail->Subject = str_replace("%1", count($alerts), l("lang_email_alerts_title_0"));
} else {
$mail->Subject = l("lang_email_alerts_title_1");
}
$body = file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/email.html");
$body = str_replace("%3", date('Y'), $body);
$body = str_replace("%2", l("lang_email_reasons_alert"), $body);
$text = "<p>" . l("lang_email_alerts_message_0") . "</p><p>" . l("lang_email_alerts_message_1") . "</p>";
foreach ($alerts as $alert) {
$text .= "<p><b>" . $alert["title"] . "</b><br>" . $alert["message"] . "</p>";
}
$text .= "<p>" . l("lang_email_alerts_message_2") . "</p>";
$body = str_replace("%1", $text, $body);
$mail->CharSet = 'UTF-8';
$mail->Body = $body;
$mail->AltBody = strip_tags($body);
$mail->send();
}
function sendLogin($email) {
global $emailConfig;

@ -1,9 +1,9 @@
</div>
<?php if (isset($_PROFILE) && $_SERVER['REQUEST_URI'] !== "/login/blocked/"): ?>
<div class="container text-muted">
<div id="footer" class="container text-muted">
<br>
© 2020-<?= date('Y') ?> Equestria.dev · v<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/version")) ?><br><a href="https://equestria.horse/legal" target="_blank" class="text-muted"><?= l("lang_footer_legal") ?></a> · <a target="_blank" href="https://equestria.horse/legal/privacy" class="text-muted"><?= l("lang_footer_privacy") ?></a> · <a href="https://equestria.horse/legal/terms-of-service" target="_blank" class="text-muted"><?= l("lang_footer_terms") ?></a><!-- · <a href="/sales" class="text-muted"><?= l("lang_footer_sales") ?></a>-->
© 2019-<?= date('Y') ?> Delta Technologies, 2022-<?= date('Y') ?> Equestria.dev · v<?= trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/version")) ?><br><a href="https://equestria.horse/legal/notices" target="_blank" class="text-muted"><?= l("lang_footer_legal") ?></a> · <a target="_blank" href="https://equestria.horse/legal/privacy" class="text-muted"><?= l("lang_footer_privacy") ?></a> · <a href="https://equestria.horse/legal/terms-of-service" target="_blank" class="text-muted"><?= l("lang_footer_terms") ?></a><!-- · <a href="/sales" class="text-muted"><?= l("lang_footer_sales") ?></a>-->
</div>
<?php endif; ?>
<br>

@ -1,6 +1,8 @@
<?php
$_lang = [];
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/lang.php";
genLang("en");
function timeAgo($time, $showTense = true, $strict = false, $daysOnly = false): string {
if (!is_numeric($time)) {
@ -13,7 +15,7 @@ function timeAgo($time, $showTense = true, $strict = false, $daysOnly = false):
$now = time();
$difference = $now - $time;
if ($difference <= 10 && $difference >= 0) {
if (abs($difference) <= 10 && abs($difference) >= 0) {
if ($showTense) {
return $tense = l("lang_time_now");
} else {
@ -25,7 +27,7 @@ function timeAgo($time, $showTense = true, $strict = false, $daysOnly = false):
$tense = l("lang_time_later");
}
for ($j = 0; $difference >= $lengths[$j] && $j < count($lengths)-1; $j++) {
for ($j = 0; abs($difference) >= $lengths[$j] && $j < count($lengths)-1; $j++) {
$difference /= $lengths[$j];
}
@ -42,18 +44,12 @@ function timeAgo($time, $showTense = true, $strict = false, $daysOnly = false):
$period = $periods[$j];
if ($showTense) {
return trim(str_replace("%3", $tense, str_replace("%2", $period . ($difference > 1 ? "s" : ""), str_replace("%1", $difference, l("lang_time_display")))));
return trim(str_replace("%3", $tense, str_replace("%2", $period . (abs($difference) > 1 ? "s" : ""), str_replace("%1", abs($difference), l("lang_time_display")))));
} else {
return trim(str_replace("%3", "", str_replace("%2", $period . ($difference > 1 ? "s" : ""), str_replace("%1", $difference, l("lang_time_display")))));
return trim(str_replace("%3", "", str_replace("%2", $period . (abs($difference) > 1 ? "s" : ""), str_replace("%1", abs($difference), l("lang_time_display")))));
}
}
function l($entry) {
global $_lang;
return $_lang[$entry] ?? $entry;
}
function resolveUser($id) {
if (file_exists($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $id . ".json")) {
$p = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/" . $id . ".json")), true);
@ -78,25 +74,22 @@ function uuid() {
return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4));
}
function loadLang($array, $baseName) {
global $_lang;
global $lf;
function enumerate($list, $separator) {
$i = "";
$_lang["lang__name"] = $lf;
$list = array_values($list);
foreach ($list as $index => $item) {
$i .= $item;
foreach ($array as $name => $item) {
if (is_array($item)) {
loadLang($item, $baseName . "_" . $name);
} else {
$_lang[$baseName . "_" . $name] = $item;
if ($index < count($list) - 2) {
$i .= ", ";
} else if ($index < count($list) - 1) {
$i .= " " . $separator . " ";
}
}
}
$lf = "en";
$lp = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $lf . ".json")), true);
loadLang($lp, "lang");
return $i;
}
function formatDate($date, $withYear = true) {
if (!is_int($date)) $date = strtotime($date);

@ -52,6 +52,133 @@ require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/functions.php";
color: #C711E1;
border: 2px solid #C711E1;
}
.badge-ultra {
color: #e18e11;
border: 2px solid #e18e11;
}
.promo-item {
border: none;
}
.promo-wrapper {
background: transparent;
height: max-content;
border-radius: 0.375rem;
padding: 2px;
}
.promo-plus {
background-image: linear-gradient(45deg, #C711E1 0%, #7F52FF 100%);
}
.promo-none {
background-image: linear-gradient(45deg, rgba(224, 224, 224, 0.75) 0%, #bfbfbf 100%);
}
.promo-ultra {
background-image: linear-gradient(45deg, rgba(214, 224, 18, 0.75) 0%, #bf763d 100%);
}
<?php if (isset($_PROFILE) && $_PROFILE["plus"] && (str_starts_with($_SERVER["REQUEST_URI"], "/articles/") || str_starts_with($_SERVER["REQUEST_URI"], "/people/"))): ?>
@media print {
#footer {
display: none;
}
.navbar {
display: none;
}
.btn {
display: none;
}
#infobox {
grid-template-columns: 1fr 300px !important;
font-size: 12px;
}
#infobox h6 {
font-size: 14px;
}
}
<?php else: ?>
@media print {
* {
display: none !important;
}
}
<?php endif; ?>
.profile-border {
width: 32px;
height: 32px;
}
.profile-border-plus {
background-image: linear-gradient(45deg, #E44857 0%, #C711E1 50%, #7F52FF 100%);
border-radius: 999px;
height: 38px;
width: 38px;
margin-top: -4px;
vertical-align: middle;
display: inline-flex;
align-items: center;
justify-content: center;
}
.profile-border-ultra {
background-image: linear-gradient(45deg, #49e353 0%, #d6e012 50%, #ffba52 100%);
border-radius: 999px;
height: 38px;
width: 38px;
margin-top: -4px;
vertical-align: middle;
display: inline-flex;
align-items: center;
justify-content: center;
}
.profile-border-plus img, .profile-border-ultra img {
width: 28px !important;
height: 28px;
margin: 2px;
}
.profile-border-inner-active {
background-color: #f8f9fa;
height: 32px;
width: 32px;
border-radius: 999px;
vertical-align: middle;
display: inline-flex;
align-items: center;
justify-content: center;
}
@media (min-width: 992px) {
.navbar {
height: 64px;
}
.navbar-nav {
height: 48px;
}
}
.user-nav {
cursor: pointer;
}
.user-nav:hover {
opacity: .75 !important;
}
.user-nav:active, .user-nav[aria-expanded="true"] {
opacity: .5 !important;
}
</style>
</head>
<body class="bg-light">

@ -0,0 +1,195 @@
<?php
function println(...$text) {
foreach ($text as $_) echo $_;
echo("\n");
}
$users = [];
$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__) . "/..";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/functions.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/email.php";
$price = (float)trim(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/plusprice"));
$list = array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles"), function ($i) { return !str_starts_with($i, "."); });
foreach ($list as $file) {
$data = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/$file")), true);
genLang($data["language"]);
println($data["first_name"], " ", $data["last_name"]);
println(" User information:");
println(" Subscription: ", $data["ultra"] && $data["plus"] ? "Delta Ultra" : ($data["plus"] ? "Delta Plus" : "Delta"), ", renews on the ", isset($data["renewal"]) ? date('j F', strtotime($data["renewal"])) : "n/a");
println(" Nick name: ", $data["nick_name"] ?? "-");
println(" Jobs:");
println(" Email linking");
$users[$data["email"]] = substr($file, 0, -5);
if ($data["nick_name"] && !$data["plus"]) {
println(" Nick name removal");
$data["nick_name"] = null;
}
if (substr($data["birth"], 5) === date('m-d')) {
println(" Birthday");
if ($data["balance"] !== -1) $data["balance"] += 2;
$data["alerts"][] = [
"title" => l("lang_notifications_birthday_title"),
"message" => l("lang_notifications_birthday_message"),
"date" => date('c'),
"read" => false
];
}
if ($data["blocked"] !== $data["last_blocked"]) {
println(" Block level update");
switch ($data["blocked"]) {
case 0:
println(" Current block level: none (0)");
$data["alerts"][] = [
"title" => l("lang_notifications_block0_title"),
"message" => l("lang_notifications_block0_message"),
"date" => date('c'),
"read" => false
];
break;
case 1:
println(" Current block level: personal (1)");
$data["alerts"][] = [
"title" => l("lang_notifications_block1_title"),
"message" => l("lang_notifications_block1_message"),
"date" => date('c'),
"read" => false
];
break;
case 2:
println(" Current block level: requests (2)");
$data["alerts"][] = [
"title" => l("lang_notifications_block2_title"),
"message" => l("lang_notifications_block2_message"),
"date" => date('c'),
"read" => false
];
break;
case 3:
println(" Current block level: full (3)");
$data["alerts"][] = [
"title" => l("lang_notifications_block3_title"),
"message" => l("lang_notifications_block3_message"),
"date" => date('c'),
"read" => false
];
break;
}
$data["last_blocked"] = $data["blocked"];
}
if ($data["plus"]) {
println(" Subscription renewal");
if (strtotime($data["renewal"]) - time() < 0) {
if ($data["ultra"]) {
$cost = $price + 2;
} else {
$cost = $price;
}
println(" Attempting to renew subscription for " . $cost . " coins");
if ($data["balance"] >= $cost || $data["balance"] === -1) {
println(" Sufficient balance, proceeding");
if ($data["balance"] === -1) {
println(" User has unlimited balance, no takeout required");
} else {
$data["balance"] -= $cost;
}
$data["renewal"] = date('Y-m-d', time() + (86400 * (int)date('t')));
println(" User balance is now " . $data["balance"] . " coins, next renewal on the " . date('j F', strtotime($data["renewal"])));
if ($data["ultra"]) {
$data["alerts"][] = [
"title" => l("lang_notifications_renewal2_title"),
"message" => str_replace("%2", formatDate($data["renewal"]), str_replace("%1", $cost, l("lang_notifications_renewal2_message"))),
"date" => date('c'),
"read" => false
];
} else {
$data["alerts"][] = [
"title" => l("lang_notifications_renewal1_title"),
"message" => str_replace("%2", formatDate($data["renewal"]), str_replace("%1", $cost, l("lang_notifications_renewal1_message"))),
"date" => date('c'),
"read" => false
];
}
} else {
println(" Insufficient balance, ending subscription");
if ($data["ultra"]) {
$data["alerts"][] = [
"title" => l("lang_notifications_expired2_title"),
"message" => l("lang_notifications_expired2_message"),
"date" => date('c'),
"read" => false
];
} else {
$data["alerts"][] = [
"title" => l("lang_notifications_expired1_title"),
"message" => l("lang_notifications_expired1_message"),
"date" => date('c'),
"read" => false
];
}
$data["ultra"] = false;
$data["plus"] = false;
$data["renewal"] = null;
}
} else {
println(" Renewal due in " . (timeAgo($data["renewal"], false)));
}
}
$alertsToSend = [];
foreach ($data["alerts"] as $alert) {
if ((!isset($alert["email"]) || $alert["email"] === false) && $alert["read"] === false) {
$alertsToSend[] = $alert;
}
}
println(" Email delivery (", count($alertsToSend) ,"):");
foreach ($alertsToSend as $alert) {
println(" ", $alert["title"]);
}
foreach ($data["alerts"] as $index => $alert) {
$data["alerts"][$index]["email"] = true;
}
if (count($alertsToSend) > 0) {
sendAlerts($data["email"], array_reverse($alertsToSend));
}
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/$file", utf8_encode(json_encode($data, JSON_PRETTY_PRINT)));
file_put_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/users.json", utf8_encode(json_encode($users, JSON_PRETTY_PRINT)));
}

@ -0,0 +1,34 @@
<?php
$_lang = [];
function loadLang($array, $baseName) {
global $_lang;
global $lf;
$_lang["lang__name"] = $lf;
foreach ($array as $name => $item) {
if (is_array($item)) {
loadLang($item, $baseName . "_" . $name);
} else {
$_lang[$baseName . "_" . $name] = $item;
}
}
}
function genLang($lf): void {
if (str_contains($lf, "/") || !file_exists($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $lf . ".json")) {
$lf = "en";
}
$lp = json_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/lang/" . $lf . ".json"), true);
loadLang($lp, "lang");
}
function l($entry) {
global $_lang;
return $_lang[$entry] ?? $entry;
}

@ -50,7 +50,50 @@
<?php endif; ?>
<li class="nav-item" style="<?= $_PROFILE["plus"] ? "margin-left: auto;" : "" ?>">
<a class="nav-link no-opacity" href="/profile/<?= $_USER ?>"><img src="<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/uploads/" . $_USER . ".jpg") ? "/uploads/" . $_USER . ".jpg" : "/icons/defaultuser.svg" ?>" style="width: 32px;border-radius: 999px;"><span class="nav-link-opacity" style="vertical-align: middle; margin-left: 5px;"><?= $_PROFILE["nick_name"] ?? $_PROFILE["first_name"] . " " . $_PROFILE["last_name"] ?></span></a>
<div class="dropdown">
<span class="user-nav nav-link no-opacity" data-bs-toggle="dropdown"><div class="profile-border <?= $_PROFILE["ultra"] ? "profile-border-ultra" : ($_PROFILE["plus"] ? "profile-border-plus" : "") ?>"><div class="profile-border-inner <?= $_PROFILE["plus"] ? "profile-border-inner-active" : "" ?>"><img src="<?= file_exists($_SERVER['DOCUMENT_ROOT'] . "/uploads/" . $_USER . ".jpg") ? "/uploads/" . $_USER . ".jpg" : "/icons/defaultuser.svg" ?>" style="width: 32px;border-radius: 999px;"></div></div></span>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item" href="/profile/<?= $_USER ?>"><b><?= $_PROFILE["nick_name"] ?? $_PROFILE["first_name"] . " " . $_PROFILE["last_name"] ?> <?php if ($_PROFILE["plus"] && !$_PROFILE["ultra"]): ?> <span class="badge badge-plus rounded-pill" style="vertical-align: middle;">PLUS</span><?php elseif ($_PROFILE["plus"] && $_PROFILE["ultra"]): ?> <span class="badge badge-ultra rounded-pill" style="vertical-align: middle;">ULTRA</span><?php endif; ?></b></a></li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="/edit/<?= $_USER ?>">
<img src="/icons/edit.svg">
<span style="vertical-align: middle;"><?= l("lang_navigation_user_edit") ?></span>
</a>
</li>
<li>
<a class="dropdown-item" href="/plus">
<img src="/icons/subscription.svg">
<span style="vertical-align: middle;"><?= l("lang_navigation_user_subscriptions") ?></span>
</a>
</li>
<li>
<a class="dropdown-item" href="/requests">
<img src="/icons/requests.svg">
<span style="vertical-align: middle;"><?= l("lang_navigation_user_requests") ?></span>
</a>
</li>
<li><hr class="dropdown-divider"></li>
<li>
<a class="dropdown-item" href="/support">
<img src="/icons/help.svg">
<span style="vertical-align: middle;"><?= l("lang_navigation_user_help") ?></span>
</a>
</li>
<li>
<a class="dropdown-item" href="/logout">
<img src="/icons/logout.svg">
<span style="vertical-align: middle;"><?= l("lang_navigation_user_logout") ?></span>
</a>
</li>
</ul>
</div>
</li>
</ul>
</div>

@ -17,7 +17,7 @@ if (isset($_COOKIE["DeltaSession"])) {
if ($_PROFILE["blocked"] >= 3 && $_SERVER['REQUEST_URI'] !== "/login/blocked/") {
header("Location: /login/blocked");
die();
} elseif ($_SERVER['REQUEST_URI'] === "/login/blocked/") {
} elseif ($_PROFILE["blocked"] < 3 && $_SERVER['REQUEST_URI'] === "/login/blocked/") {
header("Location: /");
die();
}

@ -1,4 +1,5 @@
{
"title": "[insert here]",
"contents": null
"contents": null,
"update": null
}

@ -1,5 +1,6 @@
{
"title": "[insert here]",
"contents": null,
"update": null,
"images": []
}

@ -1,6 +1,7 @@
{
"first_name": "[insert here]",
"last_name": "[insert here]",
"update": null,
"alts": [],
"born": null,
"state": null,

@ -1,12 +1,18 @@
{
"language": "fr",
"blocked": 0,
"last_blocked": 0,
"first_name": "[insert here]",
"last_name": "[insert here]",
"nick_name": null,
"email": "[insert here]",
"update": null,
"date": null,
"plus": false,
"ultra": false,
"renewal": null,
"balance": 0,
"free_trial": false,
"admin": false,
"birth": null,
"phone": null,

@ -4,12 +4,85 @@ $title = "lang_home_title";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/session.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/header.php";
require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/navigation.php";
global $_PROFILE;
?>
<div class="container">
<br><br>
hahaha<br><br><br>
<h1><?= l("lang_home_greeting") ?> <?= $_PROFILE["nick_name"] ?? $_PROFILE["first_name"] . " " . $_PROFILE["last_name"] ?></h1>
<?php
$birthdays = array_values(array_filter(array_map(function ($i) {
$r = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles/$i")), true);
$r["_id"] = substr($i, 0, -5);
return $r;
}, array_values(array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/profiles"), function ($i) { return str_ends_with($i, ".json"); }))), function ($i) {
return substr($i["birth"], 5) === date('m-d');
}));
?>
<?php if (count($birthdays) > 0): ?>
<div class="alert alert-primary">
<img src="/icons/age-home.svg"><span style="vertical-align: middle; margin-left: 5px;"><?= str_replace("%1", enumerate(array_map(function ($i) {
return str_replace("%1", "<a href='/profile/" . $i["_id"] . "'>" . ($i["nick_name"] ?? $i["first_name"]) . "</a>", l("lang_home_name"));
}, $birthdays), l("lang_home_and")), l("lang_home_birthday")) ?></span>
</div>
<?php else: ?>
<div class="alert alert-secondary">
<img src="/icons/events.svg"><span style="vertical-align: middle; margin-left: 5px;"><?= str_replace("%1", formatDate(time()), l("lang_home_date")) ?></span>
</div>
<?php endif; ?>
<div class="list-group">
<?php
$list = [];
foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/articles"), function ($i) { return !str_starts_with($i, "."); }) as $id) {
$data = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/articles/$id")), true);
$id = substr($id, 0, -5);
$data["_type"] = "articles";
$data["_id"] = $id;
$list[$id] = $data;
}
foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gallery"), function ($i) { return !str_starts_with($i, "."); }) as $id) {
$data = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/gallery/$id")), true);
$id = substr($id, 0, -5);
$data["_type"] = "gallery";
$data["_id"] = $id;
$list[$id] = $data;
}
foreach (array_filter(scandir($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people"), function ($i) { return !str_starts_with($i, "."); }) as $id) {
$data = json_decode(utf8_decode(file_get_contents($_SERVER['DOCUMENT_ROOT'] . "/includes/data/people/$id")), true);
$id = substr($id, 0, -5);
$data["_type"] = "people";
$data["_id"] = $id;
$list[$id] = $data;
}
uasort($list, function ($a, $b) {
return strtotime($a["update"]) - strtotime($b["update"]);
});
foreach ($list as $item): ?>
<a href="/<?= $item["_type"] ?>/<?= $item["_id"] ?>" class="list-group-item list-group-item-action">
<p style="margin-bottom: 10px;"><img src="/icons/<?= $item["_type"] ?>.svg" style="margin-right:5px;"><span style="vertical-align: middle;"><b><?= $item["title"] ?? $item["first_name"] . " " . $item["last_name"] ?></b> <?= l("lang_home_update") ?> <b><?= timeAgo($item["update"]) ?></b></span></p><?= trim(strip_tags($item["contents"])) !== "" ? substr(trim(strip_tags($item["contents"])), 0, 150) . (strlen(trim(strip_tags($item["contents"]))) > 150 ? "…" : "") : "-" ?>
</a>
<?php endforeach; ?>
</div>
<br><br><br>
</div>
<?php require_once $_SERVER['DOCUMENT_ROOT'] . "/includes/footer.php"; ?>

@ -13,7 +13,13 @@
"done": "You are now logged in to Delta. If you are on a shared device, don't forget to log out once you are done."
},
"home": {
"title": "Dashboard"
"title": "Dashboard",
"greeting": "Hello",
"date": "Today is %1.",
"birthday": "Today is %1 birthday.",
"and": "and",
"name": "%1's",
"update": "was updated"
},
"time": {
"display": "%1 %2 %3",
@ -30,7 +36,8 @@
"y": "year",
"age": "age",
"today": "today",
"yesterday": "yesterday"
"yesterday": "yesterday",
"update": "This page was last updated %1."
},
"months": {
"jan": "January",
@ -53,7 +60,14 @@
"events": "Events",
"search": "Search",
"profile": "Profile",
"messages": "Alerts"
"messages": "Alerts",
"user": {
"edit": "Edit page",
"subscriptions": "Subscriptions",
"requests": "Pending requests",
"help": "Help",
"logout": "Log out"
}
},
"footer": {
"legal": "Legal notices",
@ -186,49 +200,72 @@
},
"plus": {
"intro": "Get exclusive perks for Delta and unique features while supporting the developers",
"buy": "Get it now%1 (starting %2/month)",
"decimals": ".",
"terms": "Price includes taxes and transaction fees. Subscription not currently available.",
"perks": "What do I get with Delta Plus?",
"buy": "Get it now%1 (starting %2 coins/month)",
"terms": "Requires a Delta coins balance. Subscription not currently available.",
"change": "Change subscription",
"notice": "Current subscription is %1. May require a Delta coins balance.",
"perks": "What do I get with Delta Plus (for 5 coins a month)?",
"perks2": "Delta Ultra adds all of this for 2 coins more:",
"list": [
{
"title": "Free technical support",
"description": "Service, software%1 and storage fees are all covered with Delta Plus, meaning you can get free support at any time. However, hardware fees are not covered%2."
"description": "Service, software%1 and storage fees are all covered with Delta Plus, meaning you can get free support at any time. However, hardware fees are not covered%2.",
"pretty": "Free technical support for other services"
},
{
"title": "Faster reviews",
"description": "Your change requests will be reviewed faster than change requests from non-Delta Plus users%1, meaning you can edit content faster than ever."
"description": "Your change requests will be reviewed faster than change requests from non-Delta Plus users%1, meaning you can edit content faster than ever.",
"pretty": "Priority in reviewing change requests"
},
{
"title": "Early news",
"description": "When new features are coming to Delta, you are made aware of them before release%1. You may even be able to test and use them before general release%2."
"description": "When new features are coming to Delta, you are made aware of them before release%1. You may be able to test and use them before general release%2.",
"pretty": "Early news and access to upcoming features"
},
{
"title": "Exclusive badge",
"description": "To show your support, you will get an exclusive Delta Plus badge on your profile. All users of Delta can see you support the platform."
"description": "To show your support, you will get an exclusive Delta Plus badge on your profile. All users of Delta can see you support the platform.",
"pretty": "Exclusive badge on your user profile"
},
{
"title": "VIP access to events",
"description": "With a Delta Plus subscription, you get access to extra things during some events%1. You could get reduced prices%2 or access to exclusive rooms%3."
"title": "Printing support",
"description": "With a Delta Plus subscription, you can print all pages%1 from your browser's print option, so that you can enjoy a physical copy.",
"pretty": "Support for printing pages with the browser"
},
{
"title": "Profile nickname",
"description": "With a profile nickname, you get another name Delta users can use to refer to you%1. This nickname will replace your real name everywhere in Delta%2."
"description": "With a profile nickname, you get another name Delta users can use to refer to you%1. This nickname will replace your real name everywhere in Delta%2.",
"pretty": "Custom nickname for your profile and Delta"
},
{
"title": "More customisation",
"description": "With Delta Ultra, you get to customise all aspects of Delta. Your own profile, the navigation bar, the home page%1, and even more!",
"pretty": "Additional interface customisation options"
},
{
"title": "Mobile notifications",
"description": "Tired of getting emails? Delta Ultra allows you to get notifications from Delta directly on your phone, without using email%1.",
"pretty": "Mobile push notifications instead of email"
},
{
"title": "Locked safe",
"description": "Coming soon%1. Securely store encrypted%2 sensitive files directly into Delta to keep them safe and reachable at all times.",
"pretty": "Zero access encrypted storage safe"
}
],
"how": "How to buy Delta Plus?",
"how": "How to get Delta coins?",
"action": "Continue",
"online": {
"title": "Get it entirely online",
"description": "You can buy Delta Plus directly from your device using your credit card%1."
"title": "Get them entirely online",
"description": "You can buy Delta coins directly from your device using your credit card%1."
},
"code": {
"title": "Use a code",
"description": "If you have a Delta Plus subscription code at an event or from a Delta administrator, you can use it on your account%1."
"description": "If you have a Delta coins code at an event or from a Delta administrator, you can use it on your account%1."
},
"trial": {
"title": "Try it free for 14 days",
"description": "First time using Delta Plus? You can use it for free for 14 days%1, no credit card required."
"title": "Get 5 coins free",
"description": "First time using Delta Plus? You can get 5 coins for free (1 month of Delta Plus subscription%1)."
},
"notes": [
"Delta Plus is only available for users who are 16 years old or more and without an active account block.",
@ -237,15 +274,28 @@
"Limits apply, Delta is currently not able to review requests at all times due to additional work.",
"Features might change between when users are made aware of them and when they release, or be dropped entirely.",
"Features are not guaranteed to be stable or entirely usable until they publicly release. Users are expected to report issues to the developers.",
"This only apply to some events that have decided to have Delta Plus-exclusive options. Not all events have these options.",
"Reduced prices are not to be expected to be more than 50% of the original price. Does not apply to all sold products.",
"Event personnel always has permission to access the exclusive rooms for security and maintenance purposes.",
"Only supports people and articles pages, does not work with albums, search results, or profiles.",
"People who need to change their display name (transgender and/or married people) can ask to change their real name instead.",
"A user's real name is still displayed on their profile page next to their nickname for reference purposes.",
"Not all interface elements cannot be customised. Customisations can be disabled at any time by the administrators.",
"Notifications will stop working and emails will send again as soon as the Delta Ultra expires.",
"Delta cannot guarantee this feature will be available soon or will be available at all.",
"Files are encrypted using AES-256 encryption and cannot be accessed by the Delta administrators.",
"Delta does not have access to banking information as payment is handled by a third-party service that has different policies.",
"Each code can be used only once and for the period of time it was made for. No credit card is required.",
"The Delta Plus 14 days free trial is only available to users who have not purchased Delta Plus or used a code before."
]
"Each code can be used only once and for the amount of coins it was made for. No credit card is required.",
"The 5 coins free trial is only available to users who have not purchased Delta coins or used a code before."
],
"subscribe": {
"title": "Change Delta Plus subscription",
"title2": "Select your subscription",
"base": "Access to all of Delta for free",
"down": "Downgrade",
"up": "Upgrade",
"free": "Free",
"help": "Free support and help for Delta services",
"current": "Current subscription",
"coin": "coins per month"
}
},
"gallery": {
"title": "Gallery",
@ -277,11 +327,47 @@
"notifications": {
"reject": {
"title": "Your request has been rejected",
"message": "Your request to \"%1\" published %2 has been rejected by the administrators. Contact them for further details."
"message": "Your request to \"%1\" published on %2 at %3 UTC has been rejected by the administrators. Contact them for further details."
},
"approve": {
"title": "Your request has been approved",
"message": "Your request to \"%1\" published on %2 at %3 UTC has been approved by the administrators. Content has already been updated."
},
"renewal1": {
"title": "Your Delta Plus subscription has been renewed",
"message": "%1 coins have been taken from your balance to renew your Delta Plus subscription, the next renewal is due on %2."
},
"renewal2": {
"title": "Your Delta Ultra subscription has been renewed",
"message": "%1 coins have been taken from your balance to renew your Delta Ultra subscription, the next renewal is due on %2."
},
"expired1": {
"title": "Your Delta Plus subscription has expired",
"message": "Your Delta PLus subscription have ended because you do not have enough coins to pay for another month. All perks have been disabled."
},
"expired2": {
"title": "Your Delta Ultra subscription has expired",
"message": "Your Delta Ultra subscription have ended because you do not have enough coins to pay for another month. All perks have been disabled."
},
"birthday": {
"title": "Happy birthday!",