Просмотр исходного кода

All strings can now be translated. #16

sh4nks 10 лет назад
Родитель
Сommit
a059f65a4a
67 измененных файлов с 2255 добавлено и 663 удалено
  1. 30 28
      flaskbb/auth/forms.py
  2. 9 8
      flaskbb/auth/views.py
  3. 3 1
      flaskbb/email.py
  4. 21 20
      flaskbb/forum/forms.py
  5. 87 81
      flaskbb/management/forms.py
  6. 0 1
      flaskbb/management/models.py
  7. 47 44
      flaskbb/management/views.py
  8. 3 3
      flaskbb/templates/auth/forgot_password.html
  9. 4 4
      flaskbb/templates/auth/login.html
  10. 3 3
      flaskbb/templates/auth/reauth.html
  11. 4 4
      flaskbb/templates/auth/register.html
  12. 3 3
      flaskbb/templates/auth/reset_password.html
  13. 4 4
      flaskbb/templates/email/reset_password.html
  14. 5 3
      flaskbb/templates/email/reset_password.txt
  15. 4 4
      flaskbb/templates/errors/forbidden_page.html
  16. 4 4
      flaskbb/templates/errors/page_not_found.html
  17. 3 3
      flaskbb/templates/errors/server_error.html
  18. 1 1
      flaskbb/templates/forum/category.html
  19. 5 5
      flaskbb/templates/forum/category_layout.html
  20. 25 19
      flaskbb/templates/forum/forum.html
  21. 9 9
      flaskbb/templates/forum/index.html
  22. 8 8
      flaskbb/templates/forum/memberlist.html
  23. 7 7
      flaskbb/templates/forum/new_post.html
  24. 7 7
      flaskbb/templates/forum/new_topic.html
  25. 2 2
      flaskbb/templates/forum/online_users.html
  26. 4 4
      flaskbb/templates/forum/report_post.html
  27. 6 6
      flaskbb/templates/forum/search_form.html
  28. 40 32
      flaskbb/templates/forum/search_result.html
  29. 15 15
      flaskbb/templates/forum/topic.html
  30. 8 8
      flaskbb/templates/forum/topic_controls.html
  31. 25 19
      flaskbb/templates/forum/topictracker.html
  32. 12 12
      flaskbb/templates/layout.html
  33. 1 1
      flaskbb/templates/macros.html
  34. 13 13
      flaskbb/templates/management/banned_users.html
  35. 4 4
      flaskbb/templates/management/category_form.html
  36. 4 4
      flaskbb/templates/management/forum_form.html
  37. 12 12
      flaskbb/templates/management/forums.html
  38. 3 3
      flaskbb/templates/management/group_form.html
  39. 9 9
      flaskbb/templates/management/groups.html
  40. 7 7
      flaskbb/templates/management/management_layout.html
  41. 8 8
      flaskbb/templates/management/overview.html
  42. 11 11
      flaskbb/templates/management/plugins.html
  43. 10 10
      flaskbb/templates/management/reports.html
  44. 1 1
      flaskbb/templates/management/settings.html
  45. 12 12
      flaskbb/templates/management/unread_reports.html
  46. 4 4
      flaskbb/templates/management/user_form.html
  47. 18 15
      flaskbb/templates/management/users.html
  48. 9 9
      flaskbb/templates/message/drafts.html
  49. 8 8
      flaskbb/templates/message/inbox.html
  50. 2 2
      flaskbb/templates/message/message_form.html
  51. 7 7
      flaskbb/templates/message/message_layout.html
  52. 8 8
      flaskbb/templates/message/sent.html
  53. 10 10
      flaskbb/templates/message/trash.html
  54. 4 4
      flaskbb/templates/message/view_message.html
  55. 2 2
      flaskbb/templates/user/all_posts.html
  56. 23 9
      flaskbb/templates/user/all_topics.html
  57. 2 2
      flaskbb/templates/user/change_email.html
  58. 2 2
      flaskbb/templates/user/change_password.html
  59. 2 2
      flaskbb/templates/user/change_user_details.html
  60. 2 2
      flaskbb/templates/user/general_settings.html
  61. 17 17
      flaskbb/templates/user/profile.html
  62. 7 7
      flaskbb/templates/user/settings_layout.html
  63. 17 17
      flaskbb/themes/bootstrap2/templates/layout.html
  64. 16 16
      flaskbb/themes/bootstrap3/templates/layout.html
  65. 1538 1
      flaskbb/translations/en/LC_MESSAGES/messages.po
  66. 39 38
      flaskbb/user/forms.py
  67. 15 14
      flaskbb/user/views.py

+ 30 - 28
flaskbb/auth/forms.py

@@ -14,51 +14,53 @@ from flask.ext.wtf import Form, RecaptchaField
 from wtforms import StringField, PasswordField, BooleanField, HiddenField
 from wtforms.validators import (DataRequired, Email, EqualTo, regexp,
                                 ValidationError)
+from flask.ext.babel import lazy_gettext as _
 
 from flaskbb.user.models import User
 
 USERNAME_RE = r'^[\w.+-]+$'
 is_username = regexp(USERNAME_RE,
-                     message=("You can only use letters, numbers or dashes"))
+                     message=_("You can only use letters, numbers or dashes"))
 
 
 class LoginForm(Form):
-    login = StringField("Username or E-Mail", validators=[
-        DataRequired(message="You must provide an email adress or username")])
+    login = StringField(_("Username or E-Mail"), validators=[
+        DataRequired(message=_("You must provide an email adress or username"))]
+    )
 
-    password = PasswordField("Password", validators=[
-        DataRequired(message="Password required")])
+    password = PasswordField(_("Password"), validators=[
+        DataRequired(message=_("Password required"))])
 
-    remember_me = BooleanField("Remember Me", default=False)
+    remember_me = BooleanField(_("Remember Me"), default=False)
 
 
 class RegisterForm(Form):
