mirror of
https://github.com/YunoHost/apps.git
synced 2024-09-03 20:06:07 +02:00
app_generator: more cleanup, misc bug fixes, simplify code and development flow (#2313)
This commit is contained in:
parent
43aebcce8b
commit
f61a6dae1e
14 changed files with 313 additions and 2103 deletions
|
@ -1,152 +1,107 @@
|
||||||
#### Imports
|
|
||||||
import logging
|
|
||||||
from io import BytesIO
|
|
||||||
import re
|
import re
|
||||||
import os
|
import os
|
||||||
import jinja2 as j2
|
import logging
|
||||||
|
import zipfile
|
||||||
|
import random
|
||||||
|
import string
|
||||||
|
from io import BytesIO
|
||||||
from flask import (
|
from flask import (
|
||||||
Flask,
|
Flask,
|
||||||
render_template,
|
render_template,
|
||||||
render_template_string,
|
render_template_string,
|
||||||
request,
|
request,
|
||||||
redirect,
|
redirect,
|
||||||
flash,
|
|
||||||
send_file,
|
send_file,
|
||||||
|
make_response,
|
||||||
|
session,
|
||||||
)
|
)
|
||||||
from markupsafe import Markup # No longer imported from Flask
|
|
||||||
|
|
||||||
# Form libraries
|
|
||||||
from flask_wtf import FlaskForm
|
from flask_wtf import FlaskForm
|
||||||
|
from flask_babel import Babel, lazy_gettext as _
|
||||||
|
|
||||||
from wtforms import (
|
from wtforms import (
|
||||||
StringField,
|
StringField,
|
||||||
RadioField,
|
|
||||||
SelectField,
|
SelectField,
|
||||||
SubmitField,
|
SubmitField,
|
||||||
TextAreaField,
|
TextAreaField,
|
||||||
BooleanField,
|
BooleanField,
|
||||||
SelectMultipleField,
|
SelectMultipleField,
|
||||||
|
HiddenField,
|
||||||
)
|
)
|
||||||
from wtforms.validators import (
|
from wtforms.validators import (
|
||||||
DataRequired,
|
DataRequired,
|
||||||
InputRequired,
|
|
||||||
Optional,
|
Optional,
|
||||||
Regexp,
|
Regexp,
|
||||||
URL,
|
URL,
|
||||||
Length,
|
Length,
|
||||||
)
|
)
|
||||||
from wtforms.fields import HiddenField
|
|
||||||
|
|
||||||
# Translations
|
YOLOGEN_VERSION = "0.11"
|
||||||
from flask_babel import Babel
|
LANGUAGES = {"en": _("English"), "fr": _("French")}
|
||||||
from flask_babel import lazy_gettext as _
|
|
||||||
|
|
||||||
from flask import redirect, request, make_response # Language swap by redirecting
|
###############################################################################
|
||||||
|
# App initialization, misc configs
|
||||||
# Markdown to HTML - for debugging purposes
|
###############################################################################
|
||||||
from misaka import Markdown, HtmlRenderer
|
|
||||||
|
|
||||||
# Managing zipfiles
|
|
||||||
import zipfile
|
|
||||||
from flask_cors import CORS
|
|
||||||
from urllib import parse
|
|
||||||
from secrets import token_urlsafe
|
|
||||||
|
|
||||||
logger = logging.getLogger()
|
logger = logging.getLogger()
|
||||||
|
|
||||||
#### GLOBAL VARIABLES
|
app = Flask(__name__, static_url_path="/static", static_folder="static")
|
||||||
YOLOGEN_VERSION = "0.10"
|
|
||||||
GENERATOR_DICT = {"GENERATOR_VERSION": YOLOGEN_VERSION}
|
|
||||||
|
|
||||||
#### Create FLASK and Jinja Environments
|
if app.config.get("DEBUG"):
|
||||||
app = Flask(__name__)
|
app.config["TEMPLATES_AUTO_RELOAD"] = True
|
||||||
app.config["SECRET_KEY"] = token_urlsafe(16) # Necessary for the form CORS
|
|
||||||
cors = CORS(app)
|
|
||||||
|
|
||||||
environment = j2.Environment(loader=j2.FileSystemLoader("templates/"))
|
app.config["LANGUAGES"] = LANGUAGES
|
||||||
|
app.config["GENERATOR_VERSION"] = YOLOGEN_VERSION
|
||||||
|
|
||||||
|
# This is the secret key used for session signing
|
||||||
def is_hidden_field_filter(field):
|
app.secret_key = "".join(random.choice(string.ascii_lowercase) for i in range(32))
|
||||||
|
|
||||||
return isinstance(field, HiddenField)
|
|
||||||
|
|
||||||
|
|
||||||
app.jinja_env.globals["bootstrap_is_hidden_field"] = is_hidden_field_filter
|
|
||||||
|
|
||||||
# Handle translations
|
|
||||||
BABEL_TRANSLATION_DIRECTORIES = "translations"
|
|
||||||
|
|
||||||
babel = Babel()
|
|
||||||
|
|
||||||
LANGUAGES = {"en": _("English"), "fr": _("French")}
|
|
||||||
|
|
||||||
|
|
||||||
@app.context_processor
|
|
||||||
def inject_conf_var():
|
|
||||||
return dict(AVAILABLE_LANGUAGES=LANGUAGES)
|
|
||||||
|
|
||||||
|
|
||||||
def configure(app):
|
|
||||||
babel.init_app(app, locale_selector=get_locale)
|
|
||||||
app.config["LANGUAGES"] = LANGUAGES
|
|
||||||
|
|
||||||
|
|
||||||
def get_locale():
|
def get_locale():
|
||||||
print(request.accept_languages.best_match(app.config["LANGUAGES"].keys()))
|
return (
|
||||||
print(request.cookies.get("lang", "en"))
|
session.get("lang")
|
||||||
# return 'en' # to test
|
or request.accept_languages.best_match(LANGUAGES.keys())
|
||||||
# return 'fr'
|
or "en"
|
||||||
if request.args.get("language"):
|
|
||||||
print(request.args.get("language"))
|
|
||||||
session["language"] = request.args.get("language")
|
|
||||||
return request.cookies.get("lang", "en")
|
|
||||||
# return request.accept_languages.best_match(app.config['LANGUAGES'].keys()) # The result is based on the Accept-Language header. For testing purposes, you can directly return a language code, for example: return ‘de’
|
|
||||||
|
|
||||||
|
|
||||||
configure(app)
|
|
||||||
|
|
||||||
#### Custom functions
|
|
||||||
|
|
||||||
|
|
||||||
# Define custom filter
|
|
||||||
@app.template_filter("render_markdown")
|
|
||||||
def render_markdown(text):
|
|
||||||
renderer = HtmlRenderer()
|
|
||||||
markdown = Markdown(renderer)
|
|
||||||
return markdown(text)
|
|
||||||
|
|
||||||
|
|
||||||
# Add custom filter
|
|
||||||
j2.filters.FILTERS["render_markdown"] = render_markdown
|
|
||||||
|
|
||||||
|
|
||||||
# Converting markdown to html
|
|
||||||
def markdown_file_to_html_string(file):
|
|
||||||
with open(file, "r") as file:
|
|
||||||
markdown_content = file.read()
|
|
||||||
# Convert content from Markdown to HTML
|
|
||||||
html_content = render_markdown(markdown_content)
|
|
||||||
# Return Markdown and HTML contents
|
|
||||||
return markdown_content, html_content
|
|
||||||
|
|
||||||
|
|
||||||
### Forms
|
|
||||||
|
|
||||||
|
|
||||||
# Language selector. Not used (in GeneratorForm) until it's fixed or superseeded.
|
|
||||||
# Use it in the HTML with {{ form_field(main_form.generator_language) }}
|
|
||||||
class Translations(FlaskForm):
|
|
||||||
generator_language = SelectField(
|
|
||||||
_("Select language"),
|
|
||||||
choices=[("none", "")] + [language for language in LANGUAGES.items()],
|
|
||||||
default=["en"],
|
|
||||||
id="selectLanguage",
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
babel = Babel(app, locale_selector=get_locale)
|
||||||
|
|
||||||
|
|
||||||
|
@app.context_processor
|
||||||
|
def jinja_globals():
|
||||||
|
|
||||||
|
d = {
|
||||||
|
"locale": get_locale(),
|
||||||
|
}
|
||||||
|
|
||||||
|
if app.config.get("DEBUG"):
|
||||||
|
d["tailwind_local"] = open("static/tailwind-local.css").read()
|
||||||
|
|
||||||
|
return d
|
||||||
|
|
||||||
|
|
||||||
|
app.jinja_env.globals["is_hidden_field"] = lambda field: isinstance(field, HiddenField)
|
||||||
|
|
||||||
|
|
||||||
|
@app.route("/lang/<lang>")
|
||||||
|
def set_lang(lang=None):
|
||||||
|
|
||||||
|
assert lang in app.config["LANGUAGES"].keys()
|
||||||
|
session["lang"] = lang
|
||||||
|
|
||||||
|
return make_response(redirect(request.referrer or "/"))
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
# Forms
|
||||||
|
###############################################################################
|
||||||
|
|
||||||
|
|
||||||
class GeneralInfos(FlaskForm):
|
class GeneralInfos(FlaskForm):
|
||||||
|
|
||||||
app_id = StringField(
|
app_id = StringField(
|
||||||
Markup(_("Application identifier (id)")),
|
_("Application identifier (id)"),
|
||||||
description=_("Small caps and without spaces"),
|
description=_("Small caps and without spaces"),
|
||||||
validators=[DataRequired(), Regexp("[a-z_1-9]+.*(?<!_ynh)$")],
|
validators=[DataRequired(), Regexp("[a-z_1-9]+.*(?<!_ynh)$")],
|
||||||
render_kw={
|
render_kw={
|
||||||
|
@ -525,10 +480,8 @@ class AppConfig(FlaskForm):
|
||||||
class Documentation(FlaskForm):
|
class Documentation(FlaskForm):
|
||||||
# TODO : # screenshot
|
# TODO : # screenshot
|
||||||
description = TextAreaField(
|
description = TextAreaField(
|
||||||
Markup(
|
|
||||||
_(
|
_(
|
||||||
"""doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly listing the main features, possible warnings and specific details on its functioning in Yunohost (e.g. warning about integration issues)."""
|
"doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly listing the main features, possible warnings and specific details on its functioning in Yunohost (e.g. warning about integration issues)."
|
||||||
)
|
|
||||||
),
|
),
|
||||||
validators=[Optional()],
|
validators=[Optional()],
|
||||||
render_kw={
|
render_kw={
|
||||||
|
@ -701,7 +654,6 @@ def main_form_route():
|
||||||
return render_template(
|
return render_template(
|
||||||
"index.html",
|
"index.html",
|
||||||
main_form=main_form,
|
main_form=main_form,
|
||||||
generator_info=GENERATOR_DICT,
|
|
||||||
generated_files={},
|
generated_files={},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -761,29 +713,21 @@ def main_form_route():
|
||||||
template_dir = os.path.dirname(__file__) + "/templates/"
|
template_dir = os.path.dirname(__file__) + "/templates/"
|
||||||
for app_file in app_files:
|
for app_file in app_files:
|
||||||
template = open(template_dir + app_file.id + ".j2").read()
|
template = open(template_dir + app_file.id + ".j2").read()
|
||||||
app_file.content = render_template_string(
|
app_file.content = render_template_string(template, data=dict(request.form))
|
||||||
template, data=dict(request.form | GENERATOR_DICT)
|
|
||||||
)
|
|
||||||
app_file.content = re.sub(r"\n\s+$", "\n", app_file.content, flags=re.M)
|
app_file.content = re.sub(r"\n\s+$", "\n", app_file.content, flags=re.M)
|
||||||
app_file.content = re.sub(r"\n{3,}", "\n\n", app_file.content, flags=re.M)
|
app_file.content = re.sub(r"\n{3,}", "\n\n", app_file.content, flags=re.M)
|
||||||
|
|
||||||
print(main_form.use_custom_config_file.data)
|
|
||||||
if main_form.use_custom_config_file.data:
|
if main_form.use_custom_config_file.data:
|
||||||
app_files.append(
|
app_files.append(
|
||||||
AppFile("appconf", "conf/" + main_form.custom_config_file.data)
|
AppFile("appconf", "conf/" + main_form.custom_config_file.data)
|
||||||
)
|
)
|
||||||
app_files[-1].content = main_form.custom_config_file_content.data
|
app_files[-1].content = main_form.custom_config_file_content.data
|
||||||
print(main_form.custom_config_file.data)
|
|
||||||
print(main_form.custom_config_file_content.data)
|
|
||||||
|
|
||||||
# TODO : same for cron job
|
|
||||||
if submit_mode == "download":
|
if submit_mode == "download":
|
||||||
# Generate the zip file
|
# Generate the zip file
|
||||||
f = BytesIO()
|
f = BytesIO()
|
||||||
with zipfile.ZipFile(f, "w") as zf:
|
with zipfile.ZipFile(f, "w") as zf:
|
||||||
print("Exporting zip archive for app: " + request.form["app_id"])
|
|
||||||
for app_file in app_files:
|
for app_file in app_files:
|
||||||
print(app_file.id)
|
|
||||||
zf.writestr(app_file.destination_path, app_file.content)
|
zf.writestr(app_file.destination_path, app_file.content)
|
||||||
f.seek(0)
|
f.seek(0)
|
||||||
# Send the zip file to the user
|
# Send the zip file to the user
|
||||||
|
@ -794,19 +738,10 @@ def main_form_route():
|
||||||
return render_template(
|
return render_template(
|
||||||
"index.html",
|
"index.html",
|
||||||
main_form=main_form,
|
main_form=main_form,
|
||||||
generator_info=GENERATOR_DICT,
|
|
||||||
generated_files=app_files,
|
generated_files=app_files,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
# Localisation
|
|
||||||
@app.route("/language/<language>")
|
|
||||||
def set_language(language=None):
|
|
||||||
response = make_response(redirect(request.referrer or "/"))
|
|
||||||
response.set_cookie("lang", language)
|
|
||||||
return response
|
|
||||||
|
|
||||||
|
|
||||||
#### Running the web server
|
#### Running the web server
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app.run(debug=True)
|
app.run(debug=True)
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
blinker==1.6.3
|
Babel==2.15.0
|
||||||
cffi==1.16.0
|
blinker==1.8.2
|
||||||
click==8.1.7
|
click==8.1.7
|
||||||
dominate==2.8.0
|
Flask==3.0.3
|
||||||
Flask==3.0.0
|
flask-babel==4.0.0
|
||||||
flask_babel~=4.0.0
|
|
||||||
Flask-Cors==4.0.0
|
|
||||||
Flask-Misaka==1.0.0
|
|
||||||
Flask-WTF==1.2.1
|
Flask-WTF==1.2.1
|
||||||
itsdangerous==2.1.2
|
|
||||||
Jinja2==3.1.4
|
|
||||||
MarkupSafe==2.1.3
|
|
||||||
misaka==2.1.1
|
|
||||||
pycparser==2.21
|
|
||||||
visitor==0.1.3
|
|
||||||
Werkzeug==3.0.1
|
|
||||||
WTForms==3.0.1
|
|
||||||
gunicorn==22.0.0
|
gunicorn==22.0.0
|
||||||
|
itsdangerous==2.2.0
|
||||||
|
Jinja2==3.1.4
|
||||||
|
MarkupSafe==2.1.5
|
||||||
|
packaging==24.0
|
||||||
|
pytz==2024.1
|
||||||
|
Werkzeug==3.0.3
|
||||||
|
WTForms==3.1.2
|
||||||
|
|
|
@ -1,6 +1,15 @@
|
||||||
# Download standalone tailwind to compile what we need
|
# Production -> download standalone tailwind to compile only what we need
|
||||||
wget https://github.com/tailwindlabs/tailwindcss/releases/download/v3.3.3/tailwindcss-linux-x64
|
wget https://github.com/tailwindlabs/tailwindcss/releases/download/v3.3.3/tailwindcss-linux-x64
|
||||||
chmod +x tailwindcss-linux-x64
|
chmod +x tailwindcss-linux-x64
|
||||||
./tailwindcss-linux-x64 --input tailwind-local.css --output tailwind.css --minify
|
./tailwindcss-linux-x64 --input tailwind-local.css --output tailwind.css --minify
|
||||||
|
|
||||||
|
# Development -> we use the JS magic thingy
|
||||||
|
curl -L https://cdn.tailwindcss.com?plugins=forms > tailwind-css.js
|
||||||
|
|
||||||
|
# Forkawesome
|
||||||
|
curl https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/css/fork-awesome.min.css > fork-awesome.min.css
|
||||||
|
sed -i 's@../fonts/@@g' ./fork-awesome.min.css
|
||||||
|
curl https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/fonts/forkawesome-webfont.woff2?v=1.2.0 > forkawesome-webfont.woff2
|
||||||
|
curl https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/fonts/forkawesome-webfont.woff?v=1.2.0 > forkawesome-webfont.woff
|
||||||
|
curl https://cdn.jsdelivr.net/npm/fork-awesome@1.2.0/fonts/forkawesome-webfont.ttf?v=1.2.0 > forkawesome-webfont.ttf
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,11 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
h2 {
|
h2 {
|
||||||
@apply text-xl font-bold;
|
@apply text-xl font-medium;
|
||||||
}
|
}
|
||||||
|
|
||||||
h3 {
|
h3 {
|
||||||
@apply text-lg font-bold;
|
@apply text-lg font-medium;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hide {
|
.hide {
|
||||||
|
@ -43,50 +43,34 @@
|
||||||
@apply block rounded-lg border border-gray-400 mb-2;
|
@apply block rounded-lg border border-gray-400 mb-2;
|
||||||
}
|
}
|
||||||
.panel-heading {
|
.panel-heading {
|
||||||
@apply text-white bg-blue-500 hover:bg-blue-700 p-2 font-bold;
|
@apply text-white bg-blue-500 hover:bg-blue-600 px-2 py-1.5;
|
||||||
}
|
}
|
||||||
.panel-body {
|
.panel-body {
|
||||||
@apply p-2;
|
@apply p-2;
|
||||||
|
transition: max-height 0.2s ease-in;
|
||||||
|
max-height: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.alert-info {
|
.alert-info {
|
||||||
@apply text-blue-900 border-blue-900 bg-blue-200 rounded-lg p-4;
|
@apply text-blue-900 border-blue-900 bg-blue-200 rounded-lg p-4;
|
||||||
}
|
}
|
||||||
|
|
||||||
.active, .collapse-button:hover {
|
|
||||||
background-color: #318ddc;
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapse-title:after {
|
.collapse-title:after {
|
||||||
content: '\002B';
|
content: '\002B';
|
||||||
color: white;
|
color: white;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
float: right;
|
float: right;
|
||||||
margin-left: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.expanded .collapse-title::after {
|
.active .collapse-title:after {
|
||||||
content: "\2212";
|
content: '\2212';
|
||||||
}
|
|
||||||
|
|
||||||
.collapsed {
|
|
||||||
padding: 0px 15px 0px 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.collapsible {
|
|
||||||
max-height: 0px;
|
|
||||||
overflow: hidden;
|
|
||||||
transition: max-height 0.2s ease-out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
label {
|
label {
|
||||||
@apply font-bold;
|
@apply font-bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
input {
|
|
||||||
@apply rounded-lg;
|
|
||||||
}
|
|
||||||
|
|
||||||
.form-group, .checkbox {
|
.form-group, .checkbox {
|
||||||
@apply px-2 py-4;
|
@apply px-2 py-4;
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,11 +7,5 @@ module.exports = {
|
||||||
plugins: [
|
plugins: [
|
||||||
require('@tailwindcss/forms'),
|
require('@tailwindcss/forms'),
|
||||||
],
|
],
|
||||||
safelist: [
|
|
||||||
'safelisted',
|
|
||||||
{
|
|
||||||
pattern: /^(text-[a-z]+-600|border-[a-z]+-400)$/,
|
|
||||||
},
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,18 @@
|
||||||
<!DOCTYPE html>
|
<!DOCTYPE html>
|
||||||
|
<html lang="{{ locale }}">
|
||||||
<html>
|
|
||||||
<head>
|
<head>
|
||||||
<title>{{ gettext("YunoHost app generator") }}</title>
|
<title>{{ _("YunoHost package generator") }}</title>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='fork-awesome.min.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='fork-awesome.min.css') }}">
|
||||||
|
{% if config.DEBUG %}
|
||||||
|
<script src="{{ url_for('static', filename='tailwind-css.js') }}"></script>
|
||||||
|
<style type="text/tailwindcss">
|
||||||
|
{{ tailwind_local|safe }}
|
||||||
|
</style>
|
||||||
|
{% else %}
|
||||||
<link rel="stylesheet" href="{{ url_for('static', filename='tailwind.css') }}">
|
<link rel="stylesheet" href="{{ url_for('static', filename='tailwind.css') }}">
|
||||||
|
{% endif %}
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<main class="my-2 mx-auto max-w-screen-md">
|
<main class="my-2 mx-auto max-w-screen-md">
|
||||||
|
|
|
@ -1,9 +1,17 @@
|
||||||
{% import "wtf.html" as wtf %}
|
{% macro form_errors(form, hiddens=True) %}
|
||||||
|
{%- if form.errors %}
|
||||||
|
{%- for fieldname, errors in form.errors.items() %}
|
||||||
|
{%- if is_hidden_field(form[fieldname]) and hiddens or
|
||||||
|
not is_hidden_field(form[fieldname]) and hiddens != 'only' %}
|
||||||
|
{%- for error in errors %}
|
||||||
|
<p class="error">{{error}}</p>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endfor %}
|
||||||
|
{%- endif %}
|
||||||
|
{%- endmacro %}
|
||||||
|
|
||||||
{% macro form_field(field,
|
{% macro form_field(field) %}
|
||||||
form_type="basic",
|
|
||||||
horizontal_columns=('lg', 2, 10),
|
|
||||||
button_map={}) %}
|
|
||||||
{% if field.widget.input_type == 'checkbox' %}
|
{% if field.widget.input_type == 'checkbox' %}
|
||||||
<div class="checkbox">
|
<div class="checkbox">
|
||||||
<label>
|
<label>
|
||||||
|
@ -13,30 +21,54 @@
|
||||||
<p class="help-block">{{field.description|safe}}</p>
|
<p class="help-block">{{field.description|safe}}</p>
|
||||||
{%- endif %}
|
{%- endif %}
|
||||||
</div>
|
</div>
|
||||||
{% else %}
|
{%- elif field.type == 'RadioField' -%}
|
||||||
{{ wtf.form_field(field, form_type, horizontal_columns, button_map) }}
|
{% for item in field -%}
|
||||||
|
<div class="radio">
|
||||||
|
<label>
|
||||||
|
{{item|safe}} {{item.label.text|safe}}
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
{% else -%}
|
||||||
|
<div class="form-group {% if field.errors %} has-error{% endif -%}
|
||||||
|
{%- if field.flags.required %} required{% endif -%}
|
||||||
|
">
|
||||||
|
{{field.label(class="control-label")|safe}}
|
||||||
|
{% if field.type == 'FileField' %}
|
||||||
|
{{field(**kwargs)|safe}}
|
||||||
|
{% else %}
|
||||||
|
{{field(class="form-control", **kwargs)|safe}}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
{%- if field.errors %}
|
||||||
|
{%- for error in field.errors %}
|
||||||
|
<p class="help-block">{{error}}</p>
|
||||||
|
{%- endfor %}
|
||||||
|
{%- elif field.description -%}
|
||||||
|
<p class="help-block">{{field.description|safe}}</p>
|
||||||
|
{%- endif %}
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endmacro %}
|
{% endmacro %}
|
||||||
|
|
||||||
|
|
||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
|
|
||||||
{% block main %}
|
{% block main %}
|
||||||
<div class="mx-auto w-full text-center p-8">
|
<div class="mx-auto w-full text-center p-8">
|
||||||
<img alt="YunoHost application logo" src="{{ url_for('static', filename='yunohost-package.png') }}" class="w-32 mx-auto">
|
<img alt="YunoHost application logo" src="{{ url_for('static', filename='yunohost-package.png') }}" class="w-32 mx-auto">
|
||||||
<h1 class="text-2xl font-bold">
|
<h1 class="text-2xl font-bold">
|
||||||
{{ _("Yunohost application generation form") }}
|
{{ _("YunoHost package generator") }}
|
||||||
</h1>
|
</h1>
|
||||||
<p>Version: {{ generator_info['GENERATOR_VERSION'] }}</p>
|
<p>Version: {{ config["GENERATOR_VERSION"] }}</p>
|
||||||
<script>
|
<script>
|
||||||
function changeLanguage(lang) {
|
function changeLanguage(lang) {
|
||||||
var url = "{{ url_for('set_language', language=lang) }}" + lang;
|
var url = "{{ url_for('set_lang', lang=lang) }}" + lang;
|
||||||
window.location.href = url;
|
window.location.href = url;
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
<div>
|
<div>
|
||||||
{% for lang in AVAILABLE_LANGUAGES.items() %}
|
{% for lang_id, lang_label in config["LANGUAGES"].items() %}
|
||||||
<button class="btn btn-sm bg-gray-200" type="button" onclick="changeLanguage('{{ lang[0] }}')">{{ lang[1] }}</button>
|
<button class="btn btn-sm bg-gray-200" type="button" onclick="changeLanguage('{{ lang_id }}')">{{ lang_label }}</button>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -44,17 +76,18 @@
|
||||||
<form method="POST" role="form">
|
<form method="POST" role="form">
|
||||||
|
|
||||||
{{ main_form.hidden_tag() }}
|
{{ main_form.hidden_tag() }}
|
||||||
<div class="text-red-800">
|
<div class="text-red-500 text-center">
|
||||||
{{ wtf.form_errors(main_form, hiddens="only") }}
|
{% if main_form.errors %}<p>{{ _("The form contains issues") }}<p/>{% endif %}
|
||||||
|
{{ form_errors(main_form, hiddens="only") }}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{ form_field(main_form.generator_mode) }}
|
{{ form_field(main_form.generator_mode) }}
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("1/9 - General information") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("1/9 - General information") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
<div>
|
<div>
|
||||||
{{ form_field(main_form.app_name) }}
|
{{ form_field(main_form.app_name) }}
|
||||||
{{ form_field(main_form.app_id) }}
|
{{ form_field(main_form.app_id) }}
|
||||||
|
@ -67,10 +100,10 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("2/9 - Upstream information") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("2/9 - Upstream information") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
<p class="tip">{{ gettext("The word 'upstream' refers to the original project that develops and maintains the app") }}</p>
|
<p class="tip">{{ _("The word 'upstream' refers to the original project that develops and maintains the app") }}</p>
|
||||||
<div>
|
<div>
|
||||||
{{ form_field(main_form.license) }}
|
{{ form_field(main_form.license) }}
|
||||||
{{ form_field(main_form.website) }}
|
{{ form_field(main_form.website) }}
|
||||||
|
@ -85,9 +118,9 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("3/9 - Integration in YunoHost") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("3/9 - Integration in YunoHost") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
<div>
|
<div>
|
||||||
{{ form_field(main_form.version) }}
|
{{ form_field(main_form.version) }}
|
||||||
{{ form_field(main_form.maintainers) }}
|
{{ form_field(main_form.maintainers) }}
|
||||||
|
@ -101,13 +134,13 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("4/9 - Questions to ask during installation") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("4/9 - Questions to ask during installation") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
<p class="tip">
|
<p class="tip">
|
||||||
{{ gettext("This part is meant to indicate the questions that will be asked.") }}
|
{{ _("This part is meant to indicate the questions that will be asked.") }}
|
||||||
<br/>
|
<br/>
|
||||||
{{ gettext("NB: only standard questions are asked here, it might be required to complete it by hand using other questions as a guide.") }}
|
{{ _("NB: only standard questions are asked here, it might be required to complete it by hand using other questions as a guide.") }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
@ -121,11 +154,11 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("5/9 - Resources to initialize") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("5/9 - Resources to initialize") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
<p class="tip">
|
<p class="tip">
|
||||||
{{ gettext("Technical elements configured before launching the 'real' app install script. Usually : creating a system user, downloading app sources, initialiser le dossier d'install et de données, install apt dependencies, create a database, ...") }}
|
{{ _("Technical elements configured before launching the 'real' app install script. Usually : creating a system user, downloading app sources, initialiser le dossier d'install et de données, install apt dependencies, create a database, ...") }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<h3>Sources du logiciel</h3>
|
<h3>Sources du logiciel</h3>
|
||||||
|
@ -148,13 +181,13 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("6/9 - Specific technology") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("6/9 - Specific technology") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
{{ form_field(main_form.main_technology) }}
|
{{ form_field(main_form.main_technology) }}
|
||||||
<div id="php_options">
|
<div id="php_options">
|
||||||
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ gettext("You probably want to make sure to have 'phpX.Y-fpm' and others 'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y being the php version you want to use)") }}</div>
|
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ _("You probably want to make sure to have 'phpX.Y-fpm' and others 'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y being the php version you want to use)") }}</div>
|
||||||
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ gettext("The generated application draft will include an nginx configuration snippet that interfaces with PHP-FPM") }}</div>
|
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ _("The generated application draft will include an nginx configuration snippet that interfaces with PHP-FPM") }}</div>
|
||||||
{{ form_field(main_form.use_composer) }}
|
{{ form_field(main_form.use_composer) }}
|
||||||
</div>
|
</div>
|
||||||
<div id="nodejs_options">
|
<div id="nodejs_options">
|
||||||
|
@ -162,11 +195,11 @@
|
||||||
{{ form_field(main_form.use_yarn) }}
|
{{ form_field(main_form.use_yarn) }}
|
||||||
</div>
|
</div>
|
||||||
<div id="python_options">
|
<div id="python_options">
|
||||||
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ gettext("You probably want to make sure to have 'python3' and 'python3-venv' listed in the apt dependencies earlier. Other dependencies should be installed inside a venv (cf the proposed install snippet)") }}</div>
|
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ _("You probably want to make sure to have 'python3' and 'python3-venv' listed in the apt dependencies earlier. Other dependencies should be installed inside a venv (cf the proposed install snippet)") }}</div>
|
||||||
</div>
|
</div>
|
||||||
{{ form_field(main_form.install_snippet) }}
|
{{ form_field(main_form.install_snippet) }}
|
||||||
<div id="systemd_options">
|
<div id="systemd_options">
|
||||||
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ gettext("The generated application draft will include an nginx configuration snippet that reverse-proxies to a systemd service using an internal port") }}</div>
|
<div class="alert alert-info" role="alert"><span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span> {{ _("The generated application draft will include an nginx configuration snippet that reverse-proxies to a systemd service using an internal port") }}</div>
|
||||||
{{ form_field(main_form.systemd_execstart) }}
|
{{ form_field(main_form.systemd_execstart) }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -234,9 +267,9 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("7/9 - App configuration") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("7/9 - App configuration") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
{{ form_field(main_form.use_custom_config_file) }}
|
{{ form_field(main_form.use_custom_config_file) }}
|
||||||
<!-- TODO : this show/hide the other fields -->
|
<!-- TODO : this show/hide the other fields -->
|
||||||
<div id="custom_config_file_options">
|
<div id="custom_config_file_options">
|
||||||
|
@ -258,9 +291,9 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("8/9 - General and advanced documentation") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("8/9 - General and advanced documentation") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
{{ form_field(main_form.description) }}
|
{{ form_field(main_form.description) }}
|
||||||
{{ form_field(main_form.pre_install) }}
|
{{ form_field(main_form.pre_install) }}
|
||||||
{{ form_field(main_form.post_install) }}
|
{{ form_field(main_form.post_install) }}
|
||||||
|
@ -272,9 +305,9 @@
|
||||||
|
|
||||||
<div class="panel">
|
<div class="panel">
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h2 class="panel-title collapse-title">{{ gettext("9/9 - Advanced options") }}</h2>
|
<h2 class="panel-title collapse-title">{{ _("9/9 - Advanced options") }}</h2>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed">
|
<div class="panel-body hide">
|
||||||
{{ form_field(main_form.enable_change_url) }}
|
{{ form_field(main_form.enable_change_url) }}
|
||||||
{{ form_field(main_form.use_logrotate) }}
|
{{ form_field(main_form.use_logrotate) }}
|
||||||
{{ form_field(main_form.use_fail2ban) }}
|
{{ form_field(main_form.use_fail2ban) }}
|
||||||
|
@ -323,7 +356,7 @@
|
||||||
<div class="panel-heading collapse-button">
|
<div class="panel-heading collapse-button">
|
||||||
<h3 class="panel-title collapse-title">{{ file.destination_path }}</h3>
|
<h3 class="panel-title collapse-title">{{ file.destination_path }}</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body collapsible collapsed p-0">
|
<div class="panel-body hide p-0">
|
||||||
<pre class="m-0">{{ file.content }}</pre>
|
<pre class="m-0">{{ file.content }}</pre>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -338,15 +371,9 @@
|
||||||
for (i = 0; i < coll.length; i++) {
|
for (i = 0; i < coll.length; i++) {
|
||||||
coll[i].addEventListener("click", function() {
|
coll[i].addEventListener("click", function() {
|
||||||
|
|
||||||
if (this.classList.contains('expanded')) {
|
this.nextElementSibling.classList.toggle("hide");
|
||||||
this.classList.remove('expanded');
|
|
||||||
this.nextElementSibling.classList.add('collapsed');
|
|
||||||
} else {
|
|
||||||
this.classList.add('expanded');
|
|
||||||
this.nextElementSibling.classList.remove('collapsed');
|
|
||||||
}
|
|
||||||
|
|
||||||
this.classList.toggle("active");
|
this.classList.toggle("active");
|
||||||
|
|
||||||
var content = this.nextElementSibling;
|
var content = this.nextElementSibling;
|
||||||
if (content.style.maxHeight){
|
if (content.style.maxHeight){
|
||||||
content.style.maxHeight = null;
|
content.style.maxHeight = null;
|
||||||
|
|
|
@ -1,213 +0,0 @@
|
||||||
{% macro form_errors(form, hiddens=True) %}
|
|
||||||
{%- if form.errors %}
|
|
||||||
{%- for fieldname, errors in form.errors.items() %}
|
|
||||||
{%- if bootstrap_is_hidden_field(form[fieldname]) and hiddens or
|
|
||||||
not bootstrap_is_hidden_field(form[fieldname]) and hiddens != 'only' %}
|
|
||||||
{%- for error in errors %}
|
|
||||||
<p class="error">{{error}}</p>
|
|
||||||
{%- endfor %}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endmacro %}
|
|
||||||
|
|
||||||
{% macro _hz_form_wrap(horizontal_columns, form_type, add_group=False, required=False) %}
|
|
||||||
{% if form_type == "horizontal" %}
|
|
||||||
{% if add_group %}<div class="form-group{% if required %} required{% endif %}">{% endif %}
|
|
||||||
<div class="col-{{horizontal_columns[0]}}-offset-{{horizontal_columns[1]}}
|
|
||||||
col-{{horizontal_columns[0]}}-{{horizontal_columns[2]}}
|
|
||||||
">
|
|
||||||
{% endif %}
|
|
||||||
{{caller()}}
|
|
||||||
|
|
||||||
{% if form_type == "horizontal" %}
|
|
||||||
{% if add_group %}</div>{% endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endmacro %}
|
|
||||||
|
|
||||||
{% macro form_field(field,
|
|
||||||
form_type="basic",
|
|
||||||
horizontal_columns=('lg', 2, 10),
|
|
||||||
button_map={}) %}
|
|
||||||
|
|
||||||
{# this is a workaround hack for the more straightforward-code of just passing required=required parameter. older versions of wtforms do not have
|
|
||||||
the necessary fix for required=False attributes, but will also not set the required flag in the first place. we skirt the issue using the code below #}
|
|
||||||
{% if field.flags.required and not required in kwargs %}
|
|
||||||
{% set kwargs = dict(required=True, **kwargs) %}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{% if field.widget.input_type == 'checkbox' %}
|
|
||||||
{% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %}
|
|
||||||
<div class="checkbox">
|
|
||||||
<label>
|
|
||||||
{{field()|safe}} {{field.label.text|safe}}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{% endcall %}
|
|
||||||
{%- elif field.type == 'RadioField' -%}
|
|
||||||
{# note: A cleaner solution would be rendering depending on the widget,
|
|
||||||
this is just a hack for now, until I can think of something better #}
|
|
||||||
{% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %}
|
|
||||||
{% for item in field -%}
|
|
||||||
<div class="radio">
|
|
||||||
<label>
|
|
||||||
{{item|safe}} {{item.label.text|safe}}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
{% endfor %}
|
|
||||||
{% endcall %}
|
|
||||||
{%- elif field.type == 'SubmitField' -%}
|
|
||||||
{# deal with jinja scoping issues? #}
|
|
||||||
{% set field_kwargs = kwargs %}
|
|
||||||
|
|
||||||
{# note: same issue as above - should check widget, not field type #}
|
|
||||||
{% call _hz_form_wrap(horizontal_columns, form_type, True, required=required) %}
|
|
||||||
{{field(class='btn btn-%s' % button_map.get(field.name, 'default'),
|
|
||||||
**field_kwargs)}}
|
|
||||||
{% endcall %}
|
|
||||||
{%- elif field.type == 'FormField' -%}
|
|
||||||
{# note: FormFields are tricky to get right and complex setups requiring
|
|
||||||
these are probably beyond the scope of what this macro tries to do.
|
|
||||||
the code below ensures that things don't break horribly if we run into
|
|
||||||
one, but does not try too hard to get things pretty. #}
|
|
||||||
<fieldset>
|
|
||||||
<legend>{{field.label}}</legend>
|
|
||||||
{%- for subfield in field %}
|
|
||||||
{% if not bootstrap_is_hidden_field(subfield) -%}
|
|
||||||
{{ form_field(subfield,
|
|
||||||
form_type=form_type,
|
|
||||||
horizontal_columns=horizontal_columns,
|
|
||||||
button_map=button_map) }}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
</fieldset>
|
|
||||||
{% else -%}
|
|
||||||
<div class="form-group {% if field.errors %} has-error{% endif -%}
|
|
||||||
{%- if field.flags.required %} required{% endif -%}
|
|
||||||
">
|
|
||||||
{%- if form_type == "inline" %}
|
|
||||||
{{field.label(class="sr-only")|safe}}
|
|
||||||
{% if field.type == 'FileField' %}
|
|
||||||
{{field(**kwargs)|safe}}
|
|
||||||
{% else %}
|
|
||||||
{{field(class="form-control", **kwargs)|safe}}
|
|
||||||
{% endif %}
|
|
||||||
{% elif form_type == "horizontal" %}
|
|
||||||
{{field.label(class="control-label " + (
|
|
||||||
" col-%s-%s" % horizontal_columns[0:2]
|
|
||||||
))|safe}}
|
|
||||||
<div class=" col-{{horizontal_columns[0]}}-{{horizontal_columns[2]}}">
|
|
||||||
{% if field.type == 'FileField' %}
|
|
||||||
{{field(**kwargs)|safe}}
|
|
||||||
{% else %}
|
|
||||||
{{field(class="form-control", **kwargs)|safe}}
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{%- if field.errors %}
|
|
||||||
{%- for error in field.errors %}
|
|
||||||
{% call _hz_form_wrap(horizontal_columns, form_type, required=required) %}
|
|
||||||
<p class="help-block">{{error}}</p>
|
|
||||||
{% endcall %}
|
|
||||||
{%- endfor %}
|
|
||||||
{%- elif field.description -%}
|
|
||||||
{% call _hz_form_wrap(horizontal_columns, form_type, required=required) %}
|
|
||||||
<p class="help-block">{{field.description|safe}}</p>
|
|
||||||
{% endcall %}
|
|
||||||
{%- endif %}
|
|
||||||
{%- else -%}
|
|
||||||
{{field.label(class="control-label")|safe}}
|
|
||||||
{% if field.type == 'FileField' %}
|
|
||||||
{{field(**kwargs)|safe}}
|
|
||||||
{% else %}
|
|
||||||
{{field(class="form-control", **kwargs)|safe}}
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{%- if field.errors %}
|
|
||||||
{%- for error in field.errors %}
|
|
||||||
<p class="help-block">{{error}}</p>
|
|
||||||
{%- endfor %}
|
|
||||||
{%- elif field.description -%}
|
|
||||||
<p class="help-block">{{field.description|safe}}</p>
|
|
||||||
{%- endif %}
|
|
||||||
{%- endif %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endmacro %}
|
|
||||||
|
|
||||||
{# valid form types are "basic", "inline" and "horizontal" #}
|
|
||||||
{% macro quick_form(form,
|
|
||||||
action="",
|
|
||||||
method="post",
|
|
||||||
extra_classes=None,
|
|
||||||
role="form",
|
|
||||||
form_type="basic",
|
|
||||||
horizontal_columns=('lg', 2, 10),
|
|
||||||
enctype=None,
|
|
||||||
button_map={},
|
|
||||||
id="",
|
|
||||||
novalidate=False) %}
|
|
||||||
{#-
|
|
||||||
action="" is what we want, from http://www.ietf.org/rfc/rfc2396.txt:
|
|
||||||
|
|
||||||
4.2. Same-document References
|
|
||||||
|
|
||||||
A URI reference that does not contain a URI is a reference to the
|
|
||||||
current document. In other words, an empty URI reference within a
|
|
||||||
document is interpreted as a reference to the start of that document,
|
|
||||||
and a reference containing only a fragment identifier is a reference
|
|
||||||
to the identified fragment of that document. Traversal of such a
|
|
||||||
reference should not result in an additional retrieval action.
|
|
||||||
However, if the URI reference occurs in a context that is always
|
|
||||||
intended to result in a new request, as in the case of HTML's FORM
|
|
||||||
element, then an empty URI reference represents the base URI of the
|
|
||||||
current document and should be replaced by that URI when transformed
|
|
||||||
into a request.
|
|
||||||
|
|
||||||
-#}
|
|
||||||
{#- if any file fields are inside the form and enctype is automatic, adjust
|
|
||||||
if file fields are found. could really use the equalto test of jinja2
|
|
||||||
here, but latter is not available until 2.8
|
|
||||||
|
|
||||||
warning: the code below is guaranteed to make you cry =(
|
|
||||||
#}
|
|
||||||
{%- set _enctype = [] %}
|
|
||||||
{%- if enctype is none -%}
|
|
||||||
{%- for field in form %}
|
|
||||||
{%- if field.type == 'FileField' %}
|
|
||||||
{#- for loops come with a fairly watertight scope, so this list-hack is
|
|
||||||
used to be able to set values outside of it #}
|
|
||||||
{%- set _ = _enctype.append('multipart/form-data') -%}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
{%- else %}
|
|
||||||
{% set _ = _enctype.append(enctype) %}
|
|
||||||
{%- endif %}
|
|
||||||
<form
|
|
||||||
{%- if action != None %} action="{{action}}"{% endif -%}
|
|
||||||
{%- if id %} id="{{id}}"{% endif -%}
|
|
||||||
{%- if method %} method="{{method}}"{% endif %}
|
|
||||||
class="form
|
|
||||||
{%- if extra_classes %} {{extra_classes}}{% endif -%}
|
|
||||||
{%- if form_type == "horizontal" %} form-horizontal
|
|
||||||
{%- elif form_type == "inline" %} form-inline
|
|
||||||
{%- endif -%}
|
|
||||||
"
|
|
||||||
{%- if _enctype[0] %} enctype="{{_enctype[0]}}"{% endif -%}
|
|
||||||
{%- if role %} role="{{role}}"{% endif -%}
|
|
||||||
{%- if novalidate %} novalidate{% endif -%}
|
|
||||||
>
|
|
||||||
{{ form.hidden_tag() }}
|
|
||||||
{{ form_errors(form, hiddens='only') }}
|
|
||||||
|
|
||||||
{%- for field in form %}
|
|
||||||
{% if not bootstrap_is_hidden_field(field) -%}
|
|
||||||
{{ form_field(field,
|
|
||||||
form_type=form_type,
|
|
||||||
horizontal_columns=horizontal_columns,
|
|
||||||
button_map=button_map) }}
|
|
||||||
{%- endif %}
|
|
||||||
{%- endfor %}
|
|
||||||
|
|
||||||
</form>
|
|
||||||
{%- endmacro %}
|
|
Binary file not shown.
|
@ -1,760 +0,0 @@
|
||||||
# English 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-04-26 15:39+0200\n"
|
|
||||||
"PO-Revision-Date: 2024-03-31 20:23+0200\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language: en\n"
|
|
||||||
"Language-Team: en <LL@li.org>\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Generated-By: Babel 2.14.0\n"
|
|
||||||
|
|
||||||
#: app.py:68 app.py:334
|
|
||||||
msgid "English"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:68 app.py:335
|
|
||||||
msgid "French"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:127
|
|
||||||
msgid "Select language"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:137
|
|
||||||
msgid "Application identifier (id)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:138
|
|
||||||
msgid "Small caps and without spaces"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:146
|
|
||||||
msgid "App name"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:147
|
|
||||||
msgid "It's the application name, displayed in the user interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:157
|
|
||||||
msgid "Short description (en)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:158 app.py:165
|
|
||||||
msgid ""
|
|
||||||
"Explain in a few words (10-15) why this app is useful or what it does "
|
|
||||||
"(the goal is to give a broad idea for the user browsing an hundred apps "
|
|
||||||
"long catalog"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:164
|
|
||||||
msgid "Short description (fr)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:176
|
|
||||||
msgid "Version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:182
|
|
||||||
msgid "Maintainer of the generated app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:183
|
|
||||||
msgid "Usually you put your name here... If you're okay with it ;)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:189
|
|
||||||
msgid "Minimal YunoHost version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:190
|
|
||||||
msgid "Minimal YunoHost version for the application to work"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:199
|
|
||||||
msgid "Supported architectures"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:201
|
|
||||||
msgid "All architectures"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:212
|
|
||||||
msgid ""
|
|
||||||
"The app can be installed multiple times at the same time on the same "
|
|
||||||
"server"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:219
|
|
||||||
msgid "The app will be integrating LDAP"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:220
|
|
||||||
msgid ""
|
|
||||||
"Which means it's possible to use Yunohost credentials to log into this "
|
|
||||||
"app. 'LDAP' corresponds to the technology used by Yunohost to handle a "
|
|
||||||
"centralised user base. Bridging the app and Yunohost's LDAP often "
|
|
||||||
"requires to add the proper technical details in the app's configuration "
|
|
||||||
"file"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:224 app.py:238
|
|
||||||
msgid "No"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:225 app.py:237
|
|
||||||
msgid "Yes"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:226 app.py:239
|
|
||||||
msgid "Not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:232
|
|
||||||
msgid "The app will be integrated in Yunohost SSO (Single Sign On)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:233
|
|
||||||
msgid ""
|
|
||||||
"Which means that people will be logged in the app after logging in "
|
|
||||||
"YunoHost's portal, without having to sign on specifically into this app."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:249
|
|
||||||
msgid "Licence"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:250
|
|
||||||
msgid ""
|
|
||||||
"You should check this on the upstream repository. The expected format is "
|
|
||||||
"a SPDX id listed in https://spdx.org/licenses/"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:257
|
|
||||||
msgid "Official website"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:258
|
|
||||||
msgid "Leave empty if there is no official website"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:265
|
|
||||||
msgid "Official app demo"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:266
|
|
||||||
msgid "Leave empty if there is no official demo"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:273
|
|
||||||
msgid "Admin documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:274
|
|
||||||
msgid "Leave empty if there is no official admin doc"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:281
|
|
||||||
msgid "Usage documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:282
|
|
||||||
msgid "Leave empty if there is no official user doc"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:289
|
|
||||||
msgid "Code repository"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:300
|
|
||||||
msgid ""
|
|
||||||
"Ask the URL where the app will be installed ('domain' and 'path' "
|
|
||||||
"variables)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:305
|
|
||||||
msgid "Ask domain+path"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:308
|
|
||||||
msgid ""
|
|
||||||
"Ask only the domain (the app requires to be installed at the root of a "
|
|
||||||
"dedicated domain)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:312
|
|
||||||
msgid "Do not ask (it isn't a webapp)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:317
|
|
||||||
msgid "Ask who can access to the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:318
|
|
||||||
msgid ""
|
|
||||||
"In the users groups : by default at least 'visitors', 'all_users' et "
|
|
||||||
"'admins' exists. (It was previously the private/public app concept)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:325
|
|
||||||
msgid "Ask who can access to the admin interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:326
|
|
||||||
msgid "In the case where the app has an admin interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:331
|
|
||||||
msgid "Supported languages"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:333
|
|
||||||
msgid "None / not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:336
|
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:337
|
|
||||||
msgid "Italian"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:338
|
|
||||||
msgid "German"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:339
|
|
||||||
msgid "Chinese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:340
|
|
||||||
msgid "Japanese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:341
|
|
||||||
msgid "Danish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:342
|
|
||||||
msgid "Portugese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:343
|
|
||||||
msgid "Dutch"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:344
|
|
||||||
msgid "Russian"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:356
|
|
||||||
msgid "Application source code or executable"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:363
|
|
||||||
msgid "Sources sha256 checksum"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:371
|
|
||||||
msgid "Enable automatic update of sources (using a bot running every night)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:372
|
|
||||||
msgid ""
|
|
||||||
"If the upstream software is hosted in one of the handled sources and "
|
|
||||||
"publishes proper releases or tags, the bot will create a pull request to "
|
|
||||||
"update the sources URL and checksum"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:394
|
|
||||||
msgid "Dependencies to be installed via apt (separated by comma and/or spaces)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:403
|
|
||||||
msgid "Initialize an SQL database"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:413
|
|
||||||
msgid "Initialize a system user for this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:418
|
|
||||||
msgid "Initialize an installation folder for this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:419
|
|
||||||
msgid "By default it's /var/www/$app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:424
|
|
||||||
msgid "Initialize a folder to store the app data"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:425
|
|
||||||
msgid "By default it's /var/yunohost.app/$app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:433
|
|
||||||
msgid "App main technology"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:435
|
|
||||||
msgid "None / Static application"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:440
|
|
||||||
msgid "Other"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:447
|
|
||||||
msgid "Installation specific commands"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:448
|
|
||||||
msgid ""
|
|
||||||
"These commands are executed from the app installation folder (by default,"
|
|
||||||
" /var/www/$app) after the sources have been deployed. This field uses by "
|
|
||||||
"default a classic example based on the selected technology. You should "
|
|
||||||
"probably compare and adapt it according to the app installation "
|
|
||||||
"documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:460
|
|
||||||
msgid "Use composer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:461
|
|
||||||
msgid "Composer is a PHP dependencies manager used by some apps"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:472
|
|
||||||
msgid "NodeJS version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:473
|
|
||||||
msgid "For example: 16.4, 18, 18.2, 20, 20.1, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:480
|
|
||||||
msgid "Install and use Yarn"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:487
|
|
||||||
msgid "Command to start the app daemon (from systemd service)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:488
|
|
||||||
msgid ""
|
|
||||||
"Corresponds to 'ExecStart' statement in systemd. You can use "
|
|
||||||
"'__INSTALL_DIR__' to refer to the install directory, or '__APP__' to "
|
|
||||||
"refer to the app id"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:500
|
|
||||||
msgid "The app uses a specific configuration file"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:501
|
|
||||||
msgid "Usually : .env, config.json, conf.ini, params.yml, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:508
|
|
||||||
msgid "Name or file path to use"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:516
|
|
||||||
msgid "App configuration file pattern"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:517
|
|
||||||
msgid ""
|
|
||||||
"In this pattern, you can use the syntax __FOO_BAR__ which will "
|
|
||||||
"automatically replaced by the value of the variable $foo_bar"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:529
|
|
||||||
msgid ""
|
|
||||||
"doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly "
|
|
||||||
"listing the main features, possible warnings and specific details on its "
|
|
||||||
"functioning in Yunohost (e.g. warning about integration issues)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:539
|
|
||||||
msgid ""
|
|
||||||
"doc/PRE_INSTALL.md: important info to be shown to the admin before "
|
|
||||||
"installing the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:540 app.py:548 app.py:556 app.py:564 app.py:572
|
|
||||||
msgid "Leave empty if not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:547
|
|
||||||
msgid ""
|
|
||||||
"doc/POST_INSTALL.md: important info to be shown to the admin after "
|
|
||||||
"installing the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:555
|
|
||||||
msgid ""
|
|
||||||
"doc/PRE_UPGRADE.md: important info to be shown to the admin before "
|
|
||||||
"upgrading the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:563
|
|
||||||
msgid ""
|
|
||||||
"doc/POST_UPGRADE.md: important info to be shown to the admin after "
|
|
||||||
"upgrading the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:571
|
|
||||||
msgid "doc/ADMIN.md: general tips on how to administrate this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:583
|
|
||||||
msgid "Handle app install URL change (change_url script)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:586
|
|
||||||
msgid "Should changing the app URL be allowed ? (change_url change)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:593
|
|
||||||
msgid "Use logrotate for the app logs"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:596
|
|
||||||
msgid ""
|
|
||||||
"If the app generates logs, this option permit to handle their archival. "
|
|
||||||
"Recommended."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:604
|
|
||||||
msgid "Protect the application against brute force attacks (via fail2ban)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:609
|
|
||||||
msgid ""
|
|
||||||
"If the app generates failed connexions logs, this option allows to "
|
|
||||||
"automatically banish the related IP after a certain number of failed "
|
|
||||||
"password tries. Recommended."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:615
|
|
||||||
msgid "Add a CRON task for this application"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:616
|
|
||||||
msgid "Corresponds to some app periodic operations"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:620
|
|
||||||
msgid "Type the CRON file content"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:629
|
|
||||||
msgid "Regular expression for fail2ban"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:633
|
|
||||||
msgid "A regular expression"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:635
|
|
||||||
msgid ""
|
|
||||||
"Regular expression to check in the log file to activate failban (search "
|
|
||||||
"for a line that indicates a credentials error)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:659
|
|
||||||
msgid "Generator mode"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:660
|
|
||||||
msgid ""
|
|
||||||
"In tutorial version, the generated app will contain additionnal comments "
|
|
||||||
"to ease the understanding. In steamlined version, the generated app will "
|
|
||||||
"only contain the necessary minimum."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:664
|
|
||||||
msgid "Streamlined version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:665
|
|
||||||
msgid "Tutorial version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:671
|
|
||||||
msgid "Previsualise"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:672
|
|
||||||
msgid "Download the .zip"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:674
|
|
||||||
msgid "Fill with demo values"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:677
|
|
||||||
msgid ""
|
|
||||||
"Generate a complete and functionnal minimalistic app that you can iterate"
|
|
||||||
" from"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/base.html:5
|
|
||||||
msgid "YunoHost app generator"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:28
|
|
||||||
msgid "Yunohost application generation form"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:55
|
|
||||||
msgid "1/9 - General information"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:70
|
|
||||||
msgid "2/9 - Upstream information"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:73
|
|
||||||
msgid ""
|
|
||||||
"The word 'upstream' refers to the original project that develops and "
|
|
||||||
"maintains the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:88
|
|
||||||
msgid "3/9 - Integration in YunoHost"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:104
|
|
||||||
msgid "4/9 - Questions to ask during installation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:108
|
|
||||||
msgid "This part is meant to indicate the questions that will be asked."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:110
|
|
||||||
msgid ""
|
|
||||||
"NB: only standard questions are asked here, it might be required to "
|
|
||||||
"complete it by hand using other questions as a guide."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:124
|
|
||||||
msgid "5/9 - Resources to initialize"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:128
|
|
||||||
msgid ""
|
|
||||||
"Technical elements configured before launching the 'real' app install "
|
|
||||||
"script. Usually : creating a system user, downloading app sources, "
|
|
||||||
"initialiser le dossier d'install et de données, install apt dependencies,"
|
|
||||||
" create a database, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:151
|
|
||||||
msgid "6/9 - Specific technology"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:156
|
|
||||||
msgid ""
|
|
||||||
"You probably want to make sure to have 'phpX.Y-fpm' and others "
|
|
||||||
"'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y "
|
|
||||||
"being the php version you want to use)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:157
|
|
||||||
msgid ""
|
|
||||||
"The generated application draft will include an nginx configuration "
|
|
||||||
"snippet that interfaces with PHP-FPM"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:165
|
|
||||||
msgid ""
|
|
||||||
"You probably want to make sure to have 'python3' and 'python3-venv' "
|
|
||||||
"listed in the apt dependencies earlier. Other dependencies should be "
|
|
||||||
"installed inside a venv (cf the proposed install snippet)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:169
|
|
||||||
msgid ""
|
|
||||||
"The generated application draft will include an nginx configuration "
|
|
||||||
"snippet that reverse-proxies to a systemd service using an internal port"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:237
|
|
||||||
msgid "7/9 - App configuration"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:261
|
|
||||||
msgid "8/9 - General and advanced documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:275
|
|
||||||
msgid "9/9 - Advanced options"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Maintener of the generated app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Commonly you put your name here... If you agree with it ;)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Which means it's possible to use "
|
|
||||||
#~ "Yunohost credential to connect. 'LDAP' "
|
|
||||||
#~ "corresponds to the technology used by"
|
|
||||||
#~ " Yunohost to handle a centralised "
|
|
||||||
#~ "user base. Bridging the APP and "
|
|
||||||
#~ "Yunohost LDAP often requires to fill "
|
|
||||||
#~ "some parameters in the app configuration"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Which means that one connexion to "
|
|
||||||
#~ "Yunohost unlock the connexion to the "
|
|
||||||
#~ "software, without having to sign on "
|
|
||||||
#~ "specificaly into it. One only has "
|
|
||||||
#~ "to connect once (Single Sign On)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Activate the automated source update bot"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "If the software is available in "
|
|
||||||
#~ "one of the handled sources and "
|
|
||||||
#~ "publish releases or tags for its "
|
|
||||||
#~ "new updates, or for each new "
|
|
||||||
#~ "commit, a bot will provide an "
|
|
||||||
#~ "update with updated URL and checksum"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Dependances to be installed via apt "
|
|
||||||
#~ "(separated by a quote and/or spaces)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a SQL database"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a system user for this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise an installation folder for this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a folder to store the app data"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Type the content of DESCRIPTION.md file."
|
|
||||||
#~ " <br> Do not give the software "
|
|
||||||
#~ "name at the beginning, as it will"
|
|
||||||
#~ " be integrated an 'Overview' subpart"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Type the DISCLAIMER.md file content, "
|
|
||||||
#~ "which list warnings and attention "
|
|
||||||
#~ "points."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the PRE_INSTALL.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the POST_INSTALL.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the PRE_UPGRADE.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the POST_UPGRADE.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the ADMIN.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "2/9 - Informations about the application"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "The word upstream refers to the original project that maintains the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "5/9 - Ressources to initialise"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "A more complete presentation that the"
|
|
||||||
#~ " summary completed above, explaining to "
|
|
||||||
#~ "what correspond the software, the "
|
|
||||||
#~ "eventual warnings and specific details "
|
|
||||||
#~ "on its functioning in Yunohost (it's "
|
|
||||||
#~ "the place where one can warn about"
|
|
||||||
#~ " integration issues)."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Indications to show at key steps "
|
|
||||||
#~ "to manage the package : installation,"
|
|
||||||
#~ " update, message to the admin "
|
|
||||||
#~ "account. You usually don't have to "
|
|
||||||
#~ "fill them."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Description courte (fr)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Français"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/DESCRIPTION.md : A comprehensive "
|
|
||||||
#~ "presentation of the app, possibly "
|
|
||||||
#~ "listing the main features, possible "
|
|
||||||
#~ "warnings and specific details on its "
|
|
||||||
#~ "functioning in Yunohost (e.g. warning "
|
|
||||||
#~ "about integration issues)."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/PRE_INSTALL.md : important info to "
|
|
||||||
#~ "be shown to the admin before "
|
|
||||||
#~ "installing the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/POST_INSTALL.md : important info to "
|
|
||||||
#~ "be shown to the admin after "
|
|
||||||
#~ "installing the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/PRE_UPGRADE.md : important info to "
|
|
||||||
#~ "be shown to the admin before "
|
|
||||||
#~ "upgrading the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/POST_UPGRADE.md : important info to "
|
|
||||||
#~ "be shown to the admin after "
|
|
||||||
#~ "upgrading the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "doc/ADMIN.md : general tips on how to administrate this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
Binary file not shown.
|
@ -1,760 +0,0 @@
|
||||||
# Spanish 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-04-26 15:39+0200\n"
|
|
||||||
"PO-Revision-Date: 2024-03-31 20:02+0200\n"
|
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
|
||||||
"Language: es\n"
|
|
||||||
"Language-Team: es <LL@li.org>\n"
|
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
|
||||||
"MIME-Version: 1.0\n"
|
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
|
||||||
"Generated-By: Babel 2.14.0\n"
|
|
||||||
|
|
||||||
#: app.py:68 app.py:334
|
|
||||||
msgid "English"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:68 app.py:335
|
|
||||||
msgid "French"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:127
|
|
||||||
msgid "Select language"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:137
|
|
||||||
msgid "Application identifier (id)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:138
|
|
||||||
msgid "Small caps and without spaces"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:146
|
|
||||||
msgid "App name"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:147
|
|
||||||
msgid "It's the application name, displayed in the user interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:157
|
|
||||||
msgid "Short description (en)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:158 app.py:165
|
|
||||||
msgid ""
|
|
||||||
"Explain in a few words (10-15) why this app is useful or what it does "
|
|
||||||
"(the goal is to give a broad idea for the user browsing an hundred apps "
|
|
||||||
"long catalog"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:164
|
|
||||||
msgid "Short description (fr)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:176
|
|
||||||
msgid "Version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:182
|
|
||||||
msgid "Maintainer of the generated app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:183
|
|
||||||
msgid "Usually you put your name here... If you're okay with it ;)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:189
|
|
||||||
msgid "Minimal YunoHost version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:190
|
|
||||||
msgid "Minimal YunoHost version for the application to work"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:199
|
|
||||||
msgid "Supported architectures"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:201
|
|
||||||
msgid "All architectures"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:212
|
|
||||||
msgid ""
|
|
||||||
"The app can be installed multiple times at the same time on the same "
|
|
||||||
"server"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:219
|
|
||||||
msgid "The app will be integrating LDAP"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:220
|
|
||||||
msgid ""
|
|
||||||
"Which means it's possible to use Yunohost credentials to log into this "
|
|
||||||
"app. 'LDAP' corresponds to the technology used by Yunohost to handle a "
|
|
||||||
"centralised user base. Bridging the app and Yunohost's LDAP often "
|
|
||||||
"requires to add the proper technical details in the app's configuration "
|
|
||||||
"file"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:224 app.py:238
|
|
||||||
msgid "No"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:225 app.py:237
|
|
||||||
msgid "Yes"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:226 app.py:239
|
|
||||||
msgid "Not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:232
|
|
||||||
msgid "The app will be integrated in Yunohost SSO (Single Sign On)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:233
|
|
||||||
msgid ""
|
|
||||||
"Which means that people will be logged in the app after logging in "
|
|
||||||
"YunoHost's portal, without having to sign on specifically into this app."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:249
|
|
||||||
msgid "Licence"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:250
|
|
||||||
msgid ""
|
|
||||||
"You should check this on the upstream repository. The expected format is "
|
|
||||||
"a SPDX id listed in https://spdx.org/licenses/"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:257
|
|
||||||
msgid "Official website"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:258
|
|
||||||
msgid "Leave empty if there is no official website"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:265
|
|
||||||
msgid "Official app demo"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:266
|
|
||||||
msgid "Leave empty if there is no official demo"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:273
|
|
||||||
msgid "Admin documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:274
|
|
||||||
msgid "Leave empty if there is no official admin doc"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:281
|
|
||||||
msgid "Usage documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:282
|
|
||||||
msgid "Leave empty if there is no official user doc"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:289
|
|
||||||
msgid "Code repository"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:300
|
|
||||||
msgid ""
|
|
||||||
"Ask the URL where the app will be installed ('domain' and 'path' "
|
|
||||||
"variables)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:305
|
|
||||||
msgid "Ask domain+path"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:308
|
|
||||||
msgid ""
|
|
||||||
"Ask only the domain (the app requires to be installed at the root of a "
|
|
||||||
"dedicated domain)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:312
|
|
||||||
msgid "Do not ask (it isn't a webapp)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:317
|
|
||||||
msgid "Ask who can access to the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:318
|
|
||||||
msgid ""
|
|
||||||
"In the users groups : by default at least 'visitors', 'all_users' et "
|
|
||||||
"'admins' exists. (It was previously the private/public app concept)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:325
|
|
||||||
msgid "Ask who can access to the admin interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:326
|
|
||||||
msgid "In the case where the app has an admin interface"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:331
|
|
||||||
msgid "Supported languages"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:333
|
|
||||||
msgid "None / not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:336
|
|
||||||
msgid "Spanish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:337
|
|
||||||
msgid "Italian"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:338
|
|
||||||
msgid "German"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:339
|
|
||||||
msgid "Chinese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:340
|
|
||||||
msgid "Japanese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:341
|
|
||||||
msgid "Danish"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:342
|
|
||||||
msgid "Portugese"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:343
|
|
||||||
msgid "Dutch"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:344
|
|
||||||
msgid "Russian"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:356
|
|
||||||
msgid "Application source code or executable"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:363
|
|
||||||
msgid "Sources sha256 checksum"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:371
|
|
||||||
msgid "Enable automatic update of sources (using a bot running every night)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:372
|
|
||||||
msgid ""
|
|
||||||
"If the upstream software is hosted in one of the handled sources and "
|
|
||||||
"publishes proper releases or tags, the bot will create a pull request to "
|
|
||||||
"update the sources URL and checksum"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:394
|
|
||||||
msgid "Dependencies to be installed via apt (separated by comma and/or spaces)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:403
|
|
||||||
msgid "Initialize an SQL database"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:413
|
|
||||||
msgid "Initialize a system user for this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:418
|
|
||||||
msgid "Initialize an installation folder for this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:419
|
|
||||||
msgid "By default it's /var/www/$app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:424
|
|
||||||
msgid "Initialize a folder to store the app data"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:425
|
|
||||||
msgid "By default it's /var/yunohost.app/$app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:433
|
|
||||||
msgid "App main technology"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:435
|
|
||||||
msgid "None / Static application"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:440
|
|
||||||
msgid "Other"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:447
|
|
||||||
msgid "Installation specific commands"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:448
|
|
||||||
msgid ""
|
|
||||||
"These commands are executed from the app installation folder (by default,"
|
|
||||||
" /var/www/$app) after the sources have been deployed. This field uses by "
|
|
||||||
"default a classic example based on the selected technology. You should "
|
|
||||||
"probably compare and adapt it according to the app installation "
|
|
||||||
"documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:460
|
|
||||||
msgid "Use composer"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:461
|
|
||||||
msgid "Composer is a PHP dependencies manager used by some apps"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:472
|
|
||||||
msgid "NodeJS version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:473
|
|
||||||
msgid "For example: 16.4, 18, 18.2, 20, 20.1, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:480
|
|
||||||
msgid "Install and use Yarn"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:487
|
|
||||||
msgid "Command to start the app daemon (from systemd service)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:488
|
|
||||||
msgid ""
|
|
||||||
"Corresponds to 'ExecStart' statement in systemd. You can use "
|
|
||||||
"'__INSTALL_DIR__' to refer to the install directory, or '__APP__' to "
|
|
||||||
"refer to the app id"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:500
|
|
||||||
msgid "The app uses a specific configuration file"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:501
|
|
||||||
msgid "Usually : .env, config.json, conf.ini, params.yml, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:508
|
|
||||||
msgid "Name or file path to use"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:516
|
|
||||||
msgid "App configuration file pattern"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:517
|
|
||||||
msgid ""
|
|
||||||
"In this pattern, you can use the syntax __FOO_BAR__ which will "
|
|
||||||
"automatically replaced by the value of the variable $foo_bar"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:529
|
|
||||||
msgid ""
|
|
||||||
"doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly "
|
|
||||||
"listing the main features, possible warnings and specific details on its "
|
|
||||||
"functioning in Yunohost (e.g. warning about integration issues)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:539
|
|
||||||
msgid ""
|
|
||||||
"doc/PRE_INSTALL.md: important info to be shown to the admin before "
|
|
||||||
"installing the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:540 app.py:548 app.py:556 app.py:564 app.py:572
|
|
||||||
msgid "Leave empty if not relevant"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:547
|
|
||||||
msgid ""
|
|
||||||
"doc/POST_INSTALL.md: important info to be shown to the admin after "
|
|
||||||
"installing the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:555
|
|
||||||
msgid ""
|
|
||||||
"doc/PRE_UPGRADE.md: important info to be shown to the admin before "
|
|
||||||
"upgrading the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:563
|
|
||||||
msgid ""
|
|
||||||
"doc/POST_UPGRADE.md: important info to be shown to the admin after "
|
|
||||||
"upgrading the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:571
|
|
||||||
msgid "doc/ADMIN.md: general tips on how to administrate this app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:583
|
|
||||||
msgid "Handle app install URL change (change_url script)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:586
|
|
||||||
msgid "Should changing the app URL be allowed ? (change_url change)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:593
|
|
||||||
msgid "Use logrotate for the app logs"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:596
|
|
||||||
msgid ""
|
|
||||||
"If the app generates logs, this option permit to handle their archival. "
|
|
||||||
"Recommended."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:604
|
|
||||||
msgid "Protect the application against brute force attacks (via fail2ban)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:609
|
|
||||||
msgid ""
|
|
||||||
"If the app generates failed connexions logs, this option allows to "
|
|
||||||
"automatically banish the related IP after a certain number of failed "
|
|
||||||
"password tries. Recommended."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:615
|
|
||||||
msgid "Add a CRON task for this application"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:616
|
|
||||||
msgid "Corresponds to some app periodic operations"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:620
|
|
||||||
msgid "Type the CRON file content"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:629
|
|
||||||
msgid "Regular expression for fail2ban"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:633
|
|
||||||
msgid "A regular expression"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:635
|
|
||||||
msgid ""
|
|
||||||
"Regular expression to check in the log file to activate failban (search "
|
|
||||||
"for a line that indicates a credentials error)."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:659
|
|
||||||
msgid "Generator mode"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:660
|
|
||||||
msgid ""
|
|
||||||
"In tutorial version, the generated app will contain additionnal comments "
|
|
||||||
"to ease the understanding. In steamlined version, the generated app will "
|
|
||||||
"only contain the necessary minimum."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:664
|
|
||||||
msgid "Streamlined version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:665
|
|
||||||
msgid "Tutorial version"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:671
|
|
||||||
msgid "Previsualise"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:672
|
|
||||||
msgid "Download the .zip"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:674
|
|
||||||
msgid "Fill with demo values"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: app.py:677
|
|
||||||
msgid ""
|
|
||||||
"Generate a complete and functionnal minimalistic app that you can iterate"
|
|
||||||
" from"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/base.html:5
|
|
||||||
msgid "YunoHost app generator"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:28
|
|
||||||
msgid "Yunohost application generation form"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:55
|
|
||||||
msgid "1/9 - General information"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:70
|
|
||||||
msgid "2/9 - Upstream information"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:73
|
|
||||||
msgid ""
|
|
||||||
"The word 'upstream' refers to the original project that develops and "
|
|
||||||
"maintains the app"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:88
|
|
||||||
msgid "3/9 - Integration in YunoHost"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:104
|
|
||||||
msgid "4/9 - Questions to ask during installation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:108
|
|
||||||
msgid "This part is meant to indicate the questions that will be asked."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:110
|
|
||||||
msgid ""
|
|
||||||
"NB: only standard questions are asked here, it might be required to "
|
|
||||||
"complete it by hand using other questions as a guide."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:124
|
|
||||||
msgid "5/9 - Resources to initialize"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:128
|
|
||||||
msgid ""
|
|
||||||
"Technical elements configured before launching the 'real' app install "
|
|
||||||
"script. Usually : creating a system user, downloading app sources, "
|
|
||||||
"initialiser le dossier d'install et de données, install apt dependencies,"
|
|
||||||
" create a database, ..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:151
|
|
||||||
msgid "6/9 - Specific technology"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:156
|
|
||||||
msgid ""
|
|
||||||
"You probably want to make sure to have 'phpX.Y-fpm' and others "
|
|
||||||
"'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y "
|
|
||||||
"being the php version you want to use)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:157
|
|
||||||
msgid ""
|
|
||||||
"The generated application draft will include an nginx configuration "
|
|
||||||
"snippet that interfaces with PHP-FPM"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:165
|
|
||||||
msgid ""
|
|
||||||
"You probably want to make sure to have 'python3' and 'python3-venv' "
|
|
||||||
"listed in the apt dependencies earlier. Other dependencies should be "
|
|
||||||
"installed inside a venv (cf the proposed install snippet)"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:169
|
|
||||||
msgid ""
|
|
||||||
"The generated application draft will include an nginx configuration "
|
|
||||||
"snippet that reverse-proxies to a systemd service using an internal port"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:237
|
|
||||||
msgid "7/9 - App configuration"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:261
|
|
||||||
msgid "8/9 - General and advanced documentation"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: templates/index.html:275
|
|
||||||
msgid "9/9 - Advanced options"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Maintener of the generated app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Commonly you put your name here... If you agree with it ;)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Which means it's possible to use "
|
|
||||||
#~ "Yunohost credential to connect. 'LDAP' "
|
|
||||||
#~ "corresponds to the technology used by"
|
|
||||||
#~ " Yunohost to handle a centralised "
|
|
||||||
#~ "user base. Bridging the APP and "
|
|
||||||
#~ "Yunohost LDAP often requires to fill "
|
|
||||||
#~ "some parameters in the app configuration"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Which means that one connexion to "
|
|
||||||
#~ "Yunohost unlock the connexion to the "
|
|
||||||
#~ "software, without having to sign on "
|
|
||||||
#~ "specificaly into it. One only has "
|
|
||||||
#~ "to connect once (Single Sign On)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Activate the automated source update bot"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "If the software is available in "
|
|
||||||
#~ "one of the handled sources and "
|
|
||||||
#~ "publish releases or tags for its "
|
|
||||||
#~ "new updates, or for each new "
|
|
||||||
#~ "commit, a bot will provide an "
|
|
||||||
#~ "update with updated URL and checksum"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Dependances to be installed via apt "
|
|
||||||
#~ "(separated by a quote and/or spaces)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a SQL database"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a system user for this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise an installation folder for this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Initialise a folder to store the app data"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Type the content of DESCRIPTION.md file."
|
|
||||||
#~ " <br> Do not give the software "
|
|
||||||
#~ "name at the beginning, as it will"
|
|
||||||
#~ " be integrated an 'Overview' subpart"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Type the DISCLAIMER.md file content, "
|
|
||||||
#~ "which list warnings and attention "
|
|
||||||
#~ "points."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the PRE_INSTALL.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the POST_INSTALL.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the PRE_UPGRADE.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the POST_UPGRADE.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Type the ADMIN.md file content"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "2/9 - Informations about the application"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "The word upstream refers to the original project that maintains the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "5/9 - Ressources to initialise"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "A more complete presentation that the"
|
|
||||||
#~ " summary completed above, explaining to "
|
|
||||||
#~ "what correspond the software, the "
|
|
||||||
#~ "eventual warnings and specific details "
|
|
||||||
#~ "on its functioning in Yunohost (it's "
|
|
||||||
#~ "the place where one can warn about"
|
|
||||||
#~ " integration issues)."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "Indications to show at key steps "
|
|
||||||
#~ "to manage the package : installation,"
|
|
||||||
#~ " update, message to the admin "
|
|
||||||
#~ "account. You usually don't have to "
|
|
||||||
#~ "fill them."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Description courte (fr)"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "Français"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/DESCRIPTION.md : A comprehensive "
|
|
||||||
#~ "presentation of the app, possibly "
|
|
||||||
#~ "listing the main features, possible "
|
|
||||||
#~ "warnings and specific details on its "
|
|
||||||
#~ "functioning in Yunohost (e.g. warning "
|
|
||||||
#~ "about integration issues)."
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/PRE_INSTALL.md : important info to "
|
|
||||||
#~ "be shown to the admin before "
|
|
||||||
#~ "installing the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/POST_INSTALL.md : important info to "
|
|
||||||
#~ "be shown to the admin after "
|
|
||||||
#~ "installing the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/PRE_UPGRADE.md : important info to "
|
|
||||||
#~ "be shown to the admin before "
|
|
||||||
#~ "upgrading the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid ""
|
|
||||||
#~ "doc/POST_UPGRADE.md : important info to "
|
|
||||||
#~ "be shown to the admin after "
|
|
||||||
#~ "upgrading the app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
||||||
#~ msgid "doc/ADMIN.md : general tips on how to administrate this app"
|
|
||||||
#~ msgstr ""
|
|
||||||
|
|
Binary file not shown.
|
@ -7,7 +7,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PROJECT VERSION\n"
|
"Project-Id-Version: PROJECT VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n"
|
||||||
"POT-Creation-Date: 2024-04-26 15:39+0200\n"
|
"POT-Creation-Date: 2024-05-08 17:57+0200\n"
|
||||||
"PO-Revision-Date: 2024-03-31 20:23+0200\n"
|
"PO-Revision-Date: 2024-03-31 20:23+0200\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language: fr\n"
|
"Language: fr\n"
|
||||||
|
@ -16,43 +16,39 @@ msgstr ""
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=utf-8\n"
|
"Content-Type: text/plain; charset=utf-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Generated-By: Babel 2.14.0\n"
|
"Generated-By: Babel 2.15.0\n"
|
||||||
|
|
||||||
#: app.py:68 app.py:334
|
#: app.py:41 app.py:291
|
||||||
msgid "English"
|
msgid "English"
|
||||||
msgstr "Anglais"
|
msgstr "Anglais"
|
||||||
|
|
||||||
#: app.py:68 app.py:335
|
#: app.py:41 app.py:292
|
||||||
msgid "French"
|
msgid "French"
|
||||||
msgstr "Français"
|
msgstr "Français"
|
||||||
|
|
||||||
#: app.py:127
|
#: app.py:100
|
||||||
msgid "Select language"
|
|
||||||
msgstr "Langues supportées"
|
|
||||||
|
|
||||||
#: app.py:137
|
|
||||||
msgid "Application identifier (id)"
|
msgid "Application identifier (id)"
|
||||||
msgstr "Identifiant (id) de l'application"
|
msgstr "Identifiant (id) de l'application"
|
||||||
|
|
||||||
#: app.py:138
|
#: app.py:101
|
||||||
msgid "Small caps and without spaces"
|
msgid "Small caps and without spaces"
|
||||||
msgstr "En minuscule et sans espace"
|
msgstr "En minuscule et sans espace"
|
||||||
|
|
||||||
#: app.py:146
|
#: app.py:109
|
||||||
msgid "App name"
|
msgid "App name"
|
||||||
msgstr "Nom de l'application"
|
msgstr "Nom de l'application"
|
||||||
|
|
||||||
#: app.py:147
|
#: app.py:110
|
||||||
msgid "It's the application name, displayed in the user interface"
|
msgid "It's the application name, displayed in the user interface"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Il s'agit du nom l'application, affiché dans les interfaces "
|
"Il s'agit du nom l'application, affiché dans les interfaces "
|
||||||
"utilisateur·ice·s"
|
"utilisateur·ice·s"
|
||||||
|
|
||||||
#: app.py:157
|
#: app.py:118
|
||||||
msgid "Short description (en)"
|
msgid "Short description (en)"
|
||||||
msgstr "Description courte (en)"
|
msgstr "Description courte (en)"
|
||||||
|
|
||||||
#: app.py:158 app.py:165
|
#: app.py:119 app.py:126
|
||||||
msgid ""
|
msgid ""
|
||||||
"Explain in a few words (10-15) why this app is useful or what it does "
|
"Explain in a few words (10-15) why this app is useful or what it does "
|
||||||
"(the goal is to give a broad idea for the user browsing an hundred apps "
|
"(the goal is to give a broad idea for the user browsing an hundred apps "
|
||||||
|
@ -62,39 +58,39 @@ msgstr ""
|
||||||
"fait (l'objectif est de donner une idée grossière pour des utilisateurs "
|
"fait (l'objectif est de donner une idée grossière pour des utilisateurs "
|
||||||
"qui naviguent dans un catalogue de 100+ apps)"
|
"qui naviguent dans un catalogue de 100+ apps)"
|
||||||
|
|
||||||
#: app.py:164
|
#: app.py:125
|
||||||
msgid "Short description (fr)"
|
msgid "Short description (fr)"
|
||||||
msgstr "Description courte (fr)"
|
msgstr "Description courte (fr)"
|
||||||
|
|
||||||
#: app.py:176
|
#: app.py:137
|
||||||
msgid "Version"
|
msgid "Version"
|
||||||
msgstr "Version"
|
msgstr "Version"
|
||||||
|
|
||||||
#: app.py:182
|
#: app.py:143
|
||||||
msgid "Maintainer of the generated app"
|
msgid "Maintainer of the generated app"
|
||||||
msgstr "Mainteneur·euse de l'app YunoHost créée"
|
msgstr "Mainteneur·euse de l'app YunoHost créée"
|
||||||
|
|
||||||
#: app.py:183
|
#: app.py:144
|
||||||
msgid "Usually you put your name here... If you're okay with it ;)"
|
msgid "Usually you put your name here... If you're okay with it ;)"
|
||||||
msgstr "Généralement vous mettez votre nom ici… Si vous êtes d'accord ;)"
|
msgstr "Généralement vous mettez votre nom ici… Si vous êtes d'accord ;)"
|
||||||
|
|
||||||
#: app.py:189
|
#: app.py:148
|
||||||
msgid "Minimal YunoHost version"
|
msgid "Minimal YunoHost version"
|
||||||
msgstr "Version YunoHost minimale"
|
msgstr "Version YunoHost minimale"
|
||||||
|
|
||||||
#: app.py:190
|
#: app.py:149
|
||||||
msgid "Minimal YunoHost version for the application to work"
|
msgid "Minimal YunoHost version for the application to work"
|
||||||
msgstr "Version minimale de Yunohost pour que l'application fonctionne."
|
msgstr "Version minimale de Yunohost pour que l'application fonctionne."
|
||||||
|
|
||||||
#: app.py:199
|
#: app.py:156
|
||||||
msgid "Supported architectures"
|
msgid "Supported architectures"
|
||||||
msgstr "Architectures supportées"
|
msgstr "Architectures supportées"
|
||||||
|
|
||||||
#: app.py:201
|
#: app.py:158
|
||||||
msgid "All architectures"
|
msgid "All architectures"
|
||||||
msgstr "Toutes les architectures"
|
msgstr "Toutes les architectures"
|
||||||
|
|
||||||
#: app.py:212
|
#: app.py:169
|
||||||
msgid ""
|
msgid ""
|
||||||
"The app can be installed multiple times at the same time on the same "
|
"The app can be installed multiple times at the same time on the same "
|
||||||
"server"
|
"server"
|
||||||
|
@ -102,11 +98,11 @@ msgstr ""
|
||||||
"L'app pourra être installée simultanément plusieurs fois sur la même "
|
"L'app pourra être installée simultanément plusieurs fois sur la même "
|
||||||
"machine"
|
"machine"
|
||||||
|
|
||||||
#: app.py:219
|
#: app.py:176
|
||||||
msgid "The app will be integrating LDAP"
|
msgid "The app will be integrating LDAP"
|
||||||
msgstr "L'app s'intègrera avec le LDAP"
|
msgstr "L'app s'intègrera avec le LDAP"
|
||||||
|
|
||||||
#: app.py:220
|
#: app.py:177
|
||||||
msgid ""
|
msgid ""
|
||||||
"Which means it's possible to use Yunohost credentials to log into this "
|
"Which means it's possible to use Yunohost credentials to log into this "
|
||||||
"app. 'LDAP' corresponds to the technology used by Yunohost to handle a "
|
"app. 'LDAP' corresponds to the technology used by Yunohost to handle a "
|
||||||
|
@ -120,23 +116,23 @@ msgstr ""
|
||||||
"YunoHost nécessite le plus souvent de remplir des paramètres dans la "
|
"YunoHost nécessite le plus souvent de remplir des paramètres dans la "
|
||||||
"configuration de l'app"
|
"configuration de l'app"
|
||||||
|
|
||||||
#: app.py:224 app.py:238
|
#: app.py:181 app.py:195
|
||||||
msgid "No"
|
msgid "No"
|
||||||
msgstr "Non"
|
msgstr "Non"
|
||||||
|
|
||||||
#: app.py:225 app.py:237
|
#: app.py:182 app.py:194
|
||||||
msgid "Yes"
|
msgid "Yes"
|
||||||
msgstr "Oui"
|
msgstr "Oui"
|
||||||
|
|
||||||
#: app.py:226 app.py:239
|
#: app.py:183 app.py:196
|
||||||
msgid "Not relevant"
|
msgid "Not relevant"
|
||||||
msgstr "Non pertinent"
|
msgstr "Non pertinent"
|
||||||
|
|
||||||
#: app.py:232
|
#: app.py:189
|
||||||
msgid "The app will be integrated in Yunohost SSO (Single Sign On)"
|
msgid "The app will be integrated in Yunohost SSO (Single Sign On)"
|
||||||
msgstr "L'app s'intègrera avec le SSO (Single Sign On) de YunoHost"
|
msgstr "L'app s'intègrera avec le SSO (Single Sign On) de YunoHost"
|
||||||
|
|
||||||
#: app.py:233
|
#: app.py:190
|
||||||
msgid ""
|
msgid ""
|
||||||
"Which means that people will be logged in the app after logging in "
|
"Which means that people will be logged in the app after logging in "
|
||||||
"YunoHost's portal, without having to sign on specifically into this app."
|
"YunoHost's portal, without having to sign on specifically into this app."
|
||||||
|
@ -145,11 +141,11 @@ msgstr ""
|
||||||
" connectées au portail YunoHost, sans avoir à se connecter spécifiquement"
|
" connectées au portail YunoHost, sans avoir à se connecter spécifiquement"
|
||||||
" dans"
|
" dans"
|
||||||
|
|
||||||
#: app.py:249
|
#: app.py:206
|
||||||
msgid "Licence"
|
msgid "Licence"
|
||||||
msgstr "License"
|
msgstr "License"
|
||||||
|
|
||||||
#: app.py:250
|
#: app.py:207
|
||||||
msgid ""
|
msgid ""
|
||||||
"You should check this on the upstream repository. The expected format is "
|
"You should check this on the upstream repository. The expected format is "
|
||||||
"a SPDX id listed in https://spdx.org/licenses/"
|
"a SPDX id listed in https://spdx.org/licenses/"
|
||||||
|
@ -157,43 +153,43 @@ msgstr ""
|
||||||
"Vous devriez chercher cela dans le dépôt du logiciel. Le format attendu "
|
"Vous devriez chercher cela dans le dépôt du logiciel. Le format attendu "
|
||||||
"est un identifiant SPDX listé dans https://spdx.org/licenses/"
|
"est un identifiant SPDX listé dans https://spdx.org/licenses/"
|
||||||
|
|
||||||
#: app.py:257
|
#: app.py:214
|
||||||
msgid "Official website"
|
msgid "Official website"
|
||||||
msgstr "Site web officiel"
|
msgstr "Site web officiel"
|
||||||
|
|
||||||
#: app.py:258
|
#: app.py:215
|
||||||
msgid "Leave empty if there is no official website"
|
msgid "Leave empty if there is no official website"
|
||||||
msgstr "Laisser vide s'il n'y a pas de site officiel"
|
msgstr "Laisser vide s'il n'y a pas de site officiel"
|
||||||
|
|
||||||
#: app.py:265
|
#: app.py:222
|
||||||
msgid "Official app demo"
|
msgid "Official app demo"
|
||||||
msgstr "Démo officielle de l'app"
|
msgstr "Démo officielle de l'app"
|
||||||
|
|
||||||
#: app.py:266
|
#: app.py:223
|
||||||
msgid "Leave empty if there is no official demo"
|
msgid "Leave empty if there is no official demo"
|
||||||
msgstr "Laisser vide s'il n'y a pas de démo officielle"
|
msgstr "Laisser vide s'il n'y a pas de démo officielle"
|
||||||
|
|
||||||
#: app.py:273
|
#: app.py:230
|
||||||
msgid "Admin documentation"
|
msgid "Admin documentation"
|
||||||
msgstr "Documentation d'administration"
|
msgstr "Documentation d'administration"
|
||||||
|
|
||||||
#: app.py:274
|
#: app.py:231
|
||||||
msgid "Leave empty if there is no official admin doc"
|
msgid "Leave empty if there is no official admin doc"
|
||||||
msgstr "Laisser vide s'il n'y a pas de documentation d'administration officielle"
|
msgstr "Laisser vide s'il n'y a pas de documentation d'administration officielle"
|
||||||
|
|
||||||
#: app.py:281
|
#: app.py:238
|
||||||
msgid "Usage documentation"
|
msgid "Usage documentation"
|
||||||
msgstr "Documentation d'utilisation"
|
msgstr "Documentation d'utilisation"
|
||||||
|
|
||||||
#: app.py:282
|
#: app.py:239
|
||||||
msgid "Leave empty if there is no official user doc"
|
msgid "Leave empty if there is no official user doc"
|
||||||
msgstr "Laisser vide s'il n'y a pas de documentation d'utilisation officielle"
|
msgstr "Laisser vide s'il n'y a pas de documentation d'utilisation officielle"
|
||||||
|
|
||||||
#: app.py:289
|
#: app.py:246
|
||||||
msgid "Code repository"
|
msgid "Code repository"
|
||||||
msgstr "Dépôt de code"
|
msgstr "Dépôt de code"
|
||||||
|
|
||||||
#: app.py:300
|
#: app.py:257
|
||||||
msgid ""
|
msgid ""
|
||||||
"Ask the URL where the app will be installed ('domain' and 'path' "
|
"Ask the URL where the app will be installed ('domain' and 'path' "
|
||||||
"variables)"
|
"variables)"
|
||||||
|
@ -201,11 +197,11 @@ msgstr ""
|
||||||
"Demander l'URL sur laquelle sera installée l'app (variables 'domain' et "
|
"Demander l'URL sur laquelle sera installée l'app (variables 'domain' et "
|
||||||
"'path')"
|
"'path')"
|
||||||
|
|
||||||
#: app.py:305
|
#: app.py:262
|
||||||
msgid "Ask domain+path"
|
msgid "Ask domain+path"
|
||||||
msgstr "Demander le domaine+chemin"
|
msgstr "Demander le domaine+chemin"
|
||||||
|
|
||||||
#: app.py:308
|
#: app.py:265
|
||||||
msgid ""
|
msgid ""
|
||||||
"Ask only the domain (the app requires to be installed at the root of a "
|
"Ask only the domain (the app requires to be installed at the root of a "
|
||||||
"dedicated domain)"
|
"dedicated domain)"
|
||||||
|
@ -213,15 +209,15 @@ msgstr ""
|
||||||
"Demander le domaine uniquement (l'app nécessite d'être installée à la "
|
"Demander le domaine uniquement (l'app nécessite d'être installée à la "
|
||||||
"racine d'un domaine dédié à cette app)"
|
"racine d'un domaine dédié à cette app)"
|
||||||
|
|
||||||
#: app.py:312
|
#: app.py:269
|
||||||
msgid "Do not ask (it isn't a webapp)"
|
msgid "Do not ask (it isn't a webapp)"
|
||||||
msgstr "Ne pas demander (l'app n'est pas une webapp)"
|
msgstr "Ne pas demander (l'app n'est pas une webapp)"
|
||||||
|
|
||||||
#: app.py:317
|
#: app.py:274
|
||||||
msgid "Ask who can access to the app"
|
msgid "Ask who can access to the app"
|
||||||
msgstr "Demander qui pourra accéder à l'app"
|
msgstr "Demander qui pourra accéder à l'app"
|
||||||
|
|
||||||
#: app.py:318
|
#: app.py:275
|
||||||
msgid ""
|
msgid ""
|
||||||
"In the users groups : by default at least 'visitors', 'all_users' et "
|
"In the users groups : by default at least 'visitors', 'all_users' et "
|
||||||
"'admins' exists. (It was previously the private/public app concept)"
|
"'admins' exists. (It was previously the private/public app concept)"
|
||||||
|
@ -230,73 +226,73 @@ msgstr ""
|
||||||
"'all_users' et 'admins' existent. (Corresponds anciennement à la notion "
|
"'all_users' et 'admins' existent. (Corresponds anciennement à la notion "
|
||||||
"d'app privée/publique)"
|
"d'app privée/publique)"
|
||||||
|
|
||||||
#: app.py:325
|
#: app.py:282
|
||||||
msgid "Ask who can access to the admin interface"
|
msgid "Ask who can access to the admin interface"
|
||||||
msgstr "Demander qui pourra accéder à l'interface d'admin"
|
msgstr "Demander qui pourra accéder à l'interface d'admin"
|
||||||
|
|
||||||
#: app.py:326
|
#: app.py:283
|
||||||
msgid "In the case where the app has an admin interface"
|
msgid "In the case where the app has an admin interface"
|
||||||
msgstr "Ceci suppose a priori que l'app dispose d'une interface d'admin"
|
msgstr "Ceci suppose a priori que l'app dispose d'une interface d'admin"
|
||||||
|
|
||||||
#: app.py:331
|
#: app.py:288
|
||||||
msgid "Supported languages"
|
msgid "Supported languages"
|
||||||
msgstr "Langues supportées"
|
msgstr "Langues supportées"
|
||||||
|
|
||||||
#: app.py:333
|
#: app.py:290
|
||||||
msgid "None / not relevant"
|
msgid "None / not relevant"
|
||||||
msgstr "Aucune / non pertinent"
|
msgstr "Aucune / non pertinent"
|
||||||
|
|
||||||
#: app.py:336
|
#: app.py:293
|
||||||
msgid "Spanish"
|
msgid "Spanish"
|
||||||
msgstr "Espagnol"
|
msgstr "Espagnol"
|
||||||
|
|
||||||
#: app.py:337
|
#: app.py:294
|
||||||
msgid "Italian"
|
msgid "Italian"
|
||||||
msgstr "Italien"
|
msgstr "Italien"
|
||||||
|
|
||||||
#: app.py:338
|
#: app.py:295
|
||||||
msgid "German"
|
msgid "German"
|
||||||
msgstr "Allemand"
|
msgstr "Allemand"
|
||||||
|
|
||||||
#: app.py:339
|
#: app.py:296
|
||||||
msgid "Chinese"
|
msgid "Chinese"
|
||||||
msgstr "Chinois"
|
msgstr "Chinois"
|
||||||
|
|
||||||
#: app.py:340
|
#: app.py:297
|
||||||
msgid "Japanese"
|
msgid "Japanese"
|
||||||
msgstr "Japonais"
|
msgstr "Japonais"
|
||||||
|
|
||||||
#: app.py:341
|
#: app.py:298
|
||||||
msgid "Danish"
|
msgid "Danish"
|
||||||
msgstr "Danois"
|
msgstr "Danois"
|
||||||
|
|
||||||
#: app.py:342
|
#: app.py:299
|
||||||
msgid "Portugese"
|
msgid "Portugese"
|
||||||
msgstr "Portugais"
|
msgstr "Portugais"
|
||||||
|
|
||||||
#: app.py:343
|
#: app.py:300
|
||||||
msgid "Dutch"
|
msgid "Dutch"
|
||||||
msgstr "Néerlandais"
|
msgstr "Néerlandais"
|
||||||
|
|
||||||
#: app.py:344
|
#: app.py:301
|
||||||
msgid "Russian"
|
msgid "Russian"
|
||||||
msgstr "Russe"
|
msgstr "Russe"
|
||||||
|
|
||||||
#: app.py:356
|
#: app.py:313
|
||||||
msgid "Application source code or executable"
|
msgid "Application source code or executable"
|
||||||
msgstr "Code source ou exécutable de l'application"
|
msgstr "Code source ou exécutable de l'application"
|
||||||
|
|
||||||
#: app.py:363
|
#: app.py:320
|
||||||
msgid "Sources sha256 checksum"
|
msgid "Sources sha256 checksum"
|
||||||
msgstr "Empreinte sha256 des sources"
|
msgstr "Empreinte sha256 des sources"
|
||||||
|
|
||||||
#: app.py:371
|
#: app.py:328
|
||||||
msgid "Enable automatic update of sources (using a bot running every night)"
|
msgid "Enable automatic update of sources (using a bot running every night)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Activer le robot de mise à jour automatique des sources (via un robot "
|
"Activer le robot de mise à jour automatique des sources (via un robot "
|
||||||
"chaque nuit)"
|
"chaque nuit)"
|
||||||
|
|
||||||
#: app.py:372
|
#: app.py:329
|
||||||
msgid ""
|
msgid ""
|
||||||
"If the upstream software is hosted in one of the handled sources and "
|
"If the upstream software is hosted in one of the handled sources and "
|
||||||
"publishes proper releases or tags, the bot will create a pull request to "
|
"publishes proper releases or tags, the bot will create a pull request to "
|
||||||
|
@ -306,51 +302,51 @@ msgstr ""
|
||||||
"publie des releases ou des tags pour ses nouvelles versions, un robot "
|
"publie des releases ou des tags pour ses nouvelles versions, un robot "
|
||||||
"proposera automatiquement des mises à jour de l'URL et de la checksum."
|
"proposera automatiquement des mises à jour de l'URL et de la checksum."
|
||||||
|
|
||||||
#: app.py:394
|
#: app.py:351
|
||||||
msgid "Dependencies to be installed via apt (separated by comma and/or spaces)"
|
msgid "Dependencies to be installed via apt (separated by comma and/or spaces)"
|
||||||
msgstr "Dépendances à installer via apt (séparées par des virgules et/ou espaces)"
|
msgstr "Dépendances à installer via apt (séparées par des virgules et/ou espaces)"
|
||||||
|
|
||||||
#: app.py:403
|
#: app.py:358
|
||||||
msgid "Initialize an SQL database"
|
msgid "Initialize an SQL database"
|
||||||
msgstr "Initialiser une base de données SQL"
|
msgstr "Initialiser une base de données SQL"
|
||||||
|
|
||||||
#: app.py:413
|
#: app.py:368
|
||||||
msgid "Initialize a system user for this app"
|
msgid "Initialize a system user for this app"
|
||||||
msgstr "Initialiser un utilisateur système pour cet app"
|
msgstr "Initialiser un utilisateur système pour cet app"
|
||||||
|
|
||||||
#: app.py:418
|
#: app.py:373
|
||||||
msgid "Initialize an installation folder for this app"
|
msgid "Initialize an installation folder for this app"
|
||||||
msgstr "Initialiser un dossier d'installation de l'app"
|
msgstr "Initialiser un dossier d'installation de l'app"
|
||||||
|
|
||||||
#: app.py:419
|
#: app.py:374
|
||||||
msgid "By default it's /var/www/$app"
|
msgid "By default it's /var/www/$app"
|
||||||
msgstr "Par défaut il s'agit de /var/www/$app"
|
msgstr "Par défaut il s'agit de /var/www/$app"
|
||||||
|
|
||||||
#: app.py:424
|
#: app.py:379
|
||||||
msgid "Initialize a folder to store the app data"
|
msgid "Initialize a folder to store the app data"
|
||||||
msgstr "Initialiser un dossier destiné à stocker les données de l'app"
|
msgstr "Initialiser un dossier destiné à stocker les données de l'app"
|
||||||
|
|
||||||
#: app.py:425
|
#: app.py:380
|
||||||
msgid "By default it's /var/yunohost.app/$app"
|
msgid "By default it's /var/yunohost.app/$app"
|
||||||
msgstr "Par défaut il s'agit de /home/yunohost.app/$app"
|
msgstr "Par défaut il s'agit de /home/yunohost.app/$app"
|
||||||
|
|
||||||
#: app.py:433
|
#: app.py:388
|
||||||
msgid "App main technology"
|
msgid "App main technology"
|
||||||
msgstr "Technologie principale de l'app"
|
msgstr "Technologie principale de l'app"
|
||||||
|
|
||||||
#: app.py:435
|
#: app.py:390
|
||||||
msgid "None / Static application"
|
msgid "None / Static application"
|
||||||
msgstr "Aucune / application statique"
|
msgstr "Aucune / application statique"
|
||||||
|
|
||||||
#: app.py:440
|
#: app.py:395
|
||||||
msgid "Other"
|
msgid "Other"
|
||||||
msgstr "Autre"
|
msgstr "Autre"
|
||||||
|
|
||||||
#: app.py:447
|
#: app.py:402
|
||||||
msgid "Installation specific commands"
|
msgid "Installation specific commands"
|
||||||
msgstr "Commandes spécifiques d'installation"
|
msgstr "Commandes spécifiques d'installation"
|
||||||
|
|
||||||
#: app.py:448
|
#: app.py:403
|
||||||
msgid ""
|
msgid ""
|
||||||
"These commands are executed from the app installation folder (by default,"
|
"These commands are executed from the app installation folder (by default,"
|
||||||
" /var/www/$app) after the sources have been deployed. This field uses by "
|
" /var/www/$app) after the sources have been deployed. This field uses by "
|
||||||
|
@ -364,31 +360,31 @@ msgstr ""
|
||||||
"technologie sélectionnée. Vous devriez sans-doute le comparer et "
|
"technologie sélectionnée. Vous devriez sans-doute le comparer et "
|
||||||
"l'adapter en fonction de la documentation d'installation de l'app."
|
"l'adapter en fonction de la documentation d'installation de l'app."
|
||||||
|
|
||||||
#: app.py:460
|
#: app.py:415
|
||||||
msgid "Use composer"
|
msgid "Use composer"
|
||||||
msgstr "Utiliser composer"
|
msgstr "Utiliser composer"
|
||||||
|
|
||||||
#: app.py:461
|
#: app.py:416
|
||||||
msgid "Composer is a PHP dependencies manager used by some apps"
|
msgid "Composer is a PHP dependencies manager used by some apps"
|
||||||
msgstr "Composer est un gestionnaire de dépendance PHP utilisé par certaines apps"
|
msgstr "Composer est un gestionnaire de dépendance PHP utilisé par certaines apps"
|
||||||
|
|
||||||
#: app.py:472
|
#: app.py:425
|
||||||
msgid "NodeJS version"
|
msgid "NodeJS version"
|
||||||
msgstr "Version de NodeJS"
|
msgstr "Version de NodeJS"
|
||||||
|
|
||||||
#: app.py:473
|
#: app.py:426
|
||||||
msgid "For example: 16.4, 18, 18.2, 20, 20.1, ..."
|
msgid "For example: 16.4, 18, 18.2, 20, 20.1, ..."
|
||||||
msgstr "Par exemple: 16.4, 18, 18.2, 20, 20.1, ..."
|
msgstr "Par exemple: 16.4, 18, 18.2, 20, 20.1, ..."
|
||||||
|
|
||||||
#: app.py:480
|
#: app.py:433
|
||||||
msgid "Install and use Yarn"
|
msgid "Install and use Yarn"
|
||||||
msgstr "Installer et utiliser Yarn"
|
msgstr "Installer et utiliser Yarn"
|
||||||
|
|
||||||
#: app.py:487
|
#: app.py:440
|
||||||
msgid "Command to start the app daemon (from systemd service)"
|
msgid "Command to start the app daemon (from systemd service)"
|
||||||
msgstr "Commande pour lancer le daemon de l'app (depuis le service systemd)"
|
msgstr "Commande pour lancer le daemon de l'app (depuis le service systemd)"
|
||||||
|
|
||||||
#: app.py:488
|
#: app.py:441
|
||||||
msgid ""
|
msgid ""
|
||||||
"Corresponds to 'ExecStart' statement in systemd. You can use "
|
"Corresponds to 'ExecStart' statement in systemd. You can use "
|
||||||
"'__INSTALL_DIR__' to refer to the install directory, or '__APP__' to "
|
"'__INSTALL_DIR__' to refer to the install directory, or '__APP__' to "
|
||||||
|
@ -398,23 +394,23 @@ msgstr ""
|
||||||
"'__INSTALL_DIR__' pour faire référence directory, our '__APP__' pour "
|
"'__INSTALL_DIR__' pour faire référence directory, our '__APP__' pour "
|
||||||
"l'identifiant de l'application"
|
"l'identifiant de l'application"
|
||||||
|
|
||||||
#: app.py:500
|
#: app.py:453
|
||||||
msgid "The app uses a specific configuration file"
|
msgid "The app uses a specific configuration file"
|
||||||
msgstr "L'app utilise un fichier de configuration spécifique"
|
msgstr "L'app utilise un fichier de configuration spécifique"
|
||||||
|
|
||||||
#: app.py:501
|
#: app.py:454
|
||||||
msgid "Usually : .env, config.json, conf.ini, params.yml, ..."
|
msgid "Usually : .env, config.json, conf.ini, params.yml, ..."
|
||||||
msgstr "Typiquement : .env, config.json, conf.ini, params.yml, ..."
|
msgstr "Typiquement : .env, config.json, conf.ini, params.yml, ..."
|
||||||
|
|
||||||
#: app.py:508
|
#: app.py:459
|
||||||
msgid "Name or file path to use"
|
msgid "Name or file path to use"
|
||||||
msgstr "Nom ou chemin du fichier à utiliser"
|
msgstr "Nom ou chemin du fichier à utiliser"
|
||||||
|
|
||||||
#: app.py:516
|
#: app.py:467
|
||||||
msgid "App configuration file pattern"
|
msgid "App configuration file pattern"
|
||||||
msgstr "Modèle de fichier de configuration de l'app"
|
msgstr "Modèle de fichier de configuration de l'app"
|
||||||
|
|
||||||
#: app.py:517
|
#: app.py:468
|
||||||
msgid ""
|
msgid ""
|
||||||
"In this pattern, you can use the syntax __FOO_BAR__ which will "
|
"In this pattern, you can use the syntax __FOO_BAR__ which will "
|
||||||
"automatically replaced by the value of the variable $foo_bar"
|
"automatically replaced by the value of the variable $foo_bar"
|
||||||
|
@ -422,7 +418,7 @@ msgstr ""
|
||||||
"Dans ce modèle, vous pouvez utilisez la syntaxe __FOO_BAR__ qui sera "
|
"Dans ce modèle, vous pouvez utilisez la syntaxe __FOO_BAR__ qui sera "
|
||||||
"automatiquement remplacé par la valeur de la variable $foo_bar"
|
"automatiquement remplacé par la valeur de la variable $foo_bar"
|
||||||
|
|
||||||
#: app.py:529
|
#: app.py:479
|
||||||
msgid ""
|
msgid ""
|
||||||
"doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly "
|
"doc/DESCRIPTION.md: A comprehensive presentation of the app, possibly "
|
||||||
"listing the main features, possible warnings and specific details on its "
|
"listing the main features, possible warnings and specific details on its "
|
||||||
|
@ -433,7 +429,7 @@ msgstr ""
|
||||||
"précisions éventuelles sur son fonctionnement dans Yunohost (c'est "
|
"précisions éventuelles sur son fonctionnement dans Yunohost (c'est "
|
||||||
"l'endroit où l'on signale des problèmes d'intégrations)."
|
"l'endroit où l'on signale des problèmes d'intégrations)."
|
||||||
|
|
||||||
#: app.py:539
|
#: app.py:488
|
||||||
msgid ""
|
msgid ""
|
||||||
"doc/PRE_INSTALL.md: important info to be shown to the admin before "
|
"doc/PRE_INSTALL.md: important info to be shown to the admin before "
|
||||||
"installing the app"
|
"installing the app"
|
||||||
|
@ -441,11 +437,11 @@ msgstr ""
|
||||||
"doc/PRE_INSTALL.md : info importantes à montrer aux admins avant "
|
"doc/PRE_INSTALL.md : info importantes à montrer aux admins avant "
|
||||||
"l'installation de l'app"
|
"l'installation de l'app"
|
||||||
|
|
||||||
#: app.py:540 app.py:548 app.py:556 app.py:564 app.py:572
|
#: app.py:491 app.py:501 app.py:511 app.py:521 app.py:529
|
||||||
msgid "Leave empty if not relevant"
|
msgid "Leave empty if not relevant"
|
||||||
msgstr "Laisser vide si pas pertinent"
|
msgstr "Laisser vide si pas pertinent"
|
||||||
|
|
||||||
#: app.py:547
|
#: app.py:498
|
||||||
msgid ""
|
msgid ""
|
||||||
"doc/POST_INSTALL.md: important info to be shown to the admin after "
|
"doc/POST_INSTALL.md: important info to be shown to the admin after "
|
||||||
"installing the app"
|
"installing the app"
|
||||||
|
@ -453,7 +449,7 @@ msgstr ""
|
||||||
"doc/POST_INSTALL.md : infos importantes à montrer aux admins après "
|
"doc/POST_INSTALL.md : infos importantes à montrer aux admins après "
|
||||||
"l'installation de l'app"
|
"l'installation de l'app"
|
||||||
|
|
||||||
#: app.py:555
|
#: app.py:508
|
||||||
msgid ""
|
msgid ""
|
||||||
"doc/PRE_UPGRADE.md: important info to be shown to the admin before "
|
"doc/PRE_UPGRADE.md: important info to be shown to the admin before "
|
||||||
"upgrading the app"
|
"upgrading the app"
|
||||||
|
@ -461,7 +457,7 @@ msgstr ""
|
||||||
"doc/PRE_UPGRADE.md : infos importantes à montrer aux admins avant la mise"
|
"doc/PRE_UPGRADE.md : infos importantes à montrer aux admins avant la mise"
|
||||||
" à jour de l'app"
|
" à jour de l'app"
|
||||||
|
|
||||||
#: app.py:563
|
#: app.py:518
|
||||||
msgid ""
|
msgid ""
|
||||||
"doc/POST_UPGRADE.md: important info to be shown to the admin after "
|
"doc/POST_UPGRADE.md: important info to be shown to the admin after "
|
||||||
"upgrading the app"
|
"upgrading the app"
|
||||||
|
@ -469,25 +465,25 @@ msgstr ""
|
||||||
"doc/POST_UPGRADE.md : infos importantes à montrer aux admins après la "
|
"doc/POST_UPGRADE.md : infos importantes à montrer aux admins après la "
|
||||||
"mise à jour de l'app"
|
"mise à jour de l'app"
|
||||||
|
|
||||||
#: app.py:571
|
#: app.py:528
|
||||||
msgid "doc/ADMIN.md: general tips on how to administrate this app"
|
msgid "doc/ADMIN.md: general tips on how to administrate this app"
|
||||||
msgstr "doc/ADMIN.md : indications générales pour administrer l'app"
|
msgstr "doc/ADMIN.md : indications générales pour administrer l'app"
|
||||||
|
|
||||||
#: app.py:583
|
#: app.py:540
|
||||||
msgid "Handle app install URL change (change_url script)"
|
msgid "Handle app install URL change (change_url script)"
|
||||||
msgstr "Gérer le changement d'URL d'installation (script change_url)"
|
msgstr "Gérer le changement d'URL d'installation (script change_url)"
|
||||||
|
|
||||||
#: app.py:586
|
#: app.py:543
|
||||||
msgid "Should changing the app URL be allowed ? (change_url change)"
|
msgid "Should changing the app URL be allowed ? (change_url change)"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Faut-il permettre le changement d'URL pour l'application ? (fichier "
|
"Faut-il permettre le changement d'URL pour l'application ? (fichier "
|
||||||
"change_url)"
|
"change_url)"
|
||||||
|
|
||||||
#: app.py:593
|
#: app.py:548
|
||||||
msgid "Use logrotate for the app logs"
|
msgid "Use logrotate for the app logs"
|
||||||
msgstr "Utiliser logrotate pour les journaux de l'app"
|
msgstr "Utiliser logrotate pour les journaux de l'app"
|
||||||
|
|
||||||
#: app.py:596
|
#: app.py:551
|
||||||
msgid ""
|
msgid ""
|
||||||
"If the app generates logs, this option permit to handle their archival. "
|
"If the app generates logs, this option permit to handle their archival. "
|
||||||
"Recommended."
|
"Recommended."
|
||||||
|
@ -495,11 +491,11 @@ msgstr ""
|
||||||
"Si l'application genère des journaux (log), cette option permet d'en "
|
"Si l'application genère des journaux (log), cette option permet d'en "
|
||||||
"gérer l'archivage. Recommandé."
|
"gérer l'archivage. Recommandé."
|
||||||
|
|
||||||
#: app.py:604
|
#: app.py:559
|
||||||
msgid "Protect the application against brute force attacks (via fail2ban)"
|
msgid "Protect the application against brute force attacks (via fail2ban)"
|
||||||
msgstr "Protéger l'application des attaques par force brute (via fail2ban)"
|
msgstr "Protéger l'application des attaques par force brute (via fail2ban)"
|
||||||
|
|
||||||
#: app.py:609
|
#: app.py:562
|
||||||
msgid ""
|
msgid ""
|
||||||
"If the app generates failed connexions logs, this option allows to "
|
"If the app generates failed connexions logs, this option allows to "
|
||||||
"automatically banish the related IP after a certain number of failed "
|
"automatically banish the related IP after a certain number of failed "
|
||||||
|
@ -509,27 +505,27 @@ msgstr ""
|
||||||
"option permet de bannir automatiquement les IP au bout d'un certain "
|
"option permet de bannir automatiquement les IP au bout d'un certain "
|
||||||
"nombre d'essais de mot de passe. Recommandé."
|
"nombre d'essais de mot de passe. Recommandé."
|
||||||
|
|
||||||
#: app.py:615
|
#: app.py:568
|
||||||
msgid "Add a CRON task for this application"
|
msgid "Add a CRON task for this application"
|
||||||
msgstr "Ajouter une tâche CRON pour cette application"
|
msgstr "Ajouter une tâche CRON pour cette application"
|
||||||
|
|
||||||
#: app.py:616
|
#: app.py:569
|
||||||
msgid "Corresponds to some app periodic operations"
|
msgid "Corresponds to some app periodic operations"
|
||||||
msgstr "Corresponds à des opérations périodiques de l'application"
|
msgstr "Corresponds à des opérations périodiques de l'application"
|
||||||
|
|
||||||
#: app.py:620
|
#: app.py:573
|
||||||
msgid "Type the CRON file content"
|
msgid "Type the CRON file content"
|
||||||
msgstr "Saisissez le contenu du fichier CRON"
|
msgstr "Saisissez le contenu du fichier CRON"
|
||||||
|
|
||||||
#: app.py:629
|
#: app.py:582
|
||||||
msgid "Regular expression for fail2ban"
|
msgid "Regular expression for fail2ban"
|
||||||
msgstr "Expression régulière pour fail2ban"
|
msgstr "Expression régulière pour fail2ban"
|
||||||
|
|
||||||
#: app.py:633
|
#: app.py:586
|
||||||
msgid "A regular expression"
|
msgid "A regular expression"
|
||||||
msgstr "Une expression régulière"
|
msgstr "Une expression régulière"
|
||||||
|
|
||||||
#: app.py:635
|
#: app.py:588
|
||||||
msgid ""
|
msgid ""
|
||||||
"Regular expression to check in the log file to activate failban (search "
|
"Regular expression to check in the log file to activate failban (search "
|
||||||
"for a line that indicates a credentials error)."
|
"for a line that indicates a credentials error)."
|
||||||
|
@ -538,11 +534,11 @@ msgstr ""
|
||||||
"s'active (cherchez une ligne qui indique une erreur d'identifiants de "
|
"s'active (cherchez une ligne qui indique une erreur d'identifiants de "
|
||||||
"connexion)."
|
"connexion)."
|
||||||
|
|
||||||
#: app.py:659
|
#: app.py:612
|
||||||
msgid "Generator mode"
|
msgid "Generator mode"
|
||||||
msgstr "Mode du générateur"
|
msgstr "Mode du générateur"
|
||||||
|
|
||||||
#: app.py:660
|
#: app.py:613
|
||||||
msgid ""
|
msgid ""
|
||||||
"In tutorial version, the generated app will contain additionnal comments "
|
"In tutorial version, the generated app will contain additionnal comments "
|
||||||
"to ease the understanding. In steamlined version, the generated app will "
|
"to ease the understanding. In steamlined version, the generated app will "
|
||||||
|
@ -552,27 +548,27 @@ msgstr ""
|
||||||
"additionnels pour faciliter la compréhension. En version épurée, "
|
"additionnels pour faciliter la compréhension. En version épurée, "
|
||||||
"l'application générée ne contiendra que le minimum nécessaire."
|
"l'application générée ne contiendra que le minimum nécessaire."
|
||||||
|
|
||||||
#: app.py:664
|
#: app.py:617
|
||||||
msgid "Streamlined version"
|
msgid "Streamlined version"
|
||||||
msgstr "Version épurée"
|
msgstr "Version épurée"
|
||||||
|
|
||||||
#: app.py:665
|
#: app.py:618
|
||||||
msgid "Tutorial version"
|
msgid "Tutorial version"
|
||||||
msgstr "Version tutoriel"
|
msgstr "Version tutoriel"
|
||||||
|
|
||||||
#: app.py:671
|
#: app.py:624
|
||||||
msgid "Previsualise"
|
msgid "Previsualise"
|
||||||
msgstr "Prévisualiser"
|
msgstr "Prévisualiser"
|
||||||
|
|
||||||
#: app.py:672
|
#: app.py:625
|
||||||
msgid "Download the .zip"
|
msgid "Download the .zip"
|
||||||
msgstr "Télécharger le .zip"
|
msgstr "Télécharger le .zip"
|
||||||
|
|
||||||
#: app.py:674
|
#: app.py:627
|
||||||
msgid "Fill with demo values"
|
msgid "Fill with demo values"
|
||||||
msgstr "Remplir avec des valeurs de démonstration"
|
msgstr "Remplir avec des valeurs de démonstration"
|
||||||
|
|
||||||
#: app.py:677
|
#: app.py:630
|
||||||
msgid ""
|
msgid ""
|
||||||
"Generate a complete and functionnal minimalistic app that you can iterate"
|
"Generate a complete and functionnal minimalistic app that you can iterate"
|
||||||
" from"
|
" from"
|
||||||
|
@ -580,23 +576,23 @@ msgstr ""
|
||||||
"Générer une application minimaliste complète et fonctionnelle à partir de"
|
"Générer une application minimaliste complète et fonctionnelle à partir de"
|
||||||
" laquelle itérer"
|
" laquelle itérer"
|
||||||
|
|
||||||
#: templates/base.html:5
|
#: templates/base.html:4 templates/index.html:60
|
||||||
msgid "YunoHost app generator"
|
msgid "YunoHost package generator"
|
||||||
msgstr "Générateur d'app YunoHost"
|
msgstr "Générateur de paquet YunoHost"
|
||||||
|
|
||||||
#: templates/index.html:28
|
#: templates/index.html:80
|
||||||
msgid "Yunohost application generation form"
|
msgid "The form contains issues"
|
||||||
msgstr "Formulaire de génération d'une application Yunohost"
|
msgstr "Le formulaire contient des problèmes"
|
||||||
|
|
||||||
#: templates/index.html:55
|
#: templates/index.html:88
|
||||||
msgid "1/9 - General information"
|
msgid "1/9 - General information"
|
||||||
msgstr "1/9 - Informations générales"
|
msgstr "1/9 - Informations générales"
|
||||||
|
|
||||||
#: templates/index.html:70
|
#: templates/index.html:103
|
||||||
msgid "2/9 - Upstream information"
|
msgid "2/9 - Upstream information"
|
||||||
msgstr "2/9 - Informations sur l'upstream"
|
msgstr "2/9 - Informations sur l'upstream"
|
||||||
|
|
||||||
#: templates/index.html:73
|
#: templates/index.html:106
|
||||||
msgid ""
|
msgid ""
|
||||||
"The word 'upstream' refers to the original project that develops and "
|
"The word 'upstream' refers to the original project that develops and "
|
||||||
"maintains the app"
|
"maintains the app"
|
||||||
|
@ -604,19 +600,19 @@ msgstr ""
|
||||||
"Le terme 'upstream' désigne le projet original qui développe et maintient"
|
"Le terme 'upstream' désigne le projet original qui développe et maintient"
|
||||||
" l'app"
|
" l'app"
|
||||||
|
|
||||||
#: templates/index.html:88
|
#: templates/index.html:121
|
||||||
msgid "3/9 - Integration in YunoHost"
|
msgid "3/9 - Integration in YunoHost"
|
||||||
msgstr "3/9 - Intégration dans YunoHost"
|
msgstr "3/9 - Intégration dans YunoHost"
|
||||||
|
|
||||||
#: templates/index.html:104
|
#: templates/index.html:137
|
||||||
msgid "4/9 - Questions to ask during installation"
|
msgid "4/9 - Questions to ask during installation"
|
||||||
msgstr "4/9 - Questions à poser pendant l'installation"
|
msgstr "4/9 - Questions à poser pendant l'installation"
|
||||||
|
|
||||||
#: templates/index.html:108
|
#: templates/index.html:141
|
||||||
msgid "This part is meant to indicate the questions that will be asked."
|
msgid "This part is meant to indicate the questions that will be asked."
|
||||||
msgstr "Cette partie sert à indiquer les questions qui devront être posées."
|
msgstr "Cette partie sert à indiquer les questions qui devront être posées."
|
||||||
|
|
||||||
#: templates/index.html:110
|
#: templates/index.html:143
|
||||||
msgid ""
|
msgid ""
|
||||||
"NB: only standard questions are asked here, it might be required to "
|
"NB: only standard questions are asked here, it might be required to "
|
||||||
"complete it by hand using other questions as a guide."
|
"complete it by hand using other questions as a guide."
|
||||||
|
@ -625,11 +621,11 @@ msgstr ""
|
||||||
"éventuellement compléter à la main en suivant le modèle des autres "
|
"éventuellement compléter à la main en suivant le modèle des autres "
|
||||||
"questions."
|
"questions."
|
||||||
|
|
||||||
#: templates/index.html:124
|
#: templates/index.html:157
|
||||||
msgid "5/9 - Resources to initialize"
|
msgid "5/9 - Resources to initialize"
|
||||||
msgstr "5/9 - Ressources à initialiser"
|
msgstr "5/9 - Ressources à initialiser"
|
||||||
|
|
||||||
#: templates/index.html:128
|
#: templates/index.html:161
|
||||||
msgid ""
|
msgid ""
|
||||||
"Technical elements configured before launching the 'real' app install "
|
"Technical elements configured before launching the 'real' app install "
|
||||||
"script. Usually : creating a system user, downloading app sources, "
|
"script. Usually : creating a system user, downloading app sources, "
|
||||||
|
@ -642,11 +638,11 @@ msgstr ""
|
||||||
"données, installer des dépendances avec apt, créer une base de données, "
|
"données, installer des dépendances avec apt, créer une base de données, "
|
||||||
"..."
|
"..."
|
||||||
|
|
||||||
#: templates/index.html:151
|
#: templates/index.html:184
|
||||||
msgid "6/9 - Specific technology"
|
msgid "6/9 - Specific technology"
|
||||||
msgstr "6/9 - Technologie spécifique"
|
msgstr "6/9 - Technologie spécifique"
|
||||||
|
|
||||||
#: templates/index.html:156
|
#: templates/index.html:189
|
||||||
msgid ""
|
msgid ""
|
||||||
"You probably want to make sure to have 'phpX.Y-fpm' and others "
|
"You probably want to make sure to have 'phpX.Y-fpm' and others "
|
||||||
"'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y "
|
"'phpX.Y-foobar' libraries listed the apt dependencies earlier (with X.Y "
|
||||||
|
@ -656,7 +652,7 @@ msgstr ""
|
||||||
"librairies 'phpX.Y-foobar' listées dans les dépendances apt (X.Y étant la"
|
"librairies 'phpX.Y-foobar' listées dans les dépendances apt (X.Y étant la"
|
||||||
" version de PHP que vous voulez utiliser)"
|
" version de PHP que vous voulez utiliser)"
|
||||||
|
|
||||||
#: templates/index.html:157
|
#: templates/index.html:190
|
||||||
msgid ""
|
msgid ""
|
||||||
"The generated application draft will include an nginx configuration "
|
"The generated application draft will include an nginx configuration "
|
||||||
"snippet that interfaces with PHP-FPM"
|
"snippet that interfaces with PHP-FPM"
|
||||||
|
@ -664,7 +660,7 @@ msgstr ""
|
||||||
"Le brouillon de l'application inclura une configuration nginx qui "
|
"Le brouillon de l'application inclura une configuration nginx qui "
|
||||||
"s'interface avec PHP-FPM"
|
"s'interface avec PHP-FPM"
|
||||||
|
|
||||||
#: templates/index.html:165
|
#: templates/index.html:198
|
||||||
msgid ""
|
msgid ""
|
||||||
"You probably want to make sure to have 'python3' and 'python3-venv' "
|
"You probably want to make sure to have 'python3' and 'python3-venv' "
|
||||||
"listed in the apt dependencies earlier. Other dependencies should be "
|
"listed in the apt dependencies earlier. Other dependencies should be "
|
||||||
|
@ -674,7 +670,7 @@ msgstr ""
|
||||||
" listés dans les dépendances apt. Les autres dépendences devront être "
|
" listés dans les dépendances apt. Les autres dépendences devront être "
|
||||||
"installées dans un venv"
|
"installées dans un venv"
|
||||||
|
|
||||||
#: templates/index.html:169
|
#: templates/index.html:202
|
||||||
msgid ""
|
msgid ""
|
||||||
"The generated application draft will include an nginx configuration "
|
"The generated application draft will include an nginx configuration "
|
||||||
"snippet that reverse-proxies to a systemd service using an internal port"
|
"snippet that reverse-proxies to a systemd service using an internal port"
|
||||||
|
@ -682,18 +678,14 @@ msgstr ""
|
||||||
"Le brouillon de l'application inclura une configuration nginx qui "
|
"Le brouillon de l'application inclura une configuration nginx qui "
|
||||||
"redirige vers le service systemd en utilisant un port interne"
|
"redirige vers le service systemd en utilisant un port interne"
|
||||||
|
|
||||||
#: templates/index.html:237
|
#: templates/index.html:270
|
||||||
msgid "7/9 - App configuration"
|
msgid "7/9 - App configuration"
|
||||||
msgstr "7/9 - Configuration de l'app"
|
msgstr "7/9 - Configuration de l'app"
|
||||||
|
|
||||||
#: templates/index.html:261
|
#: templates/index.html:294
|
||||||
msgid "8/9 - General and advanced documentation"
|
msgid "8/9 - General and advanced documentation"
|
||||||
msgstr "8/9 - Documentation générale et avancée"
|
msgstr "8/9 - Documentation générale et avancée"
|
||||||
|
|
||||||
#: templates/index.html:275
|
#: templates/index.html:308
|
||||||
msgid "9/9 - Advanced options"
|
msgid "9/9 - Advanced options"
|
||||||
msgstr "9/9 - Options avancées"
|
msgstr "9/9 - Options avancées"
|
||||||
|
|
||||||
#~ msgid "Français"
|
|
||||||
#~ msgstr "French"
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue