* 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:
freedit-dev
2024-10-21 23:02:38 +08:00
committed by GitHub
parent b19ab25582
commit b0882b25a9
48 changed files with 1188 additions and 477 deletions

67
Cargo.lock generated
View File

@@ -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",

View File

@@ -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
View 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
View 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
View 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
View 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 = "警告"

View File

@@ -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(),
}
}
}

View File

@@ -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);

View File

@@ -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()
}

View File

@@ -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},

View File

@@ -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::{

View File

@@ -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,
}
}
}

View File

@@ -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)
}
}
}

View File

@@ -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;

View File

@@ -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},

View File

@@ -26,7 +26,7 @@ use whichlang::detect_language;
use crate::{
config::CONFIG,
controller::{InnType, SoloType},
controller::{filters, InnType, SoloType},
error::AppError,
DB,
};

View File

@@ -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},

View File

@@ -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)?;

View File

@@ -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>

View File

@@ -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="#">&times;</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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -22,8 +22,8 @@
<p class="title">{{item.title|truncate(100)}}</p>
<p>📅 {{item.updated}} &nbsp;&nbsp;
⚓ {{item.feed_title}} &nbsp;&nbsp;
<a href="{{item.link}}">🌐 Origin</a> &nbsp;&nbsp;
<a href="/feed/read/{{item.item_id}}?allow_img=true">🖼️ Load image</a>
<a href="{{item.link}}">🌐 {{ "source"|l10n(page_data.lang) }}</a> &nbsp;&nbsp;
<a href="/feed/read/{{item.item_id}}?allow_img=true">🖼️ {{ "load_image"|l10n(page_data.lang) }}</a>
</p>
</div>
</div>

View File

@@ -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="#">&times;</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>![](/static/upload/{{img.1}})</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 %}

View File

@@ -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">

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -24,53 +24,53 @@
<a href="/inn/{{post.iid}}">⚓ {{post.inn_name}}</a> &nbsp;&nbsp; 📅 {{post.created_at}} &nbsp;&nbsp;
<a href="/user/{{post.uid}}">👤 {{post.username}}</a> &nbsp;&nbsp; 👁️ {{pageview}} &nbsp;&nbsp;
{% if post.can_edit %}
<a href="/post/edit/{{post.pid}}">Edit</a> &nbsp;&nbsp;
<a href="/post/edit/{{post.pid}}">{{ "edit"|l10n(page_data.lang) }}</a> &nbsp;&nbsp;
{% 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> &nbsp;&nbsp;
<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> &nbsp;&nbsp;
<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> &nbsp;&nbsp;
<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 %}
&nbsp;&nbsp;
{% 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="#">&times;</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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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="#">&times;</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="#">&times;</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>

View File

@@ -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="#">&times;</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 %}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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
View File

@@ -0,0 +1,5 @@
[default.extend-words]
Fo = "Fo"
Limite = "Limite"
valide = "valide"
adresse = "adresse"