-    username = StringField("Username", validators=[
-        DataRequired(message="Username required"),
+    username = StringField(_("Username"), validators=[
+        DataRequired(message=_("Username required")),
         is_username])
 
-    email = StringField("E-Mail", validators=[
-        DataRequired(message="Email adress required"),
-        Email(message="This email is invalid")])
+    email = StringField(_("E-Mail"), validators=[
+        DataRequired(message=_("E-Mail required")),
+        Email(message=_("This E-Mail is invalid"))])
 
-    password = PasswordField("Password", validators=[
-        DataRequired(message="Password required")])
+    password = PasswordField(_("Password"), validators=[
+        DataRequired(message=_("Password required"))])
 
-    confirm_password = PasswordField("Confirm Password", validators=[
-        DataRequired(message="Confirm Password required"),
-        EqualTo("password", message="Passwords do not match")])
+    confirm_password = PasswordField(_("Confirm Password"), validators=[
+        DataRequired(message=_("Confirm Password required")),
+        EqualTo("password", message=_("Passwords do not match"))])
 
-    accept_tos = BooleanField("Accept Terms of Service", default=True)
+    accept_tos = BooleanField(_("I accept the Terms of Service"), default=True)
 
     def validate_username(self, field):
         user = User.query.filter_by(username=field.data).first()
         if user:
-            raise ValidationError("This username is taken")
+            raise ValidationError(_("This username is taken"))
 
     def validate_email(self, field):
         email = User.query.filter_by(email=field.data).first()
         if email:
-            raise ValidationError("This email is taken")
+            raise ValidationError(_("This email is taken"))
 
     def save(self):
         user = User(username=self.username.data,
@@ -70,35 +72,35 @@ class RegisterForm(Form):
 
 
 class RegisterRecaptchaForm(RegisterForm):
-    recaptcha = RecaptchaField("Captcha")
+    recaptcha = RecaptchaField(_("Captcha"))
 
 
 class ReauthForm(Form):
-    password = PasswordField('Password', valdidators=[
+    password = PasswordField(_('Password'), valdidators=[
         DataRequired()])
 
 
 class ForgotPasswordForm(Form):
-    email = StringField('Email', validators=[
-        DataRequired(message="Email reguired"),
+    email = StringField(_('E-Mail'), validators=[
+        DataRequired(message=("E-Mail reguired")),
         Email()])
 
 
 class ResetPasswordForm(Form):
     token = HiddenField('Token')
 
-    email = StringField('Email', validators=[
+    email = StringField(_('E-Mail'), validators=[
         DataRequired(),
         Email()])
 
-    password = PasswordField('Password', validators=[
+    password = PasswordField(_('Password'), validators=[
         DataRequired()])
 
-    confirm_password = PasswordField('Confirm password', validators=[
+    confirm_password = PasswordField(_('Confirm password'), validators=[
         DataRequired(),
-        EqualTo('password', message='Passwords must match')])
+        EqualTo('password', message=_('Passwords do not match'))])
 
     def validate_email(self, field):
         email = User.query.filter_by(email=field.data).first()
         if not email:
-            raise ValidationError("Wrong E-Mail.")
+            raise ValidationError(_("Wrong E-Mail."))

+ 9 - 8
flaskbb/auth/views.py

@@ -12,6 +12,7 @@
 from flask import Blueprint, flash, redirect, url_for, request, current_app
 from flask.ext.login import (current_user, login_user, login_required,
                              logout_user, confirm_login, login_fresh)
+from flask.ext.babel import gettext as _
 
 from flaskbb.utils.helpers import render_template
 from flaskbb.email import send_reset_token
@@ -41,7 +42,7 @@ def login():
             return redirect(request.args.get("next") or
                             url_for("forum.index"))
 
-        flash(("Wrong username or password"), "danger")
+        flash(_("Wrong username or password"), "danger")
     return render_template("auth/login.html", form=form)
 
 
@@ -56,7 +57,7 @@ def reauth():
         form = ReauthForm(request.form)
         if form.validate_on_submit():
             confirm_login()
-            flash(("Reauthenticated"), "success")
+            flash(_("Reauthenticated"), "success")
             return redirect(request.args.get("next") or
                             url_for("user.profile"))
         return render_template("auth/reauth.html", form=form)
@@ -92,7 +93,7 @@ def register():
         user = form.save()
         login_user(user)
 
-        flash(("Thanks for registering"), "success")
+        flash(_("Thanks for registering"), "success")
         return redirect(url_for("user.profile", username=current_user.username))
     return render_template("auth/register.html", form=form)
 
@@ -114,10 +115,10 @@ def forgot_password():
             token = user.make_reset_token()
             send_reset_token(user, token=token)
 
-            flash(("E-Mail sent! Please check your inbox."), "info")
+            flash(_("E-Mail sent! Please check your inbox."), "info")
             return redirect(url_for("auth.forgot_password"))
         else:
-            flash(("You have entered an username or email that is not linked \
+            flash(_("You have entered an username or email that is not linked \
                 with your account"), "danger")
     return render_template("auth/forgot_password.html", form=form)
 
@@ -137,17 +138,17 @@ def reset_password(token):
         expired, invalid, data = user.verify_reset_token(form.token.data)
 
         if invalid:
-            flash(("Your password token is invalid."), "danger")
+            flash(_("Your password token is invalid."), "danger")
             return redirect(url_for("auth.forgot_password"))
 
         if expired:
-            flash(("Your password is expired."), "danger")
+            flash(_("Your password is expired."), "danger")
             return redirect(url_for("auth.forgot_password"))
 
         if user and data:
             user.password = form.password.data
             user.save()
-            flash(("Your password has been updated."), "success")
+            flash(_("Your password has been updated."), "success")
             return redirect(url_for("auth.login"))
 
     form.token.data = token

+ 3 - 1
flaskbb/email.py

@@ -10,12 +10,14 @@
 """
 from flask import render_template
 from flask.ext.mail import Message
+from flask.ext.babel import lazy_gettext as _
+
 from flaskbb.extensions import mail
 
 
 def send_reset_token(user, token):
     send_email(
-        subject="Password Reset",
+        subject=_("Password Reset"),
         recipients=[user.email],
         text_body=render_template(
             "email/reset_password.txt",

+ 21 - 20
flaskbb/forum/forms.py

@@ -12,14 +12,15 @@ from flask.ext.wtf import Form
 from wtforms import (TextAreaField, StringField, SelectMultipleField,
                      BooleanField)
 from wtforms.validators import DataRequired, Optional, Length
+from flask.ext.babel import lazy_gettext as _
 
 from flaskbb.forum.models import Topic, Post, Report, Forum
 from flaskbb.user.models import User
 
 
 class QuickreplyForm(Form):
-    content = TextAreaField("Quickreply", validators=[
-        DataRequired(message="You cannot post a reply without content.")])
+    content = TextAreaField(_("Quickreply"), validators=[
+        DataRequired(message=_("You cannot post a reply without content."))])
 
     def save(self, user, topic):
         post = Post(**self.data)
@@ -27,11 +28,11 @@ class QuickreplyForm(Form):
 
 
 class ReplyForm(Form):
-    content = TextAreaField("Content", validators=[
-        DataRequired(message="You cannot post a reply without content.")])
+    content = TextAreaField(_("Content"), validators=[
+        DataRequired(message=_("You cannot post a reply without content."))])
 
-    track_topic = BooleanField("Track this topic", default=False, validators=[
-        Optional()])
+    track_topic = BooleanField(_("Track this topic"), default=False,
+                               validators=[Optional()])
 
     def save(self, user, topic):
         post = Post(content=self.content.data)
@@ -42,14 +43,14 @@ class ReplyForm(Form):
 
 
 class NewTopicForm(ReplyForm):
-    title = StringField("Topic Title", validators=[
-        DataRequired(message="A topic title is required")])
+    title = StringField(_("Topic Title"), validators=[
+        DataRequired(message=_("A topic title is required"))])
 
-    content = TextAreaField("Content", validators=[
-        DataRequired(message="You cannot post a reply without content.")])
+    content = TextAreaField(_("Content"), validators=[
+        DataRequired(message=_("You cannot post a reply without content."))])
 
-    track_topic = BooleanField("Track this topic", default=False, validators=[
-        Optional()])
+    track_topic = BooleanField(_("Track this topic"), default=False,
+                               validators=[Optional()])
 
     def save(self, user, forum):
         topic = Topic(title=self.title.data)
@@ -61,9 +62,9 @@ class NewTopicForm(ReplyForm):
 
 
 class ReportForm(Form):
-    reason = TextAreaField("Reason", validators=[
-        DataRequired(message="Please insert a reason why you want to report \
-                              this post")
+    reason = TextAreaField(_("Reason"), validators=[
+        DataRequired(message=_("Please insert a reason why you want to report "
+                               "this post."))
     ])
 
     def save(self, user, post):
@@ -72,7 +73,7 @@ class ReportForm(Form):
 
 
 class UserSearchForm(Form):
-    search_query = StringField("Search", validators=[
+    search_query = StringField(_("Search"), validators=[
         Optional(), Length(min=3, max=50)
     ])
 
@@ -82,12 +83,12 @@ class UserSearchForm(Form):
 
 
 class SearchPageForm(Form):
-    search_query = StringField("Criteria", validators=[
+    search_query = StringField(_("Criteria"), validators=[
         DataRequired(), Length(min=3, max=50)])
 
-    search_types = SelectMultipleField("Content", validators=[
-        DataRequired()], choices=[('post', 'Post'), ('topic', 'Topic'),
-                                  ('forum', 'Forum'), ('user', 'Users')])
+    search_types = SelectMultipleField(_("Content"), validators=[
+        DataRequired()], choices=[('post', _('Post')), ('topic', _('Topic')),
+                                  ('forum', _('Forum')), ('user', _('Users'))])
 
     def get_results(self):
         # Because the DB is not yet initialized when this form is loaded,

+ 87 - 81
flaskbb/management/forms.py

@@ -16,6 +16,7 @@ from wtforms.validators import (DataRequired, Optional, Email, regexp, Length,
 
 from wtforms.ext.sqlalchemy.fields import (QuerySelectField,
                                            QuerySelectMultipleField)
+from flask.ext.babel import lazy_gettext as _
 
 from flaskbb.utils.widgets import SelectDateWidget
 from flaskbb.extensions import db
@@ -24,7 +25,7 @@ from flaskbb.user.models import User, Group
 
 USERNAME_RE = r'^[\w.+-]+$'
 is_username = regexp(USERNAME_RE,
-                     message=("You can only use letters, numbers or dashes"))
+                     message=_("You can only use letters, numbers or dashes"))
 
 
 def selectable_forums():
@@ -40,48 +41,48 @@ def select_primary_group():
 
 
 class UserForm(Form):
-    username = StringField("Username", validators=[
-        DataRequired(message="A username is required."),
+    username = StringField(_("Username"), validators=[
+        DataRequired(message=_("A username is required.")),
         is_username])
 
-    email = StringField("E-Mail", validators=[
-        DataRequired(message="A E-Mail address is required."),
-        Email(message="This email is invalid")])
+    email = StringField(_("E-Mail"), validators=[
+        DataRequired(message=_("A E-Mail address is required.")),
+        Email(message=_("This email is invalid"))])
 
     password = PasswordField("Password", validators=[
         Optional()])
 
-    birthday = DateField("Birthday", format="%d %m %Y",
+    birthday = DateField(_("Birthday"), format="%d %m %Y",
                          widget=SelectDateWidget(),
                          validators=[Optional()])
 
-    gender = SelectField("Gender", default="None", choices=[
+    gender = SelectField(_("Gender"), default="None", choices=[
         ("None", ""),
-        ("Male", "Male"),
-        ("Female", "Female")])
+        ("Male", _("Male")),
+        ("Female", _("Female"))])
 
-    location = StringField("Location", validators=[
+    location = StringField(_("Location"), validators=[
         Optional()])
 
-    website = StringField("Website", validators=[
+    website = StringField(_("Website"), validators=[
         Optional(), URL()])
 
-    avatar = StringField("Avatar", validators=[
+    avatar = StringField(_("Avatar"), validators=[
         Optional(), URL()])
 
-    signature = TextAreaField("Forum Signature", validators=[
+    signature = TextAreaField(_("Forum Signature"), validators=[
         Optional(), Length(min=0, max=250)])
 
-    notes = TextAreaField("Notes", validators=[
+    notes = TextAreaField(_("Notes"), validators=[
         Optional(), Length(min=0, max=5000)])
 
     primary_group = QuerySelectField(
-        "Primary Group",
+        _("Primary Group"),
         query_factory=select_primary_group,
         get_label="name")
 
     secondary_groups = QuerySelectMultipleField(
-        "Secondary Groups",
+        _("Secondary Groups"),
         # TODO: Template rendering errors "NoneType is not callable"
         #       without this, figure out why.
         query_factory=select_primary_group,
@@ -99,7 +100,7 @@ class UserForm(Form):
             user = User.query.filter(User.username.like(field.data)).first()
 
         if user:
-            raise ValidationError("This username is taken")
+            raise ValidationError(_("This username is taken"))
 
     def validate_email(self, field):
         if hasattr(self, "user"):
@@ -113,7 +114,7 @@ class UserForm(Form):
             user = User.query.filter(User.email.like(field.data)).first()
 
         if user:
-            raise ValidationError("This email is taken")
+            raise ValidationError(_("This email is taken"))
 
     def save(self):
         user = User(**self.data)
@@ -132,64 +133,65 @@ class EditUserForm(UserForm):
 
 
 class GroupForm(Form):
-    name = StringField("Group Name", validators=[
-        DataRequired(message="Group name required")])
+    name = StringField(_("Group Name"), validators=[
+        DataRequired(message=_("Group name required"))])
 
-    description = TextAreaField("Description", validators=[
+    description = TextAreaField(_("Description"), validators=[
         Optional()])
 
     admin = BooleanField(
-        "Is Admin Group?",
-        description="With this option the group has access to the admin panel."
+        _("Is Admin Group?"),
+        description=_("With this option the group has access to "
+                      "the admin panel.")
     )
     super_mod = BooleanField(
-        "Is Super Moderator Group?",
-        description="Check this if the users in this group are allowed to \
-                     moderate every forum"
+        _("Is Super Moderator Group?"),
+        description=_("Check this if the users in this group are allowed to "
+                      "moderate every forum")
     )
     mod = BooleanField(
-        "Is Moderator Group?",
-        description="Check this if the users in this group are allowed to \
-                     moderate specified forums"
+        _("Is Moderator Group?"),
+        description=_("Check this if the users in this group are allowed to "
+                      "moderate specified forums")
     )
     banned = BooleanField(
-        "Is Banned Group?",
-        description="Only one Banned group is allowed"
+        _("Is Banned Group?"),
+        description=_("Only one Banned group is allowed")
     )
     guest = BooleanField(
-        "Is Guest Group?",
-        description="Only one Guest group is allowed"
+        _("Is Guest Group?"),
+        description=_("Only one Guest group is allowed")
     )
     editpost = BooleanField(
-        "Can edit posts",
-        description="Check this if the users in this group can edit posts"
+        _("Can edit posts"),
+        description=_("Check this if the users in this group can edit posts")
     )
     deletepost = BooleanField(
-        "Can delete posts",
-        description="Check this is the users in this group can delete posts"
+        _("Can delete posts"),
+        description=_("Check this is the users in this group can delete posts")
     )
     deletetopic = BooleanField(
-        "Can delete topics",
-        description="Check this is the users in this group can delete topics"
+        _("Can delete topics"),
+        description=_("Check this is the users in this group can delete topics")
     )
     posttopic = BooleanField(
-        "Can create topics",
-        description="Check this is the users in this group can create topics"
+        _("Can create topics"),
+        description=_("Check this is the users in this group can create topics")
     )
     postreply = BooleanField(
-        "Can post replies",
-        description="Check this is the users in this group can post replies"
+        _("Can post replies"),
+        description=_("Check this is the users in this group can post replies")
     )
 
     mod_edituser = BooleanField(
-        "Moderators can edit user profiles",
-        description=("Allow moderators to edit a another users profile "
-                     "including password and email changes.")
+        _("Moderators can edit user profiles"),
+        description=_("Allow moderators to edit a another users profile "
+                      "including password and email changes.")
     )
 
     mod_banuser = BooleanField(
-        "Moderators can ban users",
-        description="Allow moderators to ban other users"
+        _("Moderators can ban users"),
+        description=_("Allow moderators to ban other users")
     )
 
     def validate_name(self, field):
@@ -204,7 +206,7 @@ class GroupForm(Form):
             group = Group.query.filter(Group.name.like(field.data)).first()
 
         if group:
-            raise ValidationError("This name is taken")
+            raise ValidationError(_("This name is taken"))
 
     def validate_banned(self, field):
         if hasattr(self, "group"):
@@ -218,7 +220,7 @@ class GroupForm(Form):
             group = Group.query.filter_by(banned=True).count()
 
         if field.data and group > 0:
-            raise ValidationError("There is already a Banned group")
+            raise ValidationError(_("There is already a Banned group"))
 
     def validate_guest(self, field):
         if hasattr(self, "group"):
@@ -232,7 +234,7 @@ class GroupForm(Form):
             group = Group.query.filter_by(guest=True).count()
 
         if field.data and group > 0:
-            raise ValidationError("There is already a Guest group")
+            raise ValidationError(_("There is already a Guest group"))
 
     def save(self):
         group = Group(**self.data)
@@ -252,61 +254,62 @@ class AddGroupForm(GroupForm):
 
 class ForumForm(Form):
     title = StringField(
-        "Forum Title",
-        validators=[DataRequired(message="Forum title required")]
+        _("Forum Title"),
+        validators=[DataRequired(message=_("Forum title required"))]
     )
 
     description = TextAreaField(
-        "Description",
+        _("Description"),
         validators=[Optional()],
-        description="You can format your description with BBCode."
+        description=_("You can format your description with BBCode.")
     )
 
     position = IntegerField(
-        "Position",
+        _("Position"),
         default=1,
-        validators=[DataRequired(message="Forum position required")]
+        validators=[DataRequired(message=_("Forum position required"))]
     )
 
     category = QuerySelectField(
-        "Category",
+        _("Category"),
         query_factory=selectable_categories,
         allow_blank=False,
         get_label="title",
-        description="The category that contains this forum."
+        description=_("The category that contains this forum.")
     )
 
     external = StringField(
-        "External link",
+        _("External link"),
         validators=[Optional(), URL()],
-        description="A link to a website i.e. 'http://flaskbb.org'"
+        description=_("A link to a website i.e. 'http://flaskbb.org'")
     )
 
     moderators = StringField(
-        "Moderators",
-        description="Comma seperated usernames. Leave it blank if you do not \
-                     want to set any moderators."
+        _("Moderators"),
+        description=_("Comma seperated usernames. Leave it blank if you do not "
+                      "want to set any moderators.")
     )
 
     show_moderators = BooleanField(
-        "Show Moderators",
-        description="Do you want show the moderators on the index page?"
+        _("Show Moderators"),
+        description=_("Do you want show the moderators on the index page?")
     )
 
     locked = BooleanField(
-        "Locked?",
-        description="Disable new posts and topics in this forum."
+        _("Locked?"),
+        description=_("Disable new posts and topics in this forum.")
     )
 
     def validate_external(self, field):
         if hasattr(self, "forum"):
             if self.forum.topics:
-                raise ValidationError("You cannot convert a forum that \
-                                       contain topics in a external link")
+                raise ValidationError(_("You cannot convert a forum that "
+                                        "contain topics in a external link"))
 
     def validate_show_moderators(self, field):
         if field.data and not self.moderators.data:
-            raise ValidationError("You also need to specify some moderators.")
+            raise ValidationError(_("You also need to specify some "
+                                    "moderators."))
 
     def validate_moderators(self, field):
         approved_moderators = list()
@@ -325,12 +328,15 @@ class ForumForm(Form):
                     if not (user.get_permissions()["mod"] or
                             user.get_permissions()["admin"] or
                             user.get_permissions()["super_mod"]):
-                        raise ValidationError("%s is not in a moderators \
-                            group" % user.username)
+                        raise ValidationError(
+                            _("%(user)s is not in a moderators group",
+                              user=user.username)
+                        )
                     else:
                         approved_moderators.append(user)
                 else:
-                    raise ValidationError("User %s not found" % moderator)
+                    raise ValidationError(_("User %(moderator)s not found",
+                                            moderator=moderator))
             field.data = approved_moderators
 
         else:
@@ -365,19 +371,19 @@ class AddForumForm(ForumForm):
 
 
 class CategoryForm(Form):
-    title = StringField("Category title", validators=[
-        DataRequired(message="Category title required")])
+    title = StringField(_("Category title"), validators=[
+        DataRequired(message=_("Category title required"))])
 
     description = TextAreaField(
-        "Description",
+        _("Description"),
         validators=[Optional()],
-        description="You can format your description with BBCode."
+        description=_("You can format your description with BBCode.")
     )
 
     position = IntegerField(
-        "Position",
+        _("Position"),
         default=1,
-        validators=[DataRequired(message="Category position required")]
+        validators=[DataRequired(message=_("Category position required"))]
     )
 
     def save(self):

+ 0 - 1
flaskbb/management/models.py

@@ -8,7 +8,6 @@
     :copyright: (c) 2014 by the FlaskBB Team.
     :license: BSD, see LICENSE for more details.
 """
-import sys
 from wtforms import (TextField, IntegerField, FloatField, BooleanField,
                      SelectField, SelectMultipleField, validators)
 from flask.ext.wtf import Form

+ 47 - 44
flaskbb/management/views.py

@@ -16,6 +16,7 @@ from flask import (Blueprint, current_app, request, redirect, url_for, flash,
                    __version__ as flask_version)
 from flask.ext.login import current_user
 from flask.ext.plugins import get_all_plugins, get_plugin, get_plugin_from_all
+from flask.ext.babel import gettext as _
 
 from flaskbb import __version__ as flaskbb_version
 from flaskbb._compat import iteritems
@@ -120,7 +121,7 @@ def edit_user(user_id):
     user = User.query.filter_by(id=user_id).first_or_404()
 
     if not can_edit_user(current_user):
-        flash("You are not allowed to edit this user.", "danger")
+        flash(_("You are not allowed to edit this user."), "danger")
         return redirect(url_for("management.users"))
 
     secondary_group_query = Group.query.filter(
@@ -140,11 +141,11 @@ def edit_user(user_id):
 
         user.save(groups=form.secondary_groups.data)
 
-        flash("User successfully edited", "success")
+        flash(_("User successfully edited"), "success")
         return redirect(url_for("management.edit_user", user_id=user.id))
 
     return render_template("management/user_form.html", form=form,
-                           title="Edit User")
+                           title=_("Edit User"))
 
 
 @management.route("/users/<int:user_id>/delete")
@@ -152,7 +153,7 @@ def edit_user(user_id):
 def delete_user(user_id):
     user = User.query.filter_by(id=user_id).first_or_404()
     user.delete()
-    flash("User successfully deleted", "success")
+    flash(_("User successfully deleted"), "success")
     return redirect(url_for("management.users"))
 
 
@@ -162,11 +163,11 @@ def add_user():
     form = AddUserForm()
     if form.validate_on_submit():
         form.save()
-        flash("User successfully added.", "success")
+        flash(_("User successfully added."), "success")
         return redirect(url_for("management.users"))
 
     return render_template("management/user_form.html", form=form,
-                           title="Add User")
+                           title=_("Add User"))
 
 
 @management.route("/users/banned")
@@ -195,7 +196,7 @@ def banned_users():
 @moderator_required
 def ban_user(user_id):
     if not can_ban_user(current_user):
-        flash("You do not have the permissions to ban this user.")
+        flash(_("You do not have the permissions to ban this user."), "danger")
         return redirect(url_for("management.overview"))
 
     user = User.query.filter_by(id=user_id).first_or_404()
@@ -205,13 +206,13 @@ def ban_user(user_id):
             (current_user.permissions['mod'] or
              current_user.permissions['super_mod']):
 
-        flash("A moderator cannot ban an admin user.", "danger")
+        flash(_("A moderator cannot ban an admin user."), "danger")
         return redirect(url_for("management.overview"))
 
     if user.ban():
-        flash("User was banned successfully.", "success")
+        flash(_("User was banned successfully."), "success")
     else:
-        flash("Could not ban user.", "danger")
+        flash(_("Could not ban user."), "danger")
 
     return redirect(url_for("management.banned_users"))
 
@@ -220,15 +221,16 @@ def ban_user(user_id):
 @moderator_required
 def unban_user(user_id):
     if not can_ban_user(current_user):
-        flash("You do not have the permissions to unban this user.")
+        flash(_("You do not have the permissions to unban this user."),
+              "danger")
         return redirect(url_for("management.overview"))
 
     user = User.query.filter_by(id=user_id).first_or_404()
 
     if user.unban():
-        flash("User is now unbanned.", "success")
+        flash(_("User is now unbanned."), "success")
     else:
-        flash("Could not unban user.", "danger")
+        flash(_("Could not unban user."), "danger")
 
     return redirect(url_for("management.banned_users"))
 
@@ -266,13 +268,14 @@ def report_markread(report_id=None):
 
         report = Report.query.filter_by(id=report_id).first_or_404()
         if report.zapped:
-            flash("Report %s is already marked as read" % report.id, "success")
+            flash(_("Report %(id)s is already marked as read", id=report.id),
+                  "success")
             return redirect(url_for("management.reports"))
 
         report.zapped_by = current_user.id
         report.zapped = datetime.utcnow()
         report.save()
-        flash("Report %s marked as read" % report.id, "success")
+        flash(_("Report %(id)s marked as read", id=report.id), "success")
         return redirect(url_for("management.reports"))
 
     # mark all as read
@@ -286,7 +289,7 @@ def report_markread(report_id=None):
     db.session.add_all(report_list)
     db.session.commit()
 
-    flash("All reports were marked as read", "success")
+    flash(_("All reports were marked as read"), "success")
     return redirect(url_for("management.reports"))
 
 
@@ -317,11 +320,11 @@ def edit_group(group_id):
         if group.guest:
             Guest.invalidate_cache()
 
-        flash("Group successfully edited.", "success")
+        flash(_("Group successfully edited."), "success")
         return redirect(url_for("management.groups", group_id=group.id))
 
     return render_template("management/group_form.html", form=form,
-                           title="Edit Group")
+                           title=_("Edit Group"))
 
 
 @management.route("/groups/<int:group_id>/delete")
@@ -329,7 +332,7 @@ def edit_group(group_id):
 def delete_group(group_id):
     group = Group.query.filter_by(id=group_id).first_or_404()
     group.delete()
-    flash("Group successfully deleted.", "success")
+    flash(_("Group successfully deleted."), "success")
     return redirect(url_for("management.groups"))
 
 
@@ -339,11 +342,11 @@ def add_group():
     form = AddGroupForm()
     if form.validate_on_submit():
         form.save()
-        flash("Group successfully added.", "success")
+        flash(_("Group successfully added."), "success")
         return redirect(url_for("management.groups"))
 
     return render_template("management/group_form.html", form=form,
-                           title="Add Group")
+                           title=_("Add Group"))
 
 
 # Forums and Categories
@@ -364,7 +367,7 @@ def edit_forum(forum_id):
         form.populate_obj(forum)
         forum.save(moderators=form.moderators.data)
 
-        flash("Forum successfully edited.", "success")
+        flash(_("Forum successfully edited."), "success")
         return redirect(url_for("management.edit_forum", forum_id=forum.id))
     else:
         if forum.moderators:
@@ -375,7 +378,7 @@ def edit_forum(forum_id):
             form.moderators.data = None
 
     return render_template("management/forum_form.html", form=form,
-                           title="Edit Forum")
+                           title=_("Edit Forum"))
 
 
 @management.route("/forums/<int:forum_id>/delete")
@@ -388,7 +391,7 @@ def delete_forum(forum_id):
 
     forum.delete(involved_users)
 
-    flash("Forum successfully deleted.", "success")
+    flash(_("Forum successfully deleted."), "success")
     return redirect(url_for("management.forums"))
 
 
@@ -400,7 +403,7 @@ def add_forum(category_id=None):
 
     if form.validate_on_submit():
         form.save()
-        flash("Forum successfully added.", "success")
+        flash(_("Forum successfully added."), "success")
         return redirect(url_for("management.forums"))
     else:
         if category_id:
@@ -408,7 +411,7 @@ def add_forum(category_id=None):
             form.category.data = category
 
     return render_template("management/forum_form.html", form=form,
-                           title="Add Forum")
+                           title=_("Add Forum"))
 
 
 @management.route("/category/add", methods=["GET", "POST"])
@@ -418,11 +421,11 @@ def add_category():
 
     if form.validate_on_submit():
         form.save()
-        flash("Category successfully created.", "success")
+        flash(_("Category successfully created."), "success")
         return redirect(url_for("management.forums"))
 
     return render_template("management/category_form.html", form=form,
-                           title="Add Category")
+                           title=_("Add Category"))
 
 
 @management.route("/category/<int:category_id>/edit", methods=["GET", "POST"])
@@ -437,7 +440,7 @@ def edit_category(category_id):
         category.save()
 
     return render_template("management/category_form.html", form=form,
-                           title="Edit Category")
+                           title=_("Edit Category"))
 
 
 @management.route("/category/<int:category_id>/delete", methods=["GET", "POST"])
@@ -450,7 +453,7 @@ def delete_category(category_id):
                                        Post.user_id == User.id).all()
 
     category.delete(involved_users)
-    flash("Category with all associated forums deleted.", "success")
+    flash(_("Category with all associated forums deleted."), "success")
     return redirect(url_for("management.forums"))
 
 
@@ -476,13 +479,13 @@ def enable_plugin(plugin):
 
         os.remove(disabled_file)
 
-        flash("Plugin should be enabled. Please reload your app.", "success")
+        flash(_("Plugin is enabled. Please reload your app."), "success")
 
-        flash("If you are using a host which doesn't support writting on the "
-              "disk, this won't work - than you need to delete the "
-              "'DISABLED' file by yourself.", "info")
+        flash(_("If you are using a host which doesn't support writting on the "
+                "disk, this won't work - than you need to delete the "
+                "'DISABLED' file by yourself."), "info")
     else:
-        flash("Plugin is not enabled", "danger")
+        flash(_("Plugin is not enabled"), "danger")
 
     return redirect(url_for("management.plugins"))
 
@@ -493,7 +496,7 @@ def disable_plugin(plugin):
     try:
         plugin = get_plugin(plugin)
     except KeyError:
-        flash("Plugin {} not found".format(plugin), "danger")
+        flash(_("Plugin %(plugin)s not found", plugin=plugin.name), "danger")
         return redirect(url_for("management.plugins"))
 
     plugin_dir = os.path.join(
@@ -505,11 +508,11 @@ def disable_plugin(plugin):
 
     open(disabled_file, "a").close()
 
-    flash("Plugin should be disabled. Please reload your app.", "success")
+    flash(_("Plugin is disabled. Please reload your app."), "success")
 
-    flash("If you are using a host which doesn't "
-          "support writting on the disk, this won't work - than you need to "
-          "create a 'DISABLED' file by yourself.", "info")
+    flash(_("If you are using a host which doesn't "
+            "support writting on the disk, this won't work - than you need to "
+            "create a 'DISABLED' file by yourself."), "info")
 
     return redirect(url_for("management.plugins"))
 
@@ -522,9 +525,9 @@ def uninstall_plugin(plugin):
         plugin.uninstall()
         Setting.invalidate_cache()
 
-        flash("Plugin {} has been uninstalled.".format(plugin.name), "success")
+        flash(_("Plugin has been uninstalled."), "success")
     else:
-        flash("Cannot uninstall Plugin {}".format(plugin.name), "danger")
+        flash(_("Cannot uninstall Plugin"), "danger")
 
     return redirect(url_for("management.plugins"))
 
@@ -537,8 +540,8 @@ def install_plugin(plugin):
         plugin.install()
         Setting.invalidate_cache()
 
-        flash("Plugin {} has been installed.".format(plugin.name), "success")
+        flash(_("Plugin has been installed."), "success")
     else:
-        flash("Cannot install Plugin {}".format(plugin.name), "danger")
+        flash(_("Cannot install Plugin"), "danger")
 
     return redirect(url_for("management.plugins"))

+ 3 - 3
flaskbb/templates/auth/forgot_password.html

@@ -1,18 +1,18 @@
-{% set page_title = "Reset Password" %}
+{% set page_title = _("Reset Password") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 {% from theme("macros.html") import horizontal_field %}
 
 <form class="form-horizontal" role="form" method="POST">
-    <h2>Reset Password</h2>
+    <h2>{% trans %}Reset Password{% endtrans %}</h2>
     <hr>
         {{ form.hidden_tag() }}
         {{ horizontal_field(form.email) }}
 
     <div class="form-group">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-primary">Reset Password</button>
+            <button type="submit" class="btn btn-primary">{% trans %}Reset Password{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 4 - 4
flaskbb/templates/auth/login.html

@@ -1,11 +1,11 @@
-{% set page_title = "Login" %}
+{% set page_title = _("Login") %}
 
 {% extends theme("layout.html") %}
 {% from theme("macros.html") import horizontal_field %}
 {% block content %}
 
 <form class="form-horizontal" role="form" method="POST">
-    <h2>Login</h2>
+    <h2>{% trans %}Login{% endtrans %}</h2>
     <hr>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.login)}}
@@ -15,7 +15,7 @@
         <div class="col-sm-offset-3 col-sm-3">
             <div class="checkbox">
                 <label>
-                    {{ form.remember_me }} Remember Me
+                    {{ form.remember_me }} {{ form.remember_me.label }}
                 </label>
             </div>
         </div>
@@ -23,7 +23,7 @@
 
     <div class="form-group">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-success">Login</button>
+            <button type="submit" class="btn btn-success">{% trans %}Login{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 3 - 3
flaskbb/templates/auth/reauth.html

@@ -1,4 +1,4 @@
-{% set page_title = "Refresh Login" %}
+{% set page_title = _("Refresh Login") %}
 {% set active_forum_nav=True %}
 
 {% extends theme("layout.html") %}
@@ -6,10 +6,10 @@
 {% from theme("macros.html") import form_input_field %}
 
 <form class="form-signin" action="" method="POST">
-    <h2 class="form-signin-heading">Refresh Login</h2>
+    <h2 class="form-signin-heading">{% trans %}Refresh Login{% endtrans %}</h2>
     {{ form.hidden_tag() }}
     {{ form_input_field(form.password)}}
-    <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button>
+    <button class="btn btn-lg btn-primary btn-block" type="submit">{% trans %}Sign in{% endtrans %}</button>
 </form>
 
 {% endblock %}

+ 4 - 4
flaskbb/templates/auth/register.html

@@ -1,11 +1,11 @@
-{% set page_title = "Register" %}
+{% set page_title = _("Register") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 {% from theme("macros.html") import horizontal_field %}
 
 <form class="form-horizontal" role="form" method="POST">
-    <h2>Register</h2>
+    <h2>{% trans %}Register{% endtrans %}</h2>
     <hr>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.username)}}
@@ -21,7 +21,7 @@
         <div class="col-lg-offset-2 col-lg-3">
             <div class="checkbox">
                 <label>
-                    <input type="checkbox"> {{ form.accept_tos }} I accept the <a href="#">Terms of Service</a>
+                    <input type="checkbox"> {{ form.accept_tos }} {{ form.accept_tos.label }}
                 </label>
             </div>
         </div>
@@ -29,7 +29,7 @@
 
     <div class="form-group">
         <div class="col-lg-offset-2 col-lg-10">
-            <button type="submit" class="btn btn-success">Register</button>
+            <button type="submit" class="btn btn-success">{% trans %}Register{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 3 - 3
flaskbb/templates/auth/reset_password.html

@@ -1,11 +1,11 @@
-{% set page_title = "Reset Password" %}
+{% set page_title = _("Reset Password") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 {% from theme("macros.html") import horizontal_field %}
 
 <form class="form-horizontal" role="form" method="POST">
-    <h2>Reset Password</h2>
+    <h2>{% trans %}Reset Password{% endtrans %}</h2>
     <hr>
         {{ form.hidden_tag() }}
         {{ form.token }}
@@ -15,7 +15,7 @@
 
     <div class="form-group">
         <div class="col-lg-offset-2 col-lg-10">
-            <button type="submit" class="btn btn-primary">Reset Password</button>
+            <button type="submit" class="btn btn-primary">{% trans %}Reset Password{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 4 - 4
flaskbb/templates/email/reset_password.html

@@ -1,5 +1,5 @@
-<p>Dear {{ user.username }},</p>
-<p>To reset your password click on the following link:</p>
+<p>{% trans user=user.username %}Dear {{ user }},{% endtrans %}</p>
+<p>{% trans %}To reset your password click on the following link:{% endtrans %}</p>
 <p><a href="{{ url_for('auth.reset_password', token=token, _external=True) }}">{{ url_for('auth.reset_password', token=token, _external=True) }}</a></p>
-<p>Sincerely,</p>
-<p>The Administration</p>
+<p>{% trans %}Sincerely,{% endtrans %}</p>
+<p>{% trans %}The Administration{% endtrans %}</p>

+ 5 - 3
flaskbb/templates/email/reset_password.txt

@@ -1,9 +1,11 @@
-Dear {{ user.username }},
+{{ set link = url_for('auth.reset_password', token=token, _external=True) }}
+
+{% trans user=user.username, link=link %}Dear {{ user }},
 
 To reset your password click on the following link:
 
-{{ url_for('auth.reset_password', token=token, _external=True) }}
+{{ link }}
 
 Sincerely,
-
 The Administration
+{% endtrans %}

+ 4 - 4
flaskbb/templates/errors/forbidden_page.html

@@ -1,12 +1,12 @@
-{% set page_title = "No Access - 403" %}
+{% set page_title = _("No Access - 403") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 
 <div class="well">
-    <h1>Forbidden Page</h1>
-    <p>You do not have the permission to view this page.</p>
-    <p><a href="{{url_for('forum.index')}}">Back to the Forums</a></p>
+    <h1>{% trans %}Forbidden Page{% endtrans %}</h1>
+    <p>{% trans %}You do not have the permission to view this page.{% endtrans %}</p>
+    <p><a href="{{url_for('forum.index')}}">{% trans %}Back to the Forums{% endtrans %}</a></p>
 </div>
 
 {% endblock %}

+ 4 - 4
flaskbb/templates/errors/page_not_found.html

@@ -1,12 +1,12 @@
-{% set page_title = "Oh noes! 404" %}
+{% set page_title = _("Oh noes! 404") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 
 <div class="well">
-    <h1>Oops, Page not found!</h1>
-    <p>The page you were looking for does not exist.</p>
-    <p><a href="{{url_for('forum.index')}}">Back to the Forums</a></p>
+    <h1>{% trans %}Oops, Page not found!{% endtrans %}</h1>
+    <p>{% trans %}The page you were looking for does not exist.{% endtrans %}</p>
+    <p><a href="{{url_for('forum.index')}}">{% trans %}Back to the Forums{% endtrans %}</a></p>
 </div>
 <hr>
 

+ 3 - 3
flaskbb/templates/errors/server_error.html

@@ -1,11 +1,11 @@
-{% set page_title = "Server Error - 500" %}
+{% set page_title = _("Server Error - 500") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 
 <div class="well">
-    <h1>Server Error</h1>
-    <p>Something went wrong!</p>
+    <h1>{% trans %}Server Error{% endtrans %}</h1>
+    <p>{% trans %}Something went wrong!{% endtrans %}</p>
 </div>
 
 {% endblock %}

+ 1 - 1
flaskbb/templates/forum/category.html

@@ -5,7 +5,7 @@
 {% block content %}
 
 <ol class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li class="active">{{ category.title }}</li>
 </ol>
 

+ 5 - 5
flaskbb/templates/forum/category_layout.html

@@ -8,10 +8,10 @@
     </thead>
     <tbody class="forumbody">
         <tr class="forum_stats">
-            <td colspan="2"><strong>Forum</strong></td>
-            <td width="85" align="center" style="white-space: nowrap"><strong>Topics</strong></td>
-            <td width="85" align="center" style="white-space: nowrap"><strong>Posts</strong></td>
-            <td width="200" align="center" style="white-space: nowrap"><strong>Last Post</strong></td>
+            <td colspan="2"><strong>{% trans %}Forum{% endtrans %}</strong></td>
+            <td width="85" align="center" style="white-space: nowrap"><strong>{% trans %}Topics{% endtrans %}</strong></td>
+            <td width="85" align="center" style="white-space: nowrap"><strong>{% trans %}Posts{% endtrans %}</strong></td>
+            <td width="200" align="center" style="white-space: nowrap"><strong>{% trans %}Last Post{% endtrans %}</strong></td>
         </tr>
 
         {% for forum, forumsread in forums %}
@@ -57,7 +57,7 @@
                     {% endautoescape %}
                     {% if forum.show_moderators %}
                     <div class="forum-moderators">
-                        Moderators:
+                        {% trans %}Moderators{% endtrans %}:
                         {% for moderator in forum.moderators %}
                         <a href="{{ url_for('user.profile', username=moderator.username) }}">{{ moderator.username }}</a>{% if not loop.last %}, {% endif %}
                         {% endfor %}

+ 25 - 19
flaskbb/templates/forum/forum.html

@@ -6,7 +6,7 @@
 {% from theme('macros.html') import render_pagination, topic_pages %}
 
 <ol class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ forum.category.url }}">{{ forum.category.title }}</a></li>
     <li class="active">{{ forum.title }}</li>
 </ol>
@@ -19,16 +19,16 @@
 <div class="pull-right" style="padding-bottom: 10px">
     <div class="btn-group">
         <a href="{{ url_for('forum.markread', forum_id=forum.id, slug=forum.slug) }}" class="btn btn-default">
-            <span class="fa fa-check"></span> Mark as Read
+            <span class="fa fa-check"></span> {% trans %}Mark as Read{% endtrans %}
         </a>
 
         {% if forum.locked %}
         <span class="btn btn-primary">
-            <span class="fa fa-lock"></span> Locked
+            <span class="fa fa-lock"></span> {% trans %}Locked{% endtrans %}
         </span>
         {% else %}
         <a href="{{ url_for('forum.new_topic', forum_id=forum.id, slug=forum.slug) }}" class="btn btn-primary">
-            <span class="fa fa-pencil"></span> New Topic
+            <span class="fa fa-pencil"></span> {% trans %}New Topic{% endtrans %}
         </a>
         {% endif %}
 
@@ -47,13 +47,13 @@
 
     <tbody>
         <tr>
-            <td colspan="2">Topic</td>
+            <td colspan="2">{% trans %}Topic{% endtrans %}</td>
 
-            <td>Posts</td>
+            <td>{% trans %}Posts{% endtrans %}</td>
 
-            <td>Views</td>
+            <td>{% trans %}Views{% endtrans %}</td>
 
-            <td>Last Post</td>
+            <td>{% trans %}Last Post{% endtrans %}</td>
         </tr>
 
         {% for topic, topicread in topics.items %}
@@ -82,11 +82,14 @@
                     <!-- Topic Pagination -->
                     {{ topic_pages(topic, flaskbb_config["POSTS_PER_PAGE"]) }}
                     <br />
-                    {% if topic.user_id %}
-                    <small>by <a href="{{ topic.user.url }}">{{ topic.user.username }}</a></small>
-                    {% else %}
-                    <small>by {{ topic.username }}</small>
-                    {% endif %}
+                    <small>
+                        {% trans %}by{% endtrans %}
+                        {% if topic.user_id %}
+                         <a href="{{ topic.user.url }}">{{ topic.user.username }}</a>
+                        {% else %}
+                        {{ topic.username }}
+                        {% endif %}
+                    </small>
                 </div>
             </td>
             <td>
@@ -98,17 +101,20 @@
             <td>
                 <a href="{{ topic.last_post.url }}">{{ topic.last_post.date_created|time_since }}</a><br />
 
-                {% if topic.last_post.user_id %}
-                <small>by <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a></small>
-                {% else %}
-                <small>{{ topic.last_post.username }}</small>
-                {% endif %}
+                <small>
+                    {% trans %}by{% endtrans %}
+                    {% if topic.last_post.user_id %}
+                    <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a>
+                    {% else %}
+                    {{ topic.last_post.username }}
+                    {% endif %}
+                </small>
             </td>
         </tr>
         {% else %}
         <tr>
             <td colspan="5">
-                No Topics so far.
+                {% trans %}No Topics so far.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 9 - 9
flaskbb/templates/forum/index.html

@@ -2,7 +2,7 @@
 {% block content %}
 
 <ol class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
 </ol>
 
 {% for category, forums in categories %}
@@ -14,23 +14,23 @@
     <thead>
         <tr>
             <td colspan="2">
-                <strong>Board Statistics</strong>
-                [<a href="{{ url_for('forum.who_is_online') }}" onclick="window.open(this.href, 'wio_window','width=500,height=500'); return false;">Who is online?</a>]
+                <strong>{% trans %}Board Statistics{% endtrans %}</strong>
+                [<a href="{{ url_for('forum.who_is_online') }}" onclick="window.open(this.href, 'wio_window','width=500,height=500'); return false;">{% trans %}Who is online?{% endtrans %}</a>]
             </td>
         </tr>
     </thead>
     <tbody>
         <tr>
             <td>
-                Total number of registered users: <strong>{{ user_count }}</strong> <br />
-                Total number of topics: <strong>{{ topic_count }}</strong> <br />
-                Total number of posts: <strong>{{ post_count }}</strong> <br />
+                {% trans %}Total number of registered users{% endtrans %}: <strong>{{ user_count }}</strong> <br />
+                {% trans %}Total number of topics{% endtrans %}: <strong>{{ topic_count }}</strong> <br />
+                {% trans %}Total number of posts{% endtrans %}: <strong>{{ post_count }}</strong> <br />
             </td>
             <td>
-                Newest registered user: {% if newest_user %}<a href="{{ newest_user.url }}">{{ newest_user.username }}</a>{% else %}No users{% endif %}<br />
-                Registered users online: <strong>{{ online_users }}</strong> <br />
+                {% trans %}Newest registered user{% endtrans %}: {% if newest_user %}<a href="{{ newest_user.url }}">{{ newest_user.username }}</a>{% else %}{% trans %}No users{% endtrans %}{% endif %}<br />
+                {% trans %}Registered users online{% endtrans %}: <strong>{{ online_users }}</strong> <br />
                 {% if config["REDIS_ENABLED"] %}
-                Guests online: <strong>{{ online_guests }}</strong> <br />
+                {% trans %}Guests online{% endtrans %}: <strong>{{ online_guests }}</strong> <br />
                 {% endif %}
             </td>
         </tr>

+ 8 - 8
flaskbb/templates/forum/memberlist.html

@@ -1,12 +1,12 @@
-{% set page_title = "Memberlist" %}
+{% set page_title = _("Memberlist") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
 {% from theme('macros.html') import render_pagination, group_field %}
 
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
-    <li class="active">Memberlist</li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+    <li class="active">{% trans %}Memberlist{% endtrans %}</li>
 </ul>
 
 <div class="pull-left" style="padding-bottom: 10px">
@@ -18,7 +18,7 @@
           {{ search_form.hidden_tag() }}
           {{ group_field(search_form.search_query) }}
           <span class="input-group-btn">
-            <button class="btn btn-primary" type="submit">Search</button>
+            <button class="btn btn-primary" type="submit">{% trans %}Search{% endtrans %}</button>
           </span>
       </div>
   </form>
@@ -28,10 +28,10 @@
     <thead>
         <tr>
             <th>#</th>
-            <th>Username</th>
-            <th>Posts</th>
-            <th>Date registered</th>
-            <th>Group</th>
+            <th>{% trans %}Username{% endtrans %}</th>
+            <th>{% trans %}Posts{% endtrans %}</th>
+            <th>{% trans %}Date registered{% endtrans %}</th>
+            <th>{% trans %}Group{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>

+ 7 - 7
flaskbb/templates/forum/new_post.html

@@ -1,4 +1,4 @@
-{% set page_title = "New Post" %}
+{% set page_title = _("New Post") %}
 {% set active_forum_nav=True %}
 
 {% extends theme("layout.html") %}
@@ -6,20 +6,20 @@
 {% from theme("macros.html") import render_field %}
 
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ topic.forum.url }}">{{ topic.forum.title }}</a></li>
     <li><a href="{{ topic.url }}">{{ topic.title }} </a></li>
-    <li class="active">New Post</li>
+    <li class="active">{% trans %}New Post{% endtrans %}</li>
 </ul>
 
 <form class="form" role="form" method="post">
     {{ form.hidden_tag() }}
-    <h3>New Post</h3>
+    <h3>{% trans %}New Post{% endtrans %}</h3>
 
     {% if preview %}
     <div class="form-group">
         <div class="col-sm-12">
-            <label>Preview</label>
+            <label>{% trans %}Preview{% endtrans %}</label>
             <div class="form-control preview-body">
                 {% autoescape false %}
                 {{ preview|markup }}
@@ -31,8 +31,8 @@
 
     {{ render_field(form.content, div_class="col-sm-12", rows=12) }}
 
-    <button type="submit" class="btn btn-success" name="button" value="reply">Reply</button>
-    <button type="submit" class="btn btn-success" name="button" value="preview">Preview</button>
+    <button type="submit" class="btn btn-success" name="button" value="reply">{% trans %}Reply{% endtrans %}</button>
+    <button type="submit" class="btn btn-success" name="button" value="preview">{% trans %}Preview{% endtrans %}</button>
 </form>
 
 {% endblock %}

+ 7 - 7
flaskbb/templates/forum/new_topic.html

@@ -1,4 +1,4 @@
-{% set page_title = "New Topic" %}
+{% set page_title = _("New Topic") %}
 {% set active_forum_nav=True %}
 
 {% extends theme("layout.html") %}
@@ -6,19 +6,19 @@
 {% from theme("macros.html") import render_field %}
 
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ forum.url }}">{{ forum.title }}</a></li>
-    <li class="active">New Topic</li>
+    <li class="active">{% trans %}New Topic{% endtrans %}</li>
 </ul>
 
 <form class="form" role="form" method="post">
     {{ form.hidden_tag() }}
-    <h3>New Topic</h3>
+    <h3>{% trans %}New Topic{% endtrans %}</h3>
 
     {% if preview %}
     <div class="form-group">
         <div class="col-sm-12">
-            <label>Preview</label>
+            <label>{% trans %}Preview{% endtrans %}</label>
             <div class="form-control preview-body">
                 {% autoescape false %}
                 {{ preview|markup }}
@@ -31,8 +31,8 @@
     {{ render_field(form.title, div_class="col-sm-12") }}
     {{ render_field(form.content, div_class="col-sm-12", rows=12) }}
 
-    <button type="submit" class="btn btn-success" name="button" value="reply">Reply</button>
-    <button type="submit" class="btn btn-success" name="button" value="preview">Preview</button>
+    <button type="submit" class="btn btn-success" name="button" value="reply">{% trans %}Post Topic{% endtrans %}</button>
+    <button type="submit" class="btn btn-success" name="button" value="preview">{% trans %}Preview{% endtrans %}</button>
 </form>
 
 {% endblock %}

+ 2 - 2
flaskbb/templates/forum/online_users.html

@@ -1,4 +1,4 @@
-{% set page_title = "Online Users" %}
+{% set page_title = _("Online Users") %}
 
 {% extends theme("layout.html") %}
 
@@ -7,7 +7,7 @@
 
 {% block content %}
 
-<legend>Online Users</legend>
+<legend>{% trans %}Online Users{% endtrans %}</legend>
 {% for user in online_users %}
     {% if config["REDIS_ENABLED"] %}
     <a href="{{ url_for('user.profile', username=user) }}">{{ user }}<a>{% if not loop.last %}, {% endif %}

+ 4 - 4
flaskbb/templates/forum/report_post.html

@@ -1,4 +1,4 @@
-{% set page_title = "Report Post" %}
+{% set page_title = _("Report Post") %}
 
 {% extends theme("layout.html") %}
 
@@ -10,11 +10,11 @@
 
 <form class="form" role="form" method="post">
     {{ form.hidden_tag() }}
-    <h3>Report Post</h3>
+    <h3>{% trans %}Report Post{% endtrans %}</h3>
 
     {{ render_field(form.reason) }}
 
-    <button type="submit" class="btn btn-success">Report</button>
-    <a class="btn btn-info" href="#" onclick="window.close();return false;">Close</a>
+    <button type="submit" class="btn btn-success">{% trans %}Report{% endtrans %}</button>
+    <a class="btn btn-info" href="#" onclick="window.close();return false;">{% trans %}Close{% endtrans %}</a>
 </form>
 {% endblock %}

+ 6 - 6
flaskbb/templates/forum/search_form.html

@@ -1,16 +1,16 @@
-{% set page_title = "Search" %}
+{% set page_title = _("Search") %}
 
 {% extends theme("layout.html") %}
 {% from theme("macros.html") import horizontal_field %}
 {% block content %}
 
     <ul class="breadcrumb">
-        <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
-        <li class="active">Search</li>
+        <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+        <li class="active">{% trans %}Search{% endtrans %}</li>
     </ul>
 
     <form class="form-horizontal" role="form" method="post">
-        <h2>Search</h2>
+        <h2>{% trans %}Search{% endtrans %}</h2>
         <hr>
         {{ form.hidden_tag() }}
         {{ horizontal_field(form.search_types)}}
@@ -18,9 +18,9 @@
 
         <div class="form-group">
             <div class="col-sm-offset-3 col-sm-9">
-                <button type="submit" class="btn btn-success">Search</button>
+                <button type="submit" class="btn btn-success">{% trans %}Search{% endtrans %}</button>
             </div>
         </div>
     </form>
 
-{% endblock %}
+{% endblock %}

+ 40 - 32
flaskbb/templates/forum/search_result.html

@@ -1,16 +1,16 @@
-{% set page_title = "Search" %}
+{% set page_title = _("Search") %}
 
 {% extends theme("layout.html") %}
 {% block content %}
     {% from theme('macros.html') import render_pagination, group_field, topic_pages %}
 
     <ul class="breadcrumb">
-        <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
-        <li class="active">Search</li>
+        <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+        <li class="active">{% trans %}Search{% endtrans %}</li>
     </ul>
 
     {% if result['post'] %}
-        <h3>Posts</h3>
+        <h3>{% trans %}Posts{% endtrans %}</h3>
 
         <table class="table table-bordered">
             <tbody>
@@ -40,8 +40,8 @@
                                 </td>
 
                                 <td class="pull-right">
-                                    Posts: {{ post.user.post_count }}<br />
-                                    Registered since: {{ post.user.date_joined|format_date('%b %d %Y') }}<br />
+                                    {% trans %}Posts{% endtrans %}: {{ post.user.post_count }}<br />
+                                    {% trans %}Registered since{% endtrans %}: {{ post.user.date_joined|format_date('%b %d %Y') }}<br />
                                 </td>
                             {% else %}
                                 <td>
@@ -66,7 +66,7 @@
             </tr>
             {% else %}
             <tr>
-                <td>No posts found matching your search criteria</td>
+                <td>{% trans %}No posts found matching your search criteria{% endtrans %}</td>
             </tr>
             {% endfor %}
             </tbody>
@@ -74,16 +74,16 @@
     {% endif %}
 
     {% if result['user'] %}
-        <h3>Users</h3>
+        <h3>{% trans %}Users{% endtrans %}</h3>
 
         <table class="table table-bordered">
             <thead>
             <tr>
                 <th>#</th>
-                <th>Username</th>
-                <th>Posts</th>
-                <th>Date registered</th>
-                <th>Group</th>
+                <th>{% trans %}Username{% endtrans %}</th>
+                <th>{% trans %}Posts{% endtrans %}</th>
+                <th>{% trans %}Date registered{% endtrans %}</th>
+                <th>{% trans %}Group{% endtrans %}</th>
             </tr>
             </thead>
             <tbody>
@@ -97,7 +97,7 @@
                 </tr>
             {% else %}
                 <tr>
-                    <td colspan="5">No users found matching your search criteria</td>
+                    <td colspan="5">{% trans %}No users found matching your search criteria{% endtrans %}</td>
                 </tr>
             {% endfor %}
             </tbody>
@@ -105,18 +105,18 @@
     {% endif %}
 
     {% if result['topic'] %}
-        <h3>Topics</h3>
+        <h3>{% trans %}Topics{% endtrans %}</h3>
 
         <table class="table table-bordered">
             <thead>
             <tr>
-                <th colspan="2">Topic</th>
+                <th colspan="2">{% trans %}Topic{% endtrans %}</th>
 
-                <th>Posts</th>
+                <th>{% trans %}Posts{% endtrans %}</th>
 
-                <th>Views</th>
+                <th>{% trans %}Views{% endtrans %}</th>
 
-                <th>Last Post</th>
+                <th>{% trans %}Last Post{% endtrans %}</th>
             </tr>
             </thead>
 
@@ -137,11 +137,15 @@
                             <!-- Topic Pagination -->
                             {{ topic_pages(topic, flaskbb_config["POSTS_PER_PAGE"]) }}
                             <br />
+
+                            <small>
+                            {% trans %}by{% endtrans %}
                             {% if topic.user_id %}
-                                <small>by <a href="{{ topic.user.url }}">{{ topic.user.username }}</a></small>
+                                <a href="{{ topic.user.url }}">{{ topic.user.username }}</a>
                             {% else %}
-                                <small>by {{ topic.username }}</small>
+                                {{ topic.username }}
                             {% endif %}
+                            </small>
                         </div>
                     </td>
                     <td>
@@ -153,16 +157,19 @@
                     <td>
                         <a href="{{ topic.last_post.url }}">{{ topic.last_post.date_created|time_since }}</a><br />
 
+                        <small>
+                        {% trans %}by{% endtrans %}
                         {% if topic.last_post.user_id %}
-                            <small>by <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a></small>
+                            <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a>
                         {% else %}
-                            <small>{{ topic.last_post.username }}</small>
+                            {{ topic.last_post.username }}
                         {% endif %}
+                        </small>
                     </td>
                 </tr>
             {% else %}
                 <tr>
-                    <td colspan="5">No topics found matching your search criteria</td>
+                    <td colspan="5">{% trans %}No topics found matching your search criteria{% trans %}</td>
                 </tr>
             {% endfor %}
             </tbody>
@@ -170,15 +177,15 @@
     {% endif %}
 
     {% if result['forum'] %}
-        <h3>Forums</h3>
+        <h3>{% trans %}Forums{% endtrans %}</h3>
 
         <table class="table table-bordered">
             <thead class="categoryhead">
             <tr>
-                <th colspan="2"><strong>Forum</strong></th>
-                <th width="85" align="center" style="white-space: nowrap"><strong>Topics</strong></th>
-                <th width="85" align="center" style="white-space: nowrap"><strong>Posts</strong></th>
-                <th width="200" align="center" style="white-space: nowrap"><strong>Last Post</strong></th>
+                <th colspan="2"><strong>{% trans %}Forum{% endtrans %}</strong></th>
+                <th width="85" align="center" style="white-space: nowrap"><strong>{% trans %}Topics{% endtrans %}</strong></th>
+                <th width="85" align="center" style="white-space: nowrap"><strong>{% trans %}Posts{% endtrans %}</strong></th>
+                <th width="200" align="center" style="white-space: nowrap"><strong>{% trans %}Last Post{% endtrans %}</strong></th>
             </tr>
             </thead>
             <tbody class="forumbody">
@@ -223,7 +230,7 @@
                         {% endautoescape %}
                         {% if forum.show_moderators %}
                             <div class="forum-moderators">
-                                Moderators:
+                                {% trans %}Moderators{% endtrans %}:
                                 {% for moderator in forum.moderators %}
                                     <a href="{{ url_for('user.profile', username=moderator.username) }}">{{ moderator.username }}</a>{% if not loop.last %}, {% endif %}
                                 {% endfor %}
@@ -243,14 +250,15 @@
                         <br />
                         {{ forum.last_post.date_created|time_since }}<br />
 
+                        {% trans %}by{% endtrans %}
                         {% if forum.last_post.user_id %}
-                            by <a href="{{ url_for('user.profile', username=forum.last_post.user.username) }}">{{ forum.last_post.user.username }}</a>
+                            <a href="{{ url_for('user.profile', username=forum.last_post.user.username) }}">{{ forum.last_post.user.username }}</a>
                         {% else %}
                             {{ forum.last_post.username }}
                         {% endif %}
 
                     {% else %}
-                        No posts
+                        {% trans %}No posts{% endtrans %}
                     {% endif %}
                     {% endif %}
                 </td>
@@ -258,7 +266,7 @@
             {% else %}
             <tr>
                 <td colspan="5">
-                    No forums found matching your search criteria
+                    {% trans %}No forums found matching your search criteria{% endtrans %}
                 </td>
             </tr>
             {% endfor %}

+ 15 - 15
flaskbb/templates/forum/topic.html

@@ -1,12 +1,12 @@
 {% extends theme("layout.html") %}
-{% set page_title = topic.title ~ " - Topic" %}
+{% set page_title = _("%(title)s - Topic", title=topic.title) %}
 {% set active_forum_nav=True %}
 
 {% block content %}
 {% from theme('macros.html') import render_pagination, form_field %}
 
 <ol class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ topic.forum.category.url }}">{{ topic.forum.category.title }}</a></li>
     <li><a href="{{ topic.forum.url }}">{{ topic.forum.title }}</a></li>
     <li class="active">{{ topic.title }}</li>
@@ -32,7 +32,7 @@
                         ">{{ post.date_created|format_date('%d %B %Y') }}</a>
                     {% if post.user_id and post.date_modified %}
                     <small>
-                        (Last modified: {{ post.date_modified|format_date }} by
+                        ({% trans %}Last modified{% endtrans %}: {{ post.date_modified|format_date }} {% trans %}by{% endtrans %}
                         <a href="{{ url_for('user.profile', username=post.modified_by) }}">
                             {{ post.modified_by }}
                         </a>.)
@@ -67,14 +67,14 @@
                     </td>
 
                     <td class="pull-right">
-                        Posts: {{ user.post_count }}<br />
-                        Registered since: {{ user.date_joined|format_date('%b %d %Y') }}<br />
+                        {% trans %}Posts{% endtrans %}: {{ user.post_count }}<br />
+                        {% trans %}Registered since{% endtrans %}: {{ user.date_joined|format_date('%b %d %Y') }}<br />
                     </td>
                 {% else %}
                     <td>
                         <strong>{{ post.username }}</strong>
                         <br />
-                        Guest
+                        {% trans %}Guest{% endtrans %}
                     </td>
                 {% endif %}
                 </tr>
@@ -103,36 +103,36 @@
             <td>
                 <span class="pull-left">
                     {% if current_user.is_authenticated() and post.user_id and post.user_id != current_user.id %}
-                    <a href="{{ url_for('user.new_message', to_user=post.user.username) }}">PM</a>
+                    <a href="{{ url_for('user.new_message', to_user=post.user.username) }}">{% trans %}PM{% endtrans %}</a>
                     {% endif %}
                     {% if user.website %}
-                    {% if current_user.is_authenticated() %}| {% endif %}<a href="{{ user.website }}">Website</a>
+                    {% if current_user.is_authenticated() %}| {% endif %}<a href="{{ user.website }}">{% trans %}Website{% endtrans %}</a>
                     {% endif %}
                 </span>
 
                 <span class="pull-right">
                     {% if current_user.is_authenticated() %}
                     <a href="{{ url_for('forum.report_post', post_id=post.id) }}" onclick="window.open(this.href, 'wio_window','width=500,height=500'); return false;">
-                        Report
+                        {% trans %}Report{% endtrans %}
                     </a> |
                     {% endif %}
                     {% if current_user|edit_post(post) %}
-                    <a href="{{ url_for('forum.edit_post', post_id=post.id) }}">Edit</a> |
+                    <a href="{{ url_for('forum.edit_post', post_id=post.id) }}">{% trans %}Edit{% endtrans %}</a> |
                     {% endif %}
                     {% if topic.first_post_id == post.id %}
                         {% if current_user|delete_topic(topic) %}
-                        <a href="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}">Delete</a> |
+                        <a href="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}">{% trans %}Delete{% endtrans %}</a> |
                         {% endif %}
                     {% else %}
                         {% if current_user|delete_post(post) %}
-                        <a href="{{ url_for('forum.delete_post', post_id=post.id) }}">Delete</a> |
+                        <a href="{{ url_for('forum.delete_post', post_id=post.id) }}">{% trans %}Delete{% endtrans %}</a> |
                         {% endif %}
                     {% endif %}
                     {% if current_user|post_reply(topic) %}
                         <!-- Quick quote -->
-                        <a href="#" class="quote_btn" data-post-id="{{ post.id }}">Quote</a> |
+                        <a href="#" class="quote_btn" data-post-id="{{ post.id }}">{% trans %}Quote{% endtrans %}</a> |
                         <!-- Full quote/reply -->
-                        <a href="{{ url_for('forum.reply_post', topic_id=topic.id, post_id=post.id) }}">Reply</a>
+                        <a href="{{ url_for('forum.reply_post', topic_id=topic.id, post_id=post.id) }}">{% trans %}Reply{% endtrans %}</a>
                     {% endif %}
                 </span>
             </td>
@@ -150,7 +150,7 @@
 
         {{ render_field(form.content, div_class="col-sm-12 reply-content", rows=5) }}
 
-        <button type="submit" class="btn btn-success">Reply!</button>
+        <button type="submit" class="btn btn-success">{% trans %}Reply{% endtrans %}</button>
     </form>
 {% endif %}
 

+ 8 - 8
flaskbb/templates/forum/topic_controls.html

@@ -6,26 +6,26 @@
     <div class="btn btn-group">
         {% if current_user|delete_topic(topic) %}
         <a href="{{ url_for('forum.delete_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-danger">
-            <span class="fa fa-trash-o"></span> Delete Topic
+            <span class="fa fa-trash-o"></span> {% trans %}Delete Topic{% endtrans %}
         </a>
         {% endif %}
         {% if current_user|can_moderate(topic.forum) %}
             {% if not topic.locked %}
             <a href="{{ url_for('forum.lock_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-warning">
-                <span class="fa fa-lock"></span> Lock Topic
+                <span class="fa fa-lock"></span> {% trans %}Lock Topic{% endtrans %}
             </a>
             {% else %}
             <a href="{{ url_for('forum.unlock_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-warning">
-                <span class="fa fa-unlock"></span> Unlock Topic
+                <span class="fa fa-unlock"></span> {% trans %}Unlock Topic{% endtrans %}
             </a>
             {% endif %}
             {% if not topic.important %}
             <a href="{{ url_for('forum.highlight_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-success">
-                    <span class="fa fa-star"></span> Highlight Topic
+                    <span class="fa fa-star"></span> {% trans %}Highlight Topic{% endtrans %}
             </a>
             {% else %}
             <a href="{{ url_for('forum.trivialize_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-success">
-                <span class="fa fa-star-o"></span> Trivialize Topic
+                <span class="fa fa-star-o"></span> {% trans %}Trivialize Topic{% endtrans %}
             </a>
             {% endif %}
         {% endif %}
@@ -35,17 +35,17 @@
     <div class="btn btn-group">
         {% if current_user.is_tracking_topic(topic) %}
         <a href="{{ url_for('forum.untrack_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-default"><span class="fa fa-tag">
-            </span> Untrack Topic
+            </span> {% trans %}Untrack Topic{% endtrans %}
         </a>
         {% else %}
         <a href="{{ url_for('forum.track_topic', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-default">
-            <span class="fa fa-tag"></span> Track Topic
+            <span class="fa fa-tag"></span> {% trans %}Track Topic{% endtrans %}
         </a>
         {% endif %}
 
         {% if current_user|post_reply(topic) %}
         <a href="{{ url_for('forum.new_post', topic_id=topic.id, slug=topic.slug) }}" class="btn btn-primary">
-            <span class="fa fa-pencil"></span> Reply
+            <span class="fa fa-pencil"></span> {% trans %}Reply{% endtrans %}
         </a>
         {% endif %}
     </div>

+ 25 - 19
flaskbb/templates/forum/topictracker.html

@@ -1,4 +1,4 @@
-{% set page_title = "Topic Tracker" %}
+{% set page_title = _("Topic Tracker") %}
 {% set active_forum_nav=True %}
 
 {% extends theme("layout.html") %}
@@ -6,8 +6,8 @@
 
 {% block content %}
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
-    <li class="active">Tracked Topics</li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
+    <li class="active">{% trans %}Tracked Topics{% endtrans %}</li>
 </ul>
 
 <div class="pull-left" style="padding-bottom: 10px">
@@ -19,19 +19,19 @@
     <thead>
         <tr>
             <th colspan="5">
-                Topic Tracker
+                {% trans %}Topic Tracker{% endtrans %}
             </th>
         </tr>
     </thead>
     <tbody>
         <tr>
-            <td colspan="2">Thread</td>
+            <td colspan="2">{% trans %}Topic{% endtrans %}</td>
 
-            <td>Posts</td>
+            <td>{% trans %}Posts{% endtrans %}</td>
 
-            <td>Views</td>
+            <td>{% trans %}Views{% endtrans %}</td>
 
-            <td>Last Post</td>
+            <td>{% trans %}Last Post{% endtrans %}</td>
         </tr>
 
         {% for topic, topicread in topics.items %}
@@ -48,11 +48,14 @@
             <td>
                 <div>
                     <a href="{{ topic.url }}">{{ topic.title }}</a> <br />
-                    {% if topic.user_id %}
-                    <small>by <a href="{{ topic.user.url }}">{{ topic.user.username }}</a></small>
-                    {% else %}
-                    <small>by {{ topic.username }}</small>
-                    {% endif %}
+                    <small>
+                        {% trans %}by{% endtrans %}
+                        {% if topic.user_id %}
+                        <a href="{{ topic.user.url }}">{{ topic.user.username }}</a>
+                        {% else %}
+                        {{ topic.username }}
+                        {% endif %}
+                    </small>
                 </div>
             </td>
             <td>
@@ -63,17 +66,20 @@
             </td>
             <td>
                 <a href="{{ topic.last_post.url }}">{{ topic.last_post.date_created|time_since }}</a><br />
-                {% if topic.last_post.user_id %}
-                <small>by <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a></small>
-                {% else %}
-                {{ topic.last_post.username }}
-                {% endif %}
+                <small>
+                    {% trans %}by{% endtrans %}
+                    {% if topic.last_post.user_id %}
+                    <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a>
+                    {% else %}
+                    {{ topic.last_post.username }}
+                    {% endif %}
+                </small>
             </td>
         </tr>
         {% else %}
         <tr>
             <td colspan="5">
-                No Topics so far.
+                {% trans %}No Topics so far.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 12 - 12
flaskbb/templates/layout.html

@@ -46,9 +46,9 @@
                             {{ emit_event("before-first-navigation-element") }}
 
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
-                            {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
-                            {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
-                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
+                            {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
+                            {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
 
                             {{ emit_event("after-last-navigation-element") }}
                         </ul>
@@ -62,16 +62,16 @@
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> Topic Tracker</a></li>
+                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
                                 <li class="divider"></li>
 
-                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> Settings</a></li>
+                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
                                 {% if current_user|is_admin_or_moderator %}
-                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span>Management</a></li>
+                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
                                 <li class="divider"></li>
                                 {% endif %}
 
-                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> Logout</a></li>
+                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
                             </ul>
                         </div>
 
@@ -80,21 +80,21 @@
                                 <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> Inbox</a></li>
-                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> New Message</a></li>
+                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Inbox{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% else %}
                         <div class="btn-group navbar-btn navbar-right">
                             <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
-                                <span class="fa fa-user"></span> Login
+                                <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
                             </a>
                             <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('auth.register') }}">Register</a></li>
-                                <li><a href="{{ url_for('auth.forgot_password') }}">Reset Password</a></li>
+                                <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% endif %}

+ 1 - 1
flaskbb/templates/macros.html

@@ -174,7 +174,7 @@
 
 {% macro render_pagination(page_obj, url) %}
 <ul class="pagination" style="margin: 0; float:right">
-    <li><span class="pages-label">Pages: </span></li>
+    <li><span class="pages-label">{% trans %}Pages{% endtrans %}: </span></li>
     {%- for page in page_obj.iter_pages() %}
         {% if page %}
             {% if page != page_obj.page %}

+ 13 - 13
flaskbb/templates/management/banned_users.html

@@ -1,4 +1,4 @@
-{% set page_title = "Banned Users" %}
+{% set page_title = _("Banned Users") %}
 {% set active_management_user_nav=True %}
 
 {% extends theme("management/management_layout.html") %}
@@ -7,17 +7,17 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.users', "Manage Users") }}
-        {{ navlink('management.banned_users', 'Banned Users') }}
+        {{ navlink('management.users', _("Manage Users")) }}
+        {{ navlink('management.banned_users', _('Banned Users')) }}
 
         {% if current_user|is_admin %}
-            {{ navlink('management.add_user', "Add User") }}
+            {{ navlink('management.add_user', _("Add User")) }}
         {% endif %}
     </ul>
 </div><!--/.col-md-3 -->
 
 <div class="col-md-9">
-    <legend>Banned Users</legend>
+    <legend>{% trans %}Banned Users{% endtrans %}</legend>
 
     <div class="pull-left" style="padding-bottom: 10px">
         {{ render_pagination(users, url_for('management.users')) }}
@@ -28,7 +28,7 @@
                 {{ search_form.hidden_tag() }}
                 {{ group_field(search_form.search_query) }}
                 <span class="input-group-btn">
-                    <button class="btn btn-primary" type="submit">Search</button>
+                    <button class="btn btn-primary" type="submit">{% trans %}Search{% endtrans %}</button>
                 </span>
             </div>
         </form>
@@ -38,11 +38,11 @@
         <thead>
             <tr>
                 <th>#</th>
-                <th>Username</th>
-                <th>Posts</th>
-                <th>Date registered</th>
-                <th>Group</th>
-                <th>Manage</th>
+                <th>{% trans %}Username{% endtrans %}</th>
+                <th>{% trans %}Posts{% endtrans %}</th>
+                <th>{% trans %}Date registered{% endtrans %}</th>
+                <th>{% trans %}Group{% endtrans %}</th>
+                <th>{% trans %}Manage{% endtrans %}</th>
             </tr>
         </thead>
         <tbody>
@@ -55,14 +55,14 @@
                     <td>{{ user.primary_group.name }}</td>
                     <td>
                         {% if current_user|can_ban_user and user.permissions['banned'] %}
-                            <a href="{{ url_for('management.unban_user', user_id = user.id) }}">Unban</a>
+                            <a href="{{ url_for('management.unban_user', user_id = user.id) }}">{% trans %}Unban{% endtrans %}</a>
                         {% endif %}
                     </td>
                 </tr>
             {% else %}
                 <tr>
                     <td colspan="6">
-                        No users found matching your search query
+                        {% trans %}No users found matching your search query{% endtrans %}
                     </td>
                 </tr>
             {% endfor %}

+ 4 - 4
flaskbb/templates/management/category_form.html

@@ -7,9 +7,9 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.forums', "Manage Forums") }}
-        {{ navlink('management.add_forum', "Add Forum") }}
-        {{ navlink('management.add_category', "Add Category") }}
+        {{ navlink('management.forums', _("Manage Forums")) }}
+        {{ navlink('management.add_forum', _("Add Forum")) }}
+        {{ navlink('management.add_category', _("Add Category")) }}
     </ul>
 </div>
 
@@ -24,7 +24,7 @@
 
             <div class="form-group">
                 <div class="col-lg-offset-0 col-lg-9">
-                    <button type="submit" class="btn btn-success">Save</button>
+                    <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
                 </div>
             </div>
     </form>

+ 4 - 4
flaskbb/templates/management/forum_form.html

@@ -7,9 +7,9 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.forums', "Manage Forums") }}
-        {{ navlink('management.add_forum', "Add Forum") }}
-        {{ navlink('management.add_category', "Add Category") }}
+        {{ navlink('management.forums', _("Manage Forums")) }}
+        {{ navlink('management.add_forum', _("Add Forum")) }}
+        {{ navlink('management.add_category', _("Add Category")) }}
     </ul>
 </div>
 
@@ -32,7 +32,7 @@
 
             <div class="form-group">
                 <div class="col-lg-offset-0 col-lg-9">
-                    <button type="submit" class="btn btn-success">Save</button>
+                    <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
                 </div>
             </div>
     </form>

+ 12 - 12
flaskbb/templates/management/forums.html

@@ -1,4 +1,4 @@
-{% set page_title = "Forums" %}
+{% set page_title = _("Forums") %}
 
 {% extends theme("management/management_layout.html") %}
 {% block management_content %}
@@ -6,15 +6,15 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.forums', "Manage Forums") }}
-        {{ navlink('management.add_forum', "Add Forum") }}
-        {{ navlink('management.add_category', "Add Category") }}
+        {{ navlink('management.forums', _("Manage Forums")) }}
+        {{ navlink('management.add_forum', _("Add Forum")) }}
+        {{ navlink('management.add_category', _("Add Category")) }}
     </ul>
 </div>
 
 
 <div class="col-md-9">
-    <legend>Manage Forums</legend>
+    <legend>{% trans %}Manage Forums{% endtrans %}</legend>
 
     {% for category in categories %}
     <table class="table table-bordered">
@@ -24,16 +24,16 @@
                     <div><strong><a href="{{ url_for('forum.view_category', category_id=category.id) }}">{{ category.title }}</a></strong></div>
                 </td>
                 <td valign="top" align="center" style="white-space: nowrap">
-                    <a href="{{ url_for('management.add_forum', category_id=category.id) }}">Add Forum</a> |
-                    <a href="{{ url_for('management.edit_category', category_id = category.id) }}">Edit</a> |
-                    <a href="{{ url_for('management.delete_category', category_id = category.id) }}">Delete</a>
+                    <a href="{{ url_for('management.add_forum', category_id=category.id) }}">{% trans %}Add Forum{% endtrans %}</a> |
+                    <a href="{{ url_for('management.edit_category', category_id = category.id) }}">{% trans %}Edit{% endtrans %}</a> |
+                    <a href="{{ url_for('management.delete_category', category_id = category.id) }}">{% trans %}Delete{% endtrans %}</a>
                 </td>
             </tr>
         </thead>
         <tbody class="forumbody">
             <tr class="forum_stats">
-                <td colspan="2"><strong>Forum</strong></td>
-                <td width="85" align="center" style="white-space: nowrap"><strong>Management</strong></td>
+                <td colspan="2"><strong>{% trans %}Forum{% endtrans %}</strong></td>
+                <td width="85" align="center" style="white-space: nowrap"><strong>{% trans %}Management{% endtrans %}</strong></td>
             </tr>
 
             {% for forum in category.forums %}
@@ -53,8 +53,8 @@
                 </td>
 
                 <td valign="top" align="center" style="white-space: nowrap">
-                    <a href="{{ url_for('management.edit_forum', forum_id = forum.id) }}">Edit</a> |
-                    <a href="{{ url_for('management.delete_forum', forum_id = forum.id) }}">Delete</a>
+                    <a href="{{ url_for('management.edit_forum', forum_id = forum.id) }}">{% trans %}Edit{% endtrans %}</a> |
+                    <a href="{{ url_for('management.delete_forum', forum_id = forum.id) }}">{% trans %}Delete{% endtrans %}</a>
                 </td>
             </tr>
             {% endfor %}

+ 3 - 3
flaskbb/templates/management/group_form.html

@@ -7,8 +7,8 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.groups', "Manage Groups") }}
-        {{ navlink('management.add_group', "Add Group") }}
+        {{ navlink('management.groups', _("Manage Groups")) }}
+        {{ navlink('management.add_group', _("Add Group")) }}
     </ul>
 </div>
 
@@ -38,7 +38,7 @@
 
             <div class="form-group">
                 <div class="col-lg-offset-0 col-lg-9">
-                    <button type="submit" class="btn btn-success">Save</button>
+                    <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
                 </div>
             </div>
     </form>

+ 9 - 9
flaskbb/templates/management/groups.html

@@ -1,4 +1,4 @@
-{% set page_title = "Groups" %}
+{% set page_title = _("Groups") %}
 
 {% extends theme("management/management_layout.html") %}
 {% block management_content %}
@@ -6,13 +6,13 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.groups', "Manage Groups") }}
-        {{ navlink('management.add_group', "Add Group") }}
+        {{ navlink('management.groups', _("Manage Groups")) }}
+        {{ navlink('management.add_group', _("Add Group")) }}
     </ul>
 </div>
 
 <div class="col-md-9">
-    <legend>Manage Groups</legend>
+    <legend>{% trans %}Manage Groups{% endtrans %}</legend>
 
     <div class="pull-left" style="padding-bottom: 10px">
         {{ render_pagination(groups, url_for('management.groups')) }}
@@ -22,9 +22,9 @@
         <thead>
             <tr>
                 <th>#</th>
-                <th>Group Name</th>
-                <th>Description</th>
-                <th>Manage</th>
+                <th>{% trans %}Group Name{% endtrans %}</th>
+                <th>{% trans %}Description{% endtrans %}</th>
+                <th>{% trans %}Manage{% endtrans %}</th>
             </tr>
         </thead>
         <tbody>
@@ -34,8 +34,8 @@
                 <td><a href="#">{{ group.name }}</a></td>
                 <td>{{ group.description }}</td>
                 <td>
-                    <a href="{{ url_for('management.edit_group', group_id = group.id) }}">Edit</a> |
-                    <a href="{{ url_for('management.delete_group', group_id = group.id) }}">Delete</a>
+                    <a href="{{ url_for('management.edit_group', group_id = group.id) }}">{% trans %}Edit{% endtrans %}</a> |
+                    <a href="{{ url_for('management.delete_group', group_id = group.id) }}">{% trans %}Delete{% endtrans %}</a>
                 </td>
             </tr>
             {% endfor %}

+ 7 - 7
flaskbb/templates/management/management_layout.html

@@ -4,15 +4,15 @@
 
 <div class="col-md-12" style="padding-bottom: 10px">
     <ul class="nav nav-tabs nav-justified">
-    {{ navlink('management.overview', 'Overview') }}
-    {{ navlink('management.users', 'Users', active=active_management_user_nav) }}
-    {{ navlink('management.unread_reports', 'Reports', active=active_management_report_nav) }}
+    {{ navlink('management.overview', _('Overview')) }}
+    {{ navlink('management.users', _('Users'), active=active_management_user_nav) }}
+    {{ navlink('management.unread_reports', _('Reports'), active=active_management_report_nav) }}
 
     {% if current_user|is_admin %}
-        {{ navlink('management.settings', 'Settings') }}
-        {{ navlink('management.groups', 'Groups', active=active_management_group_nav) }}
-        {{ navlink('management.forums', 'Forums', active=active_management_forum_nav) }}
-        {{ navlink('management.plugins', 'Plugins') }}
+        {{ navlink('management.settings', _('Settings')) }}
+        {{ navlink('management.groups', _('Groups'), active=active_management_group_nav) }}
+        {{ navlink('management.forums', _('Forums'), active=active_management_forum_nav) }}
+        {{ navlink('management.plugins', _('Plugins')) }}
     {% endif %}
     </ul>
 </div>

+ 8 - 8
flaskbb/templates/management/overview.html

@@ -1,4 +1,4 @@
-{% set page_title = "Overview" %}
+{% set page_title = _("Overview") %}
 
 {% extends theme("management/management_layout.html") %}
 {% block management_content %}
@@ -7,26 +7,26 @@
     <table class="table table-bordered">
         <thead>
             <tr>
-                <th colspan="4">Global Statistics</th>
+                <th colspan="4">{% trans %}Global Statistics{% endtrans %}</th>
             </tr>
         </thead>
         <tbody>
             <tr>
-                <td><b>FlaskBB Version</b></td>
+                <td><b>{% trans %}FlaskBB Version{% endtrans %}</b></td>
                 <td>{{ flaskbb_version }}</td>
-                <td><b>Posts</b></td>
+                <td><b>{% trans %}Posts{% endtrans %}</b></td>
                 <td>{{ post_count }}</td>
             </tr>
             <tr>
-                <td><b>Python Version</b></td>
+                <td><b>{% trans %}Python Version{% endtrans %}</b></td>
                 <td>{{ python_version }}</td>
-                <td><b>Topics</b></td>
+                <td><b>{% trans %}Topics{% endtrans %}</b></td>
                 <td>{{ topic_count }}</td>
             </tr>
             <tr>
-                <td><b>Flask Version</b></td>
+                <td><b>{% trans %}Flask Version{% endtrans %}</b></td>
                 <td>{{ flask_version }}</td>
-                <td><b>Users</b></td>
+                <td><b>{% trans %}Users{% endtrans %}</b></td>
                 <td>{{ user_count }}</td>
             </tr>
         </tbody>

+ 11 - 11
flaskbb/templates/management/plugins.html

@@ -1,17 +1,17 @@
-{% set page_title = "Plugins" %}
+{% set page_title = _("Plugins") %}
 
 {% extends theme("management/management_layout.html") %}
 {% block management_content %}
 {% from theme('macros.html') import render_pagination %}
 
-<legend>Manage Plugins</legend>
+<legend>{% trans %}Manage Plugins{% endtrans %}</legend>
 
 <table class="table table-bordered">
     <thead>
         <tr>
-            <th>Plugin</th>
-            <th>Information</th>
-            <th>Manage</th>
+            <th>{% trans %}Plugin{% endtrans %}</th>
+            <th>{% trans %}Information{% endtrans %}</th>
+            <th>{% trans %}Manage{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>
@@ -25,24 +25,24 @@
             {% endif %}
             </td>
             <td>
-                Version: <i>{{ plugin.version }}</i> <br />
+                {% trans %}Version{% endtrans %}: <i>{{ plugin.version }}</i> <br />
                 {{ plugin.description }} <br />
-                by  <i>{{ plugin.author }}</i> 
+                {% trans %}by{% endtrans %}  <i>{{ plugin.author }}</i>
             </td>
             <td>
                 {% if not plugin.enabled %}
-                <a href="{{ url_for('management.enable_plugin', plugin=plugin.identifier) }}">Enable</a>
+                <a href="{{ url_for('management.enable_plugin', plugin=plugin.identifier) }}">{% trans %}Enable{% endtrans %}</a>
                 {% else %}
-                <a href="{{ url_for('management.disable_plugin', plugin=plugin.identifier) }}">Disable</a>
+                <a href="{{ url_for('management.disable_plugin', plugin=plugin.identifier) }}">{% trans %}Disable{% endtrans %}</a>
                 {% endif %}
 
                 {% set uninstallable = plugin.uninstallable %}
                 {% if plugin.installable and not uninstallable %}
                 <br />
-                <a href="{{ url_for('management.install_plugin', plugin=plugin.identifier) }}">Install</a>
+                <a href="{{ url_for('management.install_plugin', plugin=plugin.identifier) }}">{% trans %}Install{% endtrans %}</a>
                 {% endif %}
                 {% if uninstallable %}
-                <a href="{{ url_for('management.uninstall_plugin', plugin=plugin.identifier) }}">Uninstall</a>
+                <a href="{{ url_for('management.uninstall_plugin', plugin=plugin.identifier) }}">{% trans %}Uninstall{% endtrans %}</a>
                 {% endif %}
             </td>
         </tr>

+ 10 - 10
flaskbb/templates/management/reports.html

@@ -1,4 +1,4 @@
-{% set page_title = "Reports" %}
+{% set page_title = _("Reports") %}
 {% set active_management_report_nav=True %}
 
 {% extends theme("management/management_layout.html") %}
@@ -7,13 +7,13 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.unread_reports', "Show unread reports") }}
-        {{ navlink('management.reports', "Show all reports") }}
+        {{ navlink('management.unread_reports', _("Show unread reports")) }}
+        {{ navlink('management.reports', _("Show all reports")) }}
     </ul>
 </div>
 
 <div class="col-md-9">
-    <legend>All Reports</legend>
+    <legend>{% trans %}All Reports{% endtrans %}</legend>
 
     <div class="pull-left" style="padding-bottom: 10px">
         {{ render_pagination(reports, url_for('management.reports')) }}
@@ -23,11 +23,11 @@
         <thead>
             <tr>
                 <th>#</th>
-                <th>Poster</th>
-                <th>Topic</th>
-                <th>Reporter</th>
-                <th>Reason</th>
-                <th>Reported</th>
+                <th>{% trans %}Poster{% endtrans %}</th>
+                <th>{% trans %}Topic{% endtrans %}</th>
+                <th>{% trans %}Reporter{% endtrans %}</th>
+                <th>{% trans %}Reason{% endtrans %}</th>
+                <th>{% trans %}Reported{% endtrans %}</th>
             </tr>
         </thead>
         <tbody>
@@ -42,7 +42,7 @@
             </tr>
             {% else %}
             <tr>
-                <td colspan="6">No reports.</td>
+                <td colspan="6">{% trans %}No reports.{% endtrans %}</td>
             </tr>
             {% endfor %}
         </tbody>

+ 1 - 1
flaskbb/templates/management/settings.html

@@ -36,7 +36,7 @@
         {% endif %}
     {%  endfor %}
 
-    <button type="submit" class="btn btn-success">Save</button>
+    <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
 
 </form>
 </div>

+ 12 - 12
flaskbb/templates/management/unread_reports.html

@@ -1,4 +1,4 @@
-{% set page_title = "Unread Reports" %}
+{% set page_title = _("Unread Reports") %}
 {% set active_management_report_nav=True %}
 
 {% extends theme("management/management_layout.html") %}
@@ -7,13 +7,13 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.unread_reports', "Show unread reports") }}
-        {{ navlink('management.reports', "Show all reports") }}
+        {{ navlink('management.unread_reports', _("Show unread reports")) }}
+        {{ navlink('management.reports', _("Show all reports")) }}
     </ul>
 </div>
 
 <div class="col-md-9">
-    <legend>Unread Reports</legend>
+    <legend>{% trans %}Unread Reports{% endtrans %}</legend>
 
     <div class="pull-left" style="padding-bottom: 10px">
         {{ render_pagination(reports, url_for('management.unread_reports')) }}
@@ -23,12 +23,12 @@
         <thead>
             <tr>
                 <th>#</th>
-                <th>Poster</th>
-                <th>Topic</th>
-                <th>Reporter</th>
-                <th>Reason</th>
-                <th>Reported</th>
-                <th><a href="{{ url_for('management.report_markread') }}">Mark all as Read</a></th>
+                <th>{% trans %}Poster{% endtrans %}</th>
+                <th>{% trans %}Topic{% endtrans %}</th>
+                <th>{% trans %}Reporter{% endtrans %}</th>
+                <th>{% trans %}Reason{% endtrans %}</th>
+                <th>{% trans %}Reported{% endtrans %}</th>
+                <th><a href="{{ url_for('management.report_markread') }}">{% trans %}Mark all as Read{% endtrans %}</a></th>
             </tr>
         </thead>
         <tbody>
@@ -41,12 +41,12 @@
                 <td>{{ report.reason }}</td>
                 <td>{{ report.reported|time_since }}</td>
                 <td>
-                    <a href="{{ url_for('management.report_markread', report_id=report.id) }}">Mark as Read</a>
+                    <a href="{{ url_for('management.report_markread', report_id=report.id) }}">{% trans %}Mark as Read{% endtrans %}</a>
                 </td>
             </tr>
             {% else %}
             <tr>
-                <td colspan="7">No unread reports.</td>
+                <td colspan="7">{% trans %}No unread reports.{% endtrans %}</td>
             </tr>
             {% endfor %}
         </tbody>

+ 4 - 4
flaskbb/templates/management/user_form.html

@@ -7,11 +7,11 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.users', "Manage Users") }}
-        {{ navlink('management.banned_users', 'Banned Users') }}
+        {{ navlink('management.users', _("Manage Users")) }}
+        {{ navlink('management.banned_users', _('Banned Users')) }}
 
         {% if current_user|is_admin %}
-            {{ navlink('management.add_user', "Add User") }}
+            {{ navlink('management.add_user', _("Add User")) }}
         {% endif %}
     </ul>
 </div><!--/.col-md-3 -->
@@ -36,7 +36,7 @@
 
             <div class="form-group">
                 <div class="col-sm-offset-3 col-sm-9">
-                    <button type="submit" class="btn btn-success">Save</button>
+                    <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
                 </div>
             </div>
     </form>

+ 18 - 15
flaskbb/templates/management/users.html

@@ -1,4 +1,4 @@
-{% set page_title = "Users" %}
+{% set page_title = _("Users") %}
 {% set active_management_user_nav=True %}
 
 {% extends theme("management/management_layout.html") %}
@@ -7,17 +7,17 @@
 
 <div class="col-md-3">
     <ul class="nav nav-pills nav-stacked">
-        {{ navlink('management.users', "Manage Users") }}
-        {{ navlink('management.banned_users', 'Banned Users') }}
+        {{ navlink('management.users', _("Manage Users")) }}
+        {{ navlink('management.banned_users', _('Banned Users')) }}
 
         {% if current_user|is_admin %}
-            {{ navlink('management.add_user', "Add User") }}
+            {{ navlink('management.add_user', _("Add User")) }}
         {% endif %}
     </ul>
 </div><!--/.col-md-3 -->
 
 <div class="col-md-9">
-    <legend>Manage Users</legend>
+    <legend>{% trans %}Manage Users{% endtrans %}</legend>
 
     <div class="pull-left" style="padding-bottom: 10px">
         {{ render_pagination(users, url_for('management.users')) }}
@@ -28,7 +28,7 @@
                 {{ search_form.hidden_tag() }}
                 {{ group_field(search_form.search_query) }}
                 <span class="input-group-btn">
-                    <button class="btn btn-primary" type="submit">Search</button>
+                    <button class="btn btn-primary" type="submit">{% trans %}Search{% endtrans %}</button>
                 </span>
             </div>
         </form>
@@ -38,11 +38,11 @@
         <thead>
             <tr>
                 <th>#</th>
-                <th>Username</th>
-                <th>Posts</th>
-                <th>Date registered</th>
-                <th>Group</th>
-                <th>Manage</th>
+                <th>{% trans %}Username{% endtrans %}</th>
+                <th>{% trans %}Posts{% endtrans %}</th>
+                <th>{% trans %}Date registered{% endtrans %}</th>
+                <th>{% trans %}Group{% endtrans %}</th>
+                <th>{% trans %}Manage{% endtrans %}</th>
             </tr>
         </thead>
         <tbody>
@@ -55,23 +55,26 @@
                     <td>{{ user.primary_group.name }}</td>
                     <td>
                         {% if current_user|can_edit_user and not user|is_admin or current_user|is_admin %}
-                            <a href="{{ url_for('management.edit_user', user_id = user.id) }}">Edit</a>
+                            <a href="{{ url_for('management.edit_user', user_id = user.id) }}">{% trans %}Edit{% endtrans %}</a>
                         {% endif %}
 
                         {% if current_user|can_ban_user and not user.permissions['banned'] %}
-                            | <a href="{{ url_for('management.ban_user', user_id = user.id) }}">Ban</a>
+                            | <a href="{{ url_for('management.ban_user', user_id = user.id) }}">{% trans %}Ban{% endtrans %}</a>
                         {% endif %}
 
+                        {% if current_user|can_ban_user and user.permissions['banned'] %}
+                            | <a href="{{ url_for('management.unban_user', user_id = user.id) }}">{% trans %}Unban{% endtrans %}</a>
+                        {% endif %}
 
                         {% if current_user|is_admin %}
-                            | <a href="{{ url_for('management.delete_user', user_id = user.id) }}">Delete</a>
+                            | <a href="{{ url_for('management.delete_user', user_id = user.id) }}">{% trans %}Delete{% endtrans %}</a>
                         {% endif %}
                     </td>
                 </tr>
             {% else %}
                 <tr>
                     <td colspan="6">
-                        No users found matching your search query
+                        {% trans %}No users found matching your search query{% endtrans %}
                     </td>
                 </tr>
             {% endfor %}

+ 9 - 9
flaskbb/templates/message/drafts.html

@@ -1,31 +1,31 @@
-{% set page_title = "Drafts" %}
+{% set page_title = _("Drafts") %}
 
 {% extends theme("message/message_layout.html") %}
 {% block message_content %}
 <table class="table table-bordered">
     <thead>
         <tr>
-            <th>To</th>
-            <th>Subject</th>
-            <th>Date</th>
-            <th>Options</th>
+            <th>{% trans %}To{% endtrans %}</th>
+            <th>{% trans %}Subject{% endtrans %}</th>
+            <th>{% trans %}Date{% endtrans %}</th>
+            <th>{% trans %}Options{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>
         {% for message in messages %}
         <tr>
             <td><a href="{{ url_for('user.profile', username=message.to_user.username) }}">{{ message.to_user.username }}</a></td>
-            <td><a href="{{ url_for('user.view_message', message_id=message.id) }}">{% if message.subject %}{{ message.subject }}{% else %}(No Subject){% endif %}</a></td>
+            <td><a href="{{ url_for('user.view_message', message_id=message.id) }}">{% if message.subject %}{{ message.subject }}{% else %}({% trans %}No Subject{% endtrans %}){% endif %}</a></td>
             <td>{{ message.date_created|format_date('%d %B %Y') }}</td>
             <td>
-                <a href="{{ url_for('user.edit_message', message_id=message.id) }}">Edit</a> |
-                <a href="{{ url_for('user.move_message', message_id=message.id) }}">Delete</a>
+                <a href="{{ url_for('user.edit_message', message_id=message.id) }}">{% trans %}Edit{% endtrans %}</a> |
+                <a href="{{ url_for('user.move_message', message_id=message.id) }}">{% trans %}Delete{% endtrans %}</a>
             </td>
         </tr>
         {% else %}
         <tr>
             <td colspan="4">
-                This message folder is empty.
+                {% trans %}This message folder is empty.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 8 - 8
flaskbb/templates/message/inbox.html

@@ -1,14 +1,14 @@
-{% set page_title = "Inbox" %}
+{% set page_title = _("Inbox") %}
 
 {% extends theme("message/message_layout.html") %}
 {% block message_content %}
 <table class="table table-bordered">
     <thead>
         <tr>
-            <th>From</th>
-            <th>Subject</th>
-            <th>Date</th>
-            <th>Options</th>
+            <th>{% trans %}From{% endtrans %}</th>
+            <th>{% trans %}Subject{% endtrans %}</th>
+            <th>{% trans %}Date{% endtrans %}</th>
+            <th>{% trans %}Options{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>
@@ -17,7 +17,7 @@
         {% if message.from_user %}
             <td><a href="{{ url_for('user.profile', username=message.from_user.username) }}">{{ message.from_user.username }}</a></td>
         {% else %}
-            <td>[deleted]</td>
+            <td>[{% trans %}deleted{% endtrans %}]</td>
         {% endif %}
             <td>
                 <a href="{{ url_for('user.view_message', message_id=message.id) }}">
@@ -25,12 +25,12 @@
                 </a>
             </td>
             <td>{{ message.date_created|time_since }}</td>
-            <td><a href="{{ url_for('user.move_message', message_id=message.id) }}">Delete</a></td>
+            <td><a href="{{ url_for('user.move_message', message_id=message.id) }}">{% trans %}Delete{% endtrans %}</a></td>
         </tr>
         {% else %}
         <tr>
             <td colspan="4">
-                This message folder is empty.
+                {% trans %}This message folder is empty.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 2 - 2
flaskbb/templates/message/message_form.html

@@ -13,8 +13,8 @@
 
     <div class="form-group row">
         <div class="col-sm-offset-3 col-lg-9">
-            <button class="btn btn-success" type="submit" name="send_message">Send Message</button>
-            <button class="btn btn-info" type="submit" name="save_message">Save as Draft</button>
+            <button class="btn btn-success" type="submit" name="send_message">{% trans %}Send Message{% endtrans %}</button>
+            <button class="btn btn-info" type="submit" name="save_message">{% trans %}Save as Draft{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 7 - 7
flaskbb/templates/message/message_layout.html

@@ -3,20 +3,20 @@
 {%- from theme('macros.html') import navlink with context -%}
 
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ url_for('user.profile', username=current_user.username) }}">{{ current_user.username }}</a></li>
-    <li class="active">Private Message</li>
+    <li class="active">{% trans %}Private Message{% endtrans %}</li>
 </ul>
 
 <div class="row">
     <div class="col-sm-3">
         <div class="sidebar">
             <ul class="nav sidenav">
-                <li class="nav-header">Options | <small><a href="{{ url_for('user.new_message') }}">New PM</a></small></li>
-                {{ navlink('user.inbox', 'Inbox') }}
-                {{ navlink('user.sent', 'Sent') }}
-                {{ navlink('user.drafts', 'Drafts') }}
-                {{ navlink('user.trash', 'Trash') }}
+                <li class="nav-header">{% trans %}Options{% endtrans %} | <small><a href="{{ url_for('user.new_message') }}">{% trans %}New PM{% endtrans %}</a></small></li>
+                {{ navlink('user.inbox', _('Inbox')) }}
+                {{ navlink('user.sent', _('Sent')) }}
+                {{ navlink('user.drafts', _('Drafts')) }}
+                {{ navlink('user.trash', _('Trash')) }}
             </ul>
         </div><!--/.sidebar -->
     </div><!--/.col-sm-3 -->

+ 8 - 8
flaskbb/templates/message/sent.html

@@ -1,14 +1,14 @@
-{% set page_title = "Sent Messages" %}
+{% set page_title = _("Sent Messages") %}
 
 {% extends theme("message/message_layout.html") %}
 {% block message_content %}
 <table class="table table-bordered">
     <thead>
         <tr>
-            <th>To</th>
-            <th>Subject</th>
-            <th>Date</th>
-            <th>Options</th>
+            <th>{% trans %}To{% endtrans %}</th>
+            <th>{% trans %}Subject{% endtrans %}</th>
+            <th>{% trans %}Date{% endtrans %}</th>
+            <th>{% trans %}Options{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>
@@ -17,16 +17,16 @@
         {% if message.to_user %}
             <td><a href="{{ url_for('user.profile', username=message.to_user.username) }}">{{ message.to_user.username }}</a></td>
         {% else %}
-            <td>[deleted]</td>
+            <td>[{% trans %}deleted{% endtrans %}]</td>
         {% endif %}
             <td><a href="{{ url_for('user.view_message', message_id=message.id) }}">{{ message.subject }}</a></td>
             <td>{{ message.date_created|time_since }}</td>
-            <td><a href="{{ url_for('user.move_message', message_id=message.id) }}">Delete</a></td>
+            <td><a href="{{ url_for('user.move_message', message_id=message.id) }}">{% trans %}Delete{% endtrans %}</a></td>
         </tr>
         {% else %}
         <tr>
             <td colspan="4">
-                This message folder is empty.
+                {% trans %}This message folder is empty.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 10 - 10
flaskbb/templates/message/trash.html

@@ -1,31 +1,31 @@
-{% set page_title = "Trash" %}
+{% set page_title = _("Trash") %}
 
 {% extends theme("message/message_layout.html") %}
 {% block message_content %}
 <table class="table table-bordered">
     <thead>
         <tr>
-            <th>To</th>
-            <th>Subject</th>
-            <th>Date</th>
-            <th>Options</th>
+            <th>{% trans %}To{% endtrans %}</th>
+            <th>{% trans %}Subject{% endtrans %}</th>
+            <th>{% trans %}Date{% endtrans %}</th>
+            <th>{% trans %}Options{% endtrans %}</th>
         </tr>
     </thead>
     <tbody>
         {% for message in messages %}
         <tr>
-            <td>{% if message.to_user %}<a href="{{ url_for('user.profile', username=message.to_user.username) }}">{{ message.to_user.username }}</a>{% else %} (No User) {% endif %}</td>
-            <td><a href="{{ url_for('user.view_message', message_id=message.id) }}">{% if message.subject %}{{ message.subject }}{% else %}(No Subject){% endif %}</a></td>
+            <td>{% if message.to_user %}<a href="{{ url_for('user.profile', username=message.to_user.username) }}">{{ message.to_user.username }}</a>{% else %} ({% trans %}No User{% endtrans %}) {% endif %}</td>
+            <td><a href="{{ url_for('user.view_message', message_id=message.id) }}">{% if message.subject %}{{ message.subject }}{% else %}({% trans %}No Subject{% endtrans %}){% endif %}</a></td>
             <td>{{ message.date_created|format_date }}</td>
             <td>
-                <a href="{{ url_for('user.restore_message', message_id=message.id) }}">Restore</a> |
-                <a href="{{ url_for('user.delete_message', message_id=message.id) }}">Delete</a>
+                <a href="{{ url_for('user.restore_message', message_id=message.id) }}">{% trans %}Restore{% endtrans %}</a> |
+                <a href="{{ url_for('user.delete_message', message_id=message.id) }}">{% trans %}Delete{% endtrans %}</a>
             </td>
         </tr>
         {% else %}
         <tr>
             <td colspan="4">
-                This message folder is empty.
+                {% trans %}This message folder is empty.{% endtrans %}
             </td>
         </tr>
         {% endfor %}

+ 4 - 4
flaskbb/templates/message/view_message.html

@@ -26,11 +26,11 @@
                     </td>
 
                     <td class="pull-right">
-                        Posts: {{ message.from_user.post_count }}<br />
-                        Registered since: {{ message.from_user.date_joined|format_date('%b %d %Y') }}<br />
+                        {% trans %}Posts{% endtrans %}: {{ message.from_user.post_count }}<br />
+                        {% trans %}Registered since{% endtrans %}: {{ message.from_user.date_joined|format_date('%b %d %Y') }}<br />
                     </td>
                 {% else %}
-                    [deleted]
+                    [{% trans %}deleted{% endtrans %}]
                 {% endif %}
                 </tr>
 
@@ -46,7 +46,7 @@
                         {{ message.message|markup }}
                         {% endautoescape %}
                     {% else %}
-                        (No Message)
+                        ({% trans %}No Message{% endtrans %})
                     {% endif %}
                 </div>
             </td>

+ 2 - 2
flaskbb/templates/user/all_posts.html

@@ -3,9 +3,9 @@
 
 {% block content %}
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li ><a href="{{ user.url }}">{{ user.username }}</a></li>
-    <li class="active">All Posts</li>
+    <li class="active">{% trans %}All Posts{% endtrans %}</li>
 </ul>
 
 <div class="pull-left" style="padding-bottom: 10px">

+ 23 - 9
flaskbb/templates/user/all_topics.html

@@ -3,9 +3,9 @@
 
 {% block content %}
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li ><a href="{{ url_for('user.profile', username=user.username) }}">{{ user.username }}</a></li>
-    <li class="active">All Topics</li>
+    <li class="active">{% trans %}All Topics{% endtrans %}</li>
 </ul>
 
 <div class="pull-left">
@@ -17,19 +17,19 @@
     <thead>
         <tr>
             <th colspan="5">
-                All Topics created by {{ user.username }}
+                {% trans %}All Topics created by{% endtrans %} {{ user.username }}
             </th>
         </tr>
     </thead>
     <tbody>
         <tr>
-            <td colspan="2">Thread</td>
+            <td colspan="2">{% trans %}Topic{% endtrans %}</td>
 
-            <td>Posts</td>
+            <td>{% trans %}Posts{% endtrans %}</td>
 
-            <td>Views</td>
+            <td>{% trans %}Views{% endtrans %}</td>
 
-            <td>Last Post</td>
+            <td>{% trans %}Last Post{% endtrans %}</td>
         </tr>
 
         {% for topic in topics.items %}
@@ -38,7 +38,14 @@
             <td>
                 <div>
                     <a href="{{ topic.url }}">{{ topic.title }}</a> <br />
-                    <small>by <a href="{{ topic.user.url }}">{{ topic.user.username }}</a></small>
+                    <small>
+                        {% trans %}by{% endtrans %}
+                        {% if topic.user_id %}
+                         <a href="{{ topic.user.url }}">{{ topic.user.username }}</a>
+                        {% else %}
+                        {{ topic.username }}
+                        {% endif %}
+                    </small>
                 </div>
             </td>
             <td>
@@ -49,7 +56,14 @@
             </td>
             <td>
                 <a href="{{ topic.last_post.url }}">{{ topic.last_post.date_created|time_since }}</a><br />
-                <small>by <a href="{{ topic.last_post.user.username }}">{{ topic.last_post.user.username }}</a></small>
+                <small>
+                    {% trans %}by{% endtrans %}
+                    {% if topic.last_post.user_id %}
+                    <a href="{{ topic.last_post.user.url }}">{{ topic.last_post.user.username }}</a>
+                    {% else %}
+                    {{ topic.last_post.username }}
+                    {% endif %}
+                </small>
             </td>
         </tr>
         {% else %}

+ 2 - 2
flaskbb/templates/user/change_email.html

@@ -3,7 +3,7 @@
 
 {% block settings_content %}
 <form class="form-horizontal" role="form" method="POST">
-    <legend>Change E-Mail Adress</legend>
+    <legend>{% trans %}Change E-Mail Adress{% endtrans %}</legend>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.old_email)}}
     {{ horizontal_field(form.new_email)}}
@@ -11,7 +11,7 @@
 
     <div class="form-group row">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-success">Save</button>
+            <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 2 - 2
flaskbb/templates/user/change_password.html

@@ -3,7 +3,7 @@
 
 {% block settings_content %}
 <form class="form-horizontal" role="form" method="POST">
-    <legend>Change Password</legend>
+    <legend>{% trans %}Change Password{% endtrans %}</legend>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.old_password)}}
     {{ horizontal_field(form.new_password)}}
@@ -11,7 +11,7 @@
 
     <div class="form-group row">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-success">Save</button>
+            <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 2 - 2
flaskbb/templates/user/change_user_details.html

@@ -3,7 +3,7 @@
 
 {% block settings_content %}
 <form class="form-horizontal" role="form" method="POST">
-    <legend class="">Change User Details</legend>
+    <legend class="">{% trans %}Change User Details{% endtrans %}</legend>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.birthday) }}
     {{ horizontal_field(form.gender) }}
@@ -15,7 +15,7 @@
 
     <div class="form-group row">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-success">Save</button>
+            <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 2 - 2
flaskbb/templates/user/general_settings.html

@@ -3,13 +3,13 @@
 
 {% block settings_content %}
 <form class="form-horizontal" role="form" method="POST">
-    <legend class="">General Settings</legend>
+    <legend class="">{% trans %}General Settings{% endtrans %}</legend>
     {{ form.hidden_tag() }}
     {{ horizontal_field(form.theme) }}
     {{ horizontal_field(form.language) }}
     <div class="form-group row">
         <div class="col-sm-offset-3 col-sm-9">
-            <button type="submit" class="btn btn-success">Save</button>
+            <button type="submit" class="btn btn-success">{% trans %}Save{% endtrans %}</button>
         </div>
     </div>
 </form>

+ 17 - 17
flaskbb/templates/user/profile.html

@@ -1,15 +1,15 @@
 {% extends theme("layout.html") %}
 {% block content %}
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li class="active">{{ user.username }}</li>
 </ul>
 
 <table class="table table-bordered">
     <thead>
       <th><a href="{{ user.url }}">{{ user.username }}</a></th>
-      <th>Info</th>
-      <th>User Stats</th>
+      <th>{% trans %}Info{% endtrans %}</th>
+      <th>{% trans %}User Stats{% endtrans %}</th>
     </thead>
     <tbody>
         <tr>
