Grayscale profile option

merge-requests/8/head
Bob Mottram 2020-07-10 19:08:45 +01:00
parent 3f44e0c881
commit faf310fc12
22 changed files with 135 additions and 16 deletions

View File

@ -179,6 +179,8 @@ from cache import getPersonFromCache
from httpsig import verifyPostHeaders from httpsig import verifyPostHeaders
from theme import setTheme from theme import setTheme
from theme import getTheme from theme import getTheme
from theme import enableGrayscale
from theme import disableGrayscale
from schedule import runPostSchedule from schedule import runPostSchedule
from schedule import runPostScheduleWatchdog from schedule import runPostScheduleWatchdog
from schedule import removeScheduledPosts from schedule import removeScheduledPosts
@ -6494,6 +6496,14 @@ class PubServer(BaseHTTPRequestHandler):
if actorJson['type'] != 'Person': if actorJson['type'] != 'Person':
actorJson['type'] = 'Person' actorJson['type'] = 'Person'
actorChanged = True actorChanged = True
grayscale = False
if fields.get('grayscale'):
if fields['grayscale'] == 'on':
grayscale = True
if grayscale:
enableGrayscale(self.server.baseDir)
else:
disableGrayscale(self.server.baseDir)
# save filtered words list # save filtered words list
filterFilename = \ filterFilename = \
self.server.baseDir + '/accounts/' + \ self.server.baseDir + '/accounts/' + \

View File

