Fix some untranslatable text
This commit is contained in:
@@ -235,8 +235,10 @@ def delete_release(package, id):
|
||||
|
||||
|
||||
class PackageUpdateConfigFrom(FlaskForm):
|
||||
trigger = RadioField(lazy_gettext("Trigger"), [InputRequired()], choices=PackageUpdateTrigger.choices(), coerce=PackageUpdateTrigger.coerce,
|
||||
default=PackageUpdateTrigger.TAG)
|
||||
trigger = RadioField(lazy_gettext("Trigger"), [InputRequired()],
|
||||
choices=[(PackageUpdateTrigger.COMMIT, lazy_gettext("New Commit")),
|
||||
(PackageUpdateTrigger.TAG, lazy_gettext("New Tag"))],
|
||||
coerce=PackageUpdateTrigger.coerce, default=PackageUpdateTrigger.TAG)
|
||||
ref = StringField(lazy_gettext("Branch name"), [Optional()], default=None)
|
||||
action = RadioField(lazy_gettext("Action"), [InputRequired()],
|
||||
choices=[("notification", lazy_gettext("Send notification and mark as outdated")), ("make_release", lazy_gettext("Create release"))],
|
||||
|
||||
@@ -158,9 +158,9 @@ def get_user_medals(user: User) -> Tuple[List[Medal], List[Medal]]:
|
||||
top_rank = user_package_ranks[2]
|
||||
top_type = PackageType.coerce(user_package_ranks[0])
|
||||
if top_rank == 1:
|
||||
title = gettext(u"Top %(type)s", type=top_type.value.lower())
|
||||
title = gettext(u"Top %(type)s", type=top_type.text.lower())
|
||||
else:
|
||||
title = gettext(u"Top %(group)d %(type)s", group=top_rank, type=top_type.value.lower())
|
||||
title = gettext(u"Top %(group)d %(type)s", group=top_rank, type=top_type.text.lower())
|
||||
if top_type == PackageType.MOD:
|
||||
icon = "fa-box"
|
||||
elif top_type == PackageType.GAME:
|
||||
@@ -169,7 +169,7 @@ def get_user_medals(user: User) -> Tuple[List[Medal], List[Medal]]:
|
||||
icon = "fa-paint-brush"
|
||||
|
||||
description = gettext(u"%(display_name)s has a %(type)s placed at #%(place)d.",
|
||||
display_name=user.display_name, type=top_type.value.lower(), place=top_rank)
|
||||
display_name=user.display_name, type=top_type.text.lower(), place=top_rank)
|
||||
unlocked.append(
|
||||
Medal.make_unlocked(place_to_color(top_rank), icon, title, description))
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
|
||||
import re
|
||||
import validators
|
||||
from flask_babel import lazy_gettext
|
||||
|
||||
from app.logic.LogicError import LogicError
|
||||
from app.models import User, Package, PackageType, MetaPackage, Tag, ContentWarning, db, Permission, AuditSeverity, \
|
||||
@@ -35,7 +36,7 @@ def get_license(name):
|
||||
|
||||
license = License.query.filter(License.name.ilike(name)).first()
|
||||
if license is None:
|
||||
raise LogicError(400, "Unknown license: " + name)
|
||||
raise LogicError(400, "Unknown license " + name)
|
||||
return license
|
||||
|
||||
|
||||
@@ -89,7 +90,7 @@ def validate(data: dict):
|
||||
name = data["name"]
|
||||
check(isinstance(name, str), "Name must be a string")
|
||||
check(bool(name_re.match(name)),
|
||||
"Name can only contain lower case letters (a-z), digits (0-9), and underscores (_)")
|
||||
lazy_gettext("Name can only contain lower case letters (a-z), digits (0-9), and underscores (_)"))
|
||||
|
||||
for key in ["repo", "website", "issue_tracker", "issueTracker"]:
|
||||
value = data.get(key)
|
||||
@@ -103,11 +104,11 @@ def validate(data: dict):
|
||||
def do_edit_package(user: User, package: Package, was_new: bool, was_web: bool, data: dict,
|
||||
reason: str = None):
|
||||
if not package.checkPerm(user, Permission.EDIT_PACKAGE):
|
||||
raise LogicError(403, "You do not have permission to edit this package")
|
||||
raise LogicError(403, lazy_gettext("You do not have permission to edit this package"))
|
||||
|
||||
if "name" in data and package.name != data["name"] and \
|
||||
not package.checkPerm(user, Permission.CHANGE_NAME):
|
||||
raise LogicError(403, "You do not have permission to change the package name")
|
||||
raise LogicError(403, lazy_gettext("You do not have permission to change the package name"))
|
||||
|
||||
for alias, to in ALIASES.items():
|
||||
if alias in data:
|
||||
@@ -154,7 +155,7 @@ def do_edit_package(user: User, package: Package, was_new: bool, was_web: bool,
|
||||
break
|
||||
|
||||
if tag.is_protected and tag not in old_tags and not user.rank.atLeast(UserRank.EDITOR):
|
||||
raise LogicError(400, f"Unable to add protected tag {tag.title} to package")
|
||||
raise LogicError(400, lazy_gettext("Unable to add protected tag {tag.title} to package"))
|
||||
|
||||
package.tags.append(tag)
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
import datetime, re
|
||||
|
||||
from celery import uuid
|
||||
from flask_babel import lazy_gettext
|
||||
|
||||
from app.logic.LogicError import LogicError
|
||||
from app.logic.uploads import upload_file
|
||||
@@ -28,12 +29,12 @@ from app.utils import AuditSeverity, addAuditLog, nonEmptyOrNone
|
||||
|
||||
def check_can_create_release(user: User, package: Package):
|
||||
if not package.checkPerm(user, Permission.MAKE_RELEASE):
|
||||
raise LogicError(403, "You do not have permission to make releases")
|
||||
raise LogicError(403, lazy_gettext("You do not have permission to make releases"))
|
||||
|
||||
five_minutes_ago = datetime.datetime.now() - datetime.timedelta(minutes=5)
|
||||
count = package.releases.filter(PackageRelease.releaseDate > five_minutes_ago).count()
|
||||
if count >= 5:
|
||||
raise LogicError(429, "You've created too many releases for this package in the last 5 minutes, please wait before trying again")
|
||||
raise LogicError(429, lazy_gettext("You've created too many releases for this package in the last 5 minutes, please wait before trying again"))
|
||||
|
||||
|
||||
def do_create_vcs_release(user: User, package: Package, title: str, ref: str,
|
||||
@@ -70,7 +71,7 @@ def do_create_zip_release(user: User, package: Package, title: str, file,
|
||||
if commit_hash:
|
||||
commit_hash = commit_hash.lower()
|
||||
if not (len(commit_hash) == 40 and re.match(r"^[0-9a-f]+$", commit_hash)):
|
||||
raise LogicError(400, "Invalid commit hash; it must be a 40 character long base16 string")
|
||||
raise LogicError(400, lazy_gettext("Invalid commit hash; it must be a 40 character long base16 string"))
|
||||
|
||||
uploaded_url, uploaded_path = upload_file(file, "zip", "a zip file")
|
||||
|
||||
|
||||
@@ -10,9 +10,9 @@ def do_create_screenshot(user: User, package: Package, title: str, file, reason:
|
||||
thirty_minutes_ago = datetime.datetime.now() - datetime.timedelta(minutes=30)
|
||||
count = package.screenshots.filter(PackageScreenshot.created_at > thirty_minutes_ago).count()
|
||||
if count >= 20:
|
||||
raise LogicError(429, "Too many requests, please wait before trying again")
|
||||
raise LogicError(429, lazy_gettext("Too many requests, please wait before trying again"))
|
||||
|
||||
uploaded_url, uploaded_path = upload_file(file, "image", "a PNG or JPG image file")
|
||||
uploaded_url, uploaded_path = upload_file(file, "image", lazy_gettext("a PNG or JPG image file"))
|
||||
|
||||
counter = 1
|
||||
for screenshot in package.screenshots.all():
|
||||
|
||||
@@ -18,6 +18,8 @@
|
||||
import imghdr
|
||||
import os
|
||||
|
||||
from flask_babel import lazy_gettext
|
||||
|
||||
from app.logic.LogicError import LogicError
|
||||
from app.models import *
|
||||
from app.utils import randomString
|
||||
@@ -47,10 +49,10 @@ def upload_file(file, fileType, fileTypeDesc):
|
||||
|
||||
ext = get_extension(file.filename)
|
||||
if ext is None or not ext in allowedExtensions:
|
||||
raise LogicError(400, "Please upload " + fileTypeDesc)
|
||||
raise LogicError(400, lazy_gettext("Please upload %(file_desc)s", file_desc=fileTypeDesc))
|
||||
|
||||
if isImage and not isAllowedImage(file.stream.read()):
|
||||
raise LogicError(400, "Uploaded image isn't actually an image")
|
||||
raise LogicError(400, lazy_gettext("Uploaded image isn't actually an image"))
|
||||
|
||||
file.stream.seek(0)
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ import datetime
|
||||
import enum
|
||||
|
||||
from flask import url_for
|
||||
from flask_babel import lazy_gettext
|
||||
from flask_sqlalchemy import BaseQuery
|
||||
from sqlalchemy_searchable import SearchQueryMixin
|
||||
from sqlalchemy_utils.types import TSVectorType
|
||||
@@ -57,6 +58,24 @@ class PackageType(enum.Enum):
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
if self == PackageType.MOD:
|
||||
return lazy_gettext("Mod")
|
||||
elif self == PackageType.GAME:
|
||||
return lazy_gettext("Game")
|
||||
elif self == PackageType.TXP:
|
||||
return lazy_gettext("Texture Pack")
|
||||
|
||||
@property
|
||||
def plural(self):
|
||||
if self == PackageType.MOD:
|
||||
return lazy_gettext("Mods")
|
||||
elif self == PackageType.GAME:
|
||||
return lazy_gettext("Games")
|
||||
elif self == PackageType.TXP:
|
||||
return lazy_gettext("Texture Packs")
|
||||
|
||||
@classmethod
|
||||
def get(cls, name):
|
||||
try:
|
||||
@@ -66,7 +85,7 @@ class PackageType(enum.Enum):
|
||||
|
||||
@classmethod
|
||||
def choices(cls):
|
||||
return [(choice, choice.value) for choice in cls]
|
||||
return [(choice, choice.text) for choice in cls]
|
||||
|
||||
@classmethod
|
||||
def coerce(cls, item):
|
||||
|
||||
@@ -21,7 +21,7 @@ class QueryBuilder:
|
||||
types = [PackageType.get(tname) for tname in types]
|
||||
types = [type for type in types if type is not None]
|
||||
if len(types) > 0:
|
||||
title = ", ".join([type.value + "s" for type in types])
|
||||
title = ", ".join([str(type.plural) for type in types])
|
||||
|
||||
# Get tags types
|
||||
tags = args.getlist("tag")
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
{% if package.author %}
|
||||
<div class="d-none d-md-block">
|
||||
<span class="mr-2">
|
||||
{{ package.type.value }}
|
||||
{{ package.type.text }}
|
||||
</span>
|
||||
{% for warning in package.content_warnings %}
|
||||
<span class="badge badge-warning" title="{{ warning.description }}">
|
||||
|
||||
@@ -106,7 +106,7 @@
|
||||
<form method="post" action="{{ package.getURL("packages.review") }}" class="card-body">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
|
||||
<p>
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.value | lower) }}
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }}
|
||||
</p>
|
||||
|
||||
<div class="btn-group btn-group-toggle" data-toggle="buttons">
|
||||
@@ -145,7 +145,7 @@
|
||||
<form method="post" action="{{ package.getURL("packages.review") }}" class="card-body">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}" />
|
||||
<p>
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.value | lower) }}
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }}
|
||||
</p>
|
||||
|
||||
<div class="btn-group">
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
{% for topic in topics %}
|
||||
<tr class="{% if topic.wip %}wiptopic{% endif %} {% if topic.discarded %}discardtopic{% endif %}">
|
||||
<td>
|
||||
[{{ topic.type.value }}]
|
||||
[{{ topic.type.text }}]
|
||||
</td>
|
||||
<td>
|
||||
<a href="https://forum.minetest.net/viewtopic.php?t={{ topic.topic_id}}">{{ topic.title }}</a>
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
<ul>
|
||||
{% for t in similar_topics %}
|
||||
<li>
|
||||
[{{ t.type.value }}]
|
||||
[{{ t.type.text }}]
|
||||
<a href="https://forum.minetest.net/viewtopic.php?t={{ t.topic_id }}">
|
||||
{{ _("%(title)s by %(display_name)s", title=t.title, display_name=t.author.display_name) }}
|
||||
</a>
|
||||
|
||||
@@ -46,7 +46,7 @@
|
||||
<div class="alert alert-secondary">
|
||||
<a class="float-right btn btn-sm btn-default" href="/help/package_config/#cdbjson">{{ _("Read more") }}</a>
|
||||
|
||||
{{ _("You can include a .cdb.json file in your %(type)s to update these details automatically.", type=package.type.value.lower()) }}
|
||||
{{ _("You can include a .cdb.json file in your %(type)s to update these details automatically.", type=package.type.text.lower()) }}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<h1>{{ self.title() }}</h1>
|
||||
|
||||
<p>
|
||||
{{ _("A release is a single downloadable version of your %(title)s.", title=package.type.value.lower()) }}
|
||||
{{ _("A release is a single downloadable version of your %(title)s.", title=package.type.text.lower()) }}
|
||||
{{ _("You need to create releases even if you use a rolling release development cycle, as Minetest needs them to check for updates.") }}
|
||||
</p>
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<p>
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.value | lower) }}
|
||||
{{ _("Do you recommend this %(type)s?", type=package.type.text | lower) }}
|
||||
</p>
|
||||
{{ render_toggle_field(form.recommends, icons={"yes":"fa-thumbs-up", "no":"fa-thumbs-down"}) }}
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
<a href="{{ pkg.getURL('packages.view') }}">
|
||||
{{ _("%(title)s by %(author)s", title=pkg.title, author=pkg.author.display_name) }}
|
||||
</a>
|
||||
[{{ pkg.type.value }}]
|
||||
[{{ pkg.type.text }}]
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<a class="btn btn-secondary float-right" href="/help/update_config/">Help</a>
|
||||
<a class="btn btn-secondary float-right" href="/help/update_config/">{{ _("Help") }}</a>
|
||||
<h1>{{ _("Configure Git Update Detection") }}</h1>
|
||||
|
||||
<p>
|
||||
|
||||
@@ -393,7 +393,7 @@
|
||||
|
||||
<dl>
|
||||
<dt>{{ _("Type") }}</dt>
|
||||
<dd>{{ package.type.value }}</dd>
|
||||
<dd>{{ package.type.text }}</dd>
|
||||
<dt>{{ _("Technical Name") }}</dt>
|
||||
<dd>{{ package.name }}</dd>
|
||||
<dt>{{ _("License") }}</dt>
|
||||
@@ -403,8 +403,8 @@
|
||||
{% elif package.type == package.type.TXP %}
|
||||
{{ render_license(package.media_license) }}
|
||||
{% else %}
|
||||
{{ render_license(package.license) }} for code,<br />
|
||||
{{ render_license(package.media_license) }} for media.
|
||||
{{ _("%(code_license)s for code,<br>%(media_license)s for media.",
|
||||
code_license=render_license(package.license), media_license=render_license(package.media_license)) }}
|
||||
{% endif %}
|
||||
</dd>
|
||||
<dt>{{ _("Maintenance State") }}</dt>
|
||||
|
||||
@@ -148,10 +148,12 @@
|
||||
</h2>
|
||||
|
||||
<p>
|
||||
Meta packages that have hard dependers, but are not fulfilled.
|
||||
{{ _("Meta packages that have hard dependers, but no packages providing them.") }}
|
||||
</p>
|
||||
|
||||
<a class="btn btn-primary" href="{{ url_for('todo.metapackages') }}">View</a>
|
||||
<a class="btn btn-primary" href="{{ url_for('todo.metapackages') }}">
|
||||
{{ _("View") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
|
||||
|
||||
|
||||
@@ -9,11 +9,11 @@
|
||||
<div class="btn-group btn-group-sm mr-2">
|
||||
{% if is_mtm_only %}
|
||||
<a class="btn btn-sm btn-primary active" href="{{ url_set_query(mtm=0) }}">
|
||||
Minetest Mods only
|
||||
{{ _("Minetest-Mods org only") }}
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="btn btn-sm btn-secondary" href="{{ url_set_query(mtm=1) }}">
|
||||
Minetest Mods only
|
||||
{{ _("Minetest-Mods org only") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
@@ -21,11 +21,11 @@
|
||||
<div class="btn-group btn-group-sm">
|
||||
<a class="btn {% if sort_by == 'date' %}btn-primary active{% else %}btn-secondary{% endif %}"
|
||||
href="{{ url_set_query(sort='date') }}">
|
||||
Sort by date
|
||||
{{ _("Sort by date") }}
|
||||
</a>
|
||||
<a class="btn {% if sort_by == 'score' %}btn-primary active{% else %}btn-secondary{% endif %}"
|
||||
href="{{ url_set_query(sort='score') }}">
|
||||
Sort by score
|
||||
{{ _("Sort by score") }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -35,9 +35,9 @@
|
||||
|
||||
<table class="table mt-5">
|
||||
<tr>
|
||||
<th>Package</th>
|
||||
<th>{{ _("Package") }}</th>
|
||||
<th></th>
|
||||
<th>Tags</th>
|
||||
<th>{{ _("Tags") }}</th>
|
||||
</tr>
|
||||
{% for package in packages %}
|
||||
<tr>
|
||||
@@ -70,70 +70,5 @@
|
||||
{% endfor %}
|
||||
</table>
|
||||
|
||||
<div class="modal">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title">{{ _("Edit tags") }}</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<select name="tags" multiple>
|
||||
{% for tag in tags %}
|
||||
<option value="{{ tag.name }}">{{ tag.title }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
|
||||
<button type="button" class="btn btn-primary">Update</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% from "macros/forms.html" import form_scripts %}
|
||||
|
||||
{% block scriptextra %}
|
||||
{{ form_scripts() }}
|
||||
|
||||
<script>
|
||||
$(".add-btn").click(function() {
|
||||
$(this).parent().parent();
|
||||
|
||||
$(".modal select option").removeAttr("selected");
|
||||
$(".multichoice_selector").remove();
|
||||
|
||||
$(".modal .modal-body").prepend(`
|
||||
<div class="multichoice_selector bulletselector form-control">
|
||||
<input type="text" placeholder="Start typing to see suggestions">
|
||||
<div class="clearboth"></div>
|
||||
</div>
|
||||
`);
|
||||
|
||||
$(".modal").modal("show");
|
||||
$(".modal input").focus();
|
||||
$(".multichoice_selector").each(function() {
|
||||
const ele = $(this);
|
||||
const sel = ele.parent().find("select");
|
||||
sel.hide();
|
||||
|
||||
const options = [];
|
||||
sel.find("option").each(function() {
|
||||
const text = $(this).text();
|
||||
options.push({
|
||||
id: $(this).attr("value"),
|
||||
value: text,
|
||||
toString: function() { return text; },
|
||||
});
|
||||
});
|
||||
|
||||
ele.selectSelector(options, sel);
|
||||
});
|
||||
});
|
||||
|
||||
</script>
|
||||
{% endblock %}
|
||||
|
||||
@@ -9,15 +9,15 @@ Topics to be Added
|
||||
<div class="btn-group btn-group-sm mr-2">
|
||||
<a class="btn btn-secondary {% if sort_by=='date' %}active{% endif %}"
|
||||
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=n, sort='date') }}">
|
||||
Sort by date
|
||||
{{ _("Sort by date") }}
|
||||
</a>
|
||||
<a class="btn btn-secondary {% if sort_by=='name' %}active{% endif %}"
|
||||
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=n, sort='name') }}">
|
||||
Sort by name
|
||||
{{ _("Sort by name") }}
|
||||
</a>
|
||||
<a class="btn btn-secondary {% if sort_by=='views' %}active{% endif %}"
|
||||
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=n, sort='views') }}">
|
||||
Sort by views
|
||||
{{ _("Sort by views") }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
@@ -26,29 +26,27 @@ Topics to be Added
|
||||
{% if n >= 10000 %}
|
||||
<a class="btn btn-secondary"
|
||||
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=100, sort=sort_by) }}">
|
||||
Paginated list
|
||||
{{ _("Paginated list") }}
|
||||
</a>
|
||||
{% else %}
|
||||
<a class="btn btn-secondary"
|
||||
href="{{ url_for('todo.topics', q=query, show_discarded=show_discarded, n=10000, sort=sort_by) }}">
|
||||
Unlimited list
|
||||
{{ _("Unlimited list") }}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
|
||||
<a class="btn btn-secondary" href="{{ url_for('todo.topics', q=query, show_discarded=not show_discarded, n=n, sort=sort_by) }}">
|
||||
{% if not show_discarded %}
|
||||
Show
|
||||
{{ _("Show discarded topics") }}
|
||||
{% else %}
|
||||
Hide
|
||||
{{ _("Hide discarded topics") }}
|
||||
{% endif %}
|
||||
|
||||
discarded topics
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<h1>Topics to be Added</h1>
|
||||
<h1>{{ _("Topics to be Added") }}</h1>
|
||||
|
||||
{% if topic_count > 0 %}
|
||||
<p>
|
||||
|
||||
@@ -40,7 +40,9 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<a class="btn btn-secondary float-right" href="/help/update_config/">Help</a>
|
||||
<a class="btn btn-secondary float-right" href="/help/update_config/">
|
||||
{{ _("Help") }}
|
||||
</a>
|
||||
<a class="btn btn-secondary float-right mr-2" href="{{ url_for('packages.bulk_update_config', username=user.username) }}">
|
||||
{{ _("See all Update Settings") }}
|
||||
</a>
|
||||
@@ -66,7 +68,8 @@
|
||||
{{ render_outdated_packages(outdated_packages, current_user) }}
|
||||
|
||||
<div class="mt-5"></div>
|
||||
<a class="btn btn-secondary float-right" href="{{ url_for('todo.tags', author=user.username) }}">See All</a>
|
||||
<a class="btn btn-secondary float-right" href="{{ url_for('todo.tags', author=user.username) }}">
|
||||
{{_ ("See All") }}</a>
|
||||
<h2>{{ _("Packages Without Tags") }}</h2>
|
||||
<p>
|
||||
{{ _("Labelling your packages with tags helps users find them.") }}
|
||||
|
||||
Reference in New Issue
Block a user