@@ -25,8 +25,8 @@
                 {% else %}
                 <tr><td><span class="label label-default">Offline</span></td></tr>
                 {% endif %}
-                <tr><td><a href="{{ url_for('user.view_all_topics', username=user.username) }}">All Topics</a></td></tr>
-                <tr><td><a href="{{ url_for('user.view_all_posts', username=user.username) }}">All Posts</a></td></tr>
+                <tr><td><a href="{{ url_for('user.view_all_topics', username=user.username) }}">{% trans %}All Topics{% endtrans %}</a></td></tr>
+                <tr><td><a href="{{ url_for('user.view_all_posts', username=user.username) }}">{% trans %}All Posts{% endtrans %}</a></td></tr>
               </tbody>
             </table>
           </td>
@@ -37,7 +37,7 @@
                 {{ user.notes|markup }}
                 {% endautoescape %}
             {% else %}
-                User has not added any notes about him.
+                {% trans %}User has not added any notes about him.{% endtrans %}
             {% endif %}
           </td>
 
@@ -45,37 +45,37 @@
             <table class="table table-borderless">
               <tbody>
                 <tr>
-                  <td align="right">Group:</td>
+                  <td align="right">{% trans %}Group{% endtrans %}:</td>
                   <td>{{ user.primary_group.name }}</td>
                 </tr>
                 <tr>