@ -1,4 +1,5 @@
:root { :root {
--grayscale: 0%;
--main-bg-color: #282c37; --main-bg-color: #282c37;
--calendar-bg-color: #eee; --calendar-bg-color: #eee;
--lines-color: black; --lines-color: black;
@ -38,6 +39,7 @@ body {
font-family: 'Montserrat'; font-family: 'Montserrat';
font-weight: 700; font-weight: 700;
min-height: 100vh; min-height: 100vh;
filter: grayscale(--grayscale);
} }
main { main {
@ -180,10 +182,12 @@ tr:nth-child(even) > .calendar__day__cell:nth-child(even) {
} }
.calendardayicon { .calendardayicon {
filter: grayscale(--grayscale);
width: 100% width: 100%
} }
.buttonprev { .buttonprev {
filter: grayscale(--grayscale);
float: left; float: left;
width: 10%; width: 10%;
-ms-transform: translateY(30%); -ms-transform: translateY(30%);
@ -191,6 +195,7 @@ tr:nth-child(even) > .calendar__day__cell:nth-child(even) {
} }
.buttonnext { .buttonnext {
filter: grayscale(--grayscale);
float: right; float: right;
width: 10%; width: 10%;
-ms-transform: translateY(30%) scaleX(-1); -ms-transform: translateY(30%) scaleX(-1);

View File

@ -1,6 +1,7 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
--grayscale: 0%;
--main-bg-color: #282c37; --main-bg-color: #282c37;
--link-bg-color: #282c37; --link-bg-color: #282c37;
--main-fg-color: #dddddd; --main-fg-color: #dddddd;
@ -49,6 +50,7 @@ body, html {
max-width: 100%; max-width: 100%;
min-width: 600px; min-width: 600px;
margin: 5% auto; margin: 5% auto;
filter: grayscale(--grayscale);
} }
a, u { a, u {
@ -89,6 +91,7 @@ a:link {
} }
.followAvatar img { .followAvatar img {
filter: grayscale(--grayscale);
border-radius: 10%; border-radius: 10%;
width: 20%; width: 20%;
min-width: 200px; min-width: 200px;
@ -168,6 +171,7 @@ input[type=text] {
} }
.options img { .options img {
filter: grayscale(--grayscale);
width: 15%; width: 15%;
} }

View File

@ -1,6 +1,7 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
--grayscale: 0%;
--main-bg-color: #282c37; --main-bg-color: #282c37;
--link-bg-color: #282c37; --link-bg-color: #282c37;
--main-fg-color: #dddddd; --main-fg-color: #dddddd;
@ -40,6 +41,7 @@ body, html {
min-width: 600px; min-width: 600px;
margin: 0 auto; margin: 0 auto;
font-size: var(--font-size); font-size: var(--font-size);
filter: grayscale(--grayscale);
} }
a, u { a, u {
@ -96,11 +98,13 @@ button:hover {
} }
.imgcontainer { .imgcontainer {
filter: grayscale(--grayscale);
text-align: center; text-align: center;
margin: 24px 0 12px 0; margin: 24px 0 12px 0;
} }
img.avatar { img.avatar {
filter: grayscale(--grayscale);
width: 40%; width: 40%;
border-radius: 50%; border-radius: 50%;
} }

View File

@ -1,6 +1,7 @@
@charset "UTF-8"; @charset "UTF-8";
:root { :root {
--grayscale: 0%;
--main-bg-color: #282c37; --main-bg-color: #282c37;
--link-bg-color: #282c37; --link-bg-color: #282c37;
--dropdown-fg-color: #dddddd; --dropdown-fg-color: #dddddd;
@ -70,6 +71,7 @@ body, html {
min-width: 950px; min-width: 950px;
margin: 0 auto; margin: 0 auto;
font-size: var(--font-size); font-size: var(--font-size);
filter: grayscale(--grayscale);
} }
a, u { a, u {
@ -107,6 +109,7 @@ a:link {
} }
.rssfeed img { .rssfeed img {
filter: grayscale(--grayscale);
width: 5%; width: 5%;
float: right; float: right;
} }
@ -144,6 +147,7 @@ a:link {
} }
.hero-image img { .hero-image img {
filter: grayscale(--grayscale);
width: 50%; width: 50%;
} }
@ -175,6 +179,7 @@ a:link {
} }
.hero-text img.emoji { .hero-text img.emoji {
filter: grayscale(--grayscale);
width: 50px; width: 50px;
padding: 0 0; padding: 0 0;
margin: 0 0; margin: 0 0;
@ -306,6 +311,7 @@ a:link {
} }
.container img.emoji { .container img.emoji {
filter: grayscale(--grayscale);
float: none; float: none;
width: 50px; width: 50px;
margin-left: 0px; margin-left: 0px;
@ -316,6 +322,7 @@ a:link {
} }
.hero-text img.emojiprofile { .hero-text img.emojiprofile {
filter: grayscale(--grayscale);
float: none; float: none;
width: 50px; width: 50px;
margin-left: 0px; margin-left: 0px;
@ -349,6 +356,7 @@ a:link {
} }
.container img.announceOrReply { .container img.announceOrReply {
filter: grayscale(--grayscale);
float: none; float: none;
width: 30px; width: 30px;
margin: 0 0; margin: 0 0;
@ -358,6 +366,7 @@ a:link {
} }
.container img.DMicon { .container img.DMicon {
filter: grayscale(--grayscale);
float: none; float: none;
width: 40px; width: 40px;
margin: 0 0; margin: 0 0;
@ -380,12 +389,14 @@ a:link {
} }
.container img.attachment { .container img.attachment {
filter: grayscale(--grayscale);
max-width: 120%; max-width: 120%;
margin-left: 5%; margin-left: 5%;
width: 120%; width: 120%;
padding-bottom: 3%; padding-bottom: 3%;
} }
.container img.right { .container img.right {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
margin-left: 0px; margin-left: 0px;
margin-right:0; margin-right:0;
@ -393,6 +404,7 @@ a:link {
margin: 0 0; margin: 0 0;
} }
.containericons img.right { .containericons img.right {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
margin-left: 20px; margin-left: 20px;
margin-right: 0; margin-right: 0;
@ -526,6 +538,7 @@ input[type=submit]:hover {
} }
.dropdown img { .dropdown img {
filter: grayscale(--grayscale);
opacity: 1.0; opacity: 1.0;
width: 32px; width: 32px;
height: 32px; height: 32px;
@ -550,6 +563,7 @@ input[type=submit]:hover {
} }
.search-result img { .search-result img {
filter: grayscale(--grayscale);
width: 7%; width: 7%;
padding: 0px 30px; padding: 0px 30px;
} }
@ -574,6 +588,7 @@ input[type=submit]:hover {
} }
.dropdown-content img { .dropdown-content img {
filter: grayscale(--grayscale);
width: 32px; width: 32px;
height: 32px; height: 32px;
padding: 0px 0px; padding: 0px 0px;
@ -623,6 +638,7 @@ input[type=submit]:hover {
} }
.dropbtn img { .dropbtn img {
filter: grayscale(--grayscale);
opacity: 1.0; opacity: 1.0;
width: 3%; width: 3%;
height: 3%; height: 3%;
@ -636,6 +652,7 @@ div.gallery:hover {
} }
div.gallery img { div.gallery img {
filter: grayscale(--grayscale);
width: 100%; width: 100%;
height: auto; height: auto;
} }
@ -879,6 +896,7 @@ aside .toggle-inside li {
text-align: center; text-align: center;
} }
.container img { .container img {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 400px; max-width: 400px;
width: 5%; width: 5%;
@ -887,10 +905,12 @@ aside .toggle-inside li {
border-radius: var(--image-corners); border-radius: var(--image-corners);
} }
.container img.emojisearch { .container img.emojisearch {
filter: grayscale(--grayscale);
width: 15%; width: 15%;
float: right; float: right;
} }
.container img.emojicalendar { .container img.emojicalendar {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 400px; max-width: 400px;
width: 8%; width: 8%;
@ -898,6 +918,7 @@ aside .toggle-inside li {
transform: translateY(-25%); transform: translateY(-25%);
} }
.container img.timelineicon { .container img.timelineicon {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
margin-left: 0px; margin-left: 0px;
margin-right:0; margin-right:0;
@ -906,6 +927,7 @@ aside .toggle-inside li {
width: 50px; width: 50px;
} }
.container img.emojiheader { .container img.emojiheader {
filter: grayscale(--grayscale);
float: none; float: none;
width: 25px; width: 25px;
margin-left: 0px; margin-left: 0px;
@ -915,6 +937,7 @@ aside .toggle-inside li {
vertical-align: middle; vertical-align: middle;
} }
.containericons img { .containericons img {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
max-width: 200px; max-width: 200px;
width: 3%; width: 3%;
@ -922,6 +945,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
div.mediaicons img { div.mediaicons img {
filter: grayscale(--grayscale);
float: right; float: right;
max-width: 200px; max-width: 200px;
width: 6%; width: 6%;
@ -929,6 +953,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
div.mediaavatar img { div.mediaavatar img {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 200px; max-width: 200px;
width: 5%; width: 5%;
@ -936,6 +961,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
.timeline-avatar img { .timeline-avatar img {
filter: grayscale(--grayscale);
opacity: 1.0; opacity: 1.0;
width: 8%; width: 8%;
height: 8%; height: 8%;
@ -1191,20 +1217,24 @@ aside .toggle-inside li {
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
} }
.hero-text img.qrcode { .hero-text img.qrcode {
filter: grayscale(--grayscale);
border-radius: 1%; border-radius: 1%;
width: 5%; width: 5%;
min-width: 20px; min-width: 20px;
} }
.hero-text img.title { .hero-text img.title {
filter: grayscale(--grayscale);
border-radius: 1%; border-radius: 1%;
width: 15%; width: 15%;
} }
#msgscope label img { #msgscope label img {
filter: grayscale(--grayscale);
width: 46px; width: 46px;
height: 46px; height: 46px;
padding: 0px 0px; padding: 0px 0px;
} }
.toggle-msgScope img { .toggle-msgScope img {
filter: grayscale(--grayscale);
width: 32px; width: 32px;
height: 32px; height: 32px;
padding: 0px 0px; padding: 0px 0px;
@ -1280,6 +1310,7 @@ aside .toggle-inside li {
text-align: center; text-align: center;
} }
.container img { .container img {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 400px; max-width: 400px;
width: 15%; width: 15%;
@ -1288,10 +1319,12 @@ aside .toggle-inside li {
border-radius: var(--image-corners); border-radius: var(--image-corners);
} }
.container img.emojisearch { .container img.emojisearch {
filter: grayscale(--grayscale);
width: 25%; width: 25%;
float: right; float: right;
} }
.container img.emojicalendar { .container img.emojicalendar {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 400px; max-width: 400px;
width: 12%; width: 12%;
@ -1299,6 +1332,7 @@ aside .toggle-inside li {
transform: translateY(-25%); transform: translateY(-25%);
} }
.container img.timelineicon { .container img.timelineicon {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
margin-left: 0px; margin-left: 0px;
margin-right:0; margin-right:0;
@ -1307,6 +1341,7 @@ aside .toggle-inside li {
width: 100px; width: 100px;
} }
.container img.emojiheader { .container img.emojiheader {
filter: grayscale(--grayscale);
float: none; float: none;
width: 45px; width: 45px;
margin-left: 0px; margin-left: 0px;
@ -1316,6 +1351,7 @@ aside .toggle-inside li {
vertical-align: middle; vertical-align: middle;
} }
div.mediaavatar img { div.mediaavatar img {
filter: grayscale(--grayscale);
float: left; float: left;
max-width: 200px; max-width: 200px;
width: 8%; width: 8%;
@ -1323,6 +1359,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
div.mediaicons img { div.mediaicons img {
filter: grayscale(--grayscale);
float: right; float: right;
max-width: 200px; max-width: 200px;
width: 10%; width: 10%;
@ -1330,6 +1367,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
.containericons img { .containericons img {
filter: grayscale(--grayscale);
float: var(--icons-side); float: var(--icons-side);
max-width: 200px; max-width: 200px;
width: 7%; width: 7%;
@ -1337,6 +1375,7 @@ aside .toggle-inside li {
border-radius: 0%; border-radius: 0%;
} }
.timeline-avatar img { .timeline-avatar img {
filter: grayscale(--grayscale);
opacity: 1.0; opacity: 1.0;
width: 15%; width: 15%;
height: 15%; height: 15%;
@ -1592,20 +1631,24 @@ aside .toggle-inside li {
font-family: Arial, Helvetica, sans-serif; font-family: Arial, Helvetica, sans-serif;
} }
.hero-text img.qrcode { .hero-text img.qrcode {
filter: grayscale(--grayscale);
border-radius: 1%; border-radius: 1%;
width: 15%; width: 15%;
min-width: 20px; min-width: 20px;
} }
.hero-text img.title { .hero-text img.title {
filter: grayscale(--grayscale);
border-radius: 1%; border-radius: 1%;
width: 25%; width: 25%;
} }
#msgscope label img { #msgscope label img {
filter: grayscale(--grayscale);
width: 64px; width: 64px;
height: 64px; height: 64px;
padding: 0px 0px; padding: 0px 0px;
} }
.toggle-msgScope img { .toggle-msgScope img {
filter: grayscale(--grayscale);
width: 64px; width: 64px;
height: 64px; height: 64px;
margin: -15px 0px; margin: -15px 0px;

View File

@ -87,7 +87,8 @@ def setCSSparam(css: str, param: str, value: str) -> str:
def setThemeFromDict(baseDir: str, name: str, themeParams: {}) -> None: def setThemeFromDict(baseDir: str, name: str, themeParams: {}) -> None:
"""Uses a dictionary to set a theme """Uses a dictionary to set a theme
""" """
setThemeInConfig(baseDir, name) if name:
setThemeInConfig(baseDir, name)
themeFiles = ('epicyon.css', 'login.css', 'follow.css', themeFiles = ('epicyon.css', 'login.css', 'follow.css',
'suspended.css', 'calendar.css', 'blog.css') 'suspended.css', 'calendar.css', 'blog.css')
for filename in themeFiles: for filename in themeFiles:
@ -144,6 +145,29 @@ def setCustomFont(baseDir: str):
cssfile.write(css) cssfile.write(css)
def enableGrayscale(baseDir: str):
removeTheme(baseDir)
themeParams = {
"grayscale": "100%"
}
setThemeFromDict(baseDir, None, themeParams)
grayscaleFilename = baseDir + '/accounts/.grayscale'
if not os.path.isfile(grayscaleFilename):
with open(grayscaleFilename, 'w') as grayfile:
grayfile.write(' ')
def disableGrayscale(baseDir: str):
removeTheme(baseDir)
themeParams = {
"grayscale": "0%"
}
setThemeFromDict(baseDir, None, themeParams)
grayscaleFilename = baseDir + '/accounts/.grayscale'
if os.path.isfile(grayscaleFilename):
os.remove(grayscaleFilename)
def setThemeDefault(baseDir: str): def setThemeDefault(baseDir: str):
removeTheme(baseDir) removeTheme(baseDir)
setThemeInConfig(baseDir, 'default') setThemeInConfig(baseDir, 'default')
@ -613,4 +637,9 @@ def setTheme(baseDir: str, name: str) -> bool:
result = True result = True
setCustomFont(baseDir) setCustomFont(baseDir)
grayscaleFilename = baseDir + '/accounts/.grayscale'
if os.path.isfile(grayscaleFilename):
enableGrayscale(baseDir)
else:
disableGrayscale(baseDir)
return result return result

View File

@ -250,5 +250,6 @@
"Better luck next time": "حظ أوفر في المرة القادمة", "Better luck next time": "حظ أوفر في المرة القادمة",
"Unavailable": "غير متوفره", "Unavailable": "غير متوفره",
"The server is busy. Please try again later": "الخادم مشغول. الرجاء معاودة المحاولة في وقت لاحق", "The server is busy. Please try again later": "الخادم مشغول. الرجاء معاودة المحاولة في وقت لاحق",
"Receive calendar events from this account": "تلقي أحداث التقويم من هذا الحساب" "Receive calendar events from this account": "تلقي أحداث التقويم من هذا الحساب",
"Grayscale": "درجات الرمادي"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Que tingueu més sort la propera vegada", "Better luck next time": "Que tingueu més sort la propera vegada",
"Unavailable": "No disponible", "Unavailable": "No disponible",
"The server is busy. Please try again later": "El servidor està ocupat. Siusplau, intenta-ho més tard", "The server is busy. Please try again later": "El servidor està ocupat. Siusplau, intenta-ho més tard",
"Receive calendar events from this account": "Rep esdeveniments del calendari des daquest compte" "Receive calendar events from this account": "Rep esdeveniments del calendari des daquest compte",
"Grayscale": "Escala de grisos"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Gwell lwc y tro nesaf", "Better luck next time": "Gwell lwc y tro nesaf",
"Unavailable": "Ddim ar gael", "Unavailable": "Ddim ar gael",
"The server is busy. Please try again later": "Mae'r gweinydd yn brysur. Rho gynnig Arni eto'n hwyrach", "The server is busy. Please try again later": "Mae'r gweinydd yn brysur. Rho gynnig Arni eto'n hwyrach",
"Receive calendar events from this account": "Derbyn digwyddiadau calendr o'r cyfrif hwn" "Receive calendar events from this account": "Derbyn digwyddiadau calendr o'r cyfrif hwn",
"Grayscale": "Graddlwyd"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Viel Glück beim nächsten Mal", "Better luck next time": "Viel Glück beim nächsten Mal",
"Unavailable": "Nicht verfügbar", "Unavailable": "Nicht verfügbar",
"The server is busy. Please try again later": "Der Server ist beschäftigt. Bitte versuchen Sie es später noch einmal", "The server is busy. Please try again later": "Der Server ist beschäftigt. Bitte versuchen Sie es später noch einmal",
"Receive calendar events from this account": "Erhalten Sie Kalenderereignisse von diesem Konto" "Receive calendar events from this account": "Erhalten Sie Kalenderereignisse von diesem Konto",
"Grayscale": "Graustufen"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Better luck next time", "Better luck next time": "Better luck next time",
"Unavailable": "Unavailable", "Unavailable": "Unavailable",
"The server is busy. Please try again later": "The server is busy. Please try again later", "The server is busy. Please try again later": "The server is busy. Please try again later",
"Receive calendar events from this account": "Receive calendar events from this account" "Receive calendar events from this account": "Receive calendar events from this account",
"Grayscale": "Grayscale"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Mejor suerte la próxima vez", "Better luck next time": "Mejor suerte la próxima vez",
"Unavailable": "Indisponible", "Unavailable": "Indisponible",
"The server is busy. Please try again later": "El servidor esta ocupado. Por favor, inténtelo de nuevo más tarde", "The server is busy. Please try again later": "El servidor esta ocupado. Por favor, inténtelo de nuevo más tarde",
"Receive calendar events from this account": "Recibe eventos de calendario de esta cuenta" "Receive calendar events from this account": "Recibe eventos de calendario de esta cuenta",
"Grayscale": "Escala de grises"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Plus de chance la prochaine fois", "Better luck next time": "Plus de chance la prochaine fois",
"Unavailable": "Indisponible", "Unavailable": "Indisponible",
"The server is busy. Please try again later": "Le serveur est occupé. Veuillez réessayer plus tard", "The server is busy. Please try again later": "Le serveur est occupé. Veuillez réessayer plus tard",
"Receive calendar events from this account": "Recevoir des événements d'agenda de ce compte" "Receive calendar events from this account": "Recevoir des événements d'agenda de ce compte",
"Grayscale": "Niveaux de gris"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Ádh níos fearr an chéad uair eile", "Better luck next time": "Ádh níos fearr an chéad uair eile",
"Unavailable": "Níl sé ar fáil", "Unavailable": "Níl sé ar fáil",
"The server is busy. Please try again later": "Tá an freastalaí gnóthach. Bain triail eile as níos déanaí", "The server is busy. Please try again later": "Tá an freastalaí gnóthach. Bain triail eile as níos déanaí",
"Receive calendar events from this account": "Faigh imeachtaí féilire ón gcuntas seo" "Receive calendar events from this account": "Faigh imeachtaí féilire ón gcuntas seo",
"Grayscale": "Liathscála"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "अगली बार किस्मत तुम्हारा साथ देगी", "Better luck next time": "अगली बार किस्मत तुम्हारा साथ देगी",
"Unavailable": "अनुपलब्ध", "Unavailable": "अनुपलब्ध",
"The server is busy. Please try again later": "सर्वर व्यस्त है। बाद में पुन: प्रयास करें", "The server is busy. Please try again later": "सर्वर व्यस्त है। बाद में पुन: प्रयास करें",
"Receive calendar events from this account": "इस खाते से कैलेंडर ईवेंट प्राप्त करें" "Receive calendar events from this account": "इस खाते से कैलेंडर ईवेंट प्राप्त करें",
"Grayscale": "ग्रेस्केल"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "La prossima volta sarai più fortunato", "Better luck next time": "La prossima volta sarai più fortunato",
"Unavailable": "non disponibile", "Unavailable": "non disponibile",
"The server is busy. Please try again later": "Il server è occupato. Per favore riprova più tardi", "The server is busy. Please try again later": "Il server è occupato. Per favore riprova più tardi",
"Receive calendar events from this account": "Ricevi eventi di calendario da questo account" "Receive calendar events from this account": "Ricevi eventi di calendario da questo account",
"Grayscale": "Scala di grigi"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "次回は幸運を", "Better luck next time": "次回は幸運を",
"Unavailable": "利用できません", "Unavailable": "利用できません",
"The server is busy. Please try again later": "サーバーはビジーです。 後でもう一度やり直してください", "The server is busy. Please try again later": "サーバーはビジーです。 後でもう一度やり直してください",
"Receive calendar events from this account": "このアカウントからカレンダーイベントを受信します" "Receive calendar events from this account": "このアカウントからカレンダーイベントを受信します",
"Grayscale": "グレースケール"
} }

View File

@ -246,5 +246,6 @@
"Better luck next time": "Better luck next time", "Better luck next time": "Better luck next time",
"Unavailable": "Unavailable", "Unavailable": "Unavailable",
"The server is busy. Please try again later": "The server is busy. Please try again later", "The server is busy. Please try again later": "The server is busy. Please try again later",
"Receive calendar events from this account": "Receive calendar events from this account" "Receive calendar events from this account": "Receive calendar events from this account",
"Grayscale": "Grayscale"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Mais sorte da próxima vez", "Better luck next time": "Mais sorte da próxima vez",
"Unavailable": "Indisponível", "Unavailable": "Indisponível",
"The server is busy. Please try again later": "O servidor está ocupado. Por favor, tente novamente mais tarde", "The server is busy. Please try again later": "O servidor está ocupado. Por favor, tente novamente mais tarde",
"Receive calendar events from this account": "Receba eventos da agenda desta conta" "Receive calendar events from this account": "Receba eventos da agenda desta conta",
"Grayscale": "Escala de cinza"
} }

View File

@ -250,5 +250,6 @@
"Better luck next time": "Повезет в следующий раз", "Better luck next time": "Повезет в следующий раз",
"Unavailable": "Недоступен", "Unavailable": "Недоступен",
"The server is busy. Please try again later": "Сервер занят. Пожалуйста, попробуйте позже", "The server is busy. Please try again later": "Сервер занят. Пожалуйста, попробуйте позже",
"Receive calendar events from this account": "Получать события календаря от этого аккаунта" "Receive calendar events from this account": "Получать события календаря от этого аккаунта",
"Grayscale": "Оттенки серого"
} }

View File

@ -249,5 +249,6 @@
"Better luck next time": "下次好运", "Better luck next time": "下次好运",
"Unavailable": "不可用", "Unavailable": "不可用",
"The server is busy. Please try again later": "服务器忙。 请稍后再试", "The server is busy. Please try again later": "服务器忙。 请稍后再试",
"Receive calendar events from this account": "从该帐户接收日历事件" "Receive calendar events from this account": "从该帐户接收日历事件",
"Grayscale": "灰阶"
} }

View File

@ -1243,6 +1243,15 @@ def htmlEditProfile(translate: {}, baseDir: str, path: str,
themes = getThemesList() themes = getThemesList()
themesDropdown = '<div class="container">' themesDropdown = '<div class="container">'
themesDropdown += ' <b>' + translate['Theme'] + '</b><br>' themesDropdown += ' <b>' + translate['Theme'] + '</b><br>'
grayscaleFilename = \
baseDir + '/accounts/.grayscale'
grayscale = ''
if os.path.isfile(grayscaleFilename):
grayscale = 'checked'
themesDropdown += \
' <input type="checkbox" class="profilecheckbox" ' + \
'name="grayscale" ' + grayscale + \
'> ' + translate['Grayscale'] + '<br>'
themesDropdown += ' <select id="themeDropdown" ' + \ themesDropdown += ' <select id="themeDropdown" ' + \
'name="themeDropdown" class="theme">' 'name="themeDropdown" class="theme">'
for themeName in themes: for themeName in themes: