propagate from branch 'i2p.www' (head 3b29b531e23947146c2b409b5802e4911026dd32)
to branch 'i2p.www.revamp' (head adc282a5a643dd723df82509f265fbfd3ab0c754)
254
app.py
Normal file
@ -0,0 +1,254 @@
|
||||
from jinja2 import Environment, FileSystemLoader, environmentfilter
|
||||
from flask import Flask, request, session, g, redirect, url_for, abort, render_template, flash, send_from_directory, safe_join
|
||||
from docutils.core import publish_parts
|
||||
import os.path
|
||||
import os
|
||||
import fileinput
|
||||
import codecs
|
||||
|
||||
|
||||
TEMPLATE_DIR = os.path.join(os.path.dirname(__file__), 'pages')
|
||||
STATIC_DIR = os.path.join(os.path.dirname(__file__), 'static')
|
||||
|
||||
BLOG_DIR = os.path.join(os.path.dirname(__file__), 'blog')
|
||||
MEETINGS_DIR = os.path.join(os.path.dirname(__file__), 'meetings')
|
||||
|
||||
app = application = Flask(__name__, template_folder=TEMPLATE_DIR, static_url_path='/_static', static_folder=STATIC_DIR)
|
||||
app.debug = bool(os.environ.get('APP_DEBUG', 'False'))
|
||||
|
||||
@app.after_request
|
||||
def call_after_request_callbacks(response):
|
||||
for callback in getattr(g, 'after_request_callbacks', ()):
|
||||
response = callback(response)
|
||||
return response
|
||||
|
||||
def after_this_request(f):
|
||||
if not hasattr(g, 'after_request_callbacks'):
|
||||
g.after_request_callbacks = []
|
||||
g.after_request_callbacks.append(f)
|
||||
return f
|
||||
|
||||
|
||||
@app.template_filter('restructuredtext')
|
||||
def restructuredtext(value):
|
||||
parts = publish_parts(source=value, writer_name="html")
|
||||
return parts['html_body']
|
||||
|
||||
|
||||
@app.url_value_preprocessor
|
||||
def pull_lang(endpoint, values):
|
||||
if not values:
|
||||
return
|
||||
g.lang=values.pop('lang', None)
|
||||
|
||||
@app.url_defaults
|
||||
def set_lang(endpoint, values):
|
||||
if not values:
|
||||
return
|
||||
if 'lang' in values:
|
||||
return
|
||||
if hasattr(g, 'lang'):
|
||||
values['lang'] = g.lang
|
||||
|
||||
@app.before_request
|
||||
def detect_theme():
|
||||
theme = 'light'
|
||||
if 'style' in request.cookies:
|
||||
theme = request.cookies['style']
|
||||
if 'theme' in request.args.keys():
|
||||
theme = request.args['theme']
|
||||
if not os.path.isfile(safe_join('static/styles', '%s.css' % theme)):
|
||||
theme = 'light'
|
||||
g.theme = theme
|
||||
@after_this_request
|
||||
def remember_theme(resp):
|
||||
if g.theme == 'light' and 'style' in request.cookies:
|
||||
resp.delete_cookie('style')
|
||||
elif g.theme != 'light':
|
||||
resp.set_cookie('style', g.theme)
|
||||
return resp
|
||||
|
||||
|
||||
@app.errorhandler(404)
|
||||
def page_not_found(error):
|
||||
return render_template('global/error_404.html'), 404
|
||||
|
||||
@app.route('/')
|
||||
def main_index():
|
||||
return redirect(url_for('site_show', lang='en'))
|
||||
|
||||
|
||||
|
||||
@app.route('/<string:lang>/site/')
|
||||
@app.route('/<string:lang>/site/<path:page>')
|
||||
def site_show(page='index'):
|
||||
if page.endswith('.html'):
|
||||
return redirect(url_for('site_show', page=page[:-5]))
|
||||
name = 'site/%s.html' % page
|
||||
page_file = safe_join(TEMPLATE_DIR, name)
|
||||
|
||||
# bah! those damn users all the time!
|
||||
if not os.path.exists(page_file):
|
||||
abort(404)
|
||||
|
||||
# hah!
|
||||
return render_template(name, page=page)
|
||||
|
||||
@app.route('/<string:lang>/meetings/')
|
||||
def meetings_index():
|
||||
return render_template('meetings/index.html')
|
||||
|
||||
@app.route('/<string:lang>/meetings/<int:id>')
|
||||
def meetings_show(id, log=False, rst=False):
|
||||
"""
|
||||
Render the meeting X.
|
||||
Either display the raw IRC .log or render as html and include .rst as header if it exists
|
||||
"""
|
||||
# generate file name for the raw meeting file(and header)
|
||||
lname = str(id) + '.log'
|
||||
hname = str(id) + '.rst'
|
||||
lfile = safe_join(MEETINGS_DIR, lname)
|
||||
hfile = safe_join(MEETINGS_DIR, hname)
|
||||
|
||||
# check if meeting file exists and throw error if it does not..
|
||||
if not os.path.exists(lfile):
|
||||
abort(404)
|
||||
|
||||
# if the user just wanted the .log
|
||||
if log:
|
||||
# hmm... maybe replace with something non-render_template like?
|
||||
# return render_template('meetings/show_raw.html', log=log)
|
||||
return send_from_directory(MEETINGS_DIR, lname, mimetype='text/plain')
|
||||
|
||||
log=''
|
||||
header=None
|
||||
|
||||
# try to load header if that makes sense
|
||||
if os.path.exists(hfile):
|
||||
# if the user just wanted the .rst...
|
||||
if rst:
|
||||
return send_from_directory(MEETINGS_DIR, hname, mimetype='text/plain')
|
||||
|
||||
# open the file as utf-8 file
|
||||
with codecs.open(hfile, encoding='utf-8') as fd:
|
||||
header = fd.read()
|
||||
elif rst:
|
||||
abort(404)
|
||||
|
||||
# load log
|
||||
with codecs.open(lfile, encoding='utf-8') as fd:
|
||||
log = fd.read()
|
||||
|
||||
return render_template('meetings/show.html', log=log, header=header, id=id)
|
||||
|
||||
|
||||
@app.route('/<string:lang>/meetings/<int:id>.log')
|
||||
def meetings_show_log(id):
|
||||
return meetings_show(id, log=True)
|
||||
|
||||
@app.route('/<string:lang>/meetings/<int:id>.rst')
|
||||
def meetings_show_rst(id):
|
||||
return meetings_show(id, rst=True)
|
||||
|
||||
@app.route('/<string:lang>/download')
|
||||
def downloads_list():
|
||||
# TODO: read mirror list or list of available files
|
||||
return render_template('downloads/list.html')
|
||||
|
||||
@app.route('/<string:lang>/download/<path:file>')
|
||||
def downloads_select(file):
|
||||
# TODO: implement
|
||||
pass
|
||||
|
||||
@app.route('/download/<string:protocol>/any/<path:file>')
|
||||
@app.route('/download/<string:protocol>/<string:mirror>/<path:file>')
|
||||
def downloads_redirect(protocol, file, mirror=None):
|
||||
# TODO: implement
|
||||
pass
|
||||
|
||||
|
||||
|
||||
def render_blog_entry(slug):
|
||||
"""
|
||||
Render the blog entry
|
||||
TODO:
|
||||
- caching
|
||||
- move to own file
|
||||
"""
|
||||
# check if that file actually exists
|
||||
path = safe_join(BLOG_DIR, slug + ".rst")
|
||||
if not os.path.exists(path):
|
||||
abort(404)
|
||||
|
||||
# read file
|
||||
with codecs.open(path, encoding='utf-8') as fd:
|
||||
content = fd.read()
|
||||
|
||||
return publish_parts(source=content, source_path=BLOG_DIR, writer_name="html")
|
||||
|
||||
|
||||
|
||||
@app.route('/<string:lang>/blog/')
|
||||
@app.route('/<string:lang>/blog/page/<int:page>')
|
||||
def blog_index(page=0):
|
||||
# TODO: implement
|
||||
pass
|
||||
|
||||
@app.route('/<string:lang>/blog/entry/<path:slug>')
|
||||
def blog_entry(slug):
|
||||
# try to render that blog entry.. throws 404 if it does not exist
|
||||
parts = render_blog_entry(slug)
|
||||
|
||||
if parts:
|
||||
# now just pass to simple template file and we are done
|
||||
return render_template('blog/entry.html', parts=parts, title=parts['title'], body=parts['fragment'])
|
||||
else:
|
||||
abort(404)
|
||||
|
||||
|
||||
@app.route('/feed/blog/rss')
|
||||
def blog_rss():
|
||||
# TODO: implement
|
||||
pass
|
||||
|
||||
@app.route('/feed/blog/atom')
|
||||
def blog_atom():
|
||||
# TODO: implement
|
||||
pass
|
||||
|
||||
|
||||
|
||||
|
||||
## legacy stuff:
|
||||
|
||||
@app.route('/meeting<int:id>')
|
||||
@app.route('/meeting<int:id>.html')
|
||||
def legacy_meeting(id):
|
||||
return redirect(url_for('meetings_show', id=id, lang='en'))
|
||||
|
||||
@app.route('/status-<int:year>-<int:month>-<int:day>')
|
||||
@app.route('/status-<int:year>-<int:month>-<int:day>.html')
|
||||
def legacy_status(year, month, day):
|
||||
return redirect(url_for('blog_entry', lang='en', slug=('%s/%s/%s/status' % (year, month, day))))
|
||||
|
||||
LEGACY_MAP={
|
||||
'download': 'downloads_list'
|
||||
}
|
||||
|
||||
@app.route('/<string:f>_<string:lang>')
|
||||
@app.route('/<string:f>_<string:lang>.html')
|
||||
@app.route('/<string:f>')
|
||||
@app.route('/<string:f>.html')
|
||||
def legacy_show(f):
|
||||
lang = 'en'
|
||||
if hasattr(g, 'lang') and g.lang:
|
||||
lang = g.lang
|
||||
if f in LEGACY_MAP:
|
||||
return redirect(url_for(LEGACY_MAP[f], lang=lang))
|
||||
else:
|
||||
return redirect(url_for('site_show', lang=lang, page=f))
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
app.run(debug=True)
|
@ -1,7 +1,5 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% block title %}I2P Status Notes for 2006-10-10{% endblock %}
|
||||
{% block content %}<h3>I2P Status Notes for 2006-10-10</h3>
|
||||
<pre>-----BEGIN PGP SIGNED MESSAGE-----
|
||||
<pre>
|
||||
-----BEGIN PGP SIGNED MESSAGE-----
|
||||
Hash: SHA1
|
||||
|
||||
Hi y'all, brief status notes this week
|
||||
@ -79,7 +77,4 @@ iD8DBQFFK6hgzgi8JTPcjUkRAuG2AJ46vK/13GIEngzQe05KRuEP2ZYvRQCeJB3j
|
||||
VmEzybBbtZSpSrFcU4qdvks=
|
||||
=QlDy
|
||||
-----END PGP SIGNATURE-----
|
||||
|
||||
|
||||
</pre>
|
||||
{% endblock %}
|
6
blog/2006/10/10/status.rst
Normal file
@ -0,0 +1,6 @@
|
||||
===============================
|
||||
I2P STATUS NOTES FOR 2006-10-10
|
||||
===============================
|
||||
|
||||
.. raw:: html
|
||||
:file: blog/2006/10/10/status.html
|
@ -1,69 +1,3 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% block title %}I2P Development Meeting 208{% endblock %}
|
||||
{% block content %}<h3>I2P dev meeting, September 8, 2010</h3>
|
||||
<div>
|
||||
<h4>Quick recap</h4>
|
||||
<ul>
|
||||
<li><b>Present:</b> duck, eche|on, Mathiasdm, Moru (later on), superuser, whitenoise, zzz</li>
|
||||
<li>
|
||||
<b>Website content progress:</b>
|
||||
<p>
|
||||
The website overhaul has taken 7 weeks so far. Progress is not fast enough. We need more people to join in!
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Website backend progress:</b>
|
||||
<p>
|
||||
No report yet, welterde could not attend the meeting.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Location for development discussion:</b>
|
||||
<p>
|
||||
Most people agree that IRC is not an ideal location to post long-winded development discussions, it's too volatile, not backed up and not everyone can read it. <b>All developers are advised to post their discussions (or a writeup) to another medium, like zzz.i2p, mailing lists or forum.i2p</b>.
|
||||
Opinions on the alternatives are a bit more divided. zzz.i2p is currently the location for most discussions, but a number of people also like the idea of a mailing list. No decision has been made on which alternative would be best suited.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Task appointing and disagreements:</b>
|
||||
<p>
|
||||
Currently, people appoint themselves to a task by editing the team.html page (this requires monotone access, so there is at least a level of trust implied before being allowed to appoint yourself).
|
||||
However, what happens if people disagree?
|
||||
</p>
|
||||
<p>
|
||||
The discussion pointed out that when disagreeing, a discussion should be held (for example on zzz.i2p). If that doesn't resolve the issue, a vote is a possibility, or the Project Manager (zzz) or repository maintainers (welterde, eche|on) can make a decision.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Status updates:</b>
|
||||
<p>
|
||||
Status updates will be started next weekend. They will mostly consist of a 'what work did you do last week?' and 'what work will you do next week?'.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Development conferences:</b>
|
||||
<p>
|
||||
Nothing big was mentioned.
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
<b>Promoting the usage of the bittorrent protocol inside I2P: pros and cons:</b>
|
||||
<p>
|
||||
Filesharing in general and bittorrent more specifically can be either good or bad for I2P.
|
||||
On one hand, they could give I2P a bad reputation. On the other hand, they could boost I2P popularity.
|
||||
What to do?
|
||||
</p>
|
||||
<p>
|
||||
Filesharing on I2P will not be promoted specifically. Instead, general usability should be looked at and improved.
|
||||
If people decide to use filesharing on I2P (or any other service, like e-mail or browsing), it should become easier as a result of improving the usability.
|
||||
</p>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="irclog">
|
||||
<h4>Full IRC Log</h4>
|
||||
<pre>
|
||||
{% filter escape %}
|
||||
22:02 <@Mathiasdm> okay
|
||||
22:02 <@Mathiasdm> meeting time
|
||||
22:03 <@Mathiasdm> 0) Hello
|
||||
@ -327,8 +261,3 @@
|
||||
23:24 < eche|on> COOKIES!
|
||||
23:25 <@Mathiasdm> don't eat all of them
|
||||
23:25 * Mathiasdm pokes eche|on
|
||||
{% endfilter %}
|
||||
{# TODO: pygments #}
|
||||
</pre>
|
||||
</div>
|
||||
{% endblock %}
|
@ -1,4 +1,4 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% extends "global/layout.html" %}
|
||||
{% block title %}Download{% endblock %}
|
||||
{% block content %}
|
||||
<h1>Download I2P</h1>
|
21
pages/global/error_404.html
Normal file
@ -0,0 +1,21 @@
|
||||
{% extends "global/layout.html" %}
|
||||
{% block title -%}
|
||||
{% if g.lang == 'de' %}
|
||||
Nicht gefunden
|
||||
{% elif g.lang == 'zh' %}
|
||||
未找到
|
||||
{% else %}
|
||||
Not found
|
||||
{% endif %}
|
||||
{%- endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% if g.lang == 'de' %}
|
||||
Yep... die Information nach der du suchst, nennt sich anders, existiert nicht oder wurde entfernt.
|
||||
{% elif g.lang == 'zh' %}
|
||||
您搜索的页面或资源的名称不正确或不存在或已被删除。
|
||||
{% else %}
|
||||
Yep... the resource, you were searching for, is named differently, doesn't exist or was removed.
|
||||
{% endif %}
|
||||
|
||||
{% endblock %}
|
@ -1,24 +1,24 @@
|
||||
{% include "_urlify" -%}
|
||||
{% include "global/urlify" -%}
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
|
||||
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" >
|
||||
<head>
|
||||
<title>{% filter capture('title') %}{% block title %}{% endblock %}{% endfilter %} - I2P</title>
|
||||
<title>{% block title %}{% endblock %} - I2P</title>
|
||||
<link rel="canonical" href="{{ domain }}/{{ path }}" />
|
||||
<link rel="stylesheet" href="_static/styles/{{ theme }}.css" type="text/css" title="{{ theme }}" />
|
||||
<link rel="shortcut icon" href="_static/favicon.ico" />
|
||||
<link rel="stylesheet" href="/_static/styles/{{ g.theme }}.css" type="text/css" title="{{ g.theme }}" />
|
||||
<link rel="shortcut icon" href="/_static/favicon.ico" />
|
||||
<link type="application/atom+xml" rel="alternate" href="http://code.google.com/feeds/p/i2p/downloads/basic" />
|
||||
<meta name="robots" content="NOODP" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="hide"><a href="#main" title="Skip navigation" accesskey="2">Skip navigation</a></div>
|
||||
<div class="logo">
|
||||
<a href="index.html" class="fade"><img src="_static/images/i2plogo.png" alt="I2P Logo" title="Invisible Internet Project (I2P)" /></a>
|
||||
<a href="index.html" class="fade"><img src="/_static/images/i2plogo.png" alt="I2P Logo" title="Invisible Internet Project (I2P)" /></a>
|
||||
</div>
|
||||
<h1>{{ title }}</h1>
|
||||
<h1>{{ self.title() }}</h1>
|
||||
<div class="menu">
|
||||
{% include "_menu.html" %}
|
||||
{% include "global/menu.html" %}
|
||||
</div>
|
||||
<div class="main" id="main">
|
||||
{% block content %}{% endblock %}
|
@ -1,20 +1,20 @@
|
||||
<div class="langbox"><div style="text-align: left; width: 118px; margin-left: auto; margin-right: auto;">
|
||||
<a href="index.html" class="fade"><img src="_static/images/us.png" alt="English" title="English" class="lang" /></a>
|
||||
<a href="index_de.html" class="fade"><img src="_static/images/de.png" alt="Deutsch" title="Deutsch" class="lang" /></a>
|
||||
<a href="index_es.html" class="fade"><img src="_static/images/es.png" alt="Castellano" title="Castellano" class="lang" /></a>
|
||||
<a href="index_zh.html" class="fade"><img src="_static/images/zh.png" alt="中文" title="中文" class="lang" /></a>
|
||||
<a href="index.html" class="fade"><img src="/_static/images/us.png" alt="English" title="English" class="lang" /></a>
|
||||
<a href="index_de.html" class="fade"><img src="/_static/images/de.png" alt="Deutsch" title="Deutsch" class="lang" /></a>
|
||||
<a href="index_es.html" class="fade"><img src="/_static/images/es.png" alt="Castellano" title="Castellano" class="lang" /></a>
|
||||
<a href="index_zh.html" class="fade"><img src="/_static/images/zh.png" alt="中文" title="中文" class="lang" /></a>
|
||||
<br /><div style="padding: 2px 0px;"></div>
|
||||
<a href="index_fr.html" class="fade"><img src="_static/images/fr.png" alt="Français" title="Français" class="lang" /></a>
|
||||
<a href="index_it.html" class="fade"><img src="_static/images/it.png" alt="Italiano" title="Italiano" class="lang" /></a>
|
||||
<a href="index_nl.html" class="fade"><img src="_static/images/nl.png" alt="Nederlands" title="Nederlands" class="lang" /></a>
|
||||
<a href="index_ru.html" class="fade"><img src="_static/images/ru.png" alt="Русский" title="Русский" class="lang" /></a>
|
||||
<a href="index_fr.html" class="fade"><img src="/_static/images/fr.png" alt="Français" title="Français" class="lang" /></a>
|
||||
<a href="index_it.html" class="fade"><img src="/_static/images/it.png" alt="Italiano" title="Italiano" class="lang" /></a>
|
||||
<a href="index_nl.html" class="fade"><img src="/_static/images/nl.png" alt="Nederlands" title="Nederlands" class="lang" /></a>
|
||||
<a href="index_ru.html" class="fade"><img src="/_static/images/ru.png" alt="Русский" title="Русский" class="lang" /></a>
|
||||
<br /><div style="padding: 2px 0px;"></div>
|
||||
<a href="index_cs.html" class="fade"><img src="_static/images/cz.png" alt="Čeština" title="Čeština" class="lang" /></a>
|
||||
<a href="index_ar.html" class="fade"><img src="_static/images/lang_ar.png" alt="العربية" title="العربية" class="lang" /></a>
|
||||
<a href="index_cs.html" class="fade"><img src="/_static/images/cz.png" alt="Čeština" title="Čeština" class="lang" /></a>
|
||||
<a href="index_ar.html" class="fade"><img src="/_static/images/lang_ar.png" alt="العربية" title="العربية" class="lang" /></a>
|
||||
</div></div>
|
||||
|
||||
<div class="themebox" style="text-align:center"><a href="?theme=dark" class="fade"><img src="/_static/images/dark.png" alt="Dark" title="Dark theme" class="lang" /></a>
|
||||
<a href="?theme=light" class="fade"><img src="_static/images/light.png" alt="Light" title="Light theme" class="lang" /></a>
|
||||
<a href="?theme=light" class="fade"><img src="/_static/images/light.png" alt="Light" title="Light theme" class="lang" /></a>
|
||||
</div>
|
||||
|
||||
{% if lang == "de" %}
|
@ -1,7 +1,9 @@
|
||||
{% macro urlify url, title, suffix %}
|
||||
{% macro urlify(url, title, suffix) %}
|
||||
{% autoescape false %}
|
||||
{% if static %}
|
||||
<a href="{{url}}.{{suffix}}">{{title}}</a>
|
||||
{% else %}
|
||||
<a href="{{url}}">{{title}}</a>
|
||||
{% endif %}
|
||||
{% endautoescape %}
|
||||
{% endmacro %}
|
@ -1,4 +1,4 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% extends "global/layout.html" %}
|
||||
{% block title %}Meetings{% endblock %}
|
||||
{% block content %}
|
||||
<h1>Logs of past I2P meetings</h1>
|
@ -1,10 +1,11 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% extends "global/layout.html" %}
|
||||
{% from "global/urlify" import urlify as urlify %}
|
||||
{% block title %}I2P Anonymous Network{% endblock %}
|
||||
{% block content %}
|
||||
<table cellspacing="10" class="announce"><tr class="announce"><td valign="top" class="announce">
|
||||
<div class="version">
|
||||
<b>Latest version:</b><div class="underline"></div>
|
||||
2012-05-02 - <strong>I2P 0.9</strong> - {{ urlify("release-0.9", "Announcement", "html")}}
|
||||
2012-05-02 - <strong>I2P 0.9</strong> - <a href="{{ url_for('site_show', page='release-0.9') }}">Announcement</a>
|
||||
- <a href="download">Download</a><br /><div class="underline"></div>
|
||||
2007-09-28 - <strong>Syndie 1.101a</strong> -
|
||||
<!-- <a href="http://dev.i2p.net/pipermail/i2p/2007-September/001355.html">Announcement</a> -->
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 4.6 KiB |
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
Before Width: | Height: | Size: 7.8 KiB After Width: | Height: | Size: 7.8 KiB |
Before Width: | Height: | Size: 476 B After Width: | Height: | Size: 476 B |
Before Width: | Height: | Size: 355 B After Width: | Height: | Size: 355 B |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 298 B After Width: | Height: | Size: 298 B |
Before Width: | Height: | Size: 1.2 KiB After Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
Before Width: | Height: | Size: 426 B After Width: | Height: | Size: 426 B |
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 472 B |
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 7.0 KiB |
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 469 B After Width: | Height: | Size: 469 B |
Before Width: | Height: | Size: 469 B After Width: | Height: | Size: 469 B |
Before Width: | Height: | Size: 42 KiB After Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 29 KiB After Width: | Height: | Size: 29 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 545 B After Width: | Height: | Size: 545 B |
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
Before Width: | Height: | Size: 852 B After Width: | Height: | Size: 852 B |
Before Width: | Height: | Size: 825 B After Width: | Height: | Size: 825 B |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 6.0 KiB After Width: | Height: | Size: 6.0 KiB |
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
Before Width: | Height: | Size: 9.6 KiB After Width: | Height: | Size: 9.6 KiB |
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 780 B After Width: | Height: | Size: 780 B |
Before Width: | Height: | Size: 804 B After Width: | Height: | Size: 804 B |
Before Width: | Height: | Size: 420 B After Width: | Height: | Size: 420 B |
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 1.1 MiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 61 KiB After Width: | Height: | Size: 61 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 28 KiB After Width: | Height: | Size: 28 KiB |
Before Width: | Height: | Size: 228 B After Width: | Height: | Size: 228 B |
Before Width: | Height: | Size: 340 B After Width: | Height: | Size: 340 B |
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 564 B After Width: | Height: | Size: 564 B |
Before Width: | Height: | Size: 620 B After Width: | Height: | Size: 620 B |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.5 KiB |
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 24 KiB |
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 32 KiB After Width: | Height: | Size: 32 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 19 KiB After Width: | Height: | Size: 19 KiB |
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 12 KiB |
Before Width: | Height: | Size: 15 KiB After Width: | Height: | Size: 15 KiB |
Before Width: | Height: | Size: 453 B After Width: | Height: | Size: 453 B |
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 21 KiB |
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 8.5 KiB |
Before Width: | Height: | Size: 420 B After Width: | Height: | Size: 420 B |
Before Width: | Height: | Size: 158 B After Width: | Height: | Size: 158 B |
Before Width: | Height: | Size: 79 KiB After Width: | Height: | Size: 79 KiB |
Before Width: | Height: | Size: 1.0 KiB After Width: | Height: | Size: 1.0 KiB |
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 917 B After Width: | Height: | Size: 917 B |
Before Width: | Height: | Size: 447 B After Width: | Height: | Size: 447 B |
Before Width: | Height: | Size: 516 B After Width: | Height: | Size: 516 B |
Before Width: | Height: | Size: 520 B After Width: | Height: | Size: 520 B |
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.4 KiB |
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 34 KiB After Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 609 B After Width: | Height: | Size: 609 B |
Before Width: | Height: | Size: 472 B After Width: | Height: | Size: 472 B |
@ -1,5 +0,0 @@
|
||||
{% extends "_layout.html" %}
|
||||
{% block title %}Not found{% endblock %}
|
||||
{% block content %}
|
||||
Yep... the resource, you were searching for, is named differently, doesn't exist or was removed.
|
||||
{% endblock %}
|
@ -1,5 +0,0 @@
|
||||
{% extends "_layout_de.html" %}
|
||||
{% block title %}Nicht gefunden{% endblock %}
|
||||
{% block content %}
|
||||
Yep... die Information nach der du suchst, nennt sich anders, existiert nicht oder wurde entfernt.
|
||||
{% endblock %}
|
@ -1,7 +0,0 @@
|
||||
{% extends "_layout_zh.html" %}
|
||||
{% block title %}
|
||||
未找到
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
您搜索的页面或资源的名称不正确或不存在或已被删除。
|
||||
{% endblock %}
|