-                  <td align="right">Joined:</td>
+                  <td align="right">{% trans %}Joined{% endtrans %}:</td>
                   <td>{{ user.date_joined|format_date('%b %d %Y') }}</td>
                 </tr>
                 <tr>
-                  <td align="right">Posts:</td>
+                  <td align="right">{% trans %}Posts{% endtrans %}:</td>
                   <td>{{ user.post_count }} ({{ user.posts_per_day }} per day)</td>
                 </tr>
                 <tr>
-                  <td align="right">Last seen:</td>
-                  <td>{%- if user.lastseen -%} {{ user.lastseen|time_since }} {%- else -%} Never seen {%- endif -%}</td>
+                  <td align="right">{% trans %}Last seen{% endtrans %}:</td>
+                  <td>{%- if user.lastseen -%} {{ user.lastseen|time_since }} {%- else -%} {% trans %}Never seen{% endtrans %} {%- endif -%}</td>
                 </tr>
                 <tr>
-                  <td align="right">Last post:</td>
+                  <td align="right">{% trans %}Last post{% endtrans %}:</td>
                   <td>{%- if user.last_post -%}
                       <a href="{{ user.last_post.url }}">{{ user.last_post.date_created|time_since }}</a>
                       {%- else -%}
-                        Never
+                        {% trans %}Never{% endtrans %}
                       {%- endif -%}
                   </td>
                 </tr>
                 <tr>
-                  <td align="right">Location:</td>
-                  <td>{%- if user.location -%} {{ user.location }} {%- else -%} No Info {%- endif -%}</td>
+                  <td align="right">{% trans %}Location{% endtrans %}:</td>
+                  <td>{%- if user.location -%} {{ user.location }} {%- else -%} {% trans %}No Info{% endtrans %} {%- endif -%}</td>
                 </tr>
                 <tr>
-                  <td align="right">Birthday:</td>
-                  <td>{% if user.birthday %} {{ user.birthday|format_date('%b %d %Y') }} {% else %} No Info {% endif %} {% if user.gender %} ({{ user.gender }}) {% endif %}</td>
+                  <td align="right">{% trans %}Birthday{% endtrans %}:</td>
+                  <td>{% if user.birthday %} {{ user.birthday|format_date('%b %d %Y') }} {% else %} {% trans %}No Info{% endtrans %} {% endif %} {% if user.gender %} ({{ user.gender }}) {% endif %}</td>
                 </tr>
               </tbody>
             </table>

+ 7 - 7
flaskbb/templates/user/settings_layout.html

@@ -3,20 +3,20 @@
 {%- from theme('macros.html') import navlink with context -%}
 
 <ul class="breadcrumb">
-    <li><a href="{{ url_for('forum.index') }}">Forum</a></li>
+    <li><a href="{{ url_for('forum.index') }}">{% trans %}Forum{% endtrans %}</a></li>
     <li><a href="{{ current_user.url }}">{{ current_user.username }}</a></li>
-    <li class="active">Settings</li>
+    <li class="active">{% trans %}Settings{% endtrans %}</li>
 </ul>
 
 <div class="row">
     <div class="col-sm-3">
         <div class="sidebar">
             <ul class="nav sidenav">
-                <li class="nav-header">Account Settings</li>
-                {{ navlink('user.settings', 'General Settings') }}
-                {{ navlink('user.change_user_details', 'Change User Details') }}
-                {{ navlink('user.change_email', 'Change E-Mail Address') }}
-                {{ navlink('user.change_password', 'Change Password') }}
+                <li class="nav-header">{% trans %}Account Settings{% endtrans %}</li>
+                {{ navlink('user.settings', _('General Settings')) }}
+                {{ navlink('user.change_user_details', _('Change User Details')) }}
+                {{ navlink('user.change_email', _('Change E-Mail Address')) }}
+                {{ navlink('user.change_password', _('Change Password')) }}
             </ul>
         </div> <!--/.sidebar -->
     </div><!--/.col-sm-3 -->

+ 17 - 17
flaskbb/themes/bootstrap2/templates/layout.html

@@ -29,9 +29,9 @@
     <body>
         <div id="wrap">
         {% block navigation %}
-        {%- from "macros.html" import topnav with context -%}
+        {%- from theme("macros.html") import topnav with context -%}
         <!-- Navigation -->
-            <nav class="navbar navbar-default navbar-inverse navbar-static-top">
+            <nav class="navbar navbar-default navbar-static-top">
                 <div class="container">
                     <div class="navbar-header">
                         <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-ex1-collapse">
@@ -44,14 +44,14 @@
                     </div>
                     <div class="collapse navbar-collapse navbar-ex1-collapse">
                         <ul class="nav navbar-nav">
