Add translators' page

This commit is contained in:
rubenwardy 2024-03-03 02:48:44 +00:00
parent 7c59c1c5b1
commit dd6f36bd2b
5 changed files with 146 additions and 3 deletions

@ -0,0 +1,44 @@
# ContentDB
# Copyright (C) 2024 rubenwardy
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <https://www.gnu.org/licenses/>.
from flask import Blueprint, render_template, request
from app.models import Package, PackageState, db, PackageTranslation
bp = Blueprint("translate", __name__)
@bp.route("/translate/")
def translate():
query = Package.query.filter(
Package.state == PackageState.APPROVED,
Package.translations.any(PackageTranslation.language_id != "en"))
has_langs = request.args.getlist("has_lang")
for lang in has_langs:
query = query.filter(Package.translations.any(PackageTranslation.language_id == lang))
not_langs = request.args.getlist("not_lang")
for lang in not_langs:
query = query.filter(~Package.translations.any(PackageTranslation.language_id == lang))
supports_translation = (query
.order_by(Package.translation_url.is_(None), db.desc(Package.score))
.all())
return render_template("translate/index.html",
supports_translation=supports_translation, has_langs=has_langs, not_langs=not_langs)

@ -18,7 +18,7 @@ from datetime import datetime as dt
from urllib.parse import urlparse
from flask import request, has_request_context
from flask_babel import format_timedelta, gettext
from flask_babel import format_timedelta, gettext, get_locale
from flask_login import current_user
from markupsafe import Markup
@ -34,7 +34,7 @@ def inject_misc():
hide_nonfree = False
if has_request_context():
hide_nonfree = request.cookies.get("hide_nonfree") == "1"
return dict(debug=app.debug, hide_nonfree=hide_nonfree)
return dict(debug=app.debug, hide_nonfree=hide_nonfree, locale=get_locale())
@app.context_processor

@ -255,6 +255,7 @@
<li class="list-inline-item"><a href="{{ url_for('threads.list_all') }}">{{ _("Threads") }}</a></li>
<li class="list-inline-item"><a href="{{ url_for('collections.list_all') }}">{{ _("Collections") }}</a></li>
<li class="list-inline-item"><a href="{{ url_for('donate.donate') }}">{{ _("Support Packages") }}</a></li>
<li class="list-inline-item"><a href="{{ url_for('translate.translate') }}">{{ _("Translate Packages") }}</a></li>
<li class="list-inline-item"><a href="https://github.com/minetest/contentdb">{{ _("Source Code") }}</a></li>
</ul>

@ -0,0 +1,90 @@
{% extends "base.html" %}
{% block title -%}
{{ _("Find packages to translate") }}
{%- endblock %}
{% block description -%}
{{ _("Help make Minetest more accessible by translating packages into other languages.") }}
{% endblock %}
{% macro render_packages(packages) %}
<ul class="list-group">
{% for package in packages %}
<li class="list-group-item">
<div class="row">
<div class="col-sm-auto text-muted" style="min-width: 250px;">
<a href="{{ package.get_url('packages.view') }}">
<img
class="img-fluid"
style="max-height: 22px; max-width: 22px;"
src="{{ package.get_thumb_or_placeholder() }}" />
{% set title %}
<strong>{{ package.title }}</strong>
{% endset %}
<span class="ps-2">
{{ _("%(title)s by %(author)s", title=title, author=package.author.display_name) }}
</span>
</a>
</div>
<div class="col-sm">
</div>
<div class="col-sm-auto">
<a href="{{ package.get_url('packages.view') }}" class="btn btn-sm btn-secondary me-1">
{{ _("View package") }}
</a>
{% if package.translation_url %}
<a href="{{ package.translation_url }}" class="btn btn-sm btn-primary" rel="ugc">
<i class="fas fa-language me-1"></i>
{{ _("Translate") }}
</a>
{% elif package.repo %}
<a href="{{ package.repo }}" class="btn btn-sm btn-primary" rel="ugc">
<i class="fas fa-code me-1"></i>
{{ _("Source") }}
</a>
{% endif %}
</div>
</div>
</li>
{% else %}
<li class="list-group-item text-muted">
{{ _("No packages available") }}
</li>
{% endfor %}
</ul>
{% endmacro %}
{% block content %}
<h1>{{ self.title() }}</h1>
<p class="lead">
{{ self.description() }}
</p>
<h2 id="contentdb">{{ _("ContentDB") }}</h2>
<p>
<a href="https://hosted.weblate.org/projects/minetest/contentdb/" class="btn btn-primary">
{{ _("Help translate ContentDB") }}
</a>
</p>
<h2 id="packages-that-support-translation">{{ _("Packages that support translation") }}</h2>
{% if locale and locale.language != "en" %}
<p class="mb-4">
<a href="{{ url_set_query(_toggle={ 'has_lang': locale.language }) }}"
class="btn {% if locale.language in has_langs %}btn-primary{% else %}btn-secondary{% endif %} me-2">
{{ _("Only show packages with %(lang)s translation", lang=locale.get_language_name(locale)) }}
</a>
<a href="{{ url_set_query(_toggle={ 'not_lang': locale.language }) }}"
class="btn {% if locale.language in not_langs %}btn-primary{% else %}btn-secondary{% endif %}">
{{ _("Hide packages with %(lang)s translation", lang=locale.get_language_name(locale)) }}
</a>
</p>
{% endif %}
{{ render_packages(supports_translation) }}
{% endblock %}

@ -87,7 +87,15 @@ def url_set_query(**kwargs):
args = MultiDict(request.args)
for key, value in kwargs.items():
if key == "_add":
if key == "_toggle":
for key2, value_to_add in value.items():
values = set(args.getlist(key2))
if value_to_add in values:
values.discard(value_to_add)
else:
values.add(value_to_add)
args.setlist(key2, list(values))
elif key == "_add":
for key2, value_to_add in value.items():
values = set(args.getlist(key2))
values.add(value_to_add)