mirror of
https://github.com/freedit-org/freedit.git
synced 2026-01-09 12:38:04 -05:00
i18n (#301)
* i18n * i18n * dedup feed items * fmt * update * typos * [wip] #208 * [wip] * i18n * i18n * i18n * typos * i18n * Update i18n/en.toml Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> * i18n * i18n * typos happy * typos happy --------- Co-authored-by: GitHub <github@github.com> Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
This commit is contained in:
67
Cargo.lock
generated
67
Cargo.lock
generated
@@ -89,9 +89,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
|
||||
|
||||
[[package]]
|
||||
name = "async-compression"
|
||||
version = "0.4.14"
|
||||
version = "0.4.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "998282f8f49ccd6116b0ed8a4de0fbd3151697920e7c7533416d6e25e76434a7"
|
||||
checksum = "103db485efc3e41214fe4fda9f3dbeae2eb9082f48fd236e6095627a9422066e"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
"memchr",
|
||||
@@ -340,9 +340,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.18.0"
|
||||
version = "1.19.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94bbb0ad554ad961ddc5da507a12a29b14e4ae5bda06b19f575a3e6079d2e2ae"
|
||||
checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
@@ -418,9 +418,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.1.30"
|
||||
version = "1.1.31"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b16803a61b81d9eabb7eae2588776c4c1e584b738ede45fdbb4c972cec1e9945"
|
||||
checksum = "c2e7962b54006dcfcc61cb72735f4d89bb97061dd6a7ed882ec6b8ee53714c6f"
|
||||
dependencies = [
|
||||
"jobserver",
|
||||
"libc",
|
||||
@@ -1082,9 +1082,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.4.1"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "50dfd22e0e76d0f662d429a5f80fcaf3855009297eab6a0a9f8543834744ba05"
|
||||
checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
@@ -1164,9 +1164,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "image"
|
||||
version = "0.25.2"
|
||||
version = "0.25.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "99314c8a2152b8ddb211f924cdae532d8c5e4c8bb54728e12fff1b0cd5963a10"
|
||||
checksum = "bc144d44a31d753b02ce64093d532f55ff8dc4ebf2ffb8a63c0dda691385acae"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
"byteorder-lite",
|
||||
@@ -1289,9 +1289,9 @@ checksum = "0c2cdeb66e45e9f36bfad5bbdb4d2384e70936afbee843c6f6543f0c551ebb25"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.159"
|
||||
version = "0.2.161"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "561d97a539a36e26a9a5fad1ea11a3039a67714694aaa379433e580854bc3dc5"
|
||||
checksum = "8e9489c2807c139ffd9c1794f4af0ebe86a828db53ecdc7fea2111d0fed085d1"
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
@@ -1592,9 +1592,9 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775"
|
||||
|
||||
[[package]]
|
||||
name = "once_map"
|
||||
version = "0.4.20"
|
||||
version = "0.4.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ed29bb6f7d6ac14023acb332a356f3891265d780e254057c866dbe7a909d2d2d"
|
||||
checksum = "7bd2cae3bec3936bbed1ccc5a3343b3738858182419f9c0522c7260c80c430b0"
|
||||
dependencies = [
|
||||
"ahash 0.8.11",
|
||||
"hashbrown 0.15.0",
|
||||
@@ -1782,18 +1782,18 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.87"
|
||||
version = "1.0.88"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b3e4daa0dcf6feba26f985457cdf104d4b4256fc5a09547140f3631bb076b19a"
|
||||
checksum = "7c3a7fc5db1e57d5a779a352c8cdb57b29aa4c40cc69c3a68a7fedc815fbf2f9"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "pulldown-cmark"
|
||||
version = "0.12.1"
|
||||
version = "0.12.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "666f0f59e259aea2d72e6012290c09877a780935cc3c18b1ceded41f3890d59c"
|
||||
checksum = "f86ba2052aebccc42cbbb3ed234b8b13ce76f75c3551a303cb2bcffcff12bb14"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"memchr",
|
||||
@@ -2169,9 +2169,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.23.14"
|
||||
version = "0.23.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "415d9944693cb90382053259f89fbb077ea730ad7273047ec63b19bc9b160ba8"
|
||||
checksum = "5fbb44d7acc4e873d613422379f69f237a1b141928c02f6bc6ccfddddc2d7993"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"ring",
|
||||
@@ -2192,9 +2192,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustls-pki-types"
|
||||
version = "1.9.0"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e696e35370c65c9c541198af4543ccd580cf17fc25d8e05c5a242b202488c55"
|
||||
checksum = "16f1201b3c9a7ee8039bcadc17b7e605e2945b27eee7631788c1bd2b0643674b"
|
||||
|
||||
[[package]]
|
||||
name = "rustls-webpki"
|
||||
@@ -2209,9 +2209,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustversion"
|
||||
version = "1.0.17"
|
||||
version = "1.0.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6"
|
||||
checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
@@ -2256,9 +2256,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.128"
|
||||
version = "1.0.132"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ff5456707a1de34e7e37f2a6fd3d3f808c318259cbd01ab6377795054b483d8"
|
||||
checksum = "d726bfaff4b320266d395898905d0eba0345aae23b54aee3a737e260fd46db03"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"memchr",
|
||||
@@ -2443,9 +2443,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.79"
|
||||
version = "2.0.81"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89132cd0bf050864e1d38dc3bbc07a0eb8e7530af26344d3d2bbbef83499f590"
|
||||
checksum = "198514704ca887dd5a1e408c6c6cdcba43672f9b4062e1b24aa34e74e6d7faae"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -2914,12 +2914,9 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825"
|
||||
|
||||
[[package]]
|
||||
name = "unicase"
|
||||
version = "2.7.0"
|
||||
version = "2.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89"
|
||||
dependencies = [
|
||||
"version_check",
|
||||
]
|
||||
checksum = "7e51b68083f157f853b6379db119d1c1be0e6e4dec98101079dec41f6f5cf6df"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bidi"
|
||||
@@ -2985,9 +2982,9 @@ checksum = "7fcfc827f90e53a02eaef5e535ee14266c1d569214c6aa70133a624d8a3164ba"
|
||||
|
||||
[[package]]
|
||||
name = "uuid"
|
||||
version = "1.10.0"
|
||||
version = "1.11.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "81dfa00651efa65069b0b6b651f4aaa31ba9e3c3ce0137aaad053604ee7e0314"
|
||||
checksum = "f8c5f0a0af699448548ad1a2fbf920fb4bee257eae39953ba95cb84891a0446a"
|
||||
dependencies = [
|
||||
"getrandom",
|
||||
"serde",
|
||||
|
||||
@@ -10,6 +10,14 @@ Demo: <https://freedit.eu/>
|
||||
|
||||
GitHub: <https://github.com/freedit-org/freedit>
|
||||
|
||||
## Support
|
||||
|
||||
Help support the development and maintenance of freedit. Your contributions are greatly appreciated!
|
||||
|
||||
- Monero (XMR): `45JB1KbCM54gw7zDY8LzkDXjEibDgTspyKBzM8VWi8mL1gY3wCyzHsCSRGRsXBwGgdC6HX1EtJFoNYXZELnDQW8S7DRG8tL`
|
||||
|
||||
All donations go towards hosting costs and continued development of freedit. Thank you for your support!
|
||||
|
||||
## Features
|
||||
|
||||
* Easy to deploy: one binary to run, using embedded database [sled](https://github.com/spacejam/sled)
|
||||
|
||||
139
i18n/en.toml
Normal file
139
i18n/en.toml
Normal file
@@ -0,0 +1,139 @@
|
||||
about = "About"
|
||||
active = "Active"
|
||||
add = "Add"
|
||||
admin = "Admin"
|
||||
agree_terms = "I agree to the "
|
||||
all = "All"
|
||||
already_have_account = "Already have an account?"
|
||||
apply = "Apply"
|
||||
article_max_length = "Article Max Length"
|
||||
avatar_help = "Please clear browser cache"
|
||||
banned = "Banned"
|
||||
captcha = "Captcha"
|
||||
captcha_difficulty = "Captcha Difficulty"
|
||||
captcha_name = "Captcha Name"
|
||||
comment = "Comment"
|
||||
comment_interval = "Comment Interval"
|
||||
comment_max_length = "Comment Max Length"
|
||||
created = "Created"
|
||||
db_view = "DB View"
|
||||
delete = "Delete"
|
||||
delete_draft = "Delete Draft"
|
||||
delete_permanently = "Delete Permanently"
|
||||
delete_sure = "Are you sure you want to delete this?"
|
||||
description = "Description"
|
||||
domain = "Domain"
|
||||
draft = "Draft"
|
||||
early_birds = "Early Birds"
|
||||
early_birds_help = "An early bird will be Fellow automatically."
|
||||
easy = "Easy"
|
||||
edit = "Edit"
|
||||
error = "Error"
|
||||
everyone = "Everyone"
|
||||
exit = "Exit"
|
||||
explore = "Explore"
|
||||
feed_add_help = "Only works when new is selected"
|
||||
feed_url_help = "rss/atom feed url"
|
||||
fellow = "Fellow"
|
||||
folder = "Folder"
|
||||
followers = "Followers"
|
||||
following = "Following"
|
||||
forgot_password = "Forgot Password?"
|
||||
gallery = "Gallery"
|
||||
hard = "Hard"
|
||||
hidden = "Hidden"
|
||||
hide = "Hide"
|
||||
home_page = "Default Home Page"
|
||||
inn_feed_help = "Submit url again to unsubscribe."
|
||||
inn_mod_max = "Inn Mod Max"
|
||||
inn_name = "Inn Name"
|
||||
inn_type = "Inn Type"
|
||||
intern = "Intern"
|
||||
is_public = "Is Public"
|
||||
join = "Join"
|
||||
join_to_comment = "Join to comment"
|
||||
joined = "Joined"
|
||||
just_me = "Just Me"
|
||||
lang = "Language"
|
||||
like = "Like"
|
||||
limit_edit_seconds = "Limited Edit Seconds"
|
||||
limit_edit_seconds_help = "How long before users are blocked from editing? (set 0 to allow anytime)"
|
||||
limited = "Limited"
|
||||
list = "List"
|
||||
load_image = "Load Image"
|
||||
lock = "Lock"
|
||||
medium = "Medium"
|
||||
members = "Members"
|
||||
mod = "Mod"
|
||||
new = "New"
|
||||
new_comment = "New Comment"
|
||||
new_folder = "New Folder"
|
||||
new_password = "New Password"
|
||||
new_post = "New Post"
|
||||
next = "Next"
|
||||
old_password = "Old Password"
|
||||
password = "Password"
|
||||
password_help = "Password must be 7 - 20 chars"
|
||||
password_reset = "Password Reset"
|
||||
pending = "Pending"
|
||||
per_page = "Per Page"
|
||||
pin = "Pin"
|
||||
post = "Post"
|
||||
post_interval = "Post Interval"
|
||||
prev = "Prev"
|
||||
preview = "Preview"
|
||||
private = "Private"
|
||||
private_help = "The Private inn can not be changed to other type."
|
||||
private_hidden = "Private Hidden"
|
||||
public = "Public"
|
||||
re_enter_password = "Re-enter Password"
|
||||
read_only = "Read Only"
|
||||
recovery_code = "Recovery Code"
|
||||
recovery_code_last_valid = "Each time you generate a new code and only the last one will be valid."
|
||||
recovery_code_msg = "You have not set a recovery code. If you lose your password, you will not be able to recover your account."
|
||||
recovery_code_note = "We will not save this code in database. If you close this page, nobody will see this code again."
|
||||
recovery_code_privacy_note = "For your privacy, Freedit does not require your email. You can send emails directly to yourself and save them in your account."
|
||||
recovery_generate = "Generate recovery code"
|
||||
recovery_help = "You must input your password to generate or reset your recovery code."
|
||||
refresh = "Refresh"
|
||||
rejected = "Rejected"
|
||||
remove = "Remove"
|
||||
role = "Role"
|
||||
save = "Save"
|
||||
save_draft = "Save Draft"
|
||||
search = "Search"
|
||||
senior = "Senior"
|
||||
sessions = "Sessions"
|
||||
sign_in = "Sign In"
|
||||
sign_in_to_comment = "Sign in to comment"
|
||||
sign_out = "Sign Out"
|
||||
sign_up = "Sign Up"
|
||||
site_name = "Site Name"
|
||||
site_settings = "Site Settings"
|
||||
solo_interval = "Solo Interval"
|
||||
source = "Source"
|
||||
spam_regex = "Spam Regex"
|
||||
standard = "Standard"
|
||||
star = "Star"
|
||||
stats = "Stats"
|
||||
stay_logged_in = "Stay logged in"
|
||||
submit = "Submit"
|
||||
subscribe = "Subscribe"
|
||||
super = "Super"
|
||||
terms = "Terms and Conditions"
|
||||
title_max_length = "Title Max Length"
|
||||
topics = "Topics"
|
||||
topics_help = "# separated"
|
||||
uname_or_id = "Username or uid"
|
||||
unhide = "Unhide"
|
||||
unlock = "Unlock"
|
||||
unpin = "Unpin"
|
||||
unread = "Unread"
|
||||
unsubscribe = "Unsubscribe"
|
||||
upload = "Upload"
|
||||
upload_help = "Max 10 pictures; jpg jpeg png wepb and gif is allowed."
|
||||
url = "URL"
|
||||
user_name = "User Name"
|
||||
user_name_help = "Username, Not start with number, 2 - 10 chars"
|
||||
users = "Users"
|
||||
warning = "Warning"
|
||||
139
i18n/fr.toml
Normal file
139
i18n/fr.toml
Normal file
@@ -0,0 +1,139 @@
|
||||
about = "À propos"
|
||||
active = "Actif"
|
||||
add = "Ajouter"
|
||||
admin = "Administrateur"
|
||||
agree_terms = "J'accepte les "
|
||||
all = "Tous"
|
||||
already_have_account = "Vous avez déjà un compte ?"
|
||||
apply = "Appliquer"
|
||||
article_max_length = "Longueur maximale de l'article"
|
||||
avatar_help = "Veuillez vider le cache du navigateur"
|
||||
banned = "Banni"
|
||||
captcha = "Captcha"
|
||||
captcha_difficulty = "Difficulté du captcha"
|
||||
captcha_name = "Nom du captcha"
|
||||
comment = "Commentaire"
|
||||
comment_interval = "Intervalle des commentaires"
|
||||
comment_max_length = "Longueur maximale du commentaire"
|
||||
created = "Créé"
|
||||
db_view = "Vue de la base de données"
|
||||
delete = "Supprimer"
|
||||
delete_draft = "Supprimer le brouillon"
|
||||
delete_permanently = "Supprimer définitivement"
|
||||
delete_sure = "Êtes-vous sûr de vouloir supprimer ceci ?"
|
||||
description = "Description"
|
||||
domain = "Domaine"
|
||||
draft = "Brouillon"
|
||||
early_birds = "Premiers inscrits"
|
||||
early_birds_help = "Un premier inscrit deviendra automatiquement Fellow."
|
||||
easy = "Facile"
|
||||
edit = "Modifier"
|
||||
error = "Erreur"
|
||||
everyone = "Tout le monde"
|
||||
exit = "Quitter"
|
||||
explore = "Explorer"
|
||||
feed_add_help = "Ne fonctionne que lorsque 'Nouveau' est sélectionné"
|
||||
feed_url_help = "URL du flux rss/atom"
|
||||
fellow = "Membre"
|
||||
folder = "Dossier"
|
||||
followers = "Abonnés"
|
||||
following = "Abonnements"
|
||||
forgot_password = "Mot de passe oublié ?"
|
||||
gallery = "Galerie"
|
||||
hard = "Difficile"
|
||||
hidden = "Caché"
|
||||
hide = "Cacher"
|
||||
home_page = "Page d'accueil par défaut"
|
||||
inn_feed_help = "Soumettez à nouveau l'URL pour vous désabonner."
|
||||
inn_mod_max = "Max modérateurs"
|
||||
inn_name = "Nom de l'auberge"
|
||||
inn_type = "Type d'auberge"
|
||||
intern = "Stagiaire"
|
||||
is_public = "Est public"
|
||||
join = "Rejoindre"
|
||||
join_to_comment = "Rejoignez pour commenter"
|
||||
joined = "Rejoint"
|
||||
just_me = "Moi uniquement"
|
||||
lang = "Langue"
|
||||
like = "J'aime"
|
||||
limit_edit_seconds = "Limite de temps d'édition (en secondes)"
|
||||
limit_edit_seconds_help = "Combien de temps avant que les utilisateurs ne puissent plus modifier ? (mettre 0 pour permettre à tout moment)"
|
||||
limited = "Limité"
|
||||
list = "Liste"
|
||||
load_image = "Charger une image"
|
||||
lock = "Verrouiller"
|
||||
medium = "Moyen"
|
||||
members = "Membres"
|
||||
mod = "Modérateur"
|
||||
new = "Nouveau"
|
||||
new_comment = "Nouveau commentaire"
|
||||
new_folder = "Nouveau dossier"
|
||||
new_password = "Nouveau mot de passe"
|
||||
new_post = "Nouvel article"
|
||||
next = "Suivant"
|
||||
old_password = "Ancien mot de passe"
|
||||
password = "Mot de passe"
|
||||
password_help = "Le mot de passe doit comporter entre 7 et 20 caractères"
|
||||
password_reset = "Réinitialiser le mot de passe"
|
||||
pending = "En attente"
|
||||
per_page = "Par page"
|
||||
pin = "Épingler"
|
||||
post = "Publier"
|
||||
post_interval = "Intervalle de publication"
|
||||
prev = "Précédent"
|
||||
preview = "Aperçu"
|
||||
private = "Privé"
|
||||
private_help = "L'auberge privée ne peut pas être changée en un autre type."
|
||||
private_hidden = "Privé caché"
|
||||
public = "Public"
|
||||
re_enter_password = "Confirmer le mot de passe"
|
||||
read_only = "Lecture seule"
|
||||
recovery_code = "Code de récupération"
|
||||
recovery_code_last_valid = "Chaque fois que vous générez un nouveau code, seul le dernier sera valide."
|
||||
recovery_code_msg = "Vous n'avez pas défini de code de récupération. Si vous perdez votre mot de passe, vous ne pourrez pas récupérer votre compte."
|
||||
recovery_code_note = "Nous ne sauvegarderons pas ce code dans la base de données. Si vous fermez cette page, personne ne pourra voir ce code à nouveau."
|
||||
recovery_code_privacy_note = "Pour votre vie privée, Freedit ne nécessite pas votre adresse e-mail. Vous pouvez envoyer des e-mails directement à vous-même et les enregistrer dans votre compte."
|
||||
recovery_generate = "Générer le code de récupération"
|
||||
recovery_help = "Vous devez saisir votre mot de passe pour générer ou réinitialiser votre code de récupération."
|
||||
refresh = "Actualiser"
|
||||
rejected = "Rejeté"
|
||||
remove = "Supprimer"
|
||||
role = "Rôle"
|
||||
save = "Enregistrer"
|
||||
save_draft = "Enregistrer le brouillon"
|
||||
search = "Recherche"
|
||||
senior = "Sénior"
|
||||
sessions = "Sessions"
|
||||
sign_in = "Se connecter"
|
||||
sign_in_to_comment = "Connectez-vous pour commenter"
|
||||
sign_out = "Se déconnecter"
|
||||
sign_up = "S'inscrire"
|
||||
site_name = "Nom du site"
|
||||
site_settings = "Paramètres du site"
|
||||
solo_interval = "Intervalle solo"
|
||||
source = "Source"
|
||||
spam_regex = "Regex spam"
|
||||
standard = "Standard"
|
||||
star = "Étoile"
|
||||
stats = "Statistiques"
|
||||
stay_logged_in = "Rester connecté"
|
||||
submit = "Soumettre"
|
||||
subscribe = "S'abonner"
|
||||
super = "Super"
|
||||
terms = "termes et conditions"
|
||||
title_max_length = "Longueur maximale du titre"
|
||||
topics = "Sujets"
|
||||
topics_help = "Séparés par #"
|
||||
uname_or_id = "Nom d'utilisateur ou uid"
|
||||
unhide = "Révéler"
|
||||
unlock = "Déverrouiller"
|
||||
unpin = "Détacher"
|
||||
unread = "Non lu"
|
||||
unsubscribe = "Se désabonner"
|
||||
upload = "Téléverser"
|
||||
upload_help = "10 images max ; jpg jpeg png webp et gif sont autorisés."
|
||||
url = "URL"
|
||||
user_name = "Nom d'utilisateur"
|
||||
user_name_help = "Nom d'utilisateur, ne commence pas par un chiffre, 2 à 10 caractères"
|
||||
users = "Utilisateurs"
|
||||
warning = "Avertissement"
|
||||
139
i18n/ja.toml
Normal file
139
i18n/ja.toml
Normal file
@@ -0,0 +1,139 @@
|
||||
about = "概要"
|
||||
active = "アクティブ"
|
||||
add = "追加"
|
||||
admin = "管理者"
|
||||
agree_terms = "同意します"
|
||||
all = "すべて"
|
||||
already_have_account = "既にアカウントをお持ちですか?"
|
||||
apply = "適用"
|
||||
article_max_length = "記事の最大長"
|
||||
avatar_help = "ブラウザのキャッシュをクリアしてください"
|
||||
banned = "禁止"
|
||||
captcha = "キャプチャ"
|
||||
captcha_difficulty = "キャプチャの難易度"
|
||||
captcha_name = "キャプチャ名"
|
||||
comment = "コメント"
|
||||
comment_interval = "コメントの間隔"
|
||||
comment_max_length = "コメントの最大長"
|
||||
created = "作成日時"
|
||||
db_view = "データベースビュー"
|
||||
delete = "削除"
|
||||
delete_draft = "ドラフトを削除"
|
||||
delete_permanently = "完全に削除"
|
||||
delete_sure = "本当に削除しますか?"
|
||||
description = "説明"
|
||||
domain = "ドメイン"
|
||||
draft = "ドラフト"
|
||||
early_birds = "早期ユーザー"
|
||||
early_birds_help = "早期ユーザーは自動的に Fellow になります。"
|
||||
easy = "簡単"
|
||||
edit = "編集"
|
||||
error = "エラー"
|
||||
everyone = "すべての人"
|
||||
exit = "終了"
|
||||
explore = "探索"
|
||||
feed_add_help = "新規選択時のみ機能します"
|
||||
feed_url_help = "rss/atom フィードURL"
|
||||
fellow = "フェロー"
|
||||
folder = "フォルダ"
|
||||
followers = "フォロワー"
|
||||
following = "フォロー中"
|
||||
forgot_password = "パスワードをお忘れですか?"
|
||||
gallery = "ギャラリー"
|
||||
hard = "難しい"
|
||||
hidden = "非表示"
|
||||
hide = "非表示"
|
||||
home_page = "デフォルトホームページ"
|
||||
inn_feed_help = "もう一度 URL を送信して購読を解除します。"
|
||||
inn_mod_max = "最大管理者数"
|
||||
inn_name = "イン名"
|
||||
inn_type = "インタイプ"
|
||||
intern = "インターン"
|
||||
is_public = "公開されていますか?"
|
||||
join = "参加"
|
||||
join_to_comment = "コメントするには参加"
|
||||
joined = "参加済み"
|
||||
just_me = "自分のみ"
|
||||
lang = "言語"
|
||||
like = "いいね"
|
||||
limit_edit_seconds = "編集制限時間(秒)"
|
||||
limit_edit_seconds_help = "ユーザーが編集をブロックされるまでの時間(0 に設定するといつでも許可)"
|
||||
limited = "制限付き"
|
||||
list = "リスト"
|
||||
load_image = "画像を読み込む"
|
||||
lock = "ロック"
|
||||
medium = "中"
|
||||
members = "メンバー"
|
||||
mod = "モデレーター"
|
||||
new = "新規"
|
||||
new_comment = "新しいコメント"
|
||||
new_folder = "新しいフォルダ"
|
||||
new_password = "新しいパスワード"
|
||||
new_post = "新しい投稿"
|
||||
next = "次"
|
||||
old_password = "旧パスワード"
|
||||
password = "パスワード"
|
||||
password_help = "パスワードは7〜20文字で入力してください"
|
||||
password_reset = "パスワードのリセット"
|
||||
pending = "保留中"
|
||||
per_page = "1ページあたり"
|
||||
pin = "ピン"
|
||||
post = "投稿"
|
||||
post_interval = "投稿の間隔"
|
||||
prev = "前"
|
||||
preview = "プレビュー"
|
||||
private = "非公開"
|
||||
private_help = "非公開のインは他のタイプに変更できません。"
|
||||
private_hidden = "非公開の非表示"
|
||||
public = "公開"
|
||||
re_enter_password = "パスワードを再入力"
|
||||
read_only = "読み取り専用"
|
||||
recovery_code = "回復コード"
|
||||
recovery_code_last_valid = "新しいコードを生成するたびに、最後のコードのみが有効になります。"
|
||||
recovery_code_msg = "回復コードを設定していません。パスワードを忘れると、アカウントを回復できません。"
|
||||
recovery_code_note = "このコードはデータベースに保存されません。このページを閉じると、誰もこのコードを見ることはできません。"
|
||||
recovery_code_privacy_note = "プライバシー保護のため、Freedit はメールアドレスを必要としません。自分宛にメールを直接送信し、アカウントに保存できます。"
|
||||
recovery_generate = "回復コードを生成"
|
||||
recovery_help = "回復コードを生成またはリセットするには、パスワードを入力する必要があります。"
|
||||
refresh = "更新"
|
||||
rejected = "拒否されました"
|
||||
remove = "削除"
|
||||
role = "役割"
|
||||
save = "保存"
|
||||
save_draft = "ドラフトを保存"
|
||||
search = "検索"
|
||||
senior = "シニア"
|
||||
sessions = "セッション"
|
||||
sign_in = "ログイン"
|
||||
sign_in_to_comment = "コメントするにはログイン"
|
||||
sign_out = "ログアウト"
|
||||
sign_up = "サインアップ"
|
||||
site_name = "サイト名"
|
||||
site_settings = "サイト設定"
|
||||
solo_interval = "個別投稿間隔"
|
||||
source = "ソース"
|
||||
spam_regex = "スパムの正規表現"
|
||||
standard = "標準"
|
||||
star = "スター"
|
||||
stats = "統計"
|
||||
stay_logged_in = "ログイン状態を維持"
|
||||
submit = "送信"
|
||||
subscribe = "購読"
|
||||
super = "スーパー"
|
||||
terms = "利用規約"
|
||||
title_max_length = "タイトルの最大長"
|
||||
topics = "トピック"
|
||||
topics_help = "# で区切り"
|
||||
uname_or_id = "ユーザー名またはユーザーID"
|
||||
unhide = "非表示を解除"
|
||||
unlock = "アンロック"
|
||||
unpin = "ピンを外す"
|
||||
unread = "未読"
|
||||
unsubscribe = "購読を解除"
|
||||
upload = "アップロード"
|
||||
upload_help = "最大10枚の画像をアップロード可能です。jpg、jpeg、png、webp、gifが許可されています。"
|
||||
url = "URL"
|
||||
user_name = "ユーザー名"
|
||||
user_name_help = "ユーザー名、数字で始まらない、2〜10文字"
|
||||
users = "ユーザー"
|
||||
warning = "警告"
|
||||
139
i18n/zh_cn.toml
Normal file
139
i18n/zh_cn.toml
Normal file
@@ -0,0 +1,139 @@
|
||||
about = "关于"
|
||||
active = "活跃"
|
||||
add = "添加"
|
||||
admin = "管理员"
|
||||
agree_terms = "我同意"
|
||||
all = "全部"
|
||||
already_have_account = "已经有账号?"
|
||||
apply = "应用"
|
||||
article_max_length = "文章最大长度"
|
||||
avatar_help = "请清除浏览器缓存"
|
||||
banned = "已禁用"
|
||||
captcha = "验证码"
|
||||
captcha_difficulty = "验证码难度"
|
||||
captcha_name = "验证码名称"
|
||||
comment = "评论"
|
||||
comment_interval = "评论间隔"
|
||||
comment_max_length = "评论最大长度"
|
||||
created = "创建时间"
|
||||
db_view = "数据库视图"
|
||||
delete = "删除"
|
||||
delete_draft = "删除草稿"
|
||||
delete_permanently = "永久删除"
|
||||
delete_sure = "确定要删除吗?"
|
||||
description = "描述"
|
||||
domain = "域名"
|
||||
draft = "草稿"
|
||||
early_birds = "早起鸟"
|
||||
early_birds_help = "早起鸟将自动成为 Fellow。"
|
||||
easy = "简单"
|
||||
edit = "编辑"
|
||||
error = "错误"
|
||||
everyone = "所有人"
|
||||
exit = "退出"
|
||||
explore = "探索"
|
||||
feed_add_help = "仅在选择新建时有效"
|
||||
feed_url_help = "rss/atom 源地址"
|
||||
fellow = "Fellow"
|
||||
folder = "文件夹"
|
||||
followers = "关注者"
|
||||
following = "关注"
|
||||
forgot_password = "忘记密码?"
|
||||
gallery = "画廊"
|
||||
hard = "困难"
|
||||
hidden = "隐藏"
|
||||
hide = "隐藏"
|
||||
home_page = "默认主页"
|
||||
inn_feed_help = "再次提交 url 以取消订阅。"
|
||||
inn_mod_max = "最大管理员数量"
|
||||
inn_name = "小屋名称"
|
||||
inn_type = "小屋类型"
|
||||
intern = "实习生"
|
||||
is_public = "是否公开"
|
||||
join = "加入"
|
||||
join_to_comment = "加入以评论"
|
||||
joined = "已加入"
|
||||
just_me = "仅限我"
|
||||
lang = "语言"
|
||||
like = "喜欢"
|
||||
limit_edit_seconds = "限制编辑时间(秒)"
|
||||
limit_edit_seconds_help = "用户被阻止编辑前的时间?(设为 0 表示随时允许)"
|
||||
limited = "有限"
|
||||
list = "列表"
|
||||
load_image = "加载图片"
|
||||
lock = "锁定"
|
||||
medium = "中等"
|
||||
members = "成员"
|
||||
mod = "管理员"
|
||||
new = "新建"
|
||||
new_comment = "新评论"
|
||||
new_folder = "新文件夹"
|
||||
new_password = "新密码"
|
||||
new_post = "新帖子"
|
||||
next = "下一页"
|
||||
old_password = "旧密码"
|
||||
password = "密码"
|
||||
password_help = "密码必须为 7 - 20 个字符"
|
||||
password_reset = "密码重置"
|
||||
pending = "待定"
|
||||
per_page = "每页数量"
|
||||
pin = "置顶"
|
||||
post = "发布"
|
||||
post_interval = "发布间隔"
|
||||
prev = "上一页"
|
||||
preview = "预览"
|
||||
private = "私有"
|
||||
private_help = "私有小屋不能更改为其他类型。"
|
||||
private_hidden = "隐藏的私有"
|
||||
public = "公开"
|
||||
re_enter_password = "再次输入密码"
|
||||
read_only = "只读"
|
||||
recovery_code = "恢复代码"
|
||||
recovery_code_last_valid = "每次生成新代码,只有最后一个有效。"
|
||||
recovery_code_msg = "您尚未设置恢复代码。如果忘记密码,将无法恢复您的账户。"
|
||||
recovery_code_note = "我们不会将此代码保存在数据库中。如果您关闭此页面,将再也看不到此代码。"
|
||||
recovery_code_privacy_note = "为了您的隐私,Freedit 不需要您的电子邮件。您可以直接发送电子邮件给自己并将其保存在您的账户中。"
|
||||
recovery_generate = "生成恢复代码"
|
||||
recovery_help = "您必须输入密码才能生成或重置恢复代码。"
|
||||
refresh = "刷新"
|
||||
rejected = "已拒绝"
|
||||
remove = "移除"
|
||||
role = "角色"
|
||||
save = "保存"
|
||||
save_draft = "保存草稿"
|
||||
search = "搜索"
|
||||
senior = "资深"
|
||||
sessions = "会话"
|
||||
sign_in = "登录"
|
||||
sign_in_to_comment = "登录后评论"
|
||||
sign_out = "登出"
|
||||
sign_up = "注册"
|
||||
site_name = "站点名称"
|
||||
site_settings = "站点设置"
|
||||
solo_interval = "单独发布间隔"
|
||||
source = "来源"
|
||||
spam_regex = "垃圾信息正则表达式"
|
||||
standard = "标准"
|
||||
star = "收藏"
|
||||
stats = "统计"
|
||||
stay_logged_in = "保持登录"
|
||||
submit = "提交"
|
||||
subscribe = "订阅"
|
||||
super = "超级管理员"
|
||||
terms = "条款与条件"
|
||||
title_max_length = "标题最大长度"
|
||||
topics = "主题"
|
||||
topics_help = "使用 # 分隔"
|
||||
uname_or_id = "用户名或用户 ID"
|
||||
unhide = "取消隐藏"
|
||||
unlock = "解锁"
|
||||
unpin = "取消置顶"
|
||||
unread = "未读"
|
||||
unsubscribe = "取消订阅"
|
||||
upload = "上传"
|
||||
upload_help = "最多上传 10 张图片;支持 jpg、jpeg、png、webp 和 gif 格式。"
|
||||
url = "URL"
|
||||
user_name = "用户名"
|
||||
user_name_help = "用户名,不以数字开头,2 - 10 个字符"
|
||||
users = "用户"
|
||||
warning = "警告"
|
||||
@@ -7,7 +7,7 @@ use super::{
|
||||
Claim, Feed, FormPost, Item, SiteConfig,
|
||||
};
|
||||
use crate::{
|
||||
controller::{Comment, Inn, Post, Solo, User},
|
||||
controller::{filters, Comment, Inn, Post, Solo, User},
|
||||
error::AppError,
|
||||
DB,
|
||||
};
|
||||
@@ -284,6 +284,11 @@ pub(crate) async fn admin_view(
|
||||
let uid = u8_slice_to_u32(&k);
|
||||
ones.push(format!("{uid}: {}", v[0]));
|
||||
}
|
||||
"lang" => {
|
||||
let uid = u8_slice_to_u32(&k);
|
||||
let lang = String::from_utf8_lossy(&v);
|
||||
ones.push(format!("{uid}: {lang}"));
|
||||
}
|
||||
"tan" => {
|
||||
let id = String::from_utf8_lossy(&k);
|
||||
ones.push(format!("{id}: {:?}", v));
|
||||
@@ -393,6 +398,7 @@ impl Default for SiteConfig {
|
||||
captcha_name: "Lucy".into(),
|
||||
home_page: 0,
|
||||
spam_regex: None,
|
||||
lang: "en".into(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,7 @@ use super::{
|
||||
};
|
||||
use crate::{
|
||||
config::CONFIG,
|
||||
controller::{incr_id, Feed, Item},
|
||||
controller::{filters, incr_id, Feed, Item},
|
||||
error::AppError,
|
||||
DB,
|
||||
};
|
||||
@@ -275,6 +275,7 @@ pub(crate) async fn feed(
|
||||
}
|
||||
|
||||
item_ids.sort_unstable_by(|a, b| a.1.cmp(&b.1).then(a.0.cmp(&b.0)));
|
||||
item_ids.dedup_by(|a, b| a.0 == b.0);
|
||||
|
||||
let n = site_config.per_page;
|
||||
let anchor = params.anchor.unwrap_or(0);
|
||||
|
||||
@@ -71,6 +71,13 @@ pub(super) fn clean_html(raw: &str) -> String {
|
||||
.add_allowed_classes("span", &["replytag"])
|
||||
.add_tag_attributes("pre", &["style"])
|
||||
.add_tag_attributes("span", &["style"])
|
||||
// allow task list
|
||||
.add_tags(&["input"])
|
||||
.add_tag_attributes("input", &["type", "checked", "disabled"])
|
||||
// allow footnotes
|
||||
.add_allowed_classes("sup", &["footnote-reference", "footnote-definition-label"])
|
||||
.add_allowed_classes("div", &["footnote-definition"])
|
||||
.add_tag_attributes("div", &["id"])
|
||||
.clean(raw)
|
||||
.to_string()
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
//! | role | comment | post | update timeline | lock post | inn admin | protected | Note |
|
||||
//! |---------|:-------:|:----:|:---------------:|:---------:|:---------:|:---------:|------------------|
|
||||
//! | Pending | | | | | | | Apply or Private |
|
||||
//! | Deny | | | | | | | Apply or Private |
|
||||
//! | Rejected| | | | | | | Apply or Private |
|
||||
//! | Limited | ✅ | | | | | | |
|
||||
//! | Intern | ✅ | ✅ | | | | | |
|
||||
//! | Fellow | ✅ | ✅ | ✅ | | | | |
|
||||
@@ -25,7 +25,7 @@ use super::{
|
||||
user::{InnRole, Role},
|
||||
Claim, Comment, Feed, FormPost, Inn, InnType, Post, PostContent, PostStatus, SiteConfig, User,
|
||||
};
|
||||
use crate::{error::AppError, DB};
|
||||
use crate::{controller::filters, error::AppError, DB};
|
||||
|
||||
use axum::{
|
||||
extract::{Path, Query},
|
||||
|
||||
@@ -7,6 +7,7 @@ use axum_extra::{headers::Cookie, TypedHeader};
|
||||
use rinja_axum::{into_response, Template};
|
||||
use serde::Deserialize;
|
||||
|
||||
use crate::controller::filters;
|
||||
use crate::{controller::fmt::clean_html, error::AppError, DB};
|
||||
|
||||
use super::{
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
use std::sync::LazyLock;
|
||||
|
||||
use super::{db_utils::u32_to_ivec, fmt::md2html, Claim, SiteConfig};
|
||||
use crate::{error::AppError, DB};
|
||||
use crate::{controller::filters, error::AppError, DB};
|
||||
use axum::{
|
||||
http::{HeaderMap, HeaderValue, Uri},
|
||||
response::{IntoResponse, Redirect, Response},
|
||||
@@ -176,6 +176,7 @@ pub(super) struct PageData<'a> {
|
||||
pub(super) site_description: String,
|
||||
pub(super) claim: Option<Claim>,
|
||||
pub(super) has_unread: bool,
|
||||
pub(super) lang: String,
|
||||
}
|
||||
|
||||
impl<'a> PageData<'a> {
|
||||
@@ -186,12 +187,18 @@ impl<'a> PageData<'a> {
|
||||
has_unread: bool,
|
||||
) -> Self {
|
||||
let site_description = md2html(&site_config.description);
|
||||
let lang = claim
|
||||
.as_ref()
|
||||
.and_then(|claim| claim.lang.as_ref())
|
||||
.map_or_else(|| site_config.lang.clone(), |lang| lang.to_owned());
|
||||
|
||||
Self {
|
||||
title,
|
||||
site_name: &site_config.site_name,
|
||||
site_description,
|
||||
claim,
|
||||
has_unread,
|
||||
lang,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
//! | default | "imgs_count" | N |
|
||||
//! | "home_pages" | `uid` | `u8` |
|
||||
//! | "tan" | `ctype#id` | `&[]` |
|
||||
//! | "lang" | `uid` | `lang` |
|
||||
//!
|
||||
//! ### notification
|
||||
//! | tree | key | value |
|
||||
@@ -483,6 +484,8 @@ pub(super) struct SiteConfig {
|
||||
home_page: u8,
|
||||
#[garde(skip)]
|
||||
spam_regex: Option<String>,
|
||||
#[garde(length(max = 16))]
|
||||
lang: String,
|
||||
}
|
||||
|
||||
impl SiteConfig {
|
||||
@@ -502,4 +505,50 @@ struct Claim {
|
||||
role: u8,
|
||||
last_write: i64,
|
||||
session_id: String,
|
||||
lang: Option<String>,
|
||||
}
|
||||
|
||||
mod filters {
|
||||
use std::{collections::HashMap, sync::LazyLock};
|
||||
use tracing::error;
|
||||
|
||||
static I18N: LazyLock<HashMap<(&str, &str), &str>> = LazyLock::new(|| {
|
||||
let mut i18n = HashMap::new();
|
||||
let en = include_str!("../../i18n/en.toml");
|
||||
let en = basic_toml::from_str::<HashMap<&str, &str>>(en).unwrap();
|
||||
for (k, v) in en.iter() {
|
||||
i18n.insert(("en", *k), *v);
|
||||
}
|
||||
|
||||
let zh_cn = include_str!("../../i18n/zh_cn.toml");
|
||||
let zh_cn = basic_toml::from_str::<HashMap<&str, &str>>(zh_cn).unwrap();
|
||||
for (k, v) in zh_cn.iter() {
|
||||
i18n.insert(("zh_cn", *k), *v);
|
||||
}
|
||||
|
||||
let ja = include_str!("../../i18n/ja.toml");
|
||||
let ja = basic_toml::from_str::<HashMap<&str, &str>>(ja).unwrap();
|
||||
for (k, v) in ja.iter() {
|
||||
i18n.insert(("ja", *k), *v);
|
||||
}
|
||||
|
||||
let fr = include_str!("../../i18n/fr.toml");
|
||||
let fr = basic_toml::from_str::<HashMap<&str, &str>>(fr).unwrap();
|
||||
for (k, v) in fr.iter() {
|
||||
i18n.insert(("fr", *k), *v);
|
||||
}
|
||||
i18n
|
||||
});
|
||||
|
||||
pub(super) fn l10n(s: &str, lang: &str) -> ::rinja::Result<&'static str> {
|
||||
if let Some(v) = I18N.get(&(lang, s)) {
|
||||
Ok(v)
|
||||
} else {
|
||||
let Some(en) = I18N.get(&("en", s)) else {
|
||||
panic!("No translation for {} in en", s);
|
||||
};
|
||||
error!("No translation for {} in {}", s, lang);
|
||||
Ok(en)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@ use super::{
|
||||
user::{InnRole, Role},
|
||||
Claim, Comment, Inn, Post, SiteConfig, Solo, User,
|
||||
};
|
||||
use crate::{error::AppError, DB};
|
||||
use crate::{controller::filters, error::AppError, DB};
|
||||
use axum::{extract::Query, response::IntoResponse};
|
||||
use axum_extra::{headers::Cookie, TypedHeader};
|
||||
use bincode::config::standard;
|
||||
|
||||
@@ -11,7 +11,7 @@ use super::{
|
||||
user::Role,
|
||||
Claim, SiteConfig, Solo, SoloType, User,
|
||||
};
|
||||
use crate::{error::AppError, DB};
|
||||
use crate::{controller::filters, error::AppError, DB};
|
||||
use axum::{
|
||||
extract::{Path, Query},
|
||||
response::{IntoResponse, Redirect},
|
||||
|
||||
@@ -26,7 +26,7 @@ use whichlang::detect_language;
|
||||
|
||||
use crate::{
|
||||
config::CONFIG,
|
||||
controller::{InnType, SoloType},
|
||||
controller::{filters, InnType, SoloType},
|
||||
error::AppError,
|
||||
DB,
|
||||
};
|
||||
|
||||
@@ -8,7 +8,7 @@ use super::{
|
||||
user::{InnRole, Role},
|
||||
Claim, SiteConfig, User,
|
||||
};
|
||||
use crate::{config::CONFIG, error::AppError, DB};
|
||||
use crate::{config::CONFIG, controller::filters, error::AppError, DB};
|
||||
use axum::{
|
||||
extract::{Multipart, Path, Query},
|
||||
response::{IntoResponse, Redirect},
|
||||
|
||||
@@ -5,6 +5,7 @@ use super::{
|
||||
generate_nanoid_ttl, get_count, get_count_by_prefix, get_id_by_name, get_range,
|
||||
is_valid_name, ivec_to_u32, set_one, set_one_with_key, IterType,
|
||||
},
|
||||
filters,
|
||||
fmt::{clean_html, ts_to_date},
|
||||
get_ids_by_prefix, get_one, incr_id,
|
||||
meta_handler::{PageData, ParamsPage},
|
||||
@@ -241,7 +242,7 @@ impl Display for Role {
|
||||
#[repr(u8)]
|
||||
pub(super) enum InnRole {
|
||||
Pending = 1,
|
||||
Deny = 2,
|
||||
Rejected = 2,
|
||||
Limited = 3,
|
||||
Intern = 4,
|
||||
Fellow = 5,
|
||||
@@ -263,7 +264,7 @@ impl From<u8> for InnRole {
|
||||
fn from(value: u8) -> Self {
|
||||
match value {
|
||||
1 => InnRole::Pending,
|
||||
2 => InnRole::Deny,
|
||||
2 => InnRole::Rejected,
|
||||
3 => InnRole::Limited,
|
||||
4 => InnRole::Intern,
|
||||
5 => InnRole::Fellow,
|
||||
@@ -516,7 +517,7 @@ pub(crate) async fn role_post(
|
||||
DB.open_tree("inn_apply")?.insert(&inn_users_k, &[])?;
|
||||
1
|
||||
}
|
||||
"Deny" => 2,
|
||||
"Rejected" => 2,
|
||||
"Limited" => 3,
|
||||
"Intern" => 4,
|
||||
"Fellow" => 5,
|
||||
@@ -593,6 +594,8 @@ pub(crate) struct FormUser {
|
||||
url: String,
|
||||
#[garde(skip)]
|
||||
home_page: u8,
|
||||
#[garde(skip)]
|
||||
lang: String,
|
||||
}
|
||||
|
||||
/// Page data: `user_setting.html`
|
||||
@@ -619,8 +622,12 @@ pub(crate) async fn user_setting(
|
||||
|
||||
let mut sessions = Vec::new();
|
||||
for i in DB.open_tree("sessions")?.iter() {
|
||||
let (_, v) = i?;
|
||||
let (claim2, _): (Claim, _) = bincode::decode_from_slice(&v, standard())?;
|
||||
let (k, v) = i?;
|
||||
let Ok((claim2, _)): Result<(Claim, _), _> = bincode::decode_from_slice(&v, standard())
|
||||
else {
|
||||
DB.open_tree("sessions")?.remove(k)?;
|
||||
continue;
|
||||
};
|
||||
if claim2.uid == claim.uid {
|
||||
sessions.push(claim2.session_id);
|
||||
}
|
||||
@@ -734,7 +741,7 @@ pub(crate) async fn user_setting_post(
|
||||
) -> Result<impl IntoResponse, AppError> {
|
||||
let cookie = cookie.ok_or(AppError::NonLogin)?;
|
||||
let site_config = SiteConfig::get(&DB)?;
|
||||
let claim = Claim::get(&DB, &cookie, &site_config).ok_or(AppError::NonLogin)?;
|
||||
let mut claim = Claim::get(&DB, &cookie, &site_config).ok_or(AppError::NonLogin)?;
|
||||
let mut user: User = get_one(&DB, "users", claim.uid)?;
|
||||
|
||||
let username = clean_html(&input.username);
|
||||
@@ -762,6 +769,16 @@ pub(crate) async fn user_setting_post(
|
||||
user.url = clean_html(&input.url);
|
||||
DB.open_tree("home_pages")?
|
||||
.insert(u32_to_ivec(user.uid), &[input.home_page])?;
|
||||
|
||||
let lang = match input.lang.as_str() {
|
||||
"en" | "zh_cn" | "ja" | "fr" => {
|
||||
claim.update_lang(&DB, &input.lang)?;
|
||||
&input.lang
|
||||
}
|
||||
_ => "en",
|
||||
};
|
||||
|
||||
DB.open_tree("lang")?.insert(u32_to_ivec(user.uid), lang)?;
|
||||
set_one(&DB, "users", claim.uid, &user)?;
|
||||
|
||||
let target = format!("/user/{}", claim.uid);
|
||||
@@ -1158,6 +1175,21 @@ impl Claim {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(super) fn update_lang(&mut self, db: &Db, lang: &str) -> Result<(), AppError> {
|
||||
let uid = self.uid;
|
||||
let session_tree = db.open_tree("sessions")?;
|
||||
for i in session_tree.iter() {
|
||||
let (k, v) = i?;
|
||||
let (mut claim, _): (Claim, _) = bincode::decode_from_slice(&v, standard())?;
|
||||
if claim.uid == uid {
|
||||
claim.lang = Some(lang.to_string());
|
||||
set_one_with_key(db, "sessions", k, &claim)?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn update_role(db: &Db, uid: u32) -> Result<(), AppError> {
|
||||
let user: User = get_one(db, "users", uid)?;
|
||||
|
||||
@@ -1182,6 +1214,10 @@ impl Claim {
|
||||
let seconds = expire_seconds(expiry);
|
||||
let now = Timestamp::now().as_second();
|
||||
let session_id = generate_nanoid_ttl(seconds);
|
||||
let lang = db
|
||||
.open_tree("lang")?
|
||||
.get(u32_to_ivec(user.uid))?
|
||||
.map(|s| String::from_utf8_lossy(&s).to_string());
|
||||
|
||||
let claim = Claim {
|
||||
uid: user.uid,
|
||||
@@ -1189,6 +1225,7 @@ impl Claim {
|
||||
role: user.role,
|
||||
last_write: now,
|
||||
session_id: session_id.clone(),
|
||||
lang,
|
||||
};
|
||||
|
||||
set_one_with_key(db, "sessions", &session_id, &claim)?;
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="site_name">Sitename</label>
|
||||
<label class="label" for="site_name">{{ "site_name"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="domain">Domain</label>
|
||||
<label class="label" for="domain">{{ "domain"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="description">Description</label>
|
||||
<label class="label" for="description">{{ "description"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -44,7 +44,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="read_only">Read only</label>
|
||||
<label class="label" for="read_only">{{ "read_only"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="inn_mod_max">Inn mod max</label>
|
||||
<label class="label" for="inn_mod_max">{{ "inn_mod_max"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -71,7 +71,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="title_max_length">Title max length</label>
|
||||
<label class="label" for="title_max_length">{{ "title_max_length"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="article_max_length">Article max length</label>
|
||||
<label class="label" for="article_max_length">{{ "article_max_length"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="comment_max_length">Comment max length</label>
|
||||
<label class="label" for="comment_max_length">{{ "comment_max_length"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="solo_interval">Solo interval</label>
|
||||
<label class="label" for="solo_interval">{{ "solo_interval"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -123,7 +123,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="post_interval">Post interval</label>
|
||||
<label class="label" for="post_interval">{{ "post_interval"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -136,7 +136,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="comment_interval">Comment interval</label>
|
||||
<label class="label" for="comment_interval">{{ "comment_interval"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -149,7 +149,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="per_page">Per page</label>
|
||||
<label class="label" for="per_page">{{ "per_page"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -162,15 +162,15 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="captcha_difficulty">Captcha difficulty</label>
|
||||
<label class="label" for="captcha_difficulty">{{ "captcha_difficulty"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<p class="help">About <a href="https://docs.rs/captcha/0.0.9/captcha/fn.by_name.html" target="_blank">captcha</a></p>
|
||||
<p class="help">{{"about"|l10n(page_data.lang)}} <a href="https://docs.rs/captcha/0.0.9/captcha/fn.by_name.html" target="_blank">{{ "captcha"|l10n(page_data.lang) }}</a></p>
|
||||
<div class="control">
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Easy" {% if site_config.captcha_difficulty.as_str() == "Easy" %} checked {% endif %} autocomplete="off" /> Easy</label>
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Medium" {% if site_config.captcha_difficulty.as_str() == "Medium" %} checked {% endif %} autocomplete="off" /> Medium</label>
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Hard" {% if site_config.captcha_difficulty.as_str() == "Hard" %} checked {% endif %} autocomplete="off" /> Hard</label>
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Easy" {% if site_config.captcha_difficulty.as_str() == "Easy" %} checked {% endif %} autocomplete="off" /> {{ "easy"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Medium" {% if site_config.captcha_difficulty.as_str() == "Medium" %} checked {% endif %} autocomplete="off" /> {{ "medium"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="captcha_difficulty" value="Hard" {% if site_config.captcha_difficulty.as_str() == "Hard" %} checked {% endif %} autocomplete="off" /> {{ "hard"|l10n(page_data.lang) }} </label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -178,7 +178,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="captcha_name">Captcha type</label>
|
||||
<label class="label" for="captcha_name">{{ "captcha_name"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -194,19 +194,19 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="home_page">Default home page</label>
|
||||
<label class="label" for="home_page">{{ "home_page"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<div class="select">
|
||||
<select name="home_page" required>
|
||||
<option {% if site_config.home_page ==0 %} selected {% endif %} value="0">Inn/All</option>
|
||||
<option {% if site_config.home_page ==2 %} selected {% endif %} value="2">Inn/Joined</option>
|
||||
<option {% if site_config.home_page ==3 %} selected {% endif %} value="3">Inn/Following</option>
|
||||
<option {% if site_config.home_page ==4 %} selected {% endif %} value="4">Solo/All</option>
|
||||
<option {% if site_config.home_page ==5 %} selected {% endif %} value="5">Solo/Following</option>
|
||||
<option {% if site_config.home_page ==6 %} selected {% endif %} value="6">Explore all ⚓ inns</option>
|
||||
<option {% if site_config.home_page ==0 %} selected {% endif %} value="0">Inn/{{ "all"|l10n(page_data.lang) }}</option>
|
||||
<option {% if site_config.home_page ==2 %} selected {% endif %} value="2">Inn/{{ "joined"|l10n(page_data.lang) }}</option>
|
||||
<option {% if site_config.home_page ==3 %} selected {% endif %} value="3">Inn/{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option {% if site_config.home_page ==4 %} selected {% endif %} value="4">Solo/{{ "all"|l10n(page_data.lang) }}</option>
|
||||
<option {% if site_config.home_page ==5 %} selected {% endif %} value="5">Solo/{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option {% if site_config.home_page ==6 %} selected {% endif %} value="6">Inn/{{ "list"|l10n(page_data.lang)}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -216,7 +216,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="spam_regex">Spam regex</label>
|
||||
<label class="label" for="spam_regex">{{ "spam_regex"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -232,12 +232,32 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="lang">{{ "lang"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<div class="select">
|
||||
<select name="lang" required>
|
||||
<option {% if site_config.lang == "en" %} selected {% endif %} value="en">English</option>
|
||||
<option {% if site_config.lang == "fr" %} selected {% endif %} value="fr">Français</option>
|
||||
<option {% if site_config.lang == "ja" %} selected {% endif %} value="ja">日本語</option>
|
||||
<option {% if site_config.lang == "zh_cn" %} selected {% endif %} value="zh_cn">中文</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label"></div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="admin" class="button is-link">Save</button>
|
||||
<button type="submit" form="admin" class="button is-link">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
{% for img in imgs %}
|
||||
<div id="delete_{{img.2}}" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this image?</p>
|
||||
<p><a href="/image/delete/{{img.0}}/{{img.1}}" class="button is-danger">Delete</a></p>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<p><a href="/image/delete/{{img.0}}/{{img.1}}" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a></p>
|
||||
<img src="/static/upload/{{img.2}}">
|
||||
</div>
|
||||
</div>
|
||||
@@ -19,7 +19,7 @@
|
||||
<a href="/gallery/{{img.0}}"><img src="/static/avatars/{{img.0}}.png"></a>
|
||||
</p>
|
||||
<a href="/static/upload/{{img.2}}" target="_blank"><img src="/static/upload/{{img.2}}"></a>
|
||||
<a href="#delete_{{img.2}}" class="delete">Delete</a>
|
||||
<a href="#delete_{{img.2}}" class="delete">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
<figcaption>
|
||||
<span class="tag">{{img.2}}</span>
|
||||
</figcaption>
|
||||
@@ -33,15 +33,15 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/admin/gallery?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/admin/gallery?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if imgs.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/admin/gallery?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/admin/gallery?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -21,15 +21,15 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/admin/view?tree_name={{tree_name}}&anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/admin/view?tree_name={{tree_name}}&anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if ones.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/admin/view?tree_name={{tree_name}}&anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/admin/view?tree_name={{tree_name}}&anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -6,20 +6,20 @@
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
{% match username %}{% when Some with (val) %}
|
||||
<li class="is-active"><a href="/feed/{{uid}}">{{val}}'s public feeds</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}">{{val}}'s feeds</a></li>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %}{% when Some with ("star") %}
|
||||
<li><a href="/feed/{{uid}}">All</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}?filter=star">Star</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=unread">Unread</a></li>
|
||||
<li><a href="/feed/{{uid}}">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}?filter=star">{{ "star"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=unread">{{ "unread"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("unread") %}
|
||||
<li><a href="/feed/{{uid}}">All</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=star">Star</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}?filter=unread">Unread</a></li>
|
||||
<li><a href="/feed/{{uid}}">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=star">{{ "star"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}?filter=unread">{{ "unread"|l10n(page_data.lang) }}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/feed/{{uid}}">All</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=star">Star</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=unread">Unread</a></li>
|
||||
<li class="is-active"><a href="/feed/{{uid}}">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=star">{{ "star"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/feed/{{uid}}?filter=unread">{{ "unread"|l10n(page_data.lang) }}</a></li>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
</ul>
|
||||
@@ -29,13 +29,13 @@
|
||||
{% if active_feed != 0 %}
|
||||
<a href="/feed/subscribe/{{uid}}/{{active_feed}}">
|
||||
{% if username.is_some() %}
|
||||
<button class="button is-success is-small is-rounded">Subscribe</button>
|
||||
<button class="button is-success is-small is-rounded">{{ "subscribe"|l10n(page_data.lang) }}</button>
|
||||
{% else %}
|
||||
<button class="button is-small is-rounded is-danger">Unsubscribe</button>
|
||||
<button class="button is-small is-rounded is-danger">{{ "unsubscribe"|l10n(page_data.lang) }}</button>
|
||||
{% endif %}
|
||||
</a>
|
||||
{% else %}
|
||||
<a href="/feed/add"><button class="button is-success is-small is-rounded">New Feed</button></a>
|
||||
<a href="/feed/add"><button class="button is-success is-small is-rounded">{{ "add"|l10n(page_data.lang) }} Feed</button></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -67,22 +67,22 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/feed/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}&active_folder={{active_folder}}&active_feed={{active_feed}}">Prev</a>
|
||||
<a class="pagination-previous" href="/feed/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}&active_folder={{active_folder}}&active_feed={{active_feed}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/feed/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&active_folder={{active_folder}}&active_feed={{active_feed}}">Prev</a>
|
||||
<a class="pagination-previous" href="/feed/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&active_folder={{active_folder}}&active_feed={{active_feed}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if items.len() < n %}
|
||||
<a class="pagination-next" disabled>Next</a>
|
||||
<a class="pagination-next" disabled>{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/feed/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}&active_folder={{active_folder}}&active_feed={{active_feed}}">Next</a>
|
||||
<a class="pagination-next" href="/feed/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}&active_folder={{active_folder}}&active_feed={{active_feed}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/feed/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&active_folder={{active_folder}}&active_feed={{active_feed}}">Next</a>
|
||||
<a class="pagination-next" href="/feed/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&active_folder={{active_folder}}&active_feed={{active_feed}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
</nav>
|
||||
@@ -110,7 +110,7 @@
|
||||
{% match username %} {% when None %}
|
||||
<div class="box">
|
||||
<a href="/feed/update">
|
||||
<span class="tag is-success">Refresh Feeds</span>
|
||||
<span class="tag is-success">{{ "refresh"|l10n(page_data.lang) }} Feeds</span>
|
||||
</a>
|
||||
</div>
|
||||
{% else %}{% endmatch %}
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="url">url</label>
|
||||
<label class="label" for="url">{{ "url"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="url" required maxlength="500" placeholder="rss or atom link" />
|
||||
<input class="input" type="text" name="url" required maxlength="500" placeholder='{{ "feed_url_help"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="folder">Folder</label>
|
||||
<label class="label" for="folder">{{ "folder"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -26,7 +26,7 @@
|
||||
{% for folder in folders %}
|
||||
<label class="radio"><input type="radio" name="folder" value={{folder}} required="required" autocomplete="off" /> {{folder}} </label>
|
||||
{% endfor %}
|
||||
<label class="radio has-text-primary"><input type="radio" name="folder" value="New" autocomplete="off" /> New </label>
|
||||
<label class="radio has-text-primary"><input type="radio" name="folder" value="New" autocomplete="off" /> {{ "new"|l10n(page_data.lang) }} </label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -34,12 +34,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="new_folder">New folder</label>
|
||||
<label class="label" for="new_folder">{{ "new_folder"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="new_folder" maxlength="64" placeholder="Only works when new is selected" autocomplete="off" />
|
||||
<input class="input" type="text" name="new_folder" maxlength="64" placeholder='{{ "feed_add_help"|l10n(page_data.lang) }}' autocomplete="off" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="is_public">Is public</label>
|
||||
<label class="label" for="is_public">{{ "is_public"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -64,7 +64,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="feed_add" class="button is-link">Add</button>
|
||||
<button type="submit" form="feed_add" class="button is-link">{{ "add"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
<p class="title">{{item.title|truncate(100)}}</p>
|
||||
<p>📅 {{item.updated}}
|
||||
⚓ {{item.feed_title}}
|
||||
<a href="{{item.link}}">🌐 Origin</a>
|
||||
<a href="/feed/read/{{item.item_id}}?allow_img=true">🖼️ Load image</a>
|
||||
<a href="{{item.link}}">🌐 {{ "source"|l10n(page_data.lang) }}</a>
|
||||
<a href="/feed/read/{{item.item_id}}?allow_img=true">🖼️ {{ "load_image"|l10n(page_data.lang) }}</a>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,17 +11,17 @@
|
||||
{% for img in imgs %}
|
||||
<div id="delete_{{img.0}}" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this image?</p>
|
||||
<p><a href="/image/delete/{{uid}}/{{img.0}}" class="button is-danger">Delete</a></p>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<p><a href="/image/delete/{{uid}}/{{img.0}}" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a></p>
|
||||
<img src="/static/upload/{{img.1}}">
|
||||
</div>
|
||||
</div>
|
||||
<div class="column is-one-third">
|
||||
<figure>
|
||||
<a href="/static/upload/{{img.1}}" target="_blank"><img src="/static/upload/{{img.1}}"></a>
|
||||
<a href="#delete_{{img.0}}" class="delete">Delete</a>
|
||||
<a href="#delete_{{img.0}}" class="delete">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
<figcaption>
|
||||
<code></code>
|
||||
</figcaption>
|
||||
@@ -35,15 +35,15 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/gallery/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/gallery/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if imgs.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/gallery/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/gallery/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -16,42 +16,42 @@
|
||||
<ul>
|
||||
{% if page_data.claim.is_some() %}
|
||||
{% match filter.as_deref() %} {% when Some with ("joined") %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li class="is-active"><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("following") %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li class="is-active"><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with (uid) %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% match username %} {% when Some with (val) %}
|
||||
<li class="is-active"><a href="/inn/0?filter={{uid}}">👤 {{val}}</a></li>
|
||||
{% else %}{% endmatch %}
|
||||
{% else %}
|
||||
{% if iid > 0 %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/{{iid}}">⚓ {{inn_name}}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li class="is-active"><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endmatch %}
|
||||
{% else %}
|
||||
{% match filter.as_deref() %}{% when Some with (uid) %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/{{iid}}?filter={{uid}}">👤 {{uid}}</a></li>
|
||||
{% else %}
|
||||
{% if iid > 0 %}
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/{{iid}}">⚓ {{inn_name}}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/inn/0">All</a></li>
|
||||
<li class="is-active"><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
@@ -62,20 +62,20 @@
|
||||
<div class="buttons">
|
||||
{% if iid > 0 %}
|
||||
{% if inn_role >= 4 %}
|
||||
<a href="/post/edit/0?iid={{iid}}"><button class="button is-success is-small is-rounded">New Post</button></a>
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-small is-rounded is-hidden-mobile is-danger">Exit</button></a>
|
||||
<a href="/post/edit/0?iid={{iid}}"><button class="button is-success is-small is-rounded">{{ "new"|l10n(page_data.lang) }} Post</button></a>
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-small is-rounded is-hidden-mobile is-danger">{{ "exit"|l10n(page_data.lang) }}</button></a>
|
||||
{% else if inn_role == 3 %}
|
||||
<button class="button is-success is-small is-rounded" title="You are limited to comment in this Inn">Limited</button>
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-small is-rounded is-hidden-mobile is-danger">Exit</button></a>
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-small is-rounded is-hidden-mobile is-danger">{{ "exit"|l10n(page_data.lang) }}</button></a>
|
||||
{% else if inn_role == 2 %}
|
||||
<button class="button is-success is-small is-rounded" title="Your request to join this Inn has been denied">Denied</button>
|
||||
<button class="button is-success is-small is-rounded" title="Your request to join this Inn has been rejected">{{ "rejected"|l10n(page_data.lang) }}</button>
|
||||
{% else if inn_role == 1 %}
|
||||
<button class="button is-success is-small is-rounded">Pending</button>
|
||||
<button class="button is-success is-small is-rounded">{{ "pending"|l10n(page_data.lang) }}</button>
|
||||
{% else %}
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-success is-small is-rounded">Join</button></a>
|
||||
<a href="/inn/{{iid}}/join"><button class="button is-success is-small is-rounded">{{ "join"|l10n(page_data.lang) }}</button></a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<a href="/post/edit/0"><button class="button is-success is-small is-rounded">New Post</button></a>
|
||||
<a href="/post/edit/0"><button class="button is-success is-small is-rounded">{{ "new"|l10n(page_data.lang) }} Post</button></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -113,22 +113,22 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/inn/{{iid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/{{iid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/inn/{{iid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/{{iid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if posts.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/inn/{{iid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/{{iid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/inn/{{iid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/{{iid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
</nav>
|
||||
@@ -149,7 +149,7 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-item has-text-centered">
|
||||
<div>
|
||||
<p class="heading">Members</p>
|
||||
<p class="heading">{{ "members"|l10n(page_data.lang) }}</p>
|
||||
<div class="title">
|
||||
<a href="/user/list?filter=inn&id={{iid}}">
|
||||
{{inn_users_count}}
|
||||
@@ -170,7 +170,7 @@
|
||||
{% if is_mod %}
|
||||
<div class="level-item has-text-centered">
|
||||
<div>
|
||||
<p class="heading">Mod</p>
|
||||
<p class="heading">{{ "mod"|l10n(page_data.lang) }}</p>
|
||||
<div class="title">
|
||||
<a href="/mod/{{iid}}">
|
||||
<span class="icon">
|
||||
@@ -196,21 +196,21 @@
|
||||
</nav>
|
||||
<div class="buttons">
|
||||
{% if inn_role >= 4 %}
|
||||
<a href="/post/edit/0?iid={{iid}}" class="button is-fullwidth is-success is-rounded">New Post</a>
|
||||
<a href="/post/edit/0?iid={{iid}}" class="button is-fullwidth is-success is-rounded">{{ "new"|l10n(page_data.lang) }} Post</a>
|
||||
{% else if inn_role == 3 %}
|
||||
<button class="button is-fullwidth is-rounded" title="You are limited to comment in this Inn">Limited</button>
|
||||
<button class="button is-fullwidth is-rounded" title="You are limited to comment in this Inn">{{ "limited"|l10n(page_data.lang) }}</button>
|
||||
{% else if inn_role == 2 %}
|
||||
<button class="button is-fullwidth is-rounded" title="Your request to join this Inn has been denied">Denied</button>
|
||||
<button class="button is-fullwidth is-rounded" title="Your request to join this Inn has been rejected">{{ "rejected"|l10n(page_data.lang) }}</button>
|
||||
{% else if inn_role == 1 %}
|
||||
<button class="button is-fullwidth is-rounded">Pending</button>
|
||||
<button class="button is-fullwidth is-rounded">{{ "pending"|l10n(page_data.lang) }}</button>
|
||||
{% else %}
|
||||
<a href="/inn/{{iid}}/join" class="button is-fullwidth is-success is-rounded">Join</a>
|
||||
<a href="/inn/{{iid}}/join" class="button is-fullwidth is-success is-rounded">{{ "join"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="box">
|
||||
<details>
|
||||
<summary>Description</summary>
|
||||
<summary>{{ "description"|l10n(page_data.lang) }}</summary>
|
||||
<div class="content">
|
||||
<br>
|
||||
{{description}}
|
||||
@@ -229,7 +229,7 @@
|
||||
<div class="list has-visible-pointer-controls has-overflow-ellipsis box">
|
||||
<div class="list-item">
|
||||
<div class="list-item-content">
|
||||
<div class="list-item-title">Explore all <a href="/inn/list">⚓ inns</a></div>
|
||||
<div class="list-item-title">{{ "explore"|l10n(page_data.lang) }} <a href="/inn/list">⚓ inns</a></div>
|
||||
</div>
|
||||
</div>
|
||||
{% for inn in inns %}
|
||||
@@ -245,9 +245,9 @@
|
||||
|
||||
<div class="list-item-controls">
|
||||
{% if inn.2 %}
|
||||
<a href="/post/edit/0?iid={{inn.0}}"><button class="button is-success is-small is-rounded">New</button></a>
|
||||
<a href="/post/edit/0?iid={{inn.0}}"><button class="button is-success is-small is-rounded">{{ "new"|l10n(page_data.lang) }}</button></a>
|
||||
{% else %}
|
||||
<a href="/inn/{{inn.0}}/join"><button class="button is-success is-small is-rounded">Join</button></a>
|
||||
<a href="/inn/{{inn.0}}/join"><button class="button is-success is-small is-rounded">{{ "join"|l10n(page_data.lang) }}</button></a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -257,7 +257,7 @@
|
||||
<div class="box">
|
||||
<div class="list-item">
|
||||
<div class="list-item-content">
|
||||
<div class="list-item-title">Active <a href="/user/list">👤 Users</a></div>
|
||||
<div class="list-item-title">{{ "active"|l10n(page_data.lang) }} <a href="/user/list">👤 {{ "users"|l10n(page_data.lang) }}</a></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="is-flex is-flex-wrap-wrap m-2">
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="inn_name">Inn name</label>
|
||||
<label class="label" for="inn_name">{{ "inn_name"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="inn_name" pattern="^\D.*" required maxlength="64" placeholder="Inn name" />
|
||||
<input class="input" type="text" name="inn_name" pattern="^\D.*" required maxlength="64" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -18,12 +18,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="about">About</label>
|
||||
<label class="label" for="about">{{ "about"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="about" required maxlength="512" placeholder="About" />
|
||||
<input class="input" type="text" name="about" required maxlength="512" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -31,7 +31,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="description">Description</label>
|
||||
<label class="label" for="description">{{ "description"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -44,12 +44,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="topics">topics</label>
|
||||
<label class="label" for="topics">{{ "topics"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="topics" maxlength="128" required placeholder="topics, separated by #" />
|
||||
<input class="input" type="text" name="topics" maxlength="128" required placeholder='{{ "topics_help"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -57,44 +57,44 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="inn_type">Inn type</label>
|
||||
<label class="label" for="inn_type">{{ "inn_type"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<label class="radio"><input type="radio" name="inn_type" value="0" required />Public</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value="5" /> Apply</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value="10" /> Private</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value="0" required />{{ "public"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value="5" /> {{ "apply"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value="10" /> {{ "private"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<p class="help">The Private inn can not be changed to other type.</p>
|
||||
<p class="help">{{ "inn_type"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="early_birds">Early birds</label>
|
||||
<label class="label" for="early_birds">{{ "early_birds"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="number" min="0" name="early_birds" required autocomplete="off" />
|
||||
</div>
|
||||
<p class="help">An early bird will be <i>Fellow</i> automatically.</p>
|
||||
<p class="help">{{ "early_birds_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="limit_edit_seconds">Limit Edit Seconds</label>
|
||||
<label class="label" for="limit_edit_seconds">{{ "limit_edit_seconds"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="number" min="0" name="limit_edit_seconds" required autocomplete="off" />
|
||||
</div>
|
||||
<p class="help">How long before users are blocked from editing? (set 0 to allow anytime)</p>
|
||||
<p class="help">{{ "limit_edit_seconds_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -104,7 +104,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="inn" class="button is-link">Save</button>
|
||||
<button type="submit" form="inn" class="button is-link">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<div class="control">
|
||||
<input class="input" type="file" name="upload" required accept=".jpg, .jpeg, .png, .gif" placeholder="Upload image" />
|
||||
</div>
|
||||
<p class="help">Please clear browser cache (ctrl + f5)</p>
|
||||
<p class="help"> {{ "avatar_help"|l10n(page_data.lang) }}</p>
|
||||
<div class="control">
|
||||
<button type="submit" form="inn_icon" class="button is-link">Upload</button>
|
||||
<button type="submit" form="inn_icon" class="button is-link">{{ "upload"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,12 +30,12 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="inn_name">Inn name</label>
|
||||
<label class="label" for="inn_name">{{ "inn_name"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="inn_name" pattern="^\D.*" required maxlength="64" placeholder="Inn name" value="{{inn.inn_name}}" />
|
||||
<input class="input" type="text" name="inn_name" pattern="^\D.*" required maxlength="64" value="{{inn.inn_name}}" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -43,12 +43,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="about">About</label>
|
||||
<label class="label" for="about">{{ "about"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="about" required maxlength="512" placeholder="About" value="{{inn.about}}" />
|
||||
<input class="input" type="text" name="about" required maxlength="512" value="{{inn.about}}" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -56,7 +56,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="description">Description</label>
|
||||
<label class="label" for="description">{{ "description"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -69,12 +69,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="topics">topics</label>
|
||||
<label class="label" for="topics">{{ "topics"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="topics" value='{{inn.topics|join("#")}}' required maxlength="128" placeholder="topics, separated by #" />
|
||||
<input class="input" type="text" name="topics" value='{{inn.topics|join("#")}}' required maxlength="128" placeholder='{{ "topics_help"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -82,29 +82,29 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="inn_type">Inn type</label>
|
||||
<label class="label" for="inn_type">{{ "inn_type"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
{% if inn.inn_type == 0 %}
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 checked /> Public</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 /> Apply</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 /> Hidden</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 checked /> {{ "public"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 /> {{ "apply"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 /> {{ "hidden"|l10n(page_data.lang) }}</label>
|
||||
{% else if inn.inn_type == 5 %}
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 /> Public</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 checked /> Apply</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 /> Hidden</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 /> {{ "public"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 checked /> {{ "apply"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 /> {{ "hidden"|l10n(page_data.lang) }}</label>
|
||||
{% else if inn.inn_type == 20 %}
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 /> Public</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 /> Apply</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 checked /> Hidden</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=0 /> {{ "public"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=5 /> {{ "apply"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=20 checked /> {{ "hidden"|l10n(page_data.lang) }}</label>
|
||||
{% else if inn.inn_type == 10 %}
|
||||
<label class="radio"><input type="radio" name="inn_type" value=10 checked /> Private</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=30 /> PrivateHidden</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=10 checked /> {{ "private"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=30 /> {{ "private_hidden"|l10n(page_data.lang) }}</label>
|
||||
{% else if inn.inn_type == 30 %}
|
||||
<label class="radio"><input type="radio" name="inn_type" value=10 /> Private</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=30 checked /> PrivateHidden</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=10 /> {{ "private"|l10n(page_data.lang) }}</label>
|
||||
<label class="radio"><input type="radio" name="inn_type" value=30 checked /> {{ "private_hidden"|l10n(page_data.lang) }}</label>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -113,28 +113,28 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="early_birds">Early birds</label>
|
||||
<label class="label" for="early_birds">{{ "early_birds"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="number" min="0" name="early_birds" value='{{inn.early_birds}}' autocomplete="off" />
|
||||
</div>
|
||||
<p class="help">An early bird will be <i>Fellow</i> automatically.</p>
|
||||
<p class="help">{{ "early_birds_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="limit_edit_seconds">Limit Edit Seconds</label>
|
||||
<label class="label" for="limit_edit_seconds">{{ "limit_edit_seconds"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="number" min="0" name="limit_edit_seconds" value='{{inn.limit_edit_seconds}}' required autocomplete="off" />
|
||||
</div>
|
||||
<p class="help">How long before users are blocked from editing? (set 0 to allow anytime)</p>
|
||||
<p class="help">{{ "limit_edit_seconds_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -144,7 +144,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="inn" class="button is-link">Save</button>
|
||||
<button type="submit" form="inn" class="button is-link">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -156,14 +156,14 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label" for="url">url</label>
|
||||
<label class="label" for="url">Inn Feeds {{ "url"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input" type="text" name="url" required maxlength="500" placeholder="rss or atom link" />
|
||||
<input class="input" type="text" name="url" required maxlength="500" placeholder='{{ "feed_url_help"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
<p class="help">Submit url again to unsubscribe.</p>
|
||||
<p class="help">{{ "inn_feed_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -173,7 +173,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="inn_feed" class="button is-link">Save</button>
|
||||
<button type="submit" form="inn_feed" class="button is-link">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -11,26 +11,26 @@
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
{% match topic %} {% when Some with (val) %}
|
||||
<li><a href="/inn/list">All</a></li>
|
||||
<li><a href="/inn/list">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% if page_data.claim.is_some() %}
|
||||
<li><a href="/inn/list?filter=mod">⚙️ Mod</a></li>
|
||||
<li><a href="/inn/list?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/list?filter=mod">⚙️ {{ "mod"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/list?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
<li class="is-active"><a href="/inn/list?topic={{val}}">🏷️ {{val}}</a></li>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with ("mod") %}
|
||||
<li><a href="/inn/list">All</a></li>
|
||||
<li class="is-active"><a href="/inn/list?filter=mod">⚙️ Mod</a></li>
|
||||
<li><a href="/inn/list?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/list">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/list?filter=mod">⚙️ {{ "mod"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/list?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("joined") %}
|
||||
<li><a href="/inn/list">All</a></li>
|
||||
<li><a href="/inn/list?filter=mod">⚙️ Mod</a></li>
|
||||
<li class="is-active"><a href="/inn/list?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/list">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/list?filter=mod">⚙️ {{ "mod"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/inn/list?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/inn/list">All</a></li>
|
||||
<li class="is-active"><a href="/inn/list">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% if page_data.claim.is_some() %}
|
||||
<li><a href="/inn/list?filter=mod">⚙️ Mod</a></li>
|
||||
<li><a href="/inn/list?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/list?filter=mod">⚙️ {{ "mod"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/list?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
@@ -40,7 +40,7 @@
|
||||
<div class="level-right">
|
||||
{% match page_data.claim %} {% when Some with (val) %}
|
||||
{% if val.role >= 100 %}
|
||||
<a href="/mod/0"><button class="button is-success is-small is-rounded">New Inn</button></a>
|
||||
<a href="/mod/0"><button class="button is-success is-small is-rounded">{{ "new"|l10n(page_data.lang) }} Inn</button></a>
|
||||
{% endif %}
|
||||
{% else %}{% endmatch %}
|
||||
</div>
|
||||
@@ -67,7 +67,7 @@
|
||||
{% match filter.as_deref() %} {% when Some with ("mod") %}
|
||||
<a href="/mod/{{inn.iid}}"><span class="tag is-success">Edit</span></a>
|
||||
{% when Some with ("joined") %}
|
||||
<a href="/inn/{{inn.iid}}/join"><span class="tag is-danger">Exit</span></a>
|
||||
<a href="/inn/{{inn.iid}}/join"><span class="tag is-danger">{{ "exit"|l10n(page_data.lang) }}</span></a>
|
||||
{% else %}{% endmatch %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -76,29 +76,29 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match topic.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}&topic={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}&topic={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/list?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if inns.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match topic.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}&topic={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}&topic={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/list?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
@@ -83,8 +83,8 @@
|
||||
</a>
|
||||
{% else %}
|
||||
<div class="buttons has-addons">
|
||||
<a href="/signin"><button class="button is-info is-small">Sign in</button></a>
|
||||
<a href="/signup"><button class="button is-success is-small">Sign up</button></a>
|
||||
<a href="/signin"><button class="button is-info is-small">{{ "sign_in"|l10n(page_data.lang) }}</button></a>
|
||||
<a href="/signup"><button class="button is-success is-small">{{ "sign_up"|l10n(page_data.lang) }}</button></a>
|
||||
</div>
|
||||
{% endmatch %}
|
||||
{% endblock %}
|
||||
@@ -106,7 +106,7 @@
|
||||
<fieldset>
|
||||
<div class="field has-addons">
|
||||
<div class="control">
|
||||
<input class="input" name="search" type="text" placeholder="Search">
|
||||
<input class="input" name="search" type="text" placeholder='{{ "search"|l10n(page_data.lang) }}'>
|
||||
</div>
|
||||
<div class="control">
|
||||
<button type="submit" form="search" class="button">🔍</button>
|
||||
@@ -119,16 +119,16 @@
|
||||
{% if val.role == 255 %}
|
||||
<div class="box">
|
||||
<a href="/admin">
|
||||
<span class="tag is-info">Site setting</span>
|
||||
<span class="tag is-info">{{ "site_settings"|l10n(page_data.lang) }}</span>
|
||||
</a>
|
||||
<a href="/admin/view">
|
||||
<span class="tag is-info">Db view</span>
|
||||
<span class="tag is-info">{{ "db_view"|l10n(page_data.lang) }}</span>
|
||||
</a>
|
||||
<a href="/admin/view?tree_name=user_stats">
|
||||
<span class="tag is-info">Stats</span>
|
||||
<span class="tag is-info">{{ "stats"|l10n(page_data.lang) }}</span>
|
||||
</a>
|
||||
<a href="/admin/gallery">
|
||||
<span class="tag is-info">Gallery</span>
|
||||
<span class="tag is-info">{{ "gallery"|l10n(page_data.lang) }}</span>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
@@ -29,18 +29,18 @@
|
||||
<p class="control">
|
||||
<span class="select is-small">
|
||||
<select name="role" required autocomplete="off">
|
||||
<option selected>Pending</option>
|
||||
<option>Deny</option>
|
||||
<option>Limited</option>
|
||||
<option>Intern</option>
|
||||
<option>Fellow</option>
|
||||
<option>Mod</option>
|
||||
<option>Super</option>
|
||||
<option selected>{{ "pending"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "rejected"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "limited"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "intern"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "fellow"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "mod"|l10n(page_data.lang) }}</option>
|
||||
<option>{{ "super"|l10n(page_data.lang) }}</option>
|
||||
</select>
|
||||
</span>
|
||||
</p>
|
||||
<div class="control">
|
||||
<button type="submit" class="button is-success is-small">Save</button>
|
||||
<button type="submit" class="button is-success is-small">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
@@ -81,15 +81,15 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/notification?anchor={{anchor - n}}">Prev</a>
|
||||
<a class="pagination-previous" href="/notification?anchor={{anchor - n}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if notifications.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/notification?anchor={{anchor + n}}">Next</a>
|
||||
<a class="pagination-next" href="/notification?anchor={{anchor + n}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
{% endblock %}
|
||||
@@ -24,53 +24,53 @@
|
||||
<a href="/inn/{{post.iid}}">⚓ {{post.inn_name}}</a> 📅 {{post.created_at}}
|
||||
<a href="/user/{{post.uid}}">👤 {{post.username}}</a> 👁️ {{pageview}}
|
||||
{% if post.can_edit %}
|
||||
<a href="/post/edit/{{post.pid}}">Edit</a>
|
||||
<a href="/post/edit/{{post.pid}}">{{ "edit"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if is_mod %}
|
||||
<a href="/mod/{{post.iid}}/{{post.pid}}/lock">
|
||||
{% match post.status.as_str() %}
|
||||
{% when "LockedByMod" %} Unlock
|
||||
{% else %} lock
|
||||
{% when "LockedByMod" %} {{ "unlock"|l10n(page_data.lang) }}
|
||||
{% else %} {{ "lock"|l10n(page_data.lang) }}
|
||||
{% endmatch %}
|
||||
</a>
|
||||
<a href="/mod/{{post.iid}}/{{post.pid}}/hide">
|
||||
{% match post.status.as_str() %}
|
||||
{% when "HiddenByMod" %} Open
|
||||
{% else %} Hide
|
||||
{% when "HiddenByMod" %} {{ "unhide"|l10n(page_data.lang) }}
|
||||
{% else %} {{ "hide"|l10n(page_data.lang) }}
|
||||
{% endmatch %}
|
||||
</a>
|
||||
<a href="/mod/{{post.iid}}/{{post.pid}}/pin">
|
||||
{% if post.is_pinned %}
|
||||
Unpin
|
||||
{{ "unpin"|l10n(page_data.lang) }}
|
||||
{% else %}
|
||||
Pin
|
||||
{{ "pin"|l10n(page_data.lang) }}
|
||||
{% endif %}
|
||||
</a>
|
||||
{% else if is_author %}
|
||||
<a href="/mod/{{post.iid}}/{{post.pid}}/lock">
|
||||
{% match post.status.as_str() %}
|
||||
{% when "LockedByUser" %} Unlock
|
||||
{% when "Normal" %} lock
|
||||
{% when "LockedByUser" %} {{ "unlock"|l10n(page_data.lang) }}
|
||||
{% when "Normal" %} {{ "lock"|l10n(page_data.lang) }}
|
||||
{% else %}{% endmatch %}
|
||||
</a>
|
||||
<a href="/mod/{{post.iid}}/{{post.pid}}/hide">
|
||||
{% match post.status.as_str() %}
|
||||
{% when "HiddenByUser" %} Open
|
||||
{% when "Normal" %} Hide
|
||||
{% when "LockedByUser" %} Hide
|
||||
{% when "HiddenByUser" %} {{ "unhide"|l10n(page_data.lang) }}
|
||||
{% when "Normal" %} {{ "hide"|l10n(page_data.lang) }}
|
||||
{% when "LockedByUser" %} {{ "hide"|l10n(page_data.lang) }}
|
||||
{% else %}{% endmatch %}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
{% if can_delete %}
|
||||
<a href="#delete_post">Delete</a>
|
||||
<a href="#delete_post">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
<div id="delete_post" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this post?</p>
|
||||
<a href="/post/{{post.iid}}/{{post.pid}}/delete" class="button is-danger">Delete</a>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<a href="/post/{{post.iid}}/{{post.pid}}/delete" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -195,7 +195,7 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">upload</a>
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">{{ "upload"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
@@ -205,13 +205,13 @@
|
||||
{% match page_data.claim %}
|
||||
{% when Some with (val) %}
|
||||
{% if has_joined %}
|
||||
<button type="submit" class="button is-link is-rounded">Submit</button>
|
||||
<button type="submit" class="button is-link is-rounded" formaction="/preview" formtarget="_blank">Preview</button>
|
||||
<button type="submit" class="button is-link is-rounded">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
<button type="submit" class="button is-link is-rounded" formaction="/preview" formtarget="_blank">{{ "preview"|l10n(page_data.lang) }}</button>
|
||||
{% else %}
|
||||
<a href="/inn/{{post.iid}}/join" class="button is-success is-rounded">Join to comment</a>
|
||||
<a href="/inn/{{post.iid}}/join" class="button is-success is-rounded">{{ "join_to_comment"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<a class="button is-success is-rounded" href="/signin">Sign in to comment</a>
|
||||
<a class="button is-success is-rounded" href="/signin">{{ "sign_in_to_comment"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
</div>
|
||||
</div>
|
||||
@@ -224,14 +224,14 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/post/{{post.iid}}/{{post.pid}}?anchor={{anchor- n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/post/{{post.iid}}/{{post.pid}}?anchor={{anchor- n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
{% if comments.len() < n %}
|
||||
<a class="pagination-next" disabled>Next</a>
|
||||
<a class="pagination-next" disabled>{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/post/{{post.iid}}/{{post.pid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/post/{{post.iid}}/{{post.pid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input is-large" type="text" name="title" value="{{draft.title}}" required maxlength="256" placeholder="title" />
|
||||
<input class="input is-large" type="text" name="title" value="{{draft.title}}" required maxlength="256" placeholder='{{ "title"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -52,14 +52,14 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">upload</a>
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">{{ "upload"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<div class="level-item">
|
||||
<div class="field is-grouped">
|
||||
<div class="control">
|
||||
<button type="submit" form="solo" class="button is-link is-rounded">Submit</button>
|
||||
<button type="submit" form="solo" class="button is-link is-rounded">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input class="input is-large" type="text" name="title" required maxlength="256" value="{{post.title}}" placeholder="title" />
|
||||
<input class="input is-large" type="text" name="title" required maxlength="256" value="{{post.title}}" placeholder='{{ "title"|l10n(page_data.lang) }}' />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -28,14 +28,14 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">upload</a>
|
||||
<a href="/upload" class="button is-success is-rounded" target="_blank">{{ "upload"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
<div class="level-item">
|
||||
<div class="field is-grouped">
|
||||
<div class="control">
|
||||
<button type="submit" form="solo" class="button is-link is-rounded">Submit</button>
|
||||
<button type="submit" form="solo" class="button is-link is-rounded">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -7,15 +7,13 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="box">
|
||||
<div class="list-item">
|
||||
<div class="list-item-content">
|
||||
<p>
|
||||
{{content}}
|
||||
</p>
|
||||
<article class="media box">
|
||||
<div class="media-content">
|
||||
<div class="content">
|
||||
{{content}}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
|
||||
<div class="divider"></div>
|
||||
{% endblock %}
|
||||
@@ -6,7 +6,7 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Username or uid</label>
|
||||
<label class="label">{{ "uname_or_id"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Recovery code</label>
|
||||
<label class="label">{{ "recovery_code"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -32,7 +32,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">New password</label>
|
||||
<label class="label">{{ "new_password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Confirm</label>
|
||||
<label class="label">{{ "re_enter_password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -61,7 +61,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="reset" class="button is-link">Change</button>
|
||||
<button type="submit" form="reset" class="button is-link">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal has-addons">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Search</label>
|
||||
<label class="label">{{ "search"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -56,7 +56,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="search" class="button is-link">Search</button>
|
||||
<button type="submit" form="search" class="button is-link">{{ "search"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -94,22 +94,22 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if offset < 20 %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match uid %} {% when Some(uid) %}
|
||||
<a class="pagination-previous" href="/search?search={{search}}&uid={{uid}}&ctype={{ctype}}&offset={{offset-20}}">Prev</a>
|
||||
<a class="pagination-previous" href="/search?search={{search}}&uid={{uid}}&ctype={{ctype}}&offset={{offset-20}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/search?search={{search}}&ctype={{ctype}}&offset={{offset-20}}">Prev</a>
|
||||
<a class="pagination-previous" href="/search?search={{search}}&ctype={{ctype}}&offset={{offset-20}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if outs.len() < 20 %}
|
||||
<a class="pagination-next" disabled>Next</a>
|
||||
<a class="pagination-next" disabled>{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match uid %} {% when Some(uid) %}
|
||||
<a class="pagination-next" href="/search?search={{search}}&uid={{uid}}&ctype={{ctype}}&offset={{offset+20}}">Next</a>
|
||||
<a class="pagination-next" href="/search?search={{search}}&uid={{uid}}&ctype={{ctype}}&offset={{offset+20}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/search?search={{search}}&ctype={{ctype}}&offset={{offset+20}}">Next</a>
|
||||
<a class="pagination-next" href="/search?search={{search}}&ctype={{ctype}}&offset={{offset+20}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
</nav>
|
||||
|
||||
@@ -3,15 +3,15 @@
|
||||
{% block content %}
|
||||
<div class="box">
|
||||
<div class="content">
|
||||
<h2>Recovery code</h2>
|
||||
<h2>{{ "recovery_code"|l10n(page_data.lang) }}</h2>
|
||||
<br>
|
||||
<p><b>Note:</b></p>
|
||||
<p>We will <b>not</b> save this code in database. If you close this page, nobody will see this code again.</p>
|
||||
<p>Each time you generate a new code and only the <b>last</b> one will be valid.</p>
|
||||
<p>{{ "recovery_code_note"|l10n(page_data.lang) }}</p>
|
||||
<p>{{ "recovery_code_last_valid"|l10n(page_data.lang) }}</p>
|
||||
<br>
|
||||
<p><code>{{recovery_code}}</code></p>
|
||||
<br>
|
||||
<p>For your privacy, Freedit does not require your email. You can send emails directly to yourself and save them in your account.</p>
|
||||
<p>{{ "recovery_code_privacy_note"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -6,24 +6,24 @@
|
||||
<form id="signin" class="box" action="/signin" method="post">
|
||||
<fieldset>
|
||||
<div class="content">
|
||||
<center><h1>Sign in</h1></center>
|
||||
<center><h1>{{ "sign_in"|l10n(page_data.lang) }}</h1></center>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="control has-icons-left">
|
||||
<input name="username" class="input" type="text" title="username or user id" required placeholder="Username or user id" >
|
||||
<input name="username" class="input" type="text" title='{{ "uname_or_id"|l10n(page_data.lang) }}' required placeholder='{{ "uname_or_id"|l10n(page_data.lang) }}' >
|
||||
<span class="icon is-left">👤</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="control has-icons-left">
|
||||
<input name="password" class="input" type="password" required placeholder="Password">
|
||||
<input name="password" class="input" type="password" required placeholder='{{ "password"|l10n(page_data.lang) }}'>
|
||||
<span class="icon is-left">🔑</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<label for="remember" class="label">Stay signed in</label>
|
||||
<label for="remember" class="label">{{ "stay_logged_in"|l10n(page_data.lang) }}</label>
|
||||
<div class="control">
|
||||
<div class="select">
|
||||
<select name="remember" required>
|
||||
@@ -48,12 +48,11 @@
|
||||
<center>
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="signin" class="button is-link">Submit</button>
|
||||
<button type="submit" form="signin" class="button is-link">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<p>New to freedit? <a href="/signup">Sign up</a></p><br>
|
||||
<p>Forgot password? <a href="/user/reset">Password reset</a></p>
|
||||
<p class="has-text-centered"><a href="/signup">{{ "sign_up"|l10n(page_data.lang) }}</a></p>
|
||||
<p class="has-text-centered"><a href="/user/reset">{{ "password_reset"|l10n(page_data.lang) }}</a></p>
|
||||
</center>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@@ -12,25 +12,25 @@
|
||||
<form id="signup" class="box" action="/signup" method="post">
|
||||
<fieldset>
|
||||
<div class="content">
|
||||
<center><h1>Sign up</h1></center>
|
||||
<center><h1>{{ "sign_up"|l10n(page_data.lang) }}</h1></center>
|
||||
</div>
|
||||
<div class="field">
|
||||
<div class="control has-icons-left">
|
||||
<input name="username" class="input" type="text" pattern="^\D.*" title="Username, Not start with number, 1 - 32 chars" required placeholder="Username, Not start with number, 1 - 64 chars" minlength="1" maxlength="32">
|
||||
<input name="username" class="input" type="text" pattern="^\D.*" title='{{ "user_name_help"|l10n(page_data.lang) }}' required placeholder='{{ "user_name_help"|l10n(page_data.lang) }}' minlength="1" maxlength="32">
|
||||
<span class="icon is-left">👤</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="control has-icons-left">
|
||||
<input name="password" class="input" type="password" title="password, at least 7 chars" required placeholder="Password, at least 7 chars" required minlength="7">
|
||||
<input name="password" class="input" type="password" title='{{ "password_help"|l10n(page_data.lang) }}' required placeholder='{{ "password_help"|l10n(page_data.lang) }}' required minlength="7">
|
||||
<span class="icon is-left">🔑</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field">
|
||||
<div class="control has-icons-left">
|
||||
<input name="password2" class="input" type="password" required placeholder="Confirm Password" minlength="7">
|
||||
<input name="password2" class="input" type="password" required placeholder='{{ "re_enter_password"|l10n(page_data.lang) }}' minlength="7">
|
||||
<span class="icon is-left">🔑</span>
|
||||
</div>
|
||||
</div>
|
||||
@@ -41,7 +41,7 @@
|
||||
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input name="captcha_value" class="input" required placeholder="captcha" >
|
||||
<input name="captcha_value" class="input" required placeholder='{{ "captcha"|l10n(page_data.lang) }}' >
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
<div class="control">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" required>
|
||||
I agree to the <a href="https://freedit.eu/static/upload/e44edbdff469fa65540c.jpeg" target="_blank">terms and conditions</a>
|
||||
{{ "agree_terms"|l10n(page_data.lang) }}<a href="https://freedit.eu/static/upload/e44edbdff469fa65540c.jpeg" target="_blank">{{ "terms"|l10n(page_data.lang) }}</a>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
@@ -59,10 +59,10 @@
|
||||
<center>
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="signup" class="button is-link">Submit</button>
|
||||
<button type="submit" form="signup" class="button is-link">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
<p>Already have an account? <a href="/signin">Sign in</a></p>
|
||||
<p><center>{{ "already_have_account"|l10n(page_data.lang) }} <a href="/signin">{{ "sign_in"|l10n(page_data.lang) }}</a></center></p>
|
||||
</center>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
<div class="level-left">
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% match page_data.claim %} {% when Some with (val) %}
|
||||
<li><a href="/solo/user/0?filter=Following">Following</a></li>
|
||||
<li><a href="/solo/user/{{val.uid}}?filter=Like">Like</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/{{val.uid}}?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
{% else %}
|
||||
{% endmatch %}
|
||||
<li class="is-active"><a href="/solo/{{solo.sid}}">#{{solo.sid}}</a></li>
|
||||
@@ -63,10 +63,10 @@
|
||||
<a class="level-item" href="#delete">🗑️</a>
|
||||
<div id="delete" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this solo?</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">Delete</a>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -118,10 +118,10 @@
|
||||
<a class="level-item" href="#delete_{{solo.sid}}">🗑️</a>
|
||||
<div id="delete_{{solo.sid}}" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this solo?</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">Delete</a>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -160,9 +160,9 @@
|
||||
</p>
|
||||
<div class="select is-small">
|
||||
<select name="solo_type" title="Who can see">
|
||||
<option value="0" selected>Everyone</option>
|
||||
<option value="10">Following</option>
|
||||
<option value="20">Just me</option>
|
||||
<option value="0" selected>{{ "everyone"|l10n(page_data.lang) }}</option>
|
||||
<option value="10">{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option value="20">{{ "just_me"|l10n(page_data.lang) }}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -170,7 +170,7 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<a href="/upload" class="button is-success is-small is-responsive" target="_blank">upload</a>
|
||||
<a href="/upload" class="button is-success is-small is-responsive" target="_blank">{{ "upload"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
@@ -178,8 +178,8 @@
|
||||
<div class="field is-grouped">
|
||||
<div class="control">
|
||||
<div class="buttons">
|
||||
<button type="submit" form="solo" class="button is-info is-small is-responsive">Submit</button>
|
||||
<button type="submit" class="button is-info is-small is-responsive" formaction="/preview" formtarget="_blank">Preview</button>
|
||||
<button type="submit" form="solo" class="button is-info is-small is-responsive">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
<button type="submit" class="button is-info is-small is-responsive" formaction="/preview" formtarget="_blank">{{ "preview"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -17,40 +17,40 @@
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
{% match hashtag %} {% when Some with (val) %}
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% if page_data.claim.is_some() %}
|
||||
<li><a href="/solo/user/0?filter=Following">Following</a></li>
|
||||
<li><a href="/solo/user/0?filter=Like">Like</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/0?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
<li class="is-active"><a href="/solo/user/0?hashtag={{val}}">🏷️ {{val}}</a></li>
|
||||
{% else %}
|
||||
{% if page_data.claim.is_some() %}
|
||||
{% match filter.as_deref() %} {% when Some with ("Following") %}
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}?filter=Following">Following</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">Like</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("Like") %}
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Following">Following</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}?filter=Like">Like</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
{% else %}
|
||||
{% if uid > 0 %}
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">Following</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">Like</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}">👤 {{username}}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">Following</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">Like</a></li>
|
||||
<li class="is-active"><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/0?filter=Following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/solo/user/{{uid}}?filter=Like">{{ "like"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endmatch %}
|
||||
{% else %}
|
||||
{% if uid > 0 %}
|
||||
<li><a href="/solo/user/0">All</a></li>
|
||||
<li><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/solo/user/{{uid}}">👤 {{username}}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/solo/user/0">All</a></li>
|
||||
<li class="is-active"><a href="/solo/user/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endmatch %}
|
||||
@@ -88,9 +88,9 @@
|
||||
</p>
|
||||
<div class="select is-small">
|
||||
<select name="solo_type" title="Who can see">
|
||||
<option value="0" selected>Everyone</option>
|
||||
<option value="10">Following</option>
|
||||
<option value="20">Just me</option>
|
||||
<option value="0" selected>{{ "everyone"|l10n(page_data.lang) }}</option>
|
||||
<option value="10">{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option value="20">{{ "just_me"|l10n(page_data.lang) }}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -98,7 +98,7 @@
|
||||
<nav class="level is-mobile">
|
||||
<div class="level-left">
|
||||
<div class="level-item">
|
||||
<a href="/upload" class="button is-success is-small is-responsive" target="_blank">upload</a>
|
||||
<a href="/upload" class="button is-success is-small is-responsive" target="_blank">{{ "upload"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-right">
|
||||
@@ -106,8 +106,8 @@
|
||||
<div class="field is-grouped">
|
||||
<div class="control">
|
||||
<div class="buttons">
|
||||
<button type="submit" form="solo" class="button is-info is-small is-responsive">Submit</button>
|
||||
<button type="submit" class="button is-info is-small is-responsive" formaction="/preview" formtarget="_blank">Preview</button>
|
||||
<button type="submit" form="solo" class="button is-info is-small is-responsive">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
<button type="submit" class="button is-info is-small is-responsive" formaction="/preview" formtarget="_blank">{{ "preview"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -152,10 +152,10 @@
|
||||
<a class="level-item" href="#delete_{{solo.sid}}">🗑️</a>
|
||||
<div id="delete_{{solo.sid}}" class="overlay">
|
||||
<div class="popup content">
|
||||
<h3>Delete permanently?</h3>
|
||||
<h3>{{ "delete_permanently"|l10n(page_data.lang) }}</h3>
|
||||
<a class="close" href="#">×</a>
|
||||
<p>Are you sure you want to delete this solo?</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">Delete</a>
|
||||
<p>{{ "delete_sure"|l10n(page_data.lang) }}</p>
|
||||
<a href="/solo/{{solo.sid}}/delete" class="button is-danger">{{ "delete"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
@@ -179,29 +179,29 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&filter={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match hashtag.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&hashtag={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}&hashtag={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/solo/user/{{uid}}?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if solos.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match filter.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match hashtag.as_deref() %} {% when Some with (val) %}
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&tag={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}&tag={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/solo/user/{{uid}}?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
@@ -10,10 +10,10 @@
|
||||
<div class="level-left">
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
<li><a href="/inn/0">All</a></li>
|
||||
<li><a href="/inn/0">{{ "all"|l10n(page_data.lang) }}</a></li>
|
||||
{% if page_data.claim.is_some() %}
|
||||
<li><a href="/inn/0?filter=joined">Joined</a></li>
|
||||
<li><a href="/inn/0?filter=following">Following</a></li>
|
||||
<li><a href="/inn/0?filter=joined">{{ "joined"|l10n(page_data.lang) }}</a></li>
|
||||
<li><a href="/inn/0?filter=following">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
<li class="is-active"><a href="/inn/tag/{{tag}}">🏷️ {{tag}}</a></li>
|
||||
</ul>
|
||||
@@ -47,15 +47,15 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/inn/tag/{{tag}}?anchor={{anchor - n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/inn/tag/{{tag}}?anchor={{anchor - n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
|
||||
{% if posts.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/inn/tag/{{tag}}?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/inn/tag/{{tag}}?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
</nav>
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
{% block content %}
|
||||
|
||||
<div class="box">
|
||||
<a class="button is-success" href="/gallery/{{uid}}" target="_blank">Gallery</a>
|
||||
<a class="button is-success" href="/gallery/{{uid}}" target="_blank">{{ "gallery"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
|
||||
<form id="upload" class="box" action="/upload" method="POST" enctype="multipart/form-data">
|
||||
@@ -12,9 +12,9 @@
|
||||
<div class="control">
|
||||
<input class="input" type="file" name="imgs" required accept=".jpg, .jpeg, .png, .gif, .wepb" placeholder="Upload image" multiple/>
|
||||
</div>
|
||||
<p class="help">Max 10 pictures; jpg jpeg png wepb and gif is allowed.</p>
|
||||
<p class="help">{{ "upload_help"|l10n(page_data.lang) }}</p>
|
||||
<div class="control">
|
||||
<button type="submit" form="upload" class="button is-link">Upload</button>
|
||||
<button type="submit" form="upload" class="button is-link">{{ "upload"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
<div class="box">
|
||||
<article class="message is-warning">
|
||||
<div class="message-header">
|
||||
<p>Warning</p>
|
||||
<p>{{ "warning"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
<div class="message-body">
|
||||
You have not set a recovery code. If you lose your password, you will not be able to recover your account.
|
||||
{{ "recovery_code_msg"|l10n(page_data.lang) }}
|
||||
<br>
|
||||
<a href="/user/setting#recovery">Set recovery code</a>
|
||||
<a href="/user/setting#recovery">{{ "recovery_generate"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</article>
|
||||
</div>
|
||||
@@ -82,9 +82,9 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="content">
|
||||
<p><b>Created</b>: {{user.created_at}}</p>
|
||||
<p><b>Url</b>: <a href="{{user.url}}">{{user.url}}</a></p>
|
||||
<p><b>About</b>: {{user.about}}</p>
|
||||
<p><b>{{ "created"|l10n(page_data.lang) }}</b>: {{user.created_at}}</p>
|
||||
<p><b>{{ "url"|l10n(page_data.lang) }}</b>: <a href="{{user.url}}">{{user.url}}</a></p>
|
||||
<p><b>{{ "about"|l10n(page_data.lang) }}</b>: {{user.about}}</p>
|
||||
</div>
|
||||
</div>
|
||||
</article>
|
||||
@@ -113,13 +113,13 @@
|
||||
</div>
|
||||
<div class="level-item has-text-centered">
|
||||
<div>
|
||||
<p class="heading">Following</p>
|
||||
<p class="heading">{{ "following"|l10n(page_data.lang) }}</p>
|
||||
<p class="title"><a href="/user/list?filter=following&id={{user.uid}}">{{user_following_count}}</a></p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="level-item has-text-centered">
|
||||
<div>
|
||||
<p class="heading">Followers</p>
|
||||
<p class="heading">{{ "followers"|l10n(page_data.lang) }}</p>
|
||||
<p class="title"><a href="/user/list?filter=followers&id={{user.uid}}">{{user_followers_count}}</a></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -6,16 +6,16 @@
|
||||
<div class="tabs is-small is-toggle is-toggle-rounded">
|
||||
<ul>
|
||||
{% match filter.as_deref() %} {% when Some with ("followers") %}
|
||||
<li><a href="/user/list">Users</a></li>
|
||||
<li class="is-active"><a href="/user/list?filter=followers&id={{info.0}}">followers</a></li>
|
||||
<li><a href="/user/list">{{ "users"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/user/list?filter=followers&id={{info.0}}">{{ "followers"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("following") %}
|
||||
<li><a href="/user/list">Users</a></li>
|
||||
<li class="is-active"><a href="/user/list?filter=following&id={{info.0}}">following</a></li>
|
||||
<li><a href="/user/list">{{ "users"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/user/list?filter=following&id={{info.0}}">{{ "following"|l10n(page_data.lang) }}</a></li>
|
||||
{% when Some with ("inn") %}
|
||||
<li><a href="/user/list">Users</a></li>
|
||||
<li><a href="/user/list">{{ "users"|l10n(page_data.lang) }}</a></li>
|
||||
<li class="is-active"><a href="/user/list?filter=inn&id={{info.0}}">⚓ {{info.1}}</a></li>
|
||||
{% else %}
|
||||
<li class="is-active"><a href="/user/list">Users</a></li>
|
||||
<li class="is-active"><a href="/user/list">{{ "users"|l10n(page_data.lang) }}</a></li>
|
||||
{% endmatch %}
|
||||
</ul>
|
||||
</div>
|
||||
@@ -26,30 +26,30 @@
|
||||
<div class="dropdown-trigger">
|
||||
<button class="button is-small is-rounded">
|
||||
<span>
|
||||
{% match role %}{% when Some(10) %} Super
|
||||
{% when Some(7) %} Mod
|
||||
{% when Some(5) %} Fellow
|
||||
{% when Some(4) %} Intern
|
||||
{% when Some(3) %} Limited
|
||||
{% when Some(2) %} Deny
|
||||
{% when Some(1) %} Pending
|
||||
{% else %} Inn Role {% endmatch %}
|
||||
{% match role %}{% when Some(10) %} {{ "super"|l10n(page_data.lang) }}
|
||||
{% when Some(7) %} {{ "mod"|l10n(page_data.lang) }}
|
||||
{% when Some(5) %} {{ "fellow"|l10n(page_data.lang) }}
|
||||
{% when Some(4) %} {{ "intern"|l10n(page_data.lang) }}
|
||||
{% when Some(3) %} {{ "limited"|l10n(page_data.lang) }}
|
||||
{% when Some(2) %} {{ "rejected"|l10n(page_data.lang) }}
|
||||
{% when Some(1) %} {{ "pending"|l10n(page_data.lang) }}
|
||||
{% else %} Inn {{ "role"|l10n(page_data.lang) }} {% endmatch %}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="dropdown-menu">
|
||||
<div class="dropdown-content">
|
||||
{% if info.2 %}
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=1" class="dropdown-item">Pending</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=2" class="dropdown-item">Deny</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=1" class="dropdown-item">{{ "pending"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=2" class="dropdown-item">{{ "rejected"|l10n(page_data.lang) }}</a>
|
||||
{% endif %}
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=3" class="dropdown-item">Limited</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=4" class="dropdown-item">Intern</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=5" class="dropdown-item">Fellow</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=7" class="dropdown-item">Mod</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=10" class="dropdown-item">Super</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=3" class="dropdown-item">{{ "limited"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=4" class="dropdown-item">{{ "intern"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=5" class="dropdown-item">{{ "fellow"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=7" class="dropdown-item">{{ "mod"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}&role=10" class="dropdown-item">{{ "super"|l10n(page_data.lang) }}</a>
|
||||
<hr class="dropdown-divider">
|
||||
<a href="/user/list?filter=inn&id={{info.0}}" class="dropdown-item">All</a>
|
||||
<a href="/user/list?filter=inn&id={{info.0}}" class="dropdown-item">{{ "all"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -58,22 +58,22 @@
|
||||
<div class="dropdown-trigger">
|
||||
<button class="button is-small is-rounded">
|
||||
<span>
|
||||
{% match role %}{% when Some(255) %} Admin
|
||||
{% when Some(100) %} Senior
|
||||
{% when Some(10) %} Standard
|
||||
{% when Some(0) %} Banned
|
||||
{% else %} Role {% endmatch %}
|
||||
{% match role %}{% when Some(255) %} {{ "admin"|l10n(page_data.lang) }}
|
||||
{% when Some(100) %} {{ "senior"|l10n(page_data.lang) }}
|
||||
{% when Some(10) %} {{ "standard"|l10n(page_data.lang) }}
|
||||
{% when Some(0) %} {{ "banned"|l10n(page_data.lang) }}
|
||||
{% else %} {{ "role"|l10n(page_data.lang) }} {% endmatch %}
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="dropdown-menu">
|
||||
<div class="dropdown-content">
|
||||
<a href="/user/list?role=255" class="dropdown-item">Admin</a>
|
||||
<a href="/user/list?role=100" class="dropdown-item">Senior</a>
|
||||
<a href="/user/list?role=10" class="dropdown-item">Standard</a>
|
||||
<a href="/user/list?role=0" class="dropdown-item">Banned</a>
|
||||
<a href="/user/list?role=255" class="dropdown-item">{{ "admin"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?role=100" class="dropdown-item">{{ "senior"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?role=10" class="dropdown-item">{{ "standard"|l10n(page_data.lang) }}</a>
|
||||
<a href="/user/list?role=0" class="dropdown-item">{{ "banned"|l10n(page_data.lang) }}</a>
|
||||
<hr class="dropdown-divider">
|
||||
<a href="/user/list" class="dropdown-item">All</a>
|
||||
<a href="/user/list" class="dropdown-item">{{ "all"|l10n(page_data.lang) }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -109,19 +109,19 @@
|
||||
<span class="select is-small">
|
||||
<select name="role" required autocomplete="off">
|
||||
{% if info.2 %}
|
||||
<option {% if user.role == 1 %} selected {% endif %}>Pending</option>
|
||||
<option {% if user.role == 2 %} selected {% endif %}>Deny</option>
|
||||
<option {% if user.role == 1 %} selected {% endif %}>{{ "pending"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 2 %} selected {% endif %}>{{ "rejected"|l10n(page_data.lang) }}</option>
|
||||
{% endif %}
|
||||
<option {% if user.role == 3 %} selected {% endif %}>Limited</option>
|
||||
<option {% if user.role == 4 %} selected {% endif %}>Intern</option>
|
||||
<option {% if user.role == 5 %} selected {% endif %}>Fellow</option>
|
||||
<option {% if user.role == 7 %} selected {% endif %}>Mod</option>
|
||||
<option {% if user.role == 10 %} selected {% endif %}>Super</option>
|
||||
<option {% if user.role == 3 %} selected {% endif %}>{{ "limited"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 4 %} selected {% endif %}>{{ "intern"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 5 %} selected {% endif %}>{{ "fellow"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 7 %} selected {% endif %}>{{ "mod"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 10 %} selected {% endif %}>{{ "super"|l10n(page_data.lang) }}</option>
|
||||
</select>
|
||||
</span>
|
||||
</p>
|
||||
<div class="control">
|
||||
<button type="submit" class="button is-success is-small">Save</button>
|
||||
<button type="submit" class="button is-success is-small">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
@@ -133,15 +133,15 @@
|
||||
<p class="control">
|
||||
<span class="select is-small">
|
||||
<select name="role" required autocomplete="off">
|
||||
<option {% if user.role == 255 %} selected {% endif %}>Admin</option>
|
||||
<option {% if user.role == 100 %} selected {% endif %}>Senior</option>
|
||||
<option {% if user.role == 10 %} selected {% endif %}>Standard</option>
|
||||
<option {% if user.role == 0 %} selected {% endif %}>Banned</option>
|
||||
<option {% if user.role == 255 %} selected {% endif %}>{{ "admin"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 100 %} selected {% endif %}>{{ "senior"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 10 %} selected {% endif %}>{{ "standard"|l10n(page_data.lang) }}</option>
|
||||
<option {% if user.role == 0 %} selected {% endif %}>{{ "banned"|l10n(page_data.lang) }}</option>
|
||||
</select>
|
||||
</span>
|
||||
</p>
|
||||
<div class="control">
|
||||
<button type="submit" class="button is-success is-small">Save</button>
|
||||
<button type="submit" class="button is-success is-small">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
@@ -159,37 +159,37 @@
|
||||
|
||||
<nav class="pagination">
|
||||
{% if anchor < n %}
|
||||
<a class="pagination-previous" disabled>Prev</a>
|
||||
<a class="pagination-previous" disabled>{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match role %} {% when Some with (val) %}
|
||||
{% match filter %} {% when Some with (filter) %}
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}&role={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}&role={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&role={{val}}">Prev</a>
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&role={{val}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% else %}
|
||||
{% match filter %} {% when Some with (filter) %}
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}">Prev</a>
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}">Prev</a>
|
||||
<a class="pagination-previous" href="/user/list?anchor={{anchor- n}}&is_desc={{is_desc}}">{{ "prev"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
{% if users.len() < n %}
|
||||
<a class="pagination-next" disabled >Next</a>
|
||||
<a class="pagination-next" disabled >{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
{% match role %} {% when Some with (val) %}
|
||||
{% match filter %} {% when Some with (filter) %}
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}&role={{val}}">Prev</a>
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}&role={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&role={{val}}">Next</a>
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&role={{val}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% else %}
|
||||
{% match filter %} {% when Some with (filter) %}
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}">Next</a>
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}&filter={{filter}}&id={{info.0}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% else %}
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}">Next</a>
|
||||
<a class="pagination-next" href="/user/list?anchor={{anchor + n}}&is_desc={{is_desc}}">{{ "next"|l10n(page_data.lang) }}</a>
|
||||
{% endmatch %}
|
||||
{% endmatch %}
|
||||
{% endif %}
|
||||
|
||||
@@ -16,9 +16,9 @@
|
||||
<div class="control">
|
||||
<input class="input" type="file" name="upload" required accept=".jpg, .jpeg, .png, .gif" placeholder="Upload image" />
|
||||
</div>
|
||||
<p class="help">Please clear browser cache (ctrl + f5)</p>
|
||||
<p class="help">{{ "avatar_help"|l10n(page_data.lang) }}</p>
|
||||
<div class="control">
|
||||
<button type="submit" form="user_avatar" class="button is-link">Upload</button>
|
||||
<button type="submit" form="user_avatar" class="button is-link">{{ "upload"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -30,12 +30,12 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Username</label>
|
||||
<label class="label">{{ "user_name"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input name="username" class="input" type="text" pattern="^\D.*" required maxlength="32" value="{{username}}" placeholder="Username, Not start with number, 2 - 10 chars">
|
||||
<input name="username" class="input" type="text" pattern="^\D.*" required maxlength="32" value="{{username}}" placeholder='{{ "user_name_help"|l10n(page_data.lang) }}'>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -56,12 +56,12 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">About</label>
|
||||
<label class="label">{{ "about"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<textarea name="about" class="textarea" maxlength="1024" placeholder="{{about}}">{{about}}</textarea>
|
||||
<textarea name="about" class="textarea" maxlength="1024" >{{about}}</textarea>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -69,7 +69,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Home page</label>
|
||||
<label class="label">{{ "home_page"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -77,13 +77,33 @@
|
||||
<div class="select">
|
||||
<select name="home_page" required>
|
||||
<option value="0">Default</option>
|
||||
<option {% if home_page ==0 %} selected {% endif %} value="0">Inn/All</option>
|
||||
<option {% if home_page ==0 %} selected {% endif %} value="0">Inn/{{ "all"|l10n(page_data.lang) }}</option>
|
||||
<option {% if home_page ==1 %} selected {% endif %} value="1">Feed</option>
|
||||
<option {% if home_page ==2 %} selected {% endif %} value="2">Inn/Joined</option>
|
||||
<option {% if home_page ==3 %} selected {% endif %} value="3">Inn/Following</option>
|
||||
<option {% if home_page ==4 %} selected {% endif %} value="4">Solo/All</option>
|
||||
<option {% if home_page ==5 %} selected {% endif %} value="5">Solo/Following</option>
|
||||
<option {% if home_page ==6 %} selected {% endif %} value="6">Explore all ⚓ inns</option>
|
||||
<option {% if home_page ==2 %} selected {% endif %} value="2">Inn/{{ "joined"|l10n(page_data.lang) }}</option>
|
||||
<option {% if home_page ==3 %} selected {% endif %} value="3">Inn/{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option {% if home_page ==4 %} selected {% endif %} value="4">Solo/{{ "all"|l10n(page_data.lang) }}</option>
|
||||
<option {% if home_page ==5 %} selected {% endif %} value="5">Solo/{{ "following"|l10n(page_data.lang) }}</option>
|
||||
<option {% if home_page ==6 %} selected {% endif %} value="6">Inn/{{ "list"|l10n(page_data.lang)}}</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">{{ "lang"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<div class="select">
|
||||
<select name="lang" required>
|
||||
<option {% if page_data.lang == "en" %} selected {% endif %} value="en">English</option>
|
||||
<option {% if page_data.lang == "zh_cn" %} selected {% endif %} value="zh_cn">中文</option>
|
||||
<option {% if page_data.lang == "ja" %} selected {% endif %} value="ja">日本語</option>
|
||||
<option {% if page_data.lang == "fr" %} selected {% endif %} value="fr">Français</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
@@ -96,7 +116,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="user_setting" class="button is-link">Save</button>
|
||||
<button type="submit" form="user_setting" class="button is-link">{{ "save"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -108,7 +128,7 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Old password</label>
|
||||
<label class="label">{{ "old_password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -121,7 +141,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">New password</label>
|
||||
<label class="label">{{ "new_password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -134,7 +154,7 @@
|
||||
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Confirm</label>
|
||||
<label class="label">{{ "re_enter_password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
@@ -150,7 +170,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="password" class="button is-link">Change</button>
|
||||
<button type="submit" form="password" class="button is-link">{{ "submit"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -163,14 +183,14 @@
|
||||
<fieldset>
|
||||
<div class="field is-horizontal">
|
||||
<div class="field-label is-normal">
|
||||
<label class="label">Password</label>
|
||||
<label class="label">{{ "password"|l10n(page_data.lang) }}</label>
|
||||
</div>
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<input name="password" class="input" type="password" required minlength="7">
|
||||
</div>
|
||||
<p class="help">You must input your password to generate or reset your recovery code.</p>
|
||||
<p class="help">{{ "recovery_help"|l10n(page_data.lang) }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -180,7 +200,7 @@
|
||||
<div class="field-body">
|
||||
<div class="field">
|
||||
<div class="control">
|
||||
<button type="submit" form="recovery" class="button is-link">Generate recovery code</button>
|
||||
<button type="submit" form="recovery" class="button is-link">{{ "recovery_generate"|l10n(page_data.lang) }}</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -190,15 +210,15 @@
|
||||
|
||||
<div class="box">
|
||||
<div class="content">
|
||||
<h3>Sessions</h3>
|
||||
<h3>{{ "sessions"|l10n(page_data.lang) }}</h3>
|
||||
<ul>
|
||||
{% match page_data.claim %}
|
||||
{% when Some(val) %}
|
||||
{% for i in sessions %}
|
||||
{% if val.session_id.as_str() == i %}
|
||||
<li>{{i}}: current(<a href="/signout">Sign out</a>)</li>
|
||||
<li>{{i}}: current(<a href="/signout">{{ "sign_out"|l10n(page_data.lang) }}</a>)</li>
|
||||
{% else %}
|
||||
<li>{{i}}: <a href="/user/remove/{{i}}">remove</a></li>
|
||||
<li>{{i}}: <a href="/user/remove/{{i}}">{{ "remove"|l10n(page_data.lang) }}</a></li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
|
||||
5
typos.toml
Normal file
5
typos.toml
Normal file
@@ -0,0 +1,5 @@
|
||||
[default.extend-words]
|
||||
Fo = "Fo"
|
||||
Limite = "Limite"
|
||||
valide = "valide"
|
||||
adresse = "adresse"
|
||||
Reference in New Issue
Block a user