mirror of
https://github.com/bszczuka/steel-training.git
synced 2025-12-21 13:23:02 +01:00
Add i18n, add IDPA target
This commit is contained in:
15
app.py
15
app.py
@@ -2,9 +2,20 @@ import math
|
||||
|
||||
from flask import Flask, render_template, request, send_file
|
||||
from weasyprint import HTML
|
||||
from flask_babel import Babel, _
|
||||
|
||||
import io
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config['BABEL_DEFAULT_LOCALE'] = 'en'
|
||||
app.config['BABEL_SUPPORTED_LOCALES'] = ['en', 'pl'] # Add supported languages here
|
||||
app.config['BABEL_DEFAULT_TIMEZONE'] = 'UTC'
|
||||
|
||||
babel = Babel(app)
|
||||
|
||||
@babel.localeselector
|
||||
def get_locale():
|
||||
return request.accept_languages.best_match(app.config['BABEL_SUPPORTED_LOCALES'])
|
||||
|
||||
SHOOTOFF_DISTANCE = 1200
|
||||
SHOOTOFF_GAP = 100
|
||||
@@ -213,6 +224,7 @@ def generate_pdf_ipsc():
|
||||
distance = int(request.form.get('distance', 1) or 1)
|
||||
size = request.form.get('size')
|
||||
distance_type = request.form.get('distance_type')
|
||||
target_type = request.form.get('target_type')
|
||||
scale = distance / IPSC_DISTANCE
|
||||
wall_extra_space_for_paper = 29.7 if size == 'a3' else 21.0
|
||||
if distance_type == 'wall':
|
||||
@@ -236,7 +248,8 @@ def generate_pdf_ipsc():
|
||||
preview_target_width=preview_scale * IPSC_TARGET_WIDTH,
|
||||
preview_margin=preview_margin,
|
||||
preview_gap=preview_scale * IPSC_GAP + preview_margin,
|
||||
box_position=box_position
|
||||
box_position=box_position,
|
||||
target_type=target_type
|
||||
)
|
||||
# return rendered_html
|
||||
|
||||
|
||||
18
messages.pot
Normal file
18
messages.pot
Normal file
@@ -0,0 +1,18 @@
|
||||
# Translations template for PROJECT.
|
||||
# Copyright (C) 2024 ORGANIZATION
|
||||
# This file is distributed under the same license as the PROJECT project.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-09-18 09:15+0200\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
BIN
static/images/idpa_el_presidente.webp
Normal file
BIN
static/images/idpa_el_presidente.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 4.4 KiB |
BIN
static/images/ipsc_el_presidente.webp
Normal file
BIN
static/images/ipsc_el_presidente.webp
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.2 KiB |
@@ -28,7 +28,7 @@
|
||||
<body class="bg-gray-100 font-sans">
|
||||
<div class="max-w-4xl mx-auto p-6 bg-white shadow-md rounded-lg mt-10">
|
||||
<h1 class="text-2xl font-bold mb-6 text-center text-gray-700">Paper Challenge</h1>
|
||||
<h2 class="my-10 mx-auto text-center font-bold text-xl">Wygeneruj tor {% block title %}{% endblock %}</h2>
|
||||
<h2 class="my-10 mx-auto text-center font-bold text-xl">{% trans %}Generate stage for{% endtrans %} {% block title %}{% endblock %}</h2>
|
||||
<div class="flex justify-center gap-6">
|
||||
<a href="{{ url_for('index') }}"
|
||||
class="{{ 'shadow-inner shadow-blue-900' if current_url == url_for('index') else '' }} bg-blue-500 text-white py-2 px-4 rounded-md hover:bg-blue-600 transition-colors">
|
||||
@@ -40,10 +40,18 @@
|
||||
</a>
|
||||
<a href="{{ url_for('ipsc') }}"
|
||||
class="{{ 'shadow-inner shadow-blue-900' if current_url == url_for('ipsc') else '' }} bg-blue-500 text-white py-2 px-4 rounded-md hover:bg-blue-600 transition-colors">
|
||||
IPSC - El Presidente
|
||||
El Presidente
|
||||
</a>
|
||||
|
||||
</div>
|
||||
<div class="flex justify-center mt-4">
|
||||
<a href="https://buycoffee.to/bogson" target="_blank"
|
||||
class="bg-green-500 text-white py-2 px-4 rounded-md hover:bg-green-600 transition-colors">
|
||||
Wesprzyj projekt
|
||||
</a>
|
||||
</div>
|
||||
{% block content %}{% endblock %}
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
||||
7
templates/idpa_preview_svg.html
Normal file
7
templates/idpa_preview_svg.html
Normal file
@@ -0,0 +1,7 @@
|
||||
<div class="preview-target w-[{{preview_target_width}}cm] h-[{{preview_target_height}}cm]" style="left: {{(preview_margin + i * preview_gap)}}cm;">
|
||||
<svg width="{{preview_target_width}}cm" height="{{preview_target_height}}cm" viewBox="0 0 460 780" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M145 0 315 0 315 150 385 150 460 225 460 650 385 780 75 780 0 650 0 225 75 150 145 150Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M145 150 315 150 385 225 385 460 320 620 150 620 85 460 85 225 145 150Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M230 192.5 A102.5 102.5 0 1 1 229.99 192.5Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
</div>
|
||||
5
templates/idpa_svg.html
Normal file
5
templates/idpa_svg.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg style="display: block; margin: auto;" width="{{target_width}}cm" height="{{target_height}}cm" viewBox="0 0 460 780" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M145 0 315 0 315 150 385 150 460 225 460 650 385 780 75 780 0 650 0 225 75 150 145 150Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M145 150 315 150 385 225 385 460 320 620 150 620 85 460 85 225 145 150Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M230 192.5 A102.5 102.5 0 1 1 229.99 192.5Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 511 B |
@@ -1,21 +1,35 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}IPSC - El Presidente{% endblock %}
|
||||
{% block title %}El Presidente{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
|
||||
<form class="" action="/generate-pdf-ipsc" method="post">
|
||||
{% include 'setup.html' %}
|
||||
<div class="mb-6 max-w-2xl mx-auto">
|
||||
<h2>IPSC - El Presidente</h2>
|
||||
<h2>{%trans%}Select the stage{%endtrans%}</h2>
|
||||
|
||||
<div class="mb-6 max-w-2xl mx-auto mt-4">
|
||||
<img class="mx-auto" src="{{ url_for('static', filename='images/el_presidente_preview.webp') }}" alt="IPSC - El Presidente">
|
||||
<div id="stage" class="grid grid-cols-1 gap-4">
|
||||
<div>
|
||||
<label for="ipsc">
|
||||
<p>IPSC</p>
|
||||
<img src="{{ url_for('static', filename='images/ipsc_el_presidente.webp') }}" alt="IPSC">
|
||||
<input type="radio" id="ipsc" name="target_type" value="ipsc" required>
|
||||
</label>
|
||||
</div>
|
||||
<div>
|
||||
<label for="idpa">
|
||||
<p>IDPA</p>
|
||||
<img src="{{ url_for('static', filename='images/idpa_el_presidente.webp') }}"
|
||||
alt="IDPA">
|
||||
<input type="radio" id="idpa" name="target_type" value="idpa">
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center">
|
||||
<button type="submit"
|
||||
class="bg-green-500 text-white py-2 px-4 rounded-md hover:bg-green-600 transition-colors">
|
||||
Generuj
|
||||
{%trans%}Generate PDF{%endtrans%}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
7
templates/ipsc_preview_svg.html
Normal file
7
templates/ipsc_preview_svg.html
Normal file
@@ -0,0 +1,7 @@
|
||||
<div class="preview-target w-[{{preview_target_width}}cm] h-[{{preview_target_height}}cm]" style="left: {{(preview_margin + i * preview_gap)}}cm;">
|
||||
<svg width="{{preview_target_width}}cm" height="{{preview_target_height}}cm" viewBox="0 0 450 570" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M150 0 0 190 0 380 150 570 300 570 450 380 450 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M150 0 75 190 75 335 175 450 275 450 375 335 375 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M200 25 150 190 150 275 200 350 250 350 300 275 300 190 250 25Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
</div>
|
||||
5
templates/ipsc_svg.html
Normal file
5
templates/ipsc_svg.html
Normal file
@@ -0,0 +1,5 @@
|
||||
<svg style="display: block; margin: auto;" width="{{target_width}}cm" height="{{target_height}}cm" viewBox="0 0 450 570" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M150 0 0 190 0 380 150 570 300 570 450 380 450 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M150 0 75 190 75 335 175 450 275 450 375 335 375 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M200 25 150 190 150 275 200 350 250 350 300 275 300 190 250 25Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 489 B |
@@ -82,17 +82,15 @@
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<p>Wymagana długość ściany: {{ wall_length/10 }}cm</p>
|
||||
<p>Odległość od ściany: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>Przygotowanie toru:</p>
|
||||
<p>{%trans%}Wall length required{%endtrans%}: {{ wall_length/10 }}cm</p>
|
||||
<p>{%trans%}Distance from wall{%endtrans%}: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>{%trans%}Stage preparation{%endtrans%}:</p>
|
||||
<ul>
|
||||
<li>Umieść z lewej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"</li>
|
||||
<li>Wyznacz pole startowe {{ box_position }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany</li>
|
||||
<li>Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie przeszkazdało
|
||||
w swobodnym dobyciu i składaniu do celów na całej szerokości ściany
|
||||
</li>
|
||||
<li>W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki</li>
|
||||
<li>Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża</li>
|
||||
<li>{%trans%}Place the first target with the 'ZERO point' marker on the left side of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Set shooting box{%endtrans%} {{ box_position }}cm {%trans%}from 'ZERO' point (along the wall) and{%endtrans%} {{distance}}cm {%trans%}from the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Ensure that the starting field is positioned in a convenient location within the room, so that nothing obstructs the drawing and aiming at targets across the entire width of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}If necessary, adjust the first target along with the ZERO point and repeat the two previous steps{%endtrans%}</li>
|
||||
<li>{%trans%}Place the remaining targets on the wall according to the distances indicated on the position markers at the bottom of each target. Ensure that all targets are aligned in a single line parallel to the ground{%endtrans%}</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
@@ -111,9 +109,9 @@
|
||||
</div>
|
||||
</div>
|
||||
{% if target.target == 't1' %}
|
||||
<div class="mounting-info">punkt ZERO ({{ stage.split('_') | map('capitalize') | join(' ') }})</div>
|
||||
<div class="mounting-info">{%trans%}ZERO point{%endtrans%} ({{ stage.split('_') | map('capitalize') | join(' ') }})</div>
|
||||
{% else %}
|
||||
<div class="mounting-info">{{ target.position / 10 }}cm od punktu ZERO ({{ stage.split('_') | map('capitalize') | join(' ') }})</div>
|
||||
<div class="mounting-info">{{ target.position / 10 }}cm {%trans%}from ZERO point{%endtrans%} ({{ stage.split('_') | map('capitalize') | join(' ') }})</div>
|
||||
{% endif %}
|
||||
<div class="mounting-point"></div>
|
||||
</div>
|
||||
|
||||
@@ -66,44 +66,44 @@
|
||||
<h2>IPSC - El Presidente</h2>
|
||||
<div class="preview">
|
||||
{% for i in range(3) %}
|
||||
<div class="preview-target w-[{{preview_target_width}}cm] h-[{{preview_target_height}}cm]" style="left: {{(preview_margin + i * preview_gap)}}cm;">
|
||||
<svg width="{{preview_target_width}}cm" height="{{preview_target_height}}cm" viewBox="0 0 450 570" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M150 0 0 190 0 380 150 570 300 570 450 380 450 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M150 0 75 190 75 335 175 450 275 450 375 335 375 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M200 25 150 190 150 275 200 350 250 350 300 275 300 190 250 25Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
</div>
|
||||
{% with preview_target_width = preview_target_width, preview_target_height = preview_target_height, preview_margin = preview_margin, preview_gap = preview_gap %}
|
||||
{%if target_type == 'ipsc' %}
|
||||
{%include 'ipsc_preview_svg.html'%}
|
||||
{%else%}
|
||||
{%include 'idpa_preview_svg.html'%}
|
||||
{%endif%}
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<p>Wymagana długość ściany: {{ wall_length|round(1,'ceil') }}cm</p>
|
||||
<p>Odległość od ściany: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>Przygotowanie toru:</p>
|
||||
<p>{%trans%}Wall length required{%endtrans%}: {{ wall_length|round(1,'ceil') }}cm</p>
|
||||
<p>{%trans%}Distance from wall{%endtrans%}: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>{%trans%}Stage preparation{%endtrans%}:</p>
|
||||
<ul>
|
||||
<li>Umieść z lewej lub prawej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"</li>
|
||||
<li>Wyznacz pole startowe {{ box_position|round(1,'ceil') }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany</li>
|
||||
<li>Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie
|
||||
przeszkazdało
|
||||
w swobodnym dobyciu i składaniu do celów na całej szerokości ściany
|
||||
</li>
|
||||
<li>W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki</li>
|
||||
<li>Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego
|
||||
celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża</li>
|
||||
<li>{%trans%}Place the first target with the 'ZERO point' marker on the left or right side of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Set shooting box{%endtrans%} {{ box_position|round(1,'ceil') }}cm {%trans%}from 'ZERO' point (along the wall) and{%endtrans%} {{distance}}cm {%trans%}from the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Ensure that the starting field is positioned in a convenient location within the room, so that nothing obstructs the drawing and aiming at targets across the entire width of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}If necessary, adjust the first target along with the ZERO point and repeat the two previous steps{%endtrans%}</li>
|
||||
<li>{%trans%}Place the remaining targets on the wall according to the distances indicated on the position markers at the bottom of each target. Ensure that all targets are aligned in a single line parallel to the ground{%endtrans%}</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
|
||||
{% for i in range(3) %}
|
||||
<div class="page-break">
|
||||
<div class="content">
|
||||
<svg style="display: block; margin: auto;" width="{{target_width}}cm" height="{{target_height}}cm" viewBox="0 0 450 570" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M150 0 0 190 0 380 150 570 300 570 450 380 450 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M150 0 75 190 75 335 175 450 275 450 375 335 375 190 300 0Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
<path d="M200 25 150 190 150 275 200 350 250 350 300 275 300 190 250 25Z" fill="#CD9F61" stroke="#A97835"/>
|
||||
</svg>
|
||||
{% with target_width=target_width, target_height=target_height %}
|
||||
{%if target_type == 'ipsc' %}
|
||||
{%include 'ipsc_svg.html'%}
|
||||
{%else%}
|
||||
{%include 'idpa_svg.html'%}
|
||||
{%endif%}
|
||||
{% endwith %}
|
||||
|
||||
|
||||
{% if i==0 %}
|
||||
<div class="mounting-info">punkt ZERO (El Presidente)</div>
|
||||
<div class="mounting-info">{%trans%}ZERO point{%endtrans%} (El Presidente)</div>
|
||||
{% else %}
|
||||
<div class="mounting-info">{{ i * gap|round(1,'ceil') }}cm od punktu ZERO (El Presidente)</div>
|
||||
<div class="mounting-info">{{ i * gap|round(1,'ceil') }}cm {%trans%}from ZERO point{%endtrans%} (El Presidente)</div>
|
||||
{% endif %}
|
||||
<div class="mounting-point"></div>
|
||||
</div>
|
||||
|
||||
@@ -109,22 +109,16 @@
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<p>Wymagana długość ściany: {{ wall_length|round(1,'ceil') }}cm</p>
|
||||
<p>Odległość od ściany: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>Przygotowanie toru:</p>
|
||||
<p>{%trans%}Wall length required{%endtrans%}: {{ wall_length|round(1,'ceil') }}cm</p>
|
||||
<p>{%trans%}Distance from wall{%endtrans%}: {{ distance|round(1,'ceil') }}cm</p>
|
||||
<p>{%trans%}Stage preparation{%endtrans%}:</p>
|
||||
<ul>
|
||||
<li>Umieść z lewej lub prawej strony ściany pierwszy cel ze znacznikiem "punkt ZERO"</li>
|
||||
<li>Wyznacz pole startowe {{ box_position|round(1,'ceil') }}cm od punktu "zero" (wzdłuż ściany) oraz w odległości {{distance}}cm od ściany</li>
|
||||
<li>Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie
|
||||
przeszkazdało
|
||||
w swobodnym dobyciu i składaniu do celów na całej szerokości ściany
|
||||
</li>
|
||||
<li>W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki</li>
|
||||
<li>Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego
|
||||
celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża</li>
|
||||
<li>{%trans%}Place the first target with the 'ZERO point' marker on the left or right side of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Set shooting box{%endtrans%} {{ box_position|round(1,'ceil') }}cm {%trans%}from 'ZERO' point (along the wall) and{%endtrans%} {{distance}}cm {%trans%}from the wall{%endtrans%}</li>
|
||||
<li>{%trans%}Ensure that the starting field is positioned in a convenient location within the room, so that nothing obstructs the drawing and aiming at targets across the entire width of the wall{%endtrans%}</li>
|
||||
<li>{%trans%}If necessary, adjust the first target along with the ZERO point and repeat the two previous steps{%endtrans%}</li>
|
||||
<li>{%trans%}Place the remaining targets on the wall according to the distances indicated on the position markers at the bottom of each target. Ensure that all targets are aligned in a single line parallel to the ground{%endtrans%}</li>
|
||||
</ul>
|
||||
|
||||
</div>
|
||||
{% for i in range(target_count) %}
|
||||
<div class="page-break">
|
||||
@@ -158,9 +152,9 @@
|
||||
|
||||
{% endif %}
|
||||
{% if i==0 %}
|
||||
<div class="mounting-info">punkt ZERO (Shootoff)</div>
|
||||
<div class="mounting-info">{%trans%}ZERO point{%endtrans%} (Shootoff)</div>
|
||||
{% else %}
|
||||
<div class="mounting-info">{{ i * gap|round(1,'ceil') }}cm od punktu ZERO (Shootoff)</div>
|
||||
<div class="mounting-info">{{ i * gap|round(1,'ceil') }}cm {%trans%}from ZERO point{%endtrans%} (Shootoff)</div>
|
||||
{% endif %}
|
||||
<div class="mounting-point"></div>
|
||||
</div>
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
{% include 'setup.html' %}
|
||||
|
||||
<div class="mb-6 max-w-2xl mx-auto">
|
||||
<h2>Tor</h2>
|
||||
<h2>{%trans%}Select the stage{%endtrans%}</h2>
|
||||
<div id="stage" class="grid grid-cols-1 gap-4">
|
||||
<div>
|
||||
<label for="five_to_go">
|
||||
@@ -72,7 +72,7 @@
|
||||
<div class="text-center">
|
||||
<button type="submit"
|
||||
class="bg-green-500 text-white py-2 px-4 rounded-md hover:bg-green-600 transition-colors">
|
||||
Generuj
|
||||
{%trans%}Generate PDF{%endtrans%}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
<div class="mb-6 max-w-2xl mx-auto mt-10">
|
||||
<h2>Wybierz rodzaj kalkulacji ze względu na ograniczoną długość ściany lub ograniczoną odległość stanowiska od ściany</h2>
|
||||
<h2>{%trans%}Select the type of calculation based on the limited wall length or the limited distance of the shooting box from the wall{%endtrans%}</h2>
|
||||
<div class="flex gap-6 place-content-center">
|
||||
<label for="floor"
|
||||
class="cursor-pointer border-2 border-transparent rounded-lg overflow-hidden transition-all hover:border-blue-400">
|
||||
<img src="{{ url_for('static', filename='images/floor.webp') }}" alt="Odległość od ściany"
|
||||
<img src="{{ url_for('static', filename='images/floor.webp') }}" alt="{%trans%}Distance from wall{%endtrans%}"
|
||||
class="w-40 h-auto">
|
||||
<input type="radio" id="floor" name="distance_type" value="floor" required>
|
||||
</label>
|
||||
|
||||
<label for="wall"
|
||||
class="cursor-pointer border-2 border-transparent rounded-lg overflow-hidden transition-all hover:border-blue-400">
|
||||
<img src="{{ url_for('static', filename='images/wall.webp') }}" alt="Długość ściany"
|
||||
<img src="{{ url_for('static', filename='images/wall.webp') }}" alt="{%trans%}Wall length{%endtrans%}"
|
||||
class="w-40 h-auto">
|
||||
<input type="radio" id="wall" name="distance_type" value="wall" required>
|
||||
</label>
|
||||
|
||||
</div>
|
||||
<div class="mb-6 max-w-2xl mx-auto mt-4">
|
||||
<h2>dystans [cm]</h2>
|
||||
<h2>{%trans%}Distance{%endtrans%} [cm]</h2>
|
||||
<input type="number" id="distance" name="distance" min="100" max="700" class="w-full p-2 border rounded-md focus:outline-none focus:ring-2 focus:ring-blue-400" required>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-6 max-w-2xl mx-auto mt-10">
|
||||
<h2>Format druku</h2>
|
||||
<h2>{%trans%}Printing format{%endtrans%}</h2>
|
||||
<div id="size" class="flex place-content-center">
|
||||
<label for="a4"
|
||||
class="cursor-pointer border-2 border-transparent rounded-lg overflow-hidden transition-all hover:border-blue-400">
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<div class="text-center">
|
||||
<button type="submit"
|
||||
class="bg-green-500 text-white py-2 px-4 rounded-md hover:bg-green-600 transition-colors">
|
||||
Generuj
|
||||
{%trans%}Generate PDF{%endtrans%}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
BIN
translations/pl/LC_MESSAGES/messages.mo
Normal file
BIN
translations/pl/LC_MESSAGES/messages.mo
Normal file
Binary file not shown.
80
translations/pl/LC_MESSAGES/messages.po
Normal file
80
translations/pl/LC_MESSAGES/messages.po
Normal file
@@ -0,0 +1,80 @@
|
||||
# Polish translations for PROJECT.
|
||||
# Copyright (C) 2024 ORGANIZATION
|
||||
# This file is distributed under the same license as the PROJECT project.
|
||||
# FIRST AUTHOR <EMAIL@ADDRESS>, 2024.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PROJECT VERSION\n"
|
||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||
"POT-Creation-Date: 2024-09-18 09:15+0200\n"
|
||||
"PO-Revision-Date: 2024-09-18 09:16+0200\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language: pl\n"
|
||||
"Language-Team: pl <LL@li.org>\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && "
|
||||
"(n%100<10 || n%100>=20) ? 1 : 2);\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=utf-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Generated-By: Babel 2.16.0\n"
|
||||
|
||||
msgid "Generate stage for"
|
||||
msgstr "Wygeneruj tor"
|
||||
|
||||
msgid "Select the type of calculation based on the limited wall length or the limited distance of the shooting box from the wall"
|
||||
msgstr "Wybierz rodzaj kalkulacji ze względu na ograniczoną długość ściany lub ograniczoną odległość stanowiska od "ściany"
|
||||
|
||||
msgid "Distance from wall"
|
||||
msgstr "Odległość od ściany"
|
||||
|
||||
msgid "Wall length"
|
||||
msgstr "Długość ściany"
|
||||
|
||||
msgid "Distance"
|
||||
msgstr "Dystans"
|
||||
|
||||
msgid "Printing format"
|
||||
msgstr "Format druku"
|
||||
|
||||
msgid "Select the stage"
|
||||
msgstr "Wybierz tor"
|
||||
|
||||
msgid "Generate PDF"
|
||||
msgstr "Wygeneruj PDF"
|
||||
|
||||
msgid "Wall length required"
|
||||
msgstr "Wymagana długość ściany"
|
||||
|
||||
msgid "Stage preparation"
|
||||
msgstr "Przygotowanie toru"
|
||||
|
||||
msgid "Place the first target with the 'ZERO point' marker on the left side of the wall"
|
||||
msgstr "Umieść z lewej strony ściany pierwszy cel ze znacznikiem 'punkt ZERO'"
|
||||
|
||||
msgid "Place the first target with the 'ZERO point' marker on the left or right side of the wall"
|
||||
msgstr "Umieść z lewej lub prawej strony ściany pierwszy cel ze znacznikiem 'punkt ZERO'"
|
||||
|
||||
msgid "Set shooting box"
|
||||
msgstr "Wyznacz pole startowe"
|
||||
|
||||
msgid "from 'ZERO' point (along the wall) and"
|
||||
msgstr "od punktu 'ZERO' (wzdłuż ściany) oraz w odległości"
|
||||
|
||||
msgid "from the wall"
|
||||
msgstr "od ściany"
|
||||
|
||||
msgid "Ensure that the starting field is positioned in a convenient location within the room, so that nothing obstructs the drawing and aiming at targets across the entire width of the wall"
|
||||
msgstr "Upewnij się, że pole startowe znjaduje się w dogodnym miejscu, pomieszczenia, tak aby nic nie przeszkazdało w swobodnym dobyciu i składaniu do celów na całej szerokości ściany"
|
||||
|
||||
msgid "If necessary, adjust the first target along with the ZERO point and repeat the two previous steps"
|
||||
msgstr "W razie potrzeby dostosuj pierwszy cel wraz z punktem ZERO i powtórz dwa powyższe kroki"
|
||||
|
||||
msgid "Place the remaining targets on the wall according to the distances indicated on the position markers at the bottom of each target. Ensure that all targets are aligned in a single line parallel to the ground"
|
||||
msgstr "Umieść na ścianie pozostałe cele zgodnie z odległościami podanymi na znacznikach pozycji na dole każdego celu. Upewnij się, że wszystkie cele są umieszczone w jednej linii równoległej do podłoża"
|
||||
|
||||
msgid "ZERO point"
|
||||
msgstr "punkt ZERO"
|
||||
|
||||
msgid "from ZERO point"
|
||||
msgstr "od punktu ZERO"
|
||||
Reference in New Issue
Block a user