-                            {{ emit_event("before-first-navigation-element") | safe }}
+                            {{ emit_event("before-first-navigation-element") }}
 
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
-                            {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
-                            {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
-                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
+                            {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
+                            {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
 
-                            {{ emit_event("after-last-navigation-element") | safe }}
+                            {{ emit_event("after-last-navigation-element") }}
                         </ul>
 
                     {% if current_user and current_user.is_authenticated() %}
@@ -63,16 +63,16 @@
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> Topic Tracker</a></li>
+                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
                                 <li class="divider"></li>
 
-                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> Settings</a></li>
+                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
                                 {% if current_user|is_admin_or_moderator %}
-                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> Management</a></li>
+                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
                                 <li class="divider"></li>
                                 {% endif %}
 
-                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> Logout</a></li>
+                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
                             </ul>
                         </div>
 
@@ -81,21 +81,21 @@
                                 <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> Inbox</a></li>
-                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> New Message</a></li>
+                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Inbox{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% else %}
                         <div class="btn-group navbar-btn navbar-right">
                             <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
-                                <span class="fa fa-user"></span> Login
+                                <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
                             </a>
                             <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('auth.register') }}">Register</a></li>
-                                <li><a href="{{ url_for('auth.forgot_password') }}">Reset Password</a></li>
+                                <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% endif %}
@@ -107,7 +107,7 @@
 
             <div class="container">
                 {% block messages %}
-                    {% include 'flashed_messages.html' %}
+                    {% include theme('flashed_messages.html') %}
                 {% endblock %}
 
                 {% block content %}

+ 16 - 16
flaskbb/themes/bootstrap3/templates/layout.html

@@ -28,7 +28,7 @@
     <body>
         <div id="wrap">
         {% block navigation %}
-        {%- from "macros.html" import topnav with context -%}
+        {%- from theme("macros.html") import topnav with context -%}
         <!-- Navigation -->
             <nav class="navbar navbar-default navbar-static-top">
                 <div class="container">
@@ -43,14 +43,14 @@
                     </div>
                     <div class="collapse navbar-collapse navbar-ex1-collapse">
                         <ul class="nav navbar-nav">
-                            {{ emit_event("before-first-navigation-element") | safe }}
+                            {{ emit_event("before-first-navigation-element") }}
 
                             {# active_forum_nav is set in {forum, category, topic}.html and new_{topic, post}.html #}
-                            {{ topnav(endpoint='forum.index', name='Forum', icon='fa fa-comment', active=active_forum_nav) }}
-                            {{ topnav(endpoint='forum.memberlist', name='Memberlist', icon='fa fa-user') }}
-                            {{ topnav(endpoint='forum.search', name='Search', icon='fa fa-search') }}
+                            {{ topnav(endpoint='forum.index', name=_('Forum'), icon='fa fa-comment', active=active_forum_nav) }}
+                            {{ topnav(endpoint='forum.memberlist', name=_('Memberlist'), icon='fa fa-user') }}
+                            {{ topnav(endpoint='forum.search', name=_('Search'), icon='fa fa-search') }}
 
-                            {{ emit_event("after-last-navigation-element") | safe }}
+                            {{ emit_event("after-last-navigation-element") }}
                         </ul>
 
                     {% if current_user and current_user.is_authenticated() %}
@@ -62,16 +62,16 @@
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> Topic Tracker</a></li>
+                                <li><a href="{{ url_for('forum.topictracker') }}"><span class="fa fa-book"></span> {% trans %}Topic Tracker{% endtrans %}</a></li>
                                 <li class="divider"></li>
 
-                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> Settings</a></li>
+                                <li><a href="{{ url_for('user.settings') }}"><span class="fa fa-cogs"></span> {% trans %}Settings{% endtrans %}</a></li>
                                 {% if current_user|is_admin_or_moderator %}
-                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> Management</a></li>
+                                <li><a href="{{ url_for('management.overview') }}"><span class="fa fa-cog"></span> {% trans %}Management{% endtrans %}</a></li>
                                 <li class="divider"></li>
                                 {% endif %}
 
-                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> Logout</a></li>
+                                <li><a href="{{ url_for('auth.logout') }}"><span class="fa fa-power-off"></span> {% trans %}Logout{% endtrans %}</a></li>
                             </ul>
                         </div>
 
@@ -80,21 +80,21 @@
                                 <span class="fa fa-envelope"></span> <span class="badge">{{ current_user.pm_unread }}</span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> Inbox</a></li>
-                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> New Message</a></li>
+                                <li><a href="{{ url_for('user.inbox') }}"><span class="fa fa-envelope"></span> {% trans %}Inbox{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('user.new_message') }}"><span class="fa fa-pencil"></span> {% trans %}New Message{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% else %}
                         <div class="btn-group navbar-btn navbar-right">
                             <a class="btn btn-primary" href="{{ url_for('auth.login') }}">
-                                <span class="fa fa-user"></span> Login
+                                <span class="fa fa-user"></span> {% trans %}Login{% endtrans %}
                             </a>
                             <button type="button" class="btn btn-primary dropdown-toggle" data-toggle="dropdown">
                                 <span class="caret"></span>
                             </button>
                             <ul class="dropdown-menu" role="menu">
-                                <li><a href="{{ url_for('auth.register') }}">Register</a></li>
-                                <li><a href="{{ url_for('auth.forgot_password') }}">Reset Password</a></li>
+                                <li><a href="{{ url_for('auth.register') }}">{% trans %}Register{% endtrans %}</a></li>
+                                <li><a href="{{ url_for('auth.forgot_password') }}">{% trans %}Reset Password{% endtrans %}</a></li>
                             </ul>
                         </div>
                     {% endif %}
@@ -106,7 +106,7 @@
 
             <div class="container">
                 {% block messages %}
-                    {% include 'flashed_messages.html' %}
+                    {% include theme('flashed_messages.html') %}
                 {% endblock %}
 
                 {% block content %}

+ 1538 - 1
flaskbb/translations/en/LC_MESSAGES/messages.po

@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version:  0.1-dev\n"
 "Report-Msgid-Bugs-To: http://github.com/flaskbb/issues\n"
-"POT-Creation-Date: 2015-01-03 20:37+0100\n"
+"POT-Creation-Date: 2015-01-04 12:23+0100\n"
 "PO-Revision-Date: 2015-01-03 13:45+0100\n"
 "Last-Translator: Peter Justin <sh4nks7@gmail.com>\n"
 "Language-Team: FlaskBB Team\n"
@@ -17,6 +17,224 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 1.3\n"
 
+#: flaskbb/email.py:20
+msgid "Password Reset"
+msgstr ""
+
+#: flaskbb/auth/forms.py:23 flaskbb/management/forms.py:28
+msgid "You can only use letters, numbers or dashes"
+msgstr ""
+
+#: flaskbb/auth/forms.py:27
+msgid "Username or E-Mail"
+msgstr ""
+
+#: flaskbb/auth/forms.py:28
+msgid "You must provide an email adress or username"
+msgstr ""
+
+#: flaskbb/auth/forms.py:31 flaskbb/auth/forms.py:46 flaskbb/auth/forms.py:79
+#: flaskbb/auth/forms.py:96
+msgid "Password"
+msgstr ""
+
+#: flaskbb/auth/forms.py:32 flaskbb/auth/forms.py:47 flaskbb/user/forms.py:66
+#: flaskbb/user/forms.py:69 flaskbb/user/forms.py:72
+msgid "Password required"
+msgstr ""
+
+#: flaskbb/auth/forms.py:34
+msgid "Remember Me"
+msgstr ""
+
+#: flaskbb/auth/forms.py:38 flaskbb/management/forms.py:44
+#: flaskbb/templates/forum/memberlist.html:31
+#: flaskbb/templates/management/banned_users.html:41
+#: flaskbb/templates/management/users.html:41
+msgid "Username"
+msgstr ""
+
+#: flaskbb/auth/forms.py:39
+msgid "Username required"
+msgstr ""
+
+#: flaskbb/auth/forms.py:42 flaskbb/auth/forms.py:84 flaskbb/auth/forms.py:92
+#: flaskbb/management/forms.py:48
+msgid "E-Mail"
+msgstr ""
+
+#: flaskbb/auth/forms.py:43
+msgid "E-Mail required"
+msgstr ""
+
+#: flaskbb/auth/forms.py:44 flaskbb/user/forms.py:40 flaskbb/user/forms.py:44
+#: flaskbb/user/forms.py:48
+msgid "This E-Mail is invalid"
+msgstr ""
+
+#: flaskbb/auth/forms.py:49
+msgid "Confirm Password"
+msgstr ""
+
+#: flaskbb/auth/forms.py:50
+msgid "Confirm Password required"
+msgstr ""
+
+#: flaskbb/auth/forms.py:51 flaskbb/auth/forms.py:101 flaskbb/user/forms.py:73
+msgid "Passwords do not match"
+msgstr ""
+
+#: flaskbb/auth/forms.py:53
+msgid "I accept the Terms of Service"
+msgstr ""
+
+#: flaskbb/auth/forms.py:58 flaskbb/management/forms.py:103
+msgid "This username is taken"
+msgstr ""
+
+#: flaskbb/auth/forms.py:63 flaskbb/management/forms.py:117
+#: flaskbb/user/forms.py:61
+msgid "This email is taken"
+msgstr ""
+
+#: flaskbb/auth/forms.py:75
+msgid "Captcha"
+msgstr ""
+
+#: flaskbb/auth/forms.py:99
+msgid "Confirm password"
+msgstr ""
+
+#: flaskbb/auth/forms.py:106
+msgid "Wrong E-Mail."
+msgstr ""
+
+#: flaskbb/auth/views.py:45
+msgid "Wrong username or password"
+msgstr ""
+
+#: flaskbb/auth/views.py:60
+msgid "Reauthenticated"
+msgstr ""
+
+#: flaskbb/auth/views.py:96
+msgid "Thanks for registering"
+msgstr ""
+
+#: flaskbb/auth/views.py:118
+msgid "E-Mail sent! Please check your inbox."
+msgstr ""
+
+#: flaskbb/auth/views.py:121
+msgid ""
+"You have entered an username or email that is not linked                 "
+"with your account"
+msgstr ""
+
+#: flaskbb/auth/views.py:141
+msgid "Your password token is invalid."
+msgstr ""
+
+#: flaskbb/auth/views.py:145
+msgid "Your password is expired."
+msgstr ""
+
+#: flaskbb/auth/views.py:151
+msgid "Your password has been updated."
+msgstr ""
+
+#: flaskbb/forum/forms.py:22
+msgid "Quickreply"
+msgstr ""
+
+#: flaskbb/forum/forms.py:23 flaskbb/forum/forms.py:32
+#: flaskbb/forum/forms.py:50
+msgid "You cannot post a reply without content."
+msgstr ""
+
+#: flaskbb/forum/forms.py:31 flaskbb/forum/forms.py:49
+#: flaskbb/forum/forms.py:89
+msgid "Content"
+msgstr ""
+
+#: flaskbb/forum/forms.py:34 flaskbb/forum/forms.py:52
+msgid "Track this topic"
+msgstr ""
+
+#: flaskbb/forum/forms.py:46
+msgid "Topic Title"
+msgstr ""
+
+#: flaskbb/forum/forms.py:47
+msgid "A topic title is required"
+msgstr ""
+
+#: flaskbb/forum/forms.py:65 flaskbb/templates/management/reports.html:29
+#: flaskbb/templates/management/unread_reports.html:29
+msgid "Reason"
+msgstr ""
+
+#: flaskbb/forum/forms.py:66
+msgid "Please insert a reason why you want to report this post."
+msgstr ""
+
+#: flaskbb/forum/forms.py:76 flaskbb/templates/layout.html:51
+#: flaskbb/templates/forum/memberlist.html:21
+#: flaskbb/templates/forum/search_form.html:1
+#: flaskbb/templates/forum/search_form.html:9
+#: flaskbb/templates/forum/search_form.html:13
+#: flaskbb/templates/forum/search_form.html:21
+#: flaskbb/templates/management/banned_users.html:31
+#: flaskbb/templates/management/users.html:31
+#: flaskbb/themes/bootstrap2/templates/layout.html:52
+#: flaskbb/themes/bootstrap3/templates/layout.html:51
+msgid "Search"
+msgstr ""
+
+#: flaskbb/forum/forms.py:86
+msgid "Criteria"
+msgstr ""
+
+#: flaskbb/forum/forms.py:90
+msgid "Post"
+msgstr ""
+
+#: flaskbb/forum/forms.py:90 flaskbb/templates/forum/forum.html:50
+#: flaskbb/templates/forum/topictracker.html:28
+#: flaskbb/templates/management/reports.html:27
+#: flaskbb/templates/management/unread_reports.html:27
+#: flaskbb/templates/user/all_topics.html:26
+msgid "Topic"
+msgstr ""
+
+#: flaskbb/forum/forms.py:91 flaskbb/templates/layout.html:49
+#: flaskbb/templates/forum/category.html:8
+#: flaskbb/templates/forum/category_layout.html:11
+#: flaskbb/templates/forum/forum.html:9 flaskbb/templates/forum/index.html:5
+#: flaskbb/templates/forum/memberlist.html:8
+#: flaskbb/templates/forum/new_post.html:9
+#: flaskbb/templates/forum/new_topic.html:9
+#: flaskbb/templates/forum/search_form.html:8
+#: flaskbb/templates/forum/topic.html:9
+#: flaskbb/templates/forum/topictracker.html:9
+#: flaskbb/templates/management/forums.html:35
+#: flaskbb/templates/message/message_layout.html:6
+#: flaskbb/templates/user/all_posts.html:6
+#: flaskbb/templates/user/all_topics.html:6
+#: flaskbb/templates/user/profile.html:4
+#: flaskbb/templates/user/settings_layout.html:6
+#: flaskbb/themes/bootstrap2/templates/layout.html:50
+#: flaskbb/themes/bootstrap3/templates/layout.html:49
+msgid "Forum"
+msgstr ""
+
+#: flaskbb/forum/forms.py:91
+#: flaskbb/templates/management/management_layout.html:8
+#: flaskbb/templates/management/overview.html:29
+#: flaskbb/templates/management/users.html:1
+msgid "Users"
+msgstr ""
+
 #: flaskbb/forum/views.py:160
 msgid "You do not have the permissions to create a new topic."
 msgstr ""
@@ -83,3 +301,1322 @@ msgstr ""
 msgid "Thanks for reporting!"
 msgstr ""
 
+#: flaskbb/management/forms.py:45 flaskbb/user/forms.py:104
+msgid "A username is required."
+msgstr ""
+
+#: flaskbb/management/forms.py:49
+msgid "A E-Mail address is required."
+msgstr ""
+
+#: flaskbb/management/forms.py:50
+msgid "This email is invalid"
+msgstr ""
+
+#: flaskbb/management/forms.py:55 flaskbb/templates/user/profile.html:77
+msgid "Birthday"
+msgstr ""
+
+#: flaskbb/management/forms.py:59 flaskbb/user/forms.py:81
+msgid "Gender"
+msgstr ""
+
+#: flaskbb/management/forms.py:61 flaskbb/user/forms.py:83
+msgid "Male"
+msgstr ""
+
+#: flaskbb/management/forms.py:62 flaskbb/user/forms.py:84
+msgid "Female"
+msgstr ""
+
+#: flaskbb/management/forms.py:64 flaskbb/templates/user/profile.html:73
+#: flaskbb/user/forms.py:86
+msgid "Location"
+msgstr ""
+
+#: flaskbb/management/forms.py:67 flaskbb/templates/forum/topic.html:109
+#: flaskbb/user/forms.py:89
+msgid "Website"
+msgstr ""
+
+#: flaskbb/management/forms.py:70 flaskbb/user/forms.py:92
+msgid "Avatar"
+msgstr ""
+
+#: flaskbb/management/forms.py:73 flaskbb/user/forms.py:95
+msgid "Forum Signature"
+msgstr ""
+
+#: flaskbb/management/forms.py:76 flaskbb/user/forms.py:98
+msgid "Notes"
+msgstr ""
+
+#: flaskbb/management/forms.py:80
+msgid "Primary Group"
+msgstr ""
+
+#: flaskbb/management/forms.py:85
+msgid "Secondary Groups"
+msgstr ""
+
+#: flaskbb/management/forms.py:136 flaskbb/templates/management/groups.html:25
+msgid "Group Name"
+msgstr ""
+
+#: flaskbb/management/forms.py:137
+msgid "Group name required"
+msgstr ""
+
+#: flaskbb/management/forms.py:139 flaskbb/management/forms.py:262
+#: flaskbb/management/forms.py:378 flaskbb/templates/management/groups.html:26
+msgid "Description"
+msgstr ""
+
+#: flaskbb/management/forms.py:143
+msgid "Is Admin Group?"
+msgstr ""
+
+#: flaskbb/management/forms.py:144
+msgid "With this option the group has access to the admin panel."
+msgstr ""
+
+#: flaskbb/management/forms.py:148
+msgid "Is Super Moderator Group?"
+msgstr ""
+
+#: flaskbb/management/forms.py:149
+msgid "Check this if the users in this group are allowed to moderate every forum"
+msgstr ""
+
+#: flaskbb/management/forms.py:153
+msgid "Is Moderator Group?"
+msgstr ""
+
+#: flaskbb/management/forms.py:154
+msgid ""
+"Check this if the users in this group are allowed to moderate specified "
+"forums"
+msgstr ""
+
+#: flaskbb/management/forms.py:158
+msgid "Is Banned Group?"
+msgstr ""
+
+#: flaskbb/management/forms.py:159
+msgid "Only one Banned group is allowed"
+msgstr ""
+
+#: flaskbb/management/forms.py:162
+msgid "Is Guest Group?"
+msgstr ""
+
+#: flaskbb/management/forms.py:163
+msgid "Only one Guest group is allowed"
+msgstr ""
+
+#: flaskbb/management/forms.py:166
+msgid "Can edit posts"
+msgstr ""
+
+#: flaskbb/management/forms.py:167
+msgid "Check this if the users in this group can edit posts"
+msgstr ""
+
+#: flaskbb/management/forms.py:170
+msgid "Can delete posts"
+msgstr ""
+
+#: flaskbb/management/forms.py:171
+msgid "Check this is the users in this group can delete posts"
+msgstr ""
+
+#: flaskbb/management/forms.py:174
+msgid "Can delete topics"
+msgstr ""
+
+#: flaskbb/management/forms.py:175
+msgid "Check this is the users in this group can delete topics"
+msgstr ""
+
+#: flaskbb/management/forms.py:178
+msgid "Can create topics"
+msgstr ""
+
+#: flaskbb/management/forms.py:179
+msgid "Check this is the users in this group can create topics"
+msgstr ""
+
+#: flaskbb/management/forms.py:182
+msgid "Can post replies"
+msgstr ""
+
+#: flaskbb/management/forms.py:183
+msgid "Check this is the users in this group can post replies"
+msgstr ""
+
+#: flaskbb/management/forms.py:187
+msgid "Moderators can edit user profiles"
+msgstr ""
+
+#: flaskbb/management/forms.py:188
+msgid ""
+"Allow moderators to edit a another users profile including password and "
+"email changes."
+msgstr ""
+
+#: flaskbb/management/forms.py:193
+msgid "Moderators can ban users"
+msgstr ""
+
+#: flaskbb/management/forms.py:194
+msgid "Allow moderators to ban other users"
+msgstr ""
+
+#: flaskbb/management/forms.py:209
+msgid "This name is taken"
+msgstr ""
+
+#: flaskbb/management/forms.py:223
+msgid "There is already a Banned group"
+msgstr ""
+
+#: flaskbb/management/forms.py:237
+msgid "There is already a Guest group"
+msgstr ""
+
+#: flaskbb/management/forms.py:257
+msgid "Forum Title"
+msgstr ""
+
+#: flaskbb/management/forms.py:258
+msgid "Forum title required"
+msgstr ""
+
+#: flaskbb/management/forms.py:264 flaskbb/management/forms.py:380
+msgid "You can format your description with BBCode."
+msgstr ""
+
+#: flaskbb/management/forms.py:268 flaskbb/management/forms.py:384
+msgid "Position"
+msgstr ""
+
+#: flaskbb/management/forms.py:270
+msgid "Forum position required"
+msgstr ""
+
+#: flaskbb/management/forms.py:274
+msgid "Category"
+msgstr ""
+
+#: flaskbb/management/forms.py:278
+msgid "The category that contains this forum."
+msgstr ""
+
+#: flaskbb/management/forms.py:282
+msgid "External link"
+msgstr ""
+
+#: flaskbb/management/forms.py:284
+msgid "A link to a website i.e. 'http://flaskbb.org'"
+msgstr ""
+
+#: flaskbb/management/forms.py:288
+#: flaskbb/templates/forum/category_layout.html:60
+msgid "Moderators"
+msgstr ""
+
+#: flaskbb/management/forms.py:289
+msgid ""
+"Comma seperated usernames. Leave it blank if you do not want to set any "
+"moderators."
+msgstr ""
+
+#: flaskbb/management/forms.py:294
+msgid "Show Moderators"
+msgstr ""
+
+#: flaskbb/management/forms.py:295
+msgid "Do you want show the moderators on the index page?"
+msgstr ""
+
+#: flaskbb/management/forms.py:299
+msgid "Locked?"
+msgstr ""
+
+#: flaskbb/management/forms.py:300
+msgid "Disable new posts and topics in this forum."
+msgstr ""
+
+#: flaskbb/management/forms.py:306
+msgid "You cannot convert a forum that contain topics in a external link"
+msgstr ""
+
+#: flaskbb/management/forms.py:311
+msgid "You also need to specify some moderators."
+msgstr ""
+
+#: flaskbb/management/forms.py:332
+#, python-format
+msgid "%(user)s is not in a moderators group"
+msgstr ""
+
+#: flaskbb/management/forms.py:338
+#, python-format
+msgid "User %(moderator)s not found"
+msgstr ""
+
+#: flaskbb/management/forms.py:374
+msgid "Category title"
+msgstr ""
+
+#: flaskbb/management/forms.py:375
+msgid "Category title required"
+msgstr ""
+
+#: flaskbb/management/forms.py:386
+msgid "Category position required"
+msgstr ""
+
+#: flaskbb/management/views.py:124
+msgid "You are not allowed to edit this user."
+msgstr ""
+
+#: flaskbb/management/views.py:144
+msgid "User successfully edited"
+msgstr ""
+
+#: flaskbb/management/views.py:148
+msgid "Edit User"
+msgstr ""
+
+#: flaskbb/management/views.py:156
+msgid "User successfully deleted"
+msgstr ""
+
+#: flaskbb/management/views.py:166
+msgid "User successfully added."
+msgstr ""
+
+#: flaskbb/management/views.py:170
+#: flaskbb/templates/management/banned_users.html:14
+#: flaskbb/templates/management/user_form.html:14
+#: flaskbb/templates/management/users.html:14
+msgid "Add User"
+msgstr ""
+
+#: flaskbb/management/views.py:199
+msgid "You do not have the permissions to ban this user."
+msgstr ""
+
+#: flaskbb/management/views.py:209
+msgid "A moderator cannot ban an admin user."
+msgstr ""
+
+#: flaskbb/management/views.py:213
+msgid "User was banned successfully."
+msgstr ""
+
+#: flaskbb/management/views.py:215
+msgid "Could not ban user."
+msgstr ""
+
+#: flaskbb/management/views.py:224
+msgid "You do not have the permissions to unban this user."
+msgstr ""
+
+#: flaskbb/management/views.py:231
+msgid "User is now unbanned."
+msgstr ""
+
+#: flaskbb/management/views.py:233
+msgid "Could not unban user."
+msgstr ""
+
+#: flaskbb/management/views.py:271
+#, python-format
+msgid "Report %(id)s is already marked as read"
+msgstr ""
+
+#: flaskbb/management/views.py:278
+#, python-format
+msgid "Report %(id)s marked as read"
+msgstr ""
+
+#: flaskbb/management/views.py:292
+msgid "All reports were marked as read"
+msgstr ""
+
+#: flaskbb/management/views.py:323
+msgid "Group successfully edited."
+msgstr ""
+
+#: flaskbb/management/views.py:327
+msgid "Edit Group"
+msgstr ""
+
+#: flaskbb/management/views.py:335
+msgid "Group successfully deleted."
+msgstr ""
+
+#: flaskbb/management/views.py:345
+msgid "Group successfully added."
+msgstr ""
+
+#: flaskbb/management/views.py:349
+#: flaskbb/templates/management/group_form.html:11
+#: flaskbb/templates/management/groups.html:10
+msgid "Add Group"
+msgstr ""
+
+#: flaskbb/management/views.py:370
+msgid "Forum successfully edited."
+msgstr ""
+
+#: flaskbb/management/views.py:381
+msgid "Edit Forum"
+msgstr ""
+
+#: flaskbb/management/views.py:394
+msgid "Forum successfully deleted."
+msgstr ""
+
+#: flaskbb/management/views.py:406
+msgid "Forum successfully added."
+msgstr ""
+
+#: flaskbb/management/views.py:414
+#: flaskbb/templates/management/category_form.html:11
+#: flaskbb/templates/management/forum_form.html:11
+#: flaskbb/templates/management/forums.html:10
+#: flaskbb/templates/management/forums.html:27
+msgid "Add Forum"
+msgstr ""
+
+#: flaskbb/management/views.py:424
+msgid "Category successfully created."
+msgstr ""
+
+#: flaskbb/management/views.py:428
+#: flaskbb/templates/management/category_form.html:12
+#: flaskbb/templates/management/forum_form.html:12
+#: flaskbb/templates/management/forums.html:11
+msgid "Add Category"
+msgstr ""
+
+#: flaskbb/management/views.py:443
+msgid "Edit Category"
+msgstr ""
+
+#: flaskbb/management/views.py:456
+msgid "Category with all associated forums deleted."
+msgstr ""
+
+#: flaskbb/management/views.py:482
+msgid "Plugin is enabled. Please reload your app."
+msgstr ""
+
+#: flaskbb/management/views.py:484
+msgid ""
+"If you are using a host which doesn't support writting on the disk, this "
+"won't work - than you need to delete the 'DISABLED' file by yourself."
+msgstr ""
+
+#: flaskbb/management/views.py:488
+msgid "Plugin is not enabled"
+msgstr ""
+
+#: flaskbb/management/views.py:499
+#, python-format
+msgid "Plugin %(plugin)s not found"
+msgstr ""
+
+#: flaskbb/management/views.py:511
+msgid "Plugin is disabled. Please reload your app."
+msgstr ""
+
+#: flaskbb/management/views.py:513
+msgid ""
+"If you are using a host which doesn't support writting on the disk, this "
+"won't work - than you need to create a 'DISABLED' file by yourself."
+msgstr ""
+
+#: flaskbb/management/views.py:528
+msgid "Plugin has been uninstalled."
+msgstr ""
+
+#: flaskbb/management/views.py:530
+msgid "Cannot uninstall Plugin"
+msgstr ""
+
+#: flaskbb/management/views.py:543
+msgid "Plugin has been installed."
+msgstr ""
+
+#: flaskbb/management/views.py:545
+msgid "Cannot install Plugin"
+msgstr ""
+
+#: flaskbb/templates/layout.html:50 flaskbb/templates/forum/memberlist.html:1
+#: flaskbb/templates/forum/memberlist.html:9
+#: flaskbb/themes/bootstrap2/templates/layout.html:51
+#: flaskbb/themes/bootstrap3/templates/layout.html:50
+msgid "Memberlist"
+msgstr ""
+
+#: flaskbb/templates/layout.html:65 flaskbb/templates/forum/topictracker.html:1
+#: flaskbb/templates/forum/topictracker.html:22
+#: flaskbb/themes/bootstrap2/templates/layout.html:66
+#: flaskbb/themes/bootstrap3/templates/layout.html:65
+msgid "Topic Tracker"
+msgstr ""
+
+#: flaskbb/templates/layout.html:68
+#: flaskbb/templates/management/management_layout.html:12
+#: flaskbb/templates/user/settings_layout.html:8
+#: flaskbb/themes/bootstrap2/templates/layout.html:69
+#: flaskbb/themes/bootstrap3/templates/layout.html:68
+msgid "Settings"
+msgstr ""
+
+#: flaskbb/templates/layout.html:70 flaskbb/templates/management/forums.html:36
+#: flaskbb/themes/bootstrap2/templates/layout.html:71
+#: flaskbb/themes/bootstrap3/templates/layout.html:70
+msgid "Management"
+msgstr ""
+
+#: flaskbb/templates/layout.html:74
+#: flaskbb/themes/bootstrap2/templates/layout.html:75
+#: flaskbb/themes/bootstrap3/templates/layout.html:74
+msgid "Logout"
+msgstr ""
+
+#: flaskbb/templates/layout.html:83 flaskbb/templates/message/inbox.html:1
+#: flaskbb/templates/message/message_layout.html:16
+#: flaskbb/themes/bootstrap2/templates/layout.html:84
+#: flaskbb/themes/bootstrap3/templates/layout.html:83
+msgid "Inbox"
+msgstr ""
+
+#: flaskbb/templates/layout.html:84
+#: flaskbb/themes/bootstrap2/templates/layout.html:85
+#: flaskbb/themes/bootstrap3/templates/layout.html:84
+msgid "New Message"
+msgstr ""
+
+#: flaskbb/templates/layout.html:90 flaskbb/templates/auth/login.html:1
+#: flaskbb/templates/auth/login.html:8 flaskbb/templates/auth/login.html:26
+#: flaskbb/themes/bootstrap2/templates/layout.html:91
+#: flaskbb/themes/bootstrap3/templates/layout.html:90
+msgid "Login"
+msgstr ""
+
+#: flaskbb/templates/layout.html:96 flaskbb/templates/auth/register.html:1
+#: flaskbb/templates/auth/register.html:8
+#: flaskbb/templates/auth/register.html:32
+#: flaskbb/themes/bootstrap2/templates/layout.html:97
+#: flaskbb/themes/bootstrap3/templates/layout.html:96
+msgid "Register"
+msgstr ""
+
+#: flaskbb/templates/layout.html:97
+#: flaskbb/templates/auth/forgot_password.html:1
+#: flaskbb/templates/auth/forgot_password.html:8
+#: flaskbb/templates/auth/forgot_password.html:15
+#: flaskbb/templates/auth/reset_password.html:1
+#: flaskbb/templates/auth/reset_password.html:8
+#: flaskbb/templates/auth/reset_password.html:18
+#: flaskbb/themes/bootstrap2/templates/layout.html:98
+#: flaskbb/themes/bootstrap3/templates/layout.html:97
+msgid "Reset Password"
+msgstr ""
+
+#: flaskbb/templates/macros.html:177
+msgid "Pages"
+msgstr ""
+
+#: flaskbb/templates/auth/reauth.html:1 flaskbb/templates/auth/reauth.html:9
+msgid "Refresh Login"
+msgstr ""
+
+#: flaskbb/templates/auth/reauth.html:12
+msgid "Sign in"
+msgstr ""
+
+#: flaskbb/templates/email/reset_password.html:1
+#, python-format
+msgid "Dear %(user)s,"
+msgstr ""
+
+#: flaskbb/templates/email/reset_password.html:2
+msgid "To reset your password click on the following link:"
+msgstr ""
+
+#: flaskbb/templates/email/reset_password.html:4
+msgid "Sincerely,"
+msgstr ""
+
+#: flaskbb/templates/email/reset_password.html:5
+msgid "The Administration"
+msgstr ""
+
+#: flaskbb/templates/errors/forbidden_page.html:1
+msgid "No Access - 403"
+msgstr ""
+
+#: flaskbb/templates/errors/forbidden_page.html:7
+msgid "Forbidden Page"
+msgstr ""
+
+#: flaskbb/templates/errors/forbidden_page.html:8
+msgid "You do not have the permission to view this page."
+msgstr ""
+
+#: flaskbb/templates/errors/forbidden_page.html:9
+#: flaskbb/templates/errors/page_not_found.html:9
+msgid "Back to the Forums"
+msgstr ""
+
+#: flaskbb/templates/errors/page_not_found.html:1
+msgid "Oh noes! 404"
+msgstr ""
+
+#: flaskbb/templates/errors/page_not_found.html:7
+msgid "Oops, Page not found!"
+msgstr ""
+
+#: flaskbb/templates/errors/page_not_found.html:8
+msgid "The page you were looking for does not exist."
+msgstr ""
+
+#: flaskbb/templates/errors/server_error.html:1
+msgid "Server Error - 500"
+msgstr ""
+
+#: flaskbb/templates/errors/server_error.html:7
+msgid "Server Error"
+msgstr ""
+
+#: flaskbb/templates/errors/server_error.html:8
+msgid "Something went wrong!"
+msgstr ""
+
+#: flaskbb/templates/forum/category_layout.html:12
+#: flaskbb/templates/management/overview.html:23
+msgid "Topics"
+msgstr ""
+
+#: flaskbb/templates/forum/category_layout.html:13
+#: flaskbb/templates/forum/forum.html:52
+#: flaskbb/templates/forum/memberlist.html:32
+#: flaskbb/templates/forum/topic.html:70
+#: flaskbb/templates/forum/topictracker.html:30
+#: flaskbb/templates/management/banned_users.html:42
+#: flaskbb/templates/management/overview.html:17
+#: flaskbb/templates/management/users.html:42
+#: flaskbb/templates/message/view_message.html:29
+#: flaskbb/templates/user/all_topics.html:28
+#: flaskbb/templates/user/profile.html:56
+msgid "Posts"
+msgstr ""
+
+#: flaskbb/templates/forum/category_layout.html:14
+#: flaskbb/templates/forum/forum.html:56
+#: flaskbb/templates/forum/topictracker.html:34
+#: flaskbb/templates/user/all_topics.html:32
+msgid "Last Post"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:22
+#: flaskbb/templates/management/unread_reports.html:44
+msgid "Mark as Read"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:27
+msgid "Locked"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:31
+#: flaskbb/templates/forum/new_topic.html:1
+#: flaskbb/templates/forum/new_topic.html:11
+#: flaskbb/templates/forum/new_topic.html:16
+msgid "New Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:54
+#: flaskbb/templates/forum/topictracker.html:32
+#: flaskbb/templates/user/all_topics.html:30
+msgid "Views"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:86 flaskbb/templates/forum/forum.html:105
+#: flaskbb/templates/forum/topic.html:35
+#: flaskbb/templates/forum/topictracker.html:52
+#: flaskbb/templates/forum/topictracker.html:70
+#: flaskbb/templates/management/plugins.html:30
+#: flaskbb/templates/user/all_topics.html:42
+#: flaskbb/templates/user/all_topics.html:60
+msgid "by"
+msgstr ""
+
+#: flaskbb/templates/forum/forum.html:117
+#: flaskbb/templates/forum/topictracker.html:82
+msgid "No Topics so far."
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:17
+msgid "Board Statistics"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:18
+msgid "Who is online?"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:25
+msgid "Total number of registered users"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:26
+msgid "Total number of topics"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:27
+msgid "Total number of posts"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:30
+msgid "Newest registered user"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:30
+msgid "No users"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:31
+msgid "Registered users online"
+msgstr ""
+
+#: flaskbb/templates/forum/index.html:33
+msgid "Guests online"
+msgstr ""
+
+#: flaskbb/templates/forum/memberlist.html:33
+#: flaskbb/templates/management/banned_users.html:43
+#: flaskbb/templates/management/users.html:43
+msgid "Date registered"
+msgstr ""
+
+#: flaskbb/templates/forum/memberlist.html:34
+#: flaskbb/templates/management/banned_users.html:44
+#: flaskbb/templates/management/users.html:44
+#: flaskbb/templates/user/profile.html:48
+msgid "Group"
+msgstr ""
+
+#: flaskbb/templates/forum/new_post.html:1
+#: flaskbb/templates/forum/new_post.html:12
+#: flaskbb/templates/forum/new_post.html:17
+msgid "New Post"
+msgstr ""
+
+#: flaskbb/templates/forum/new_post.html:22
+#: flaskbb/templates/forum/new_post.html:35
+#: flaskbb/templates/forum/new_topic.html:21
+#: flaskbb/templates/forum/new_topic.html:35
+msgid "Preview"
+msgstr ""
+
+#: flaskbb/templates/forum/new_post.html:34
+#: flaskbb/templates/forum/topic.html:135
+#: flaskbb/templates/forum/topic.html:153
+#: flaskbb/templates/forum/topic_controls.html:48
+msgid "Reply"
+msgstr ""
+
+#: flaskbb/templates/forum/new_topic.html:34
+msgid "Post Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/online_users.html:1
+#: flaskbb/templates/forum/online_users.html:10
+msgid "Online Users"
+msgstr ""
+
+#: flaskbb/templates/forum/report_post.html:1
+#: flaskbb/templates/forum/report_post.html:13
+msgid "Report Post"
+msgstr ""
+
+#: flaskbb/templates/forum/report_post.html:17
+#: flaskbb/templates/forum/topic.html:116
+msgid "Report"
+msgstr ""
+
+#: flaskbb/templates/forum/report_post.html:18
+msgid "Close"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:2
+#, python-format
+msgid "%(title)s - Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:35
+msgid "Last modified"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:71
+#: flaskbb/templates/message/view_message.html:30
+msgid "Registered since"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:77
+msgid "Guest"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:106
+msgid "PM"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:120
+#: flaskbb/templates/management/forums.html:28
+#: flaskbb/templates/management/forums.html:56
+#: flaskbb/templates/management/groups.html:37
+#: flaskbb/templates/management/users.html:58
+#: flaskbb/templates/message/drafts.html:21
+msgid "Edit"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:124
+#: flaskbb/templates/forum/topic.html:128
+#: flaskbb/templates/management/forums.html:29
+#: flaskbb/templates/management/forums.html:57
+#: flaskbb/templates/management/groups.html:38
+#: flaskbb/templates/management/users.html:70
+#: flaskbb/templates/message/drafts.html:22
+#: flaskbb/templates/message/inbox.html:28
+#: flaskbb/templates/message/sent.html:24
+#: flaskbb/templates/message/trash.html:22
+msgid "Delete"
+msgstr ""
+
+#: flaskbb/templates/forum/topic.html:133
+msgid "Quote"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:9
+msgid "Delete Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:15
+msgid "Lock Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:19
+msgid "Unlock Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:24
+msgid "Highlight Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:28
+msgid "Trivialize Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:38
+msgid "Untrack Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topic_controls.html:42
+msgid "Track Topic"
+msgstr ""
+
+#: flaskbb/templates/forum/topictracker.html:10
+msgid "Tracked Topics"
+msgstr ""
+
+#: flaskbb/templates/management/banned_users.html:1
+#: flaskbb/templates/management/banned_users.html:11
+#: flaskbb/templates/management/banned_users.html:20
+#: flaskbb/templates/management/user_form.html:11
+#: flaskbb/templates/management/users.html:11
+msgid "Banned Users"
+msgstr ""
+
+#: flaskbb/templates/management/banned_users.html:10
+#: flaskbb/templates/management/user_form.html:10
+#: flaskbb/templates/management/users.html:10
+#: flaskbb/templates/management/users.html:20
+msgid "Manage Users"
+msgstr ""
+
+#: flaskbb/templates/management/banned_users.html:45
+#: flaskbb/templates/management/groups.html:27
+#: flaskbb/templates/management/plugins.html:14
+#: flaskbb/templates/management/users.html:45
+msgid "Manage"
+msgstr ""
+
+#: flaskbb/templates/management/banned_users.html:58
+#: flaskbb/templates/management/users.html:66
+msgid "Unban"
+msgstr ""
+
+#: flaskbb/templates/management/banned_users.html:65
+#: flaskbb/templates/management/users.html:77
+msgid "No users found matching your search query"
+msgstr ""
+
+#: flaskbb/templates/management/category_form.html:10
+#: flaskbb/templates/management/forum_form.html:10
+#: flaskbb/templates/management/forums.html:9
+#: flaskbb/templates/management/forums.html:17
+msgid "Manage Forums"
+msgstr ""
+
+#: flaskbb/templates/management/category_form.html:27
+#: flaskbb/templates/management/forum_form.html:35
+#: flaskbb/templates/management/group_form.html:41
+#: flaskbb/templates/management/settings.html:39
+#: flaskbb/templates/management/user_form.html:39
+#: flaskbb/templates/user/change_email.html:14
+#: flaskbb/templates/user/change_password.html:14
+#: flaskbb/templates/user/change_user_details.html:18
+#: flaskbb/templates/user/general_settings.html:12
+msgid "Save"
+msgstr ""
+
+#: flaskbb/templates/management/forums.html:1
+#: flaskbb/templates/management/management_layout.html:14
+msgid "Forums"
+msgstr ""
+
+#: flaskbb/templates/management/group_form.html:10
+#: flaskbb/templates/management/groups.html:9
+#: flaskbb/templates/management/groups.html:15
+msgid "Manage Groups"
+msgstr ""
+
+#: flaskbb/templates/management/groups.html:1
+#: flaskbb/templates/management/management_layout.html:13
+msgid "Groups"
+msgstr ""
+
+#: flaskbb/templates/management/management_layout.html:7
+#: flaskbb/templates/management/overview.html:1
+msgid "Overview"
+msgstr ""
+
+#: flaskbb/templates/management/management_layout.html:9
+#: flaskbb/templates/management/reports.html:1
+msgid "Reports"
+msgstr ""
+
+#: flaskbb/templates/management/management_layout.html:15
+#: flaskbb/templates/management/plugins.html:1
+msgid "Plugins"
+msgstr ""
+
+#: flaskbb/templates/management/overview.html:10
+msgid "Global Statistics"
+msgstr ""
+
+#: flaskbb/templates/management/overview.html:15
+msgid "FlaskBB Version"
+msgstr ""
+
+#: flaskbb/templates/management/overview.html:21
+msgid "Python Version"
+msgstr ""
+
+#: flaskbb/templates/management/overview.html:27
+msgid "Flask Version"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:7
+msgid "Manage Plugins"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:12
+msgid "Plugin"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:13
+msgid "Information"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:28
+msgid "Version"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:34
+msgid "Enable"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:36
+msgid "Disable"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:42
+msgid "Install"
+msgstr ""
+
+#: flaskbb/templates/management/plugins.html:45
+msgid "Uninstall"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:10
+#: flaskbb/templates/management/unread_reports.html:10
+msgid "Show unread reports"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:11
+#: flaskbb/templates/management/unread_reports.html:11
+msgid "Show all reports"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:16
+msgid "All Reports"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:26
+#: flaskbb/templates/management/unread_reports.html:26
+msgid "Poster"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:28
+#: flaskbb/templates/management/unread_reports.html:28
+msgid "Reporter"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:30
+#: flaskbb/templates/management/unread_reports.html:30
+msgid "Reported"
+msgstr ""
+
+#: flaskbb/templates/management/reports.html:45
+msgid "No reports."
+msgstr ""
+
+#: flaskbb/templates/management/unread_reports.html:1
+#: flaskbb/templates/management/unread_reports.html:16
+msgid "Unread Reports"
+msgstr ""
+
+#: flaskbb/templates/management/unread_reports.html:31
+msgid "Mark all as Read"
+msgstr ""
+
+#: flaskbb/templates/management/unread_reports.html:49
+msgid "No unread reports."
+msgstr ""
+
+#: flaskbb/templates/management/users.html:62
+msgid "Ban"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:1
+#: flaskbb/templates/message/message_layout.html:18
+msgid "Drafts"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:8
+#: flaskbb/templates/message/sent.html:8 flaskbb/templates/message/trash.html:8
+msgid "To"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:9
+#: flaskbb/templates/message/inbox.html:9 flaskbb/templates/message/sent.html:9
+#: flaskbb/templates/message/trash.html:9 flaskbb/user/forms.py:105
+msgid "Subject"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:10
+#: flaskbb/templates/message/inbox.html:10
+#: flaskbb/templates/message/sent.html:10
+#: flaskbb/templates/message/trash.html:10
+msgid "Date"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:11
+#: flaskbb/templates/message/inbox.html:11
+#: flaskbb/templates/message/message_layout.html:15
+#: flaskbb/templates/message/sent.html:11
+#: flaskbb/templates/message/trash.html:11
+msgid "Options"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:18
+#: flaskbb/templates/message/trash.html:18
+msgid "No Subject"
+msgstr ""
+
+#: flaskbb/templates/message/drafts.html:28
+#: flaskbb/templates/message/inbox.html:33
+#: flaskbb/templates/message/sent.html:29
+#: flaskbb/templates/message/trash.html:28
+msgid "This message folder is empty."
+msgstr ""
+
+#: flaskbb/templates/message/inbox.html:8
+msgid "From"
+msgstr ""
+
+#: flaskbb/templates/message/inbox.html:20
+#: flaskbb/templates/message/sent.html:20
+#: flaskbb/templates/message/view_message.html:33
+msgid "deleted"
+msgstr ""
+
+#: flaskbb/templates/message/message_form.html:16
+msgid "Send Message"
+msgstr ""
+
+#: flaskbb/templates/message/message_form.html:17
+msgid "Save as Draft"
+msgstr ""
+
+#: flaskbb/templates/message/message_layout.html:8
+msgid "Private Message"
+msgstr ""
+
+#: flaskbb/templates/message/message_layout.html:15
+msgid "New PM"
+msgstr ""
+
+#: flaskbb/templates/message/message_layout.html:17
+msgid "Sent"
+msgstr ""
+
+#: flaskbb/templates/message/message_layout.html:19
+#: flaskbb/templates/message/trash.html:1
+msgid "Trash"
+msgstr ""
+
+#: flaskbb/templates/message/sent.html:1
+msgid "Sent Messages"
+msgstr ""
+
+#: flaskbb/templates/message/trash.html:17
+msgid "No User"
+msgstr ""
+
+#: flaskbb/templates/message/trash.html:21
+msgid "Restore"
+msgstr ""
+
+#: flaskbb/templates/message/view_message.html:49
+msgid "No Message"
+msgstr ""
+
+#: flaskbb/templates/user/all_posts.html:8
+#: flaskbb/templates/user/profile.html:29
+msgid "All Posts"
+msgstr ""
+
+#: flaskbb/templates/user/all_topics.html:8
+#: flaskbb/templates/user/profile.html:28
+msgid "All Topics"
+msgstr ""
+
+#: flaskbb/templates/user/all_topics.html:20
+msgid "All Topics created by"
+msgstr ""
+
+#: flaskbb/templates/user/change_email.html:6
+msgid "Change E-Mail Adress"
+msgstr ""
+
+#: flaskbb/templates/user/change_password.html:6
+#: flaskbb/templates/user/settings_layout.html:19
+msgid "Change Password"
+msgstr ""
+
+#: flaskbb/templates/user/change_user_details.html:6
+#: flaskbb/templates/user/settings_layout.html:17
+msgid "Change User Details"
+msgstr ""
+
+#: flaskbb/templates/user/general_settings.html:6
+#: flaskbb/templates/user/settings_layout.html:16
+msgid "General Settings"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:11
+msgid "Info"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:12
+msgid "User Stats"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:40
+msgid "User has not added any notes about him."
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:52
+msgid "Joined"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:60
+msgid "Last seen"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:61
+msgid "Never seen"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:64
+msgid "Last post"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:68
+msgid "Never"
+msgstr ""
+
+#: flaskbb/templates/user/profile.html:74
+#: flaskbb/templates/user/profile.html:78
+msgid "No Info"
+msgstr ""
+
+#: flaskbb/templates/user/settings_layout.html:15
+msgid "Account Settings"
+msgstr ""
+
+#: flaskbb/templates/user/settings_layout.html:18
+msgid "Change E-Mail Address"
+msgstr ""
+
+#: flaskbb/user/forms.py:27
+msgid "Only jpg, jpeg, png and gifs are allowed!"
+msgstr ""
+
+#: flaskbb/user/forms.py:33
+msgid "Language"
+msgstr ""
+
+#: flaskbb/user/forms.py:34
+msgid "Theme"
+msgstr ""
+
+#: flaskbb/user/forms.py:38
+msgid "Old E-Mail Address"
+msgstr ""
+
+#: flaskbb/user/forms.py:39 flaskbb/user/forms.py:43
+msgid "E-Mail address required"
+msgstr ""
+
+#: flaskbb/user/forms.py:42
+msgid "New E-Mail Address"
+msgstr ""
+
+#: flaskbb/user/forms.py:46
+msgid "Confirm E-Mail Address"
+msgstr ""
+
+#: flaskbb/user/forms.py:47
+msgid "E-Mail adress required"
+msgstr ""
+
+#: flaskbb/user/forms.py:49
+msgid "E-Mails do not match"
+msgstr ""
+
+#: flaskbb/user/forms.py:65
+msgid "Old Password"
+msgstr ""
+
+#: flaskbb/user/forms.py:68
+msgid "New Password"
+msgstr ""
+
+#: flaskbb/user/forms.py:71
+msgid "Confirm New Password"
+msgstr ""
+
+#: flaskbb/user/forms.py:78
+msgid "Your Birthday"
+msgstr ""
+
+#: flaskbb/user/forms.py:103
+msgid "To User"
+msgstr ""
+
+#: flaskbb/user/forms.py:106
+msgid "A subject is required."
+msgstr ""
+
+#: flaskbb/user/forms.py:107
+msgid "Message"
+msgstr ""
+
+#: flaskbb/user/forms.py:108
+msgid "A message is required."
+msgstr ""
+
+#: flaskbb/user/forms.py:113
+msgid "The username you entered doesn't exist"
+msgstr ""
+
+#: flaskbb/user/forms.py:115
+msgid "You cannot send a PM to yourself."
+msgstr ""
+
+#: flaskbb/user/views.py:69
+msgid "Your settings have been updated!"
+msgstr ""
+
+#: flaskbb/user/views.py:85
+msgid "Your password have been updated!"
+msgstr ""
+
+#: flaskbb/user/views.py:97
+msgid "Your email have been updated!"
+msgstr ""
+
+#: flaskbb/user/views.py:110
+msgid "Your details have been updated!"
+msgstr ""
+
+#: flaskbb/user/views.py:183 flaskbb/user/views.py:230
+msgid "Message saved!"
+msgstr ""
+
+#: flaskbb/user/views.py:201 flaskbb/user/views.py:247
+msgid "Message sent!"
+msgstr ""
+
+#: flaskbb/user/views.py:207
+msgid "Compose Message"
+msgstr ""
+
+#: flaskbb/user/views.py:216
+msgid "You cannot edit a sent message"
+msgstr ""
+
+#: flaskbb/user/views.py:255
+msgid "Edit Message"
+msgstr ""
+
+#: flaskbb/user/views.py:264
+msgid "Message moved to Trash!"
+msgstr ""
+
+#: flaskbb/user/views.py:274
+msgid "Message restored from Trash!"
+msgstr ""
+
+#: flaskbb/user/views.py:283
+msgid "Message deleted!"
+msgstr ""
+
+#~ msgid "Email adress required"
+#~ msgstr ""
+
+#~ msgid "Accept Terms of Service"
+#~ msgstr ""
+
+#~ msgid "%(title) - Topic"
+#~ msgstr ""
+

+ 39 - 38
flaskbb/user/forms.py

@@ -14,6 +14,7 @@ from wtforms import (StringField, PasswordField, DateField, TextAreaField,
                      SelectField, ValidationError)
 from wtforms.validators import (Length, DataRequired, Email, EqualTo, regexp,
                                 Optional, URL)
+from flask.ext.babel import lazy_gettext as _
 
 from flaskbb.user.models import User, PrivateMessage
 from flaskbb.extensions import db
@@ -23,29 +24,29 @@ from flaskbb.utils.widgets import SelectDateWidget
 IMG_RE = r'^[^/\\]\.(?:jpg|gif|png)'
 
 is_image = regexp(IMG_RE,
-                  message=("Only jpg, jpeg, png and gifs are allowed!"))
+                  message=_("Only jpg, jpeg, png and gifs are allowed!"))
 
 
 class GeneralSettingsForm(Form):
     # The choices for those fields will be generated in the user view
     # because we cannot access the current_app outside of the context
