Added translation methods to JS and Python
Modified "Create"-form
This commit is contained in:
parent
dc82260d08
commit
4ba2e1168f
2
.gitignore
vendored
2
.gitignore
vendored
@ -1,3 +1,5 @@
|
|||||||
*.swp
|
*.swp
|
||||||
*.swo
|
*.swo
|
||||||
backup
|
backup
|
||||||
|
uploadTest
|
||||||
|
torrentFiles/*
|
||||||
|
47
indexer.py
47
indexer.py
@ -1,23 +1,60 @@
|
|||||||
#!/usr/bin/python3
|
#!/usr/bin/python3
|
||||||
#/* vim:set ts=2 set noexpandtab */
|
#/* vim:set ts=2 set noexpandtab */
|
||||||
|
import json
|
||||||
from flask import Flask, render_template, url_for, request
|
from flask import Flask, render_template, url_for, request
|
||||||
|
from werkzeug import secure_filename
|
||||||
app = Flask(__name__)
|
app = Flask(__name__)
|
||||||
|
strings = None
|
||||||
|
settings = None
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def index():
|
def index():
|
||||||
return render_template("search.html")
|
return render_template("search.html", language="english", categories=settings["categories"], strings=strings)
|
||||||
|
|
||||||
@app.route("/categorys")
|
@app.route("/categories")
|
||||||
def categorys():
|
def categorys():
|
||||||
return render_template("categorys.html")
|
return render_template("categories.html", categories=settings["categories"])
|
||||||
|
|
||||||
@app.route("/create")
|
@app.route("/create", methods=['GET','POST'])
|
||||||
def create():
|
def create():
|
||||||
return render_template("create.html")
|
if request.method == "GET":
|
||||||
|
return render_template("create.html", language="english", categories=settings["categories"], strings=strings, errors=None)
|
||||||
|
elif request.method == "POST":
|
||||||
|
uploadfile = request.files["torrentFile"]
|
||||||
|
filename = secure_filename(uploadfile.filename)
|
||||||
|
# TODO: Create unique filename so that existing files doesn't get overwritten
|
||||||
|
uploadfile.save("torrentFiles/" + filename)
|
||||||
|
# TODO: Process inputdate from the form and save it to the (until now) non-existing DB
|
||||||
|
print(request.form["name"])
|
||||||
|
return "\o/"
|
||||||
|
|
||||||
@app.route("/search", methods=['GET'])
|
@app.route("/search", methods=['GET'])
|
||||||
def search():
|
def search():
|
||||||
return render_template("result.html", results=request.args.get("q", ""))
|
return render_template("result.html", results=request.args.get("q", ""))
|
||||||
|
|
||||||
|
def init():
|
||||||
|
global strings
|
||||||
|
global settings
|
||||||
|
with open("strings.json") as stringsJson:
|
||||||
|
strings = json.load(stringsJson)
|
||||||
|
|
||||||
|
with open("settings.json") as settingsJson:
|
||||||
|
settings = json.load(settingsJson)
|
||||||
|
|
||||||
|
def getLocalString(language, descriptor):
|
||||||
|
global strings
|
||||||
|
if language in strings.keys():
|
||||||
|
if descriptor in strings[language].keys():
|
||||||
|
return strings[language][descriptor]
|
||||||
|
else:
|
||||||
|
return descriptor
|
||||||
|
else:
|
||||||
|
return descriptor
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
init()
|
||||||
|
app.jinja_env.globals.update(getLocalString=getLocalString)
|
||||||
|
app.jinja_env.globals.update(json=json)
|
||||||
|
app.jinja_env.globals.update(sorted=sorted)
|
||||||
app.run(debug=True)
|
app.run(debug=True)
|
||||||
|
@ -7,28 +7,28 @@ window.onload = function () {
|
|||||||
customizeUploadButton()
|
customizeUploadButton()
|
||||||
}
|
}
|
||||||
|
|
||||||
function fillDropdownByValue(value, dropdownToFill) {
|
//function fillDropdownByValue(value, dropdownToFill) {
|
||||||
dropdownToFill.getElementsByClassName("text")[0].innerHTML = "Subcategory"
|
// dropdownToFill.getElementsByClassName("text")[0].innerHTML = "Subcategory"
|
||||||
var dropdownToFillUl = dropdownToFill.getElementsByClassName("dropdown-menu")[0]
|
// var dropdownToFillUl = dropdownToFill.getElementsByClassName("dropdown-menu")[0]
|
||||||
dropdownToFillUl.innerHTML = ""
|
// dropdownToFillUl.innerHTML = ""
|
||||||
|
//
|
||||||
subCategory = getDescriptorByLocalString("english", value)
|
// subCategory = getDescriptorByLocalString("english", value)
|
||||||
catList = document.getElementById("subcategory_list")
|
// catList = document.getElementById("subcategory_list")
|
||||||
catList.innerHTML = ""
|
// catList.innerHTML = ""
|
||||||
categories = global_categories[subCategory].sort()
|
// categories = global_categories[subCategory].sort()
|
||||||
for(var key in categories) {
|
// for(var key in categories) {
|
||||||
var newEntry = document.createElement("li")
|
// var newEntry = document.createElement("li")
|
||||||
var newEntryLink = document.createElement("a")
|
// var newEntryLink = document.createElement("a")
|
||||||
newEntry.setAttribute("role", "presentation")
|
// newEntry.setAttribute("role", "presentation")
|
||||||
newEntryLink.setAttribute("role", "menuitem")
|
// newEntryLink.setAttribute("role", "menuitem")
|
||||||
newEntryLink.tabIndex = -1
|
// newEntryLink.tabIndex = -1
|
||||||
newEntryLink.href = "#"
|
// newEntryLink.href = "#"
|
||||||
newEntryLink.innerHTML = getLocalString("english", categories[key])
|
// newEntryLink.innerHTML = getLocalString("english", categories[key])
|
||||||
newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
|
// newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
|
||||||
newEntry.appendChild(newEntryLink)
|
// newEntry.appendChild(newEntryLink)
|
||||||
dropdownToFillUl.appendChild(newEntry)
|
// dropdownToFillUl.appendChild(newEntry)
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
function setDropdownButtonText(text, dropdownButton) {
|
function setDropdownButtonText(text, dropdownButton) {
|
||||||
var dropdownTextSpan = dropdownButton.getElementsByClassName("text")[0]
|
var dropdownTextSpan = dropdownButton.getElementsByClassName("text")[0]
|
||||||
@ -38,51 +38,38 @@ function setDropdownButtonText(text, dropdownButton) {
|
|||||||
function sortCategories(categories) {
|
function sortCategories(categories) {
|
||||||
var sortedCategories = []
|
var sortedCategories = []
|
||||||
for(var key in categories) {
|
for(var key in categories) {
|
||||||
sortedCategories.push(key)
|
sortedCategories.push(categories[key])
|
||||||
}
|
}
|
||||||
sortedCategories.sort()
|
sortedCategories.sort()
|
||||||
return sortedCategories
|
return sortedCategories
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fill a defined dropdown with values.
|
||||||
|
// These values will be generated out of the categories.json
|
||||||
function fillDropdownByValue(value, dropdownToFill) {
|
function fillDropdownByValue(value, dropdownToFill) {
|
||||||
dropdownToFill.getElementsByTagName("button")[0].disabled = false
|
dropdownToFill.getElementsByTagName("button")[0].disabled = false
|
||||||
dropdownToFill.getElementsByClassName("text")[0].innerHTML = "Subcategorie"
|
dropdownToFill.getElementsByClassName("text")[0].innerHTML = "Subcategorie"
|
||||||
var dropdownToFillUl = dropdownToFill.getElementsByClassName("dropdown-menu")[0]
|
var dropdownToFillUl = dropdownToFill.getElementsByClassName("dropdown-menu")[0]
|
||||||
dropdownToFillUl.innerHTML = ""
|
dropdownToFillUl.innerHTML = ""
|
||||||
switch(value) {
|
valueDescriptor = getDescriptorByLocalString("english", value)
|
||||||
case "Action":
|
subcategories = global_categories[valueDescriptor]
|
||||||
for(i = 0; i < 10; i++) {
|
subcategories = sortCategories(subcategories)
|
||||||
// <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
|
for(subcategoryIndex in subcategories) {
|
||||||
|
subcategoryLocalString = getLocalString("english", subcategories[subcategoryIndex])
|
||||||
var newEntry = document.createElement("li")
|
var newEntry = document.createElement("li")
|
||||||
var newEntryLink = document.createElement("a")
|
var newEntryLink = document.createElement("a")
|
||||||
newEntry.setAttribute("role", "presentation")
|
newEntry.setAttribute("role", "presentation")
|
||||||
newEntryLink.setAttribute("role", "menuitem")
|
newEntryLink.setAttribute("role", "menuitem")
|
||||||
newEntryLink.tabIndex = -1
|
newEntryLink.tabIndex = -1
|
||||||
newEntryLink.href = "#"
|
newEntryLink.href = "#"
|
||||||
newEntryLink.innerHTML = "foo" + i
|
newEntryLink.innerHTML = subcategoryLocalString
|
||||||
newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
|
newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
|
||||||
newEntry.appendChild(newEntryLink)
|
newEntry.appendChild(newEntryLink)
|
||||||
dropdownToFillUl.appendChild(newEntry)
|
dropdownToFillUl.appendChild(newEntry)
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case "Another action":
|
|
||||||
for(i = 0; i < 10; i++) {
|
|
||||||
// <li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
|
|
||||||
var newEntry = document.createElement("li")
|
|
||||||
var newEntryLink = document.createElement("a")
|
|
||||||
newEntry.setAttribute("role", "presentation")
|
|
||||||
newEntryLink.setAttribute("role", "menuitem")
|
|
||||||
newEntryLink.tabIndex = -1
|
|
||||||
newEntryLink.href = "#"
|
|
||||||
newEntryLink.innerHTML = "bar" + i
|
|
||||||
newEntryLink.onclick = function(){ setDropdownButtonText(this.innerHTML, this.parentElement.parentElement.parentElement) }
|
|
||||||
newEntry.appendChild(newEntryLink)
|
|
||||||
dropdownToFillUl.appendChild(newEntry)
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hides the default browser-upload-form and replaces it by an button
|
||||||
function customizeUploadButton() {
|
function customizeUploadButton() {
|
||||||
$(".tfile").before('<button id="button-file" type="button" class="btn btn-default"><span class="text">Upload...</span><span class="glyphicon glyphicon-open-file" aria-hidden="true"></span></button>');
|
$(".tfile").before('<button id="button-file" type="button" class="btn btn-default"><span class="text">Upload...</span><span class="glyphicon glyphicon-open-file" aria-hidden="true"></span></button>');
|
||||||
$(".tfile").hide();
|
$(".tfile").hide();
|
||||||
@ -91,19 +78,31 @@ function customizeUploadButton() {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This sets the Uploadbutton to the filename of the uploaded file
|
||||||
function setButtonToFilename(event) {
|
function setButtonToFilename(event) {
|
||||||
$("input[name='Datei']").each(function() {
|
$("input[name='torrentFile']").each(function() {
|
||||||
var fileName = $(this).val().split('/').pop().split('\\').pop();
|
var fileName = $(this).val().split('/').pop().split('\\').pop();
|
||||||
console.log(event["target"]);
|
console.log(event["target"]);
|
||||||
targetInput = event["target"]
|
targetInput = event["target"]
|
||||||
button = targetInput.previousSibling.getElementsByClassName("text")[0]
|
button = targetInput.previousSibling.getElementsByClassName("text")[0]
|
||||||
button.innerHTML = fileName
|
button.innerHTML = chunk(fileName, 40)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sets the text of a given dropdown-button to a given value
|
||||||
function setDropdownButtonText(text, dropdownButton) {
|
function setDropdownButtonText(text, dropdownButton) {
|
||||||
var dropdownTextSpan = dropdownButton.getElementsByClassName("text")[0]
|
var dropdownTextSpan = dropdownButton.getElementsByClassName("text")[0]
|
||||||
dropdownTextSpan.innerHTML = text
|
dropdownTextSpan.innerHTML = text
|
||||||
}
|
}
|
||||||
|
|
||||||
customizeUploadButton()
|
function chunk(string, n) {
|
||||||
|
var ret = "";
|
||||||
|
for(var i=0, len=string.length; i < len; i += n) {
|
||||||
|
if(i==0) {
|
||||||
|
ret = string.substr(i, n)
|
||||||
|
} else {
|
||||||
|
ret += "<br/>" + string.substr(i, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
};
|
||||||
|
@ -35,6 +35,7 @@
|
|||||||
"create" : "Create",
|
"create" : "Create",
|
||||||
"torrent_file" : "Torrent file",
|
"torrent_file" : "Torrent file",
|
||||||
"name" : "Name",
|
"name" : "Name",
|
||||||
"create_new_torrent" : "Create new torrent"
|
"create_new_torrent" : "Create new torrent",
|
||||||
|
"description" : "Description"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
9
templates/categories.html
Normal file
9
templates/categories.html
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
<!--
|
||||||
|
vim: ts=2 noexpandtab
|
||||||
|
-->
|
||||||
|
{% extends "index.html" %}
|
||||||
|
{% block title %}{{ super() }} - Categories{% endblock%}
|
||||||
|
{% set active_page = "categories" %}
|
||||||
|
{% block content %}
|
||||||
|
<p>CATEGORIES</p>
|
||||||
|
{% endblock content%}
|
@ -1,9 +0,0 @@
|
|||||||
<!--
|
|
||||||
vim: ts=2 noexpandtab
|
|
||||||
-->
|
|
||||||
{% extends "index.html" %}
|
|
||||||
{% block title %}{{ super() }} - Categorys{% endblock%}
|
|
||||||
{% set active_page = "categorys" %}
|
|
||||||
{% block content %}
|
|
||||||
<p>CATEGORYS</p>
|
|
||||||
{% endblock content%}
|
|
@ -2,58 +2,52 @@
|
|||||||
vim: ts=2 noexpandtab
|
vim: ts=2 noexpandtab
|
||||||
-->
|
-->
|
||||||
{% extends "index.html" %}
|
{% extends "index.html" %}
|
||||||
{% block title %}{{ super() }} - Create{% endblock%}
|
{% block title %}{{ super() }} - {{ getLocalString(language, "create") }}{% endblock%}
|
||||||
{% set active_page = "create" %}
|
{% set active_page = "create" %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<link href="{{ url_for("static", filename="css/create.css") }}" rel="stylesheet">
|
<link href="{{ url_for("static", filename="css/create.css") }}" rel="stylesheet">
|
||||||
<script src="{{ url_for("static", filename="js/create.js") }}"></script>
|
<script src="{{ url_for("static", filename="js/create.js") }}"></script>
|
||||||
<div>
|
<div>
|
||||||
<h2 class="headline">Create new</h2>
|
<h2 class="headline">{{ getLocalString(language, "create_new_torrent") }}</h2>
|
||||||
|
<!--
|
||||||
<div class="alert alert-danger alert-dismissible" role="alert">
|
<div class="alert alert-danger alert-dismissible" role="alert">
|
||||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
<button type="button" class="close" data-dismiss="alert" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
<strong>Warning!</strong> Better check yourself, you're not looking too good.
|
<strong>Warning!</strong> Better check yourself, you're not looking too good.
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<form action="/create" method="post" enctype="multipart/form-data">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4 labelColumn">
|
<div class="col-md-4 labelColumn">
|
||||||
<strong>Torrent file</strong>
|
<strong>{{ getLocalString(language, "torrent_file") }}</strong>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<input name="Datei" class="tfile" type="file" size="50" maxlength="100000" accept="text/*" onchange="setButtonToFilename(event)">
|
<input name="torrentFile" class="tfile" type="file" size="50" maxlength="100000" accept="text/*" onchange="setButtonToFilename(event)">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-4 labelColumn">
|
<div class="col-md-4 labelColumn">
|
||||||
<strong>Name</strong>
|
<strong>{{ getLocalString(language, "category") }}</strong>
|
||||||
</div>
|
|
||||||
<div class="col-md-8">
|
|
||||||
<input type="text" class="form-control" placeholder="e.g. Attack of the Killer Tomatoes" aria-describedby="basic-addon1">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-4 labelColumn">
|
|
||||||
<strong>Categorie</strong>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-8">
|
<div class="col-md-8">
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
|
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
|
||||||
<span class="text">Categorie</span>
|
<span class="text">{{ getLocalString(language, "category") }}</span>
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Action</a></li>
|
{% for category in sorted(categories.keys()) %}
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Another action</a></li>
|
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">{{ getLocalString(language, category) }}</a></li>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Something else here</a></li>
|
{% endfor %}
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1" href="#">Separated link</a></li>
|
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true" disabled>
|
<button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true" disabled>
|
||||||
<span class="text">Subcategorie</span>
|
<span class="text">{{ getLocalString(language, "subcategory") }}</span>
|
||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
|
||||||
@ -87,6 +81,23 @@ vim: ts=2 noexpandtab
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="btn btn-default"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Create!</button>
|
<div class="row">
|
||||||
|
<div class="col-md-4 labelColumn">
|
||||||
|
<strong>{{ getLocalString(language, "name") }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<input type="text" name="name" class="form-control" placeholder="e.g. Attack of the Killer Tomatoes" aria-describedby="basic-addon1">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4 labelColumn">
|
||||||
|
<strong>{{ getLocalString(language, "description") }}</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8">
|
||||||
|
<textarea name="description" class="form-control" rows="10"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button type="submit" class="btn btn-default"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> {{ getLocalString(language, "create") }}!</button>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock content%}
|
{% endblock content%}
|
||||||
|
@ -3,7 +3,7 @@ vim: ts=2 noexpandtab
|
|||||||
-->
|
-->
|
||||||
{% set navigation_bar = [
|
{% set navigation_bar = [
|
||||||
("/", "search", "Search", "glyphicon-search"),
|
("/", "search", "Search", "glyphicon-search"),
|
||||||
("/categorys", "categorys", "Categorys", "glyphicon-th"),
|
("/categories", "categories", "Categories", "glyphicon-th"),
|
||||||
("/create", "create", "Create", "glyphicon-plus")
|
("/create", "create", "Create", "glyphicon-plus")
|
||||||
] -%}
|
] -%}
|
||||||
|
|
||||||
@ -18,9 +18,14 @@ vim: ts=2 noexpandtab
|
|||||||
<title>{% block title %}TorrentIndexer{% endblock %}</title>
|
<title>{% block title %}TorrentIndexer{% endblock %}</title>
|
||||||
<link href="{{ url_for("static", filename="css/bootstrap.css") }}" rel="stylesheet">
|
<link href="{{ url_for("static", filename="css/bootstrap.css") }}" rel="stylesheet">
|
||||||
<link href="{{ url_for("static", filename="css/style.css") }}" rel="stylesheet">
|
<link href="{{ url_for("static", filename="css/style.css") }}" rel="stylesheet">
|
||||||
|
<script src="{{ url_for("static", filename="js/main.js") }}"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<script type="text/javascript">
|
||||||
|
var global_strings = {{json.dumps(strings)|safe}};
|
||||||
|
var global_categories = {{json.dumps(categories)|safe}};
|
||||||
|
</script>
|
||||||
<div class="site-wrapper">
|
<div class="site-wrapper">
|
||||||
<div class="site-wrapper-inner">
|
<div class="site-wrapper-inner">
|
||||||
<div class="cover-container">
|
<div class="cover-container">
|
||||||
|
@ -16,7 +16,7 @@ vim: ts=2 noexpandtab
|
|||||||
<span class="input-group-btn">
|
<span class="input-group-btn">
|
||||||
<button class="btn btn-default" type="submit">
|
<button class="btn btn-default" type="submit">
|
||||||
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-search" aria-hidden="true"></span>
|
||||||
Search!
|
{{ getLocalString(language, "search") }}!
|
||||||
</button>
|
</button>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user