Allow translating form labels

This commit is contained in:
rubenwardy 2022-01-07 21:55:33 +00:00
parent dcd7e31738
commit 1b26acaaae
8 changed files with 100 additions and 93 deletions

View File

@ -16,6 +16,7 @@
from flask import render_template, redirect, request, session, url_for, abort from flask import render_template, redirect, request, session, url_for, abort
from flask_babel import lazy_gettext
from flask_login import login_required, current_user from flask_login import login_required, current_user
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import * from wtforms import *
@ -29,10 +30,10 @@ from ..users.settings import get_setting_tabs
class CreateAPIToken(FlaskForm): class CreateAPIToken(FlaskForm):
name = StringField("Name", [InputRequired(), Length(1, 30)]) name = StringField(lazy_gettext("Name"), [InputRequired(), Length(1, 30)])
package = QuerySelectField("Limit to package", allow_blank=True, package = QuerySelectField(lazy_gettext("Limit to package"), allow_blank=True,
get_pk=lambda a: a.id, get_label=lambda a: a.title) get_pk=lambda a: a.id, get_label=lambda a: a.title)
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
@bp.route("/user/tokens/") @bp.route("/user/tokens/")

View File

@ -446,8 +446,8 @@ def remove(package):
class PackageMaintainersForm(FlaskForm): class PackageMaintainersForm(FlaskForm):
maintainers_str = StringField("Maintainers (Comma-separated)", [Optional()]) maintainers_str = StringField(lazy_gettext("Maintainers (Comma-separated)"), [Optional()])
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
@bp.route("/packages/<author>/<name>/edit-maintainers/", methods=["GET", "POST"]) @bp.route("/packages/<author>/<name>/edit-maintainers/", methods=["GET", "POST"])
@ -540,9 +540,10 @@ def audit(package):
class PackageAliasForm(FlaskForm): class PackageAliasForm(FlaskForm):
author = StringField("Author Name", [InputRequired(), Length(1, 50)]) author = StringField(lazy_gettext("Author Name"), [InputRequired(), Length(1, 50)])
name = StringField("Name (Technical)", [InputRequired(), Length(1, 100), Regexp("^[a-z0-9_]+$", 0, "Lower case letters (a-z), digits (0-9), and underscores (_) only")]) name = StringField(lazy_gettext("Name (Technical)"), [InputRequired(), Length(1, 100),
submit = SubmitField("Save") Regexp("^[a-z0-9_]+$", 0, lazy_gettext("Lower case letters (a-z), digits (0-9), and underscores (_) only"))])
submit = SubmitField(lazy_gettext("Save"))
@bp.route("/packages/<author>/<name>/aliases/") @bp.route("/packages/<author>/<name>/aliases/")

View File