-    language = SelectField("Language")
-    theme = SelectField("Theme")
+    language = SelectField(_("Language"))
+    theme = SelectField(_("Theme"))
 
 
 class ChangeEmailForm(Form):
-    old_email = StringField("Old E-Mail Address", validators=[
-        DataRequired(message="Email address required"),
-        Email(message="This email is invalid")])
+    old_email = StringField(_("Old E-Mail Address"), validators=[
+        DataRequired(message=_("E-Mail address required")),
+        Email(message=_("This E-Mail is invalid"))])
 
-    new_email = StringField("New E-Mail Address", validators=[
-        DataRequired(message="Email address required"),
-        Email(message="This email is invalid")])
+    new_email = StringField(_("New E-Mail Address"), validators=[
+        DataRequired(message=_("E-Mail address required")),
+        Email(message=_("This E-Mail is invalid"))])
 
-    confirm_new_email = StringField("Confirm E-Mail Address", validators=[
-        DataRequired(message="Email adress required"),
-        Email(message="This email is invalid"),
-        EqualTo("new_email", message="E-Mails do not match")])
+    confirm_new_email = StringField(_("Confirm E-Mail Address"), validators=[
+        DataRequired(message=_("E-Mail adress required")),
+        Email(message=_("This E-Mail is invalid")),
+        EqualTo("new_email", message=_("E-Mails do not match"))])
 
     def __init__(self, user, *args, **kwargs):
         self.user = user
@@ -57,61 +58,61 @@ class ChangeEmailForm(Form):
                                  User.email.like(field.data),
                                  db.not_(User.id == self.user.id))).first()
         if user:
-            raise ValidationError("This email is taken")
+            raise ValidationError(_("This email is taken"))
 
 
 class ChangePasswordForm(Form):
-    old_password = PasswordField("Old Password", validators=[
-        DataRequired(message="Password required")])
+    old_password = PasswordField(_("Old Password"), validators=[
+        DataRequired(message=_("Password required"))])
 
-    new_password = PasswordField("New Password", validators=[
-        DataRequired(message="Password required")])
+    new_password = PasswordField(_("New Password"), validators=[
+        DataRequired(message=_("Password required"))])
 
-    confirm_new_password = PasswordField("Confirm New Password", validators=[
-        DataRequired(message="Password required"),
-        EqualTo("new_password", message="Passwords do not match")])
+    confirm_new_password = PasswordField(_("Confirm New Password"), validators=[
+        DataRequired(message=_("Password required")),
+        EqualTo("new_password", message=_("Passwords do not match"))])
 
 
 class ChangeUserDetailsForm(Form):
     # TODO: Better birthday field
-    birthday = DateField("Your Birthday", format="%d %m %Y",
+    birthday = DateField(_("Your Birthday"), format="%d %m %Y",
                          widget=SelectDateWidget(), validators=[Optional()])
 
-    gender = SelectField("Gender", default="None", choices=[
+    gender = SelectField(_("Gender"), default="None", choices=[
         ("None", ""),
-        ("Male", "Male"),
-        ("Female", "Female")])
+        ("Male", _("Male")),
+        ("Female", _("Female"))])
 
-    location = StringField("Location", validators=[
+    location = StringField(_("Location"), validators=[
         Optional()])
 
-    website = StringField("Website", validators=[
+    website = StringField(_("Website"), validators=[
         Optional(), URL()])
 
-    avatar = StringField("Avatar", validators=[
+    avatar = StringField(_("Avatar"), validators=[
         Optional(), URL()])
 
-    signature = TextAreaField("Forum Signature", validators=[
+    signature = TextAreaField(_("Forum Signature"), validators=[
         Optional()])
 
-    notes = TextAreaField("Notes", validators=[
+    notes = TextAreaField(_("Notes"), validators=[
         Optional(), Length(min=0, max=5000)])
 
 
 class NewMessageForm(Form):
-    to_user = StringField("To User", validators=[
-        DataRequired(message="A username is required.")])
-    subject = StringField("Subject", validators=[
-        DataRequired(message="A subject is required.")])
-    message = TextAreaField("Message", validators=[
-        DataRequired(message="A message is required.")])
+    to_user = StringField(_("To User"), validators=[
+        DataRequired(message=_("A username is required."))])
+    subject = StringField(_("Subject"), validators=[
+        DataRequired(message=_("A subject is required."))])
+    message = TextAreaField(_("Message"), validators=[
+        DataRequired(message=_("A message is required."))])
 
     def validate_to_user(self, field):
         user = User.query.filter_by(username=field.data).first()
         if not user:
-            raise ValidationError("The username you entered doesn't exist")
+            raise ValidationError(_("The username you entered doesn't exist"))
         if user.id == current_user.id:
-            raise ValidationError("You cannot send a PM to yourself.")
+            raise ValidationError(_("You cannot send a PM to yourself."))
 
     def save(self, from_user, to_user, user_id, unread, as_draft=False):
         message = PrivateMessage(

+ 15 - 14
flaskbb/user/views.py

@@ -14,6 +14,7 @@ from datetime import datetime
 from flask import Blueprint, flash, request, redirect, url_for
 from flask.ext.login import login_required, current_user
 from flask.ext.themes2 import get_themes_list
+from flask.ext.babel import gettext as _
 
 from flaskbb.extensions import db, babel
 from flaskbb.utils.helpers import render_template
@@ -65,7 +66,7 @@ def settings():
         current_user.language = form.language.data
         current_user.save()
 
-        flash("Your settings have been updated!", "success")
+        flash(_("Your settings have been updated!"), "success")
     else:
         form.theme.data = current_user.theme
         form.theme.data = current_user.language
@@ -81,7 +82,7 @@ def change_password():
         current_user.password = form.new_password.data
         current_user.save()
 
-        flash("Your password have been updated!", "success")
+        flash(_("Your password have been updated!"), "success")
     return render_template("user/change_password.html", form=form)
 
 
@@ -93,7 +94,7 @@ def change_email():
         current_user.email = form.new_email.data
         current_user.save()
 
-        flash("Your email have been updated!", "success")
+        flash(_("Your email have been updated!"), "success")
     return render_template("user/change_email.html", form=form)
 
 
@@ -106,7 +107,7 @@ def change_user_details():
         form.populate_obj(current_user)
         current_user.save()
 
-        flash("Your details have been updated!", "success")
+        flash(_("Your details have been updated!"), "success")
 
     return render_template("user/change_user_details.html", form=form)
 
@@ -179,7 +180,7 @@ def new_message():
                       unread=False,
                       as_draft=True)
 
-            flash("Message saved!", "success")
+            flash(_("Message saved!"), "success")
             return redirect(url_for("user.drafts"))
 
         if "send_message" in request.form and form.validate():
@@ -197,13 +198,13 @@ def new_message():
                       user_id=to_user.id,
                       unread=True)
 
-            flash("Message sent!", "success")
+            flash(_("Message sent!"), "success")
             return redirect(url_for("user.sent"))
     else:
         form.to_user.data = to_user
 
     return render_template("message/message_form.html", form=form,
-                           title="Compose Message")
+                           title=_("Compose Message"))
 
 
 @user.route("/messages/<int:message_id>/edit", methods=["POST", "GET"])
@@ -212,7 +213,7 @@ def edit_message(message_id):
     message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
 
     if not message.draft:
-        flash("You cannot edit a sent message", "danger")
+        flash(_("You cannot edit a sent message"), "danger")
         return redirect(url_for("user.inbox"))
 
     form = EditMessageForm()
@@ -226,7 +227,7 @@ def edit_message(message_id):
             message.to_user = to_user.id
             message.save()
 
-            flash("Message saved!", "success")
+            flash(_("Message saved!"), "success")
             return redirect(url_for("user.drafts"))
 
         if "send_message" in request.form and form.validate():
@@ -243,7 +244,7 @@ def edit_message(message_id):
             message.date_created = datetime.utcnow()
             message.save()
 
-            flash("Message sent!", "success")
+            flash(_("Message sent!"), "success")
             return redirect(url_for("user.sent"))
     else:
         form.to_user.data = message.to_user.username
@@ -251,7 +252,7 @@ def edit_message(message_id):
         form.message.data = message.message
 
     return render_template("message/message_form.html", form=form,
-                           title="Edit Message")
+                           title=_("Edit Message"))
 
 
 @user.route("/messages/<int:message_id>/move")
@@ -260,7 +261,7 @@ def move_message(message_id):
     message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
     message.trash = True
     message.save()
-    flash("Message moved to Trash!", "success")
+    flash(_("Message moved to Trash!"), "success")
     return redirect(url_for("user.inbox"))
 
 
@@ -270,7 +271,7 @@ def restore_message(message_id):
     message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
     message.trash = False
     message.save()
-    flash("Message restored from Trash!", "success")
+    flash(_("Message restored from Trash!"), "success")
     return redirect(url_for("user.inbox"))
 
 
@@ -279,5 +280,5 @@ def restore_message(message_id):
 def delete_message(message_id):
     message = PrivateMessage.query.filter_by(id=message_id).first_or_404()
     message.delete()
-    flash("Message deleted!", "success")
+    flash(_("Message deleted!"), "success")
     return redirect(url_for("user.inbox"))