@ -16,7 +16,7 @@
from flask import * from flask import *
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from flask_login import login_required from flask_login import login_required
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from wtforms import * from wtforms import *
@ -49,26 +49,26 @@ def get_mt_releases(is_max):
class CreatePackageReleaseForm(FlaskForm): class CreatePackageReleaseForm(FlaskForm):
title = StringField("Title", [InputRequired(), Length(1, 30)]) title = StringField(lazy_gettext("Title"), [InputRequired(), Length(1, 30)])
uploadOpt = RadioField ("Method", choices=[("upload", "File Upload")], default="upload") uploadOpt = RadioField(lazy_gettext("Method"), choices=[("upload", "File Upload")], default="upload")
vcsLabel = StringField("Git reference (ie: commit hash, branch, or tag)", default=None) vcsLabel = StringField(lazy_gettext("Git reference (ie: commit hash, branch, or tag)"), default=None)
fileUpload = FileField("File Upload") fileUpload = FileField(lazy_gettext("File Upload"))
min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()], min_rel = QuerySelectField(lazy_gettext("Minimum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()], max_rel = QuerySelectField(lazy_gettext("Maximum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
class EditPackageReleaseForm(FlaskForm): class EditPackageReleaseForm(FlaskForm):
title = StringField("Title", [InputRequired(), Length(1, 30)]) title = StringField(lazy_gettext("Title"), [InputRequired(), Length(1, 30)])
url = StringField("URL", [Optional()]) url = StringField(lazy_gettext("URL"), [Optional()])
task_id = StringField("Task ID", filters = [lambda x: x or None]) task_id = StringField(lazy_gettext("Task ID"), filters = [lambda x: x or None])
approved = BooleanField("Is Approved") approved = BooleanField(lazy_gettext("Is Approved"))
min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()], min_rel = QuerySelectField(lazy_gettext("Minimum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()], max_rel = QuerySelectField(lazy_gettext("Maximum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
@bp.route("/packages/<author>/<name>/releases/new/", methods=["GET", "POST"]) @bp.route("/packages/<author>/<name>/releases/new/", methods=["GET", "POST"])
@ -179,14 +179,14 @@ def edit_release(package, id):
class BulkReleaseForm(FlaskForm): class BulkReleaseForm(FlaskForm):
set_min = BooleanField("Set Min") set_min = BooleanField(lazy_gettext("Set Min"))
min_rel = QuerySelectField("Minimum Minetest Version", [InputRequired()], min_rel = QuerySelectField(lazy_gettext("Minimum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(False), get_pk=lambda a: a.id, get_label=lambda a: a.name)
set_max = BooleanField("Set Max") set_max = BooleanField(lazy_gettext("Set Max"))
max_rel = QuerySelectField("Maximum Minetest Version", [InputRequired()], max_rel = QuerySelectField(lazy_gettext("Maximum Minetest Version"), [InputRequired()],
query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name) query_factory=lambda: get_mt_releases(True), get_pk=lambda a: a.id, get_label=lambda a: a.name)
only_change_none = BooleanField("Only change values previously set as none") only_change_none = BooleanField(lazy_gettext("Only change values previously set as none"))
submit = SubmitField("Update") submit = SubmitField(lazy_gettext("Update"))
@bp.route("/packages/<author>/<name>/releases/bulk_change/", methods=["GET", "POST"]) @bp.route("/packages/<author>/<name>/releases/bulk_change/", methods=["GET", "POST"])
@ -235,12 +235,14 @@ def delete_release(package, id):
class PackageUpdateConfigFrom(FlaskForm): class PackageUpdateConfigFrom(FlaskForm):
trigger = RadioField("Trigger", [InputRequired()], choices=PackageUpdateTrigger.choices(), coerce=PackageUpdateTrigger.coerce, trigger = RadioField(lazy_gettext("Trigger"), [InputRequired()], choices=PackageUpdateTrigger.choices(), coerce=PackageUpdateTrigger.coerce,
default=PackageUpdateTrigger.TAG) default=PackageUpdateTrigger.TAG)
ref = StringField("Branch name", [Optional()], default=None) ref = StringField(lazy_gettext("Branch name"), [Optional()], default=None)
action = RadioField("Action", [InputRequired()], choices=[("notification", "Send notification and mark as outdated"), ("make_release", "Create release")], default="make_release") action = RadioField(lazy_gettext("Action"), [InputRequired()],
submit = SubmitField("Save Settings") choices=[("notification", lazy_gettext("Send notification and mark as outdated")), ("make_release", lazy_gettext("Create release"))],
disable = SubmitField("Disable Automation") default="make_release")
submit = SubmitField(lazy_gettext("Save Settings"))
disable = SubmitField(lazy_gettext("Disable Automation"))
def set_update_config(package, form): def set_update_config(package, form):

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
from collections import namedtuple from collections import namedtuple
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from . import bp from . import bp
@ -39,10 +39,11 @@ def list_reviews():
class ReviewForm(FlaskForm): class ReviewForm(FlaskForm):
title = StringField("Title", [InputRequired(), Length(3,100)]) title = StringField(lazy_gettext("Title"), [InputRequired(), Length(3,100)])
comment = TextAreaField("Comment", [InputRequired(), Length(10, 2000)]) comment = TextAreaField(lazy_gettext("Comment"), [InputRequired(), Length(10, 2000)])
recommends = RadioField("Private", [InputRequired()], choices=[("yes", "Yes"), ("no", "No")]) recommends = RadioField(lazy_gettext("Private"), [InputRequired()],
submit = SubmitField("Save") choices=[("yes", lazy_gettext("Yes")), ("no", lazy_gettext("No"))])
submit = SubmitField(lazy_gettext("Save"))
@bp.route("/packages/<author>/<name>/review/", methods=["GET", "POST"]) @bp.route("/packages/<author>/<name>/review/", methods=["GET", "POST"])
@login_required @login_required

View File

@ -16,7 +16,7 @@
from flask import * from flask import *
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from flask_login import login_required from flask_login import login_required
from wtforms import * from wtforms import *
@ -30,20 +30,20 @@ from app.logic.screenshots import do_create_screenshot, do_order_screenshots
class CreateScreenshotForm(FlaskForm): class CreateScreenshotForm(FlaskForm):
title = StringField("Title/Caption", [Optional(), Length(-1, 100)]) title = StringField(lazy_gettext("Title/Caption"), [Optional(), Length(-1, 100)])
fileUpload = FileField("File Upload", [InputRequired()]) fileUpload = FileField(lazy_gettext("File Upload"), [InputRequired()])
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
class EditScreenshotForm(FlaskForm): class EditScreenshotForm(FlaskForm):
title = StringField("Title/Caption", [Optional(), Length(-1, 100)]) title = StringField(lazy_gettext("Title/Caption"), [Optional(), Length(-1, 100)])
approved = BooleanField("Is Approved") approved = BooleanField(lazy_gettext("Is Approved"))
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
class EditPackageScreenshotsForm(FlaskForm): class EditPackageScreenshotsForm(FlaskForm):
cover_image = QuerySelectField("Cover Image", [DataRequired()], allow_blank=True, get_pk=lambda a: a.id, get_label=lambda a: a.title) cover_image = QuerySelectField(lazy_gettext("Cover Image"), [DataRequired()], allow_blank=True, get_pk=lambda a: a.id, get_label=lambda a: a.title)
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
@bp.route("/packages/<author>/<name>/screenshots/", methods=["GET", "POST"]) @bp.route("/packages/<author>/<name>/screenshots/", methods=["GET", "POST"])

View File

@ -14,7 +14,7 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>. # along with this program. If not, see <https://www.gnu.org/licenses/>.
from flask import * from flask import *
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from app.tasks.webhooktasks import post_discord_webhook from app.tasks.webhooktasks import post_discord_webhook
@ -171,8 +171,8 @@ def delete_reply(id):
class CommentForm(FlaskForm): class CommentForm(FlaskForm):
comment = TextAreaField("Comment", [InputRequired(), Length(10, 2000)]) comment = TextAreaField(lazy_gettext("Comment"), [InputRequired(), Length(10, 2000)])
submit = SubmitField("Comment") submit = SubmitField(lazy_gettext("Comment"))
@bp.route("/threads/<int:id>/edit/", methods=["GET", "POST"]) @bp.route("/threads/<int:id>/edit/", methods=["GET", "POST"])
@ -259,10 +259,10 @@ def view(id):
class ThreadForm(FlaskForm): class ThreadForm(FlaskForm):
title = StringField("Title", [InputRequired(), Length(3,100)]) title = StringField(lazy_gettext("Title"), [InputRequired(), Length(3,100)])
comment = TextAreaField("Comment", [InputRequired(), Length(10, 2000)]) comment = TextAreaField(lazy_gettext("Comment"), [InputRequired(), Length(10, 2000)])
private = BooleanField("Private") private = BooleanField(lazy_gettext("Private"))
submit = SubmitField("Open Thread") submit = SubmitField(lazy_gettext("Open Thread"))
@bp.route("/threads/new/", methods=["GET", "POST"]) @bp.route("/threads/new/", methods=["GET", "POST"])

View File

@ -17,7 +17,7 @@
from flask import * from flask import *
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from flask_login import current_user, login_required, logout_user, login_user from flask_login import current_user, login_required, logout_user, login_user
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from sqlalchemy import or_ from sqlalchemy import or_
@ -33,10 +33,10 @@ from . import bp
class LoginForm(FlaskForm): class LoginForm(FlaskForm):
username = StringField("Username or email", [InputRequired()]) username = StringField(lazy_gettext("Username or email"), [InputRequired()])
password = PasswordField("Password", [InputRequired(), Length(6, 100)]) password = PasswordField(lazy_gettext("Password"), [InputRequired(), Length(6, 100)])
remember_me = BooleanField("Remember me", default=True) remember_me = BooleanField(lazy_gettext("Remember me"), default=True)
submit = SubmitField("Sign in") submit = SubmitField(lazy_gettext("Sign in"))
def handle_login(form): def handle_login(form):
@ -99,14 +99,14 @@ def logout():
class RegisterForm(FlaskForm): class RegisterForm(FlaskForm):
display_name = StringField("Display Name", [Optional(), Length(1, 20)], filters=[nonEmptyOrNone]) display_name = StringField(lazy_gettext("Display Name"), [Optional(), Length(1, 20)], filters=[nonEmptyOrNone])
username = StringField("Username", [InputRequired(), username = StringField(lazy_gettext("Username"), [InputRequired(),
Regexp("^[a-zA-Z0-9._-]+$", message="Only a-zA-Z0-9._ allowed")]) Regexp("^[a-zA-Z0-9._-]+$", message=lazy_gettext("Only a-zA-Z0-9._ allowed"))])
email = StringField("Email", [InputRequired(), Email()]) email = StringField(lazy_gettext("Email"), [InputRequired(), Email()])
password = PasswordField("Password", [InputRequired(), Length(6, 100)]) password = PasswordField(lazy_gettext("Password"), [InputRequired(), Length(6, 100)])
question = StringField("What is the result of the above calculation?", [InputRequired()]) question = StringField(lazy_gettext("What is the result of the above calculation?"), [InputRequired()])
agree = BooleanField("I agree", [DataRequired()]) agree = BooleanField(lazy_gettext("I agree"), [DataRequired()])
submit = SubmitField("Register") submit = SubmitField(lazy_gettext("Register"))
def handle_register(form): def handle_register(form):
@ -181,8 +181,8 @@ def register():
class ForgotPasswordForm(FlaskForm): class ForgotPasswordForm(FlaskForm):
email = StringField("Email", [InputRequired(), Email()]) email = StringField(lazy_gettext("Email"), [InputRequired(), Email()])
submit = SubmitField("Reset Password") submit = SubmitField(lazy_gettext("Reset Password"))
@bp.route("/user/forgot-password/", methods=["GET", "POST"]) @bp.route("/user/forgot-password/", methods=["GET", "POST"])
def forgot_password(): def forgot_password():
@ -230,16 +230,18 @@ def forgot_password():
class SetPasswordForm(FlaskForm): class SetPasswordForm(FlaskForm):
email = StringField("Email", [Optional(), Email()]) email = StringField(lazy_gettext("Email"), [Optional(), Email()])
password = PasswordField("New password", [InputRequired(), Length(8, 100)]) password = PasswordField(lazy_gettext("New password"), [InputRequired(), Length(8, 100)])
password2 = PasswordField("Verify password", [InputRequired(), Length(8, 100), validators.EqualTo('password', message='Passwords must match')]) password2 = PasswordField(lazy_gettext("Verify password"), [InputRequired(), Length(8, 100),
submit = SubmitField("Save") validators.EqualTo('password', message=lazy_gettext('Passwords must match'))])
submit = SubmitField(lazy_gettext("Save"))
class ChangePasswordForm(FlaskForm): class ChangePasswordForm(FlaskForm):
old_password = PasswordField("Old password", [InputRequired(), Length(8, 100)]) old_password = PasswordField(lazy_gettext("Old password"), [InputRequired(), Length(8, 100)])
password = PasswordField("New password", [InputRequired(), Length(8, 100)]) password = PasswordField(lazy_gettext("New password"), [InputRequired(), Length(8, 100)])
password2 = PasswordField("Verify password", [InputRequired(), Length(8, 100), validators.EqualTo('password', message='Passwords must match')]) password2 = PasswordField(lazy_gettext("Verify password"), [InputRequired(), Length(8, 100),
submit = SubmitField("Save") validators.EqualTo('password', message=lazy_gettext('Passwords must match'))])
submit = SubmitField(lazy_gettext("Save"))
def handle_set_password(form): def handle_set_password(form):
@ -379,8 +381,8 @@ def verify_email():
class UnsubscribeForm(FlaskForm): class UnsubscribeForm(FlaskForm):
email = StringField("Email", [InputRequired(), Email()]) email = StringField(lazy_gettext("Email"), [InputRequired(), Email()])
submit = SubmitField("Send") submit = SubmitField(lazy_gettext("Send"))
def unsubscribe_verify(): def unsubscribe_verify():

View File

@ -1,5 +1,5 @@
from flask import * from flask import *
from flask_babel import gettext from flask_babel import gettext, lazy_gettext
from flask_login import current_user, login_required, logout_user from flask_login import current_user, login_required, logout_user
from flask_wtf import FlaskForm from flask_wtf import FlaskForm
from sqlalchemy import or_ from sqlalchemy import or_
@ -38,10 +38,10 @@ def get_setting_tabs(user):
class UserProfileForm(FlaskForm): class UserProfileForm(FlaskForm):
display_name = StringField("Display Name", [Optional(), Length(1, 20)], filters=[lambda x: nonEmptyOrNone(x)]) display_name = StringField(lazy_gettext("Display Name"), [Optional(), Length(1, 20)], filters=[lambda x: nonEmptyOrNone(x)])
website_url = StringField("Website URL", [Optional(), URL()], filters = [lambda x: x or None]) website_url = StringField(lazy_gettext("Website URL"), [Optional(), URL()], filters = [lambda x: x or None])
donate_url = StringField("Donation URL", [Optional(), URL()], filters = [lambda x: x or None]) donate_url = StringField(lazy_gettext("Donation URL"), [Optional(), URL()], filters = [lambda x: x or None])
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
def handle_profile_edit(form, user, username): def handle_profile_edit(form, user, username):
@ -102,8 +102,8 @@ def profile_edit(username):
def make_settings_form(): def make_settings_form():
attrs = { attrs = {
"email": StringField("Email", [Optional(), Email()]), "email": StringField(lazy_gettext("Email"), [Optional(), Email()]),
"submit": SubmitField("Save") "submit": SubmitField(lazy_gettext("Save"))
} }
for notificationType in NotificationType: for notificationType in NotificationType:
@ -195,13 +195,13 @@ def email_notifications(username=None):
class UserAccountForm(FlaskForm): class UserAccountForm(FlaskForm):
username = StringField("Username", [Optional(), Length(1, 50)]) username = StringField(lazy_gettext("Username"), [Optional(), Length(1, 50)])
display_name = StringField("Display name", [Optional(), Length(2, 100)]) display_name = StringField(lazy_gettext("Display name"), [Optional(), Length(2, 100)])
forums_username = StringField("Forums Username", [Optional(), Length(2, 50)]) forums_username = StringField(lazy_gettext("Forums Username"), [Optional(), Length(2, 50)])
github_username = StringField("GitHub Username", [Optional(), Length(2, 50)]) github_username = StringField(lazy_gettext("GitHub Username"), [Optional(), Length(2, 50)])
rank = SelectField("Rank", [Optional()], choices=UserRank.choices(), coerce=UserRank.coerce, rank = SelectField(lazy_gettext("Rank"), [Optional()], choices=UserRank.choices(), coerce=UserRank.coerce,
default=UserRank.NEW_MEMBER) default=UserRank.NEW_MEMBER)
submit = SubmitField("Save") submit = SubmitField(lazy_gettext("Save"))
@bp.route("/users/<username>/settings/account/", methods=["GET", "POST"]) @bp.route("/users/<username>/settings/account/", methods=["GET", "POST"])