~handlerug/mycorrhiza

8091638181139ddc93ac12bece168fc702709af4 — Timur Ismagilov 20 days ago b9ce4d6 + 4eaec35
Merge pull request #102 from pyelias/sort-stuff

Sort hypha and user lists
3 files changed, 945 insertions(+), 909 deletions(-)

M l18n/l18n.go
M views/stuff.qtpl
M views/stuff.qtpl.go
M l18n/l18n.go => l18n/l18n.go +439 -439
@@ 1,6 1,6 @@
// Code generated by go-localize; DO NOT EDIT.
// This file was generated by robots at
// 2021-10-01 12:35:00.027192 +0300 MSK m=+0.003424668
// 2021-10-01 01:05:27.197649651 -0400 EDT m=+0.002749572

package l18n



@@ 12,446 12,446 @@ import (
)

var localizations = map[string]string{
	"en.admin.newuser_create":       "Create",
	"en.admin.newuser_title":        "New user",
	"en.admin.panel_about":          "About this wiki",
	"en.admin.panel_reindex":        "Reindex hyphae",
	"en.admin.panel_safe":           "Safe things",
	"en.admin.panel_shutdown":       "Shutdown wiki",
	"en.admin.panel_title":          "Administrative functions",
	"en.admin.panel_unsafe":         "Dangerous things",
	"en.admin.panel_updateheader":   "Update header links",
	"en.admin.panel_userlist":       "User list",
	"en.admin.panel_users":          "Manage users",
	"en.admin.user_delete":          "Delete",
	"en.admin.user_delete_heading":  "Delete user",
	"en.admin.user_delete_tip":      "Remove the user from the database. Changes made by the user will be preserved. It will be possible to take this username later.",
	"en.admin.user_delete_warn":     "Are you sure you want to delete {{.name}} from the database? This action is irreversible.",
	"en.admin.user_group_heading":   "Change group",
	"en.admin.user_title":           "User %s",
	"en.admin.user_update":          "Update",
	"en.admin.users_actions":        "Actions",
	"en.admin.users_create":         "Create a new user",
	"en.admin.users_edit":           "Edit",
	"en.admin.users_group":          "Group",
	"en.admin.users_name":           "Name",
	"en.admin.users_notime":         "unknown",
	"en.admin.users_password":       "Password",
	"en.admin.users_registered":     "Registered at",
	"en.admin.users_reindex":        "Reindex users",
	"en.admin.users_title":          "Manage users",
	"en.auth.cookie_tip":            "By submitting this form you give this wiki a permission to store cookies in your browser. It lets the engine associate your edits with you. You will stay logged in until you log out.",
	"en.auth.error_password":        "Wrong password.",
	"en.auth.error_telegram":        "Could not authorize using Telegram.",
	"en.auth.error_username":        "Unknown username.",
	"en.auth.go_back":               "Go back",
	"en.auth.go_home":               "Go home",
	"en.auth.go_login":              "Go to the login page",
	"en.auth.lock_title":            "Locked",
	"en.auth.login_button":          "Log in",
	"en.auth.login_header":          "Log in to {{.name}}",
	"en.auth.login_title":           "Login",
	"en.auth.logout_anon":           "You cannot log out because you are not logged in.",
	"en.auth.logout_button":         "Confirm",
	"en.auth.logout_header":         "Log out?",
	"en.auth.logout_title":          "Logout?",
	"en.auth.noauth":                "Authentication is disabled. You can make edits anonymously.",
	"en.auth.noregister":            "Registrations are currently closed. Administrators can make an account for you by hand; contact them.",
	"en.auth.password":              "Password",
	"en.auth.password_tip":          "The server stores your password in an encrypted form; even administrators cannot read it.",
	"en.auth.register_button":       "Register",
	"en.auth.register_header":       "Register on {{.name}}",
	"en.auth.register_title":        "Register",
	"en.auth.telegram_tip":          "You can log in using Telegram. It only works if you have set your @username in Telegram and this username is free on this wiki.",
	"en.auth.try_again":             "Try again",
	"en.auth.username":              "Username",
	"en.edit.actions":               "Actions",
	"en.edit.bold":                  "Bold",
	"en.edit.bullets":               "Bullet list",
	"en.edit.code":                  "Code block",
	"en.edit.date":                  "Insert current date",
	"en.edit.heading":               "Heading",
	"en.edit.help":                  "{{.link}} about mycomarkup",
	"en.edit.help_link":             "Learn more",
	"en.edit.highlight":             "Highlight",
	"en.edit.hr":                    "Horizontal bar",
	"en.edit.italic":                "Italic",
	"en.edit.link":                  "Link",
	"en.edit.link_title":            "Title",
	"en.edit.markup":                "Markup",
	"en.edit.mono":                  "Monospace",
	"en.edit.new_hypha":             "You are creating a new hypha.",
	"en.edit.numbers":               "Number list",
	"en.edit.preview":               "Preview",
	"en.edit.preview_tip":           "Note that the hypha hasn't been saved yet. Here's the preview:",
	"en.edit.preview_title":         "Preview of %s",
	"en.edit.rocket":                "Rocketlink",
	"en.edit.save":                  "Save",
	"en.edit.selflink":              "Link yourself",
	"en.edit.strike":                "Strikethrough",
	"en.edit.sub":                   "Subtext",
	"en.edit.super":                 "Supertext",
	"en.edit.tag":                   "Describe your changes:",
	"en.edit.time":                  "Insert current time",
	"en.edit.title":                 "Edit %s",
	"en.edit.transclude":            "Transclusion",
	"en.edit.underline":             "Underline",
	"en.help.attachment":            "Attachment",
	"en.help.configuration":         "Configuration (for administrators)",
	"en.help.empty_error_line_1":    "Try finding a different entry that would help you.",
	"en.help.empty_error_line_2a":   "If you want to write this entry by yourself, consider",
	"en.help.empty_error_line_2b":   "to Mycorrhiza Wiki directly.",
	"en.help.empty_error_link":      "contributing",
	"en.help.empty_error_title":     "This entry does not exist!",
	"en.help.entry_not_found":       "Entry not found",
	"en.help.hypha":                 "Hypha",
	"en.help.interface":             "Interface",
	"en.help.lock":                  "Lock",
	"en.help.main":                  "Main",
	"en.help.mycomarkup":            "Mycomarkup",
	"en.help.prevnext":              "Previous/next",
	"en.help.recent_changes":        "Recent changes",
	"en.help.sibling_hyphae":        "Sibling hyphae",
	"en.help.special_pages":         "Special pages",
	"en.help.telegram":              "Telegram authorization",
	"en.help.title":                 "Help",
	"en.help.top_bar":               "Top bar",
	"en.help.topics":                "Help topics",
	"en.help.whitelist":             "Whitelist",
	"en.ui.about_admins":            "Administrators:",
	"en.ui.about_homepage":          "Home page:",
	"en.ui.about_hyphae":            "See {{.link}} for information about hyphae on this wiki.",
	"en.ui.about_noauth":            "This wiki does not use authorization",
	"en.ui.about_title":             "About {{.name}}",
	"en.ui.about_usercount":         "User count:",
	"en.ui.about_version":           "{{.pre}}Mycorrhiza Wiki{{.post}} version:",
	"en.ui.admin_panel":             "Admin panel",
	"en.ui.ask_delete":              "Delete %s?",
	"en.ui.ask_delete_tip":          "In this version of Mycorrhiza Wiki you cannot undelete a deleted hypha but the history can still be accessed.",
	"en.ui.ask_delete_verb":         "delete",
	"en.ui.ask_really":              "Do you really want to {{.verb}} hypha {{.name}}?",
	"en.ui.ask_rename":              "Rename %s",
	"en.ui.ask_unattach":            "Unattach %s?",
	"en.ui.ask_unattach_verb":       "unattach",
	"en.ui.attach_empty":            "This hypha has no attachment, you can upload it here.",
	"en.ui.attach_include":          "Include",
	"en.ui.attach_include_tip":      "This attachment is an image. To include it in a hypha, use a syntax like this:",
	"en.ui.attach_link":             "What are attachments?",
	"en.ui.attach_new":              "Attach",
	"en.ui.attach_new_tip":          "You can upload a new attachment. Please do not upload too big pictures unless you need to because may not want to wait for big pictures to load.",
	"en.ui.attach_remove":           "Unattach",
	"en.ui.attach_remove_button":    "Unattach",
	"en.ui.attach_remove_tip":       "Please note that you don't have to unattach before uploading a new attachment.",
	"en.ui.attach_size_value":       "{{.n}} byte%s",
	"en.ui.attach_size_value+one":   "",
	"en.admin.newuser_create": "Create",
	"en.admin.newuser_title": "New user",
	"en.admin.panel_about": "About this wiki",
	"en.admin.panel_reindex": "Reindex hyphae",
	"en.admin.panel_safe": "Safe things",
	"en.admin.panel_shutdown": "Shutdown wiki",
	"en.admin.panel_title": "Administrative functions",
	"en.admin.panel_unsafe": "Dangerous things",
	"en.admin.panel_updateheader": "Update header links",
	"en.admin.panel_userlist": "User list",
	"en.admin.panel_users": "Manage users",
	"en.admin.user_delete": "Delete",
	"en.admin.user_delete_heading": "Delete user",
	"en.admin.user_delete_tip": "Remove the user from the database. Changes made by the user will be preserved. It will be possible to take this username later.",
	"en.admin.user_delete_warn": "Are you sure you want to delete {{.name}} from the database? This action is irreversible.",
	"en.admin.user_group_heading": "Change group",
	"en.admin.user_title": "User %s",
	"en.admin.user_update": "Update",
	"en.admin.users_actions": "Actions",
	"en.admin.users_create": "Create a new user",
	"en.admin.users_edit": "Edit",
	"en.admin.users_group": "Group",
	"en.admin.users_name": "Name",
	"en.admin.users_notime": "unknown",
	"en.admin.users_password": "Password",
	"en.admin.users_registered": "Registered at",
	"en.admin.users_reindex": "Reindex users",
	"en.admin.users_title": "Manage users",
	"en.auth.cookie_tip": "By submitting this form you give this wiki a permission to store cookies in your browser. It lets the engine associate your edits with you. You will stay logged in until you log out.",
	"en.auth.error_password": "Wrong password.",
	"en.auth.error_telegram": "Could not authorize using Telegram.",
	"en.auth.error_username": "Unknown username.",
	"en.auth.go_back": "Go back",
	"en.auth.go_home": "Go home",
	"en.auth.go_login": "Go to the login page",
	"en.auth.lock_title": "Locked",
	"en.auth.login_button": "Log in",
	"en.auth.login_header": "Log in to {{.name}}",
	"en.auth.login_title": "Login",
	"en.auth.logout_anon": "You cannot log out because you are not logged in.",
	"en.auth.logout_button": "Confirm",
	"en.auth.logout_header": "Log out?",
	"en.auth.logout_title": "Logout?",
	"en.auth.noauth": "Authentication is disabled. You can make edits anonymously.",
	"en.auth.noregister": "Registrations are currently closed. Administrators can make an account for you by hand; contact them.",
	"en.auth.password": "Password",
	"en.auth.password_tip": "The server stores your password in an encrypted form; even administrators cannot read it.",
	"en.auth.register_button": "Register",
	"en.auth.register_header": "Register on {{.name}}",
	"en.auth.register_title": "Register",
	"en.auth.telegram_tip": "You can log in using Telegram. It only works if you have set your @username in Telegram and this username is free on this wiki.",
	"en.auth.try_again": "Try again",
	"en.auth.username": "Username",
	"en.edit.actions": "Actions",
	"en.edit.bold": "Bold",
	"en.edit.bullets": "Bullet list",
	"en.edit.code": "Code block",
	"en.edit.date": "Insert current date",
	"en.edit.heading": "Heading",
	"en.edit.help": "{{.link}} about mycomarkup",
	"en.edit.help_link": "Learn more",
	"en.edit.highlight": "Highlight",
	"en.edit.hr": "Horizontal bar",
	"en.edit.italic": "Italic",
	"en.edit.link": "Link",
	"en.edit.link_title": "Title",
	"en.edit.markup": "Markup",
	"en.edit.mono": "Monospace",
	"en.edit.new_hypha": "You are creating a new hypha.",
	"en.edit.numbers": "Number list",
	"en.edit.preview": "Preview",
	"en.edit.preview_tip": "Note that the hypha hasn't been saved yet. Here's the preview:",
	"en.edit.preview_title": "Preview of %s",
	"en.edit.rocket": "Rocketlink",
	"en.edit.save": "Save",
	"en.edit.selflink": "Link yourself",
	"en.edit.strike": "Strikethrough",
	"en.edit.sub": "Subtext",
	"en.edit.super": "Supertext",
	"en.edit.tag": "Describe your changes:",
	"en.edit.time": "Insert current time",
	"en.edit.title": "Edit %s",
	"en.edit.transclude": "Transclusion",
	"en.edit.underline": "Underline",
	"en.help.attachment": "Attachment",
	"en.help.configuration": "Configuration (for administrators)",
	"en.help.empty_error_line_1": "Try finding a different entry that would help you.",
	"en.help.empty_error_line_2a": "If you want to write this entry by yourself, consider",
	"en.help.empty_error_line_2b": "to Mycorrhiza Wiki directly.",
	"en.help.empty_error_link": "contributing",
	"en.help.empty_error_title": "This entry does not exist!",
	"en.help.entry_not_found": "Entry not found",
	"en.help.hypha": "Hypha",
	"en.help.interface": "Interface",
	"en.help.lock": "Lock",
	"en.help.main": "Main",
	"en.help.mycomarkup": "Mycomarkup",
	"en.help.prevnext": "Previous/next",
	"en.help.recent_changes": "Recent changes",
	"en.help.sibling_hyphae": "Sibling hyphae",
	"en.help.special_pages": "Special pages",
	"en.help.telegram": "Telegram authorization",
	"en.help.title": "Help",
	"en.help.top_bar": "Top bar",
	"en.help.topics": "Help topics",
	"en.help.whitelist": "Whitelist",
	"en.ui.about_admins": "Administrators:",
	"en.ui.about_homepage": "Home page:",
	"en.ui.about_hyphae": "See {{.link}} for information about hyphae on this wiki.",
	"en.ui.about_noauth": "This wiki does not use authorization",
	"en.ui.about_title": "About {{.name}}",
	"en.ui.about_usercount": "User count:",
	"en.ui.about_version": "{{.pre}}Mycorrhiza Wiki{{.post}} version:",
	"en.ui.admin_panel": "Admin panel",
	"en.ui.ask_delete": "Delete %s?",
	"en.ui.ask_delete_tip": "In this version of Mycorrhiza Wiki you cannot undelete a deleted hypha but the history can still be accessed.",
	"en.ui.ask_delete_verb": "delete",
	"en.ui.ask_really": "Do you really want to {{.verb}} hypha {{.name}}?",
	"en.ui.ask_rename": "Rename %s",
	"en.ui.ask_unattach": "Unattach %s?",
	"en.ui.ask_unattach_verb": "unattach",
	"en.ui.attach_empty": "This hypha has no attachment, you can upload it here.",
	"en.ui.attach_include": "Include",
	"en.ui.attach_include_tip": "This attachment is an image. To include it in a hypha, use a syntax like this:",
	"en.ui.attach_link": "What are attachments?",
	"en.ui.attach_new": "Attach",
	"en.ui.attach_new_tip": "You can upload a new attachment. Please do not upload too big pictures unless you need to because may not want to wait for big pictures to load.",
	"en.ui.attach_remove": "Unattach",
	"en.ui.attach_remove_button": "Unattach",
	"en.ui.attach_remove_tip": "Please note that you don't have to unattach before uploading a new attachment.",
	"en.ui.attach_size_value": "{{.n}} byte%s",
	"en.ui.attach_size_value+one": "",
	"en.ui.attach_size_value+other": "s",
	"en.ui.attach_stat":             "Stat",
	"en.ui.attach_stat_mime":        "MIME type:",
	"en.ui.attach_stat_size":        "File size:",
	"en.ui.attach_tip":              "You can manage the hypha's attachment on this page.",
	"en.ui.attach_title":            "Attachment of {{.name}}",
	"en.ui.attach_upload":           "Upload",
	"en.ui.attachment_link":         "Manage attachment",
	"en.ui.backlinks_desc":          "Hyphae which have a link to the selected hypha are listed below.",
	"en.ui.backlinks_link":          "{{.n}} backlink%s",
	"en.ui.backlinks_link+one":      "",
	"en.ui.backlinks_link+other":    "s",
	"en.ui.backlinks_query":         "Backlinks to ‘{{.query}}’",
	"en.ui.backlinks_title":         "Backlinks to {{.query}}",
	"en.ui.cancel":                  "Cancel",
	"en.ui.close_dialog":            "Close this dialog",
	"en.ui.confirm":                 "Confirm",
	"en.ui.delete_link":             "Delete",
	"en.ui.diff_title":              "Diff of {{.name}} at {{.rev}}",
	"en.ui.edit_link":               "Edit text",
	"en.ui.error":                   "Error",
	"en.ui.error_go_back":           "Go back to the hypha.",
	"en.ui.error_text_fetch":        "Could not fetch text data",
	"en.ui.error_try_again":         "Try again",
	"en.ui.header_no_rights":        "You must be a moderator to update header links.",
	"en.ui.history_link":            "View history",
	"en.ui.history_title":           "History of %s",
	"en.ui.list_desc":               "This wiki has {{.n}} %s.",
	"en.ui.list_desc+one":           "hypha",
	"en.ui.list_desc+other":         "hyphae",
	"en.ui.list_heading":            "List of hyphae",
	"en.ui.list_title":              "List of pages",
	"en.ui.login":                   "Login",
	"en.ui.media_download":          "Download media",
	"en.ui.media_noaudio":           "Your browser does not support audio.",
	"en.ui.media_noaudio_link":      "Download audio",
	"en.ui.media_novideo":           "Your browser does not support video.",
	"en.ui.media_novideo_link":      "Download video",
	"en.ui.no_rights":               "Not enough rights",
	"en.ui.notexist_heading":        "This hypha does not exist",
	"en.ui.notexist_login":          "Log in to your account, if you have one",
	"en.ui.notexist_media":          "Upload a media",
	"en.ui.notexist_media_tip1":     "Upload a picture, a video or an audio. Most common formats can be accessed from the browser, others can be only downloaded afterwards. You can write a description for the media later.",
	"en.ui.notexist_norights":       "You are not authorized to create new hyphae. Here is what you can do:",
	"en.ui.notexist_register":       "Register a new account",
	"en.ui.notexist_write":          "Write a text",
	"en.ui.notexist_write_button":   "Create",
	"en.ui.notexist_write_myco":     "Mycomarkup",
	"en.ui.notexist_write_tip1":     "Write a note, a diary, an article, a story or anything textual using {{.myco}}. Full history of edits to the document will be saved.",
	"en.ui.notexist_write_tip2":     "Make sure to follow this wiki's writing conventions if there are any.",
	"en.ui.random_no_hyphae":        "There are no hyphae",
	"en.ui.random_no_hyphae_tip":    "It is impossible to display a random hypha because the wiki does not contain any hyphae",
	"en.ui.recent_count_post":       "recent changes",
	"en.ui.recent_count_pre":        "See",
	"en.ui.recent_empty":            "Could not find any recent changes.",
	"en.ui.recent_heading":          "Recent Changes",
	"en.ui.recent_subscribe":        "Subscribe via {{.rss}}, {{.atom}} or {{.json}}",
	"en.ui.recent_subscribe_json":   "JSON feed",
	"en.ui.recent_title":            "{{.n}} recent change%s",
	"en.ui.recent_title+one":        "",
	"en.ui.recent_title+other":      "s",
	"en.ui.register":                "Register",
	"en.ui.reindex_no_rights":       "You must be an admin to reindex hyphae.",
	"en.ui.rename_link":             "Rename",
	"en.ui.rename_recurse":          "Rename subhyphae too",
	"en.ui.rename_tip":              "If you rename this hypha, all incoming links and all relative outcoming links will break. You will also lose all history for the new name. Rename carefully.",
	"en.ui.rename_to":               "New name",
	"en.ui.revision_link":           "Get Mycomarkup source of this revision",
	"en.ui.revision_no_text":        "This hypha had no text at this revision.",
	"en.ui.revision_title":          "{{.name}} at {{.rev}}",
	"en.ui.revision_warning":        "Please note that viewing attachments of hyphae is not supported in history for now.",
	"en.ui.search_results_desc":     "Every hypha name has been compared with the query. Hyphae that have matched the query are listed below.",
	"en.ui.search_results_query":    "Search results for ‘{{.query}}’",
	"en.ui.search_results_title":    "Search: {{.query}}",
	"en.ui.sibling_hyphae":          "Sibling hyphae",
	"en.ui.subhyphae":               "Subhyphae",
	"en.ui.text_link":               "View markup",
	"en.ui.title_search":            "Search by title",
	"en.ui.users_admins":            "Admins",
	"en.ui.users_editors":           "Editors",
	"en.ui.users_heading":           "List of users",
	"en.ui.users_moderators":        "Moderators",
	"en.ui.users_title":             "User list",
	"ru.admin.newuser_create":       "Создать",
	"ru.admin.newuser_title":        "Новый пользователь",
	"ru.admin.panel_about":          "Об этой вики",
	"ru.admin.panel_reindex":        "Переиндексировать гифы",
	"ru.admin.panel_safe":           "Безопасные действия",
	"ru.admin.panel_shutdown":       "Отключить вики",
	"ru.admin.panel_title":          "Панель администратора",
	"ru.admin.panel_unsafe":         "Опасные действия",
	"ru.admin.panel_updateheader":   "Обновить ссылки верхней панели",
	"ru.admin.panel_userlist":       "Список пользователей",
	"ru.admin.panel_users":          "Менеджер пользователей",
	"ru.admin.user_delete":          "Удалить",
	"ru.admin.user_delete_heading":  "Удалить пользователя",
	"ru.admin.user_delete_tip":      "Удаляет пользователя из базы данных. Правки пользователя будут сохранены. Имя пользователя освободится для повторной регистрации.",
	"ru.admin.user_delete_warn":     "Вы уверены, что хотите удалить {{.name}} из базы данных? Это действие нельзя отменить.",
	"ru.admin.user_group_heading":   "Изменить группу",
	"ru.admin.user_title":           "Пользователь %s",
	"ru.admin.user_update":          "Обновить",
	"ru.admin.users_actions":        "Действия",
	"ru.admin.users_create":         "Создать пользователя",
	"ru.admin.users_edit":           "Изменить",
	"ru.admin.users_group":          "Группа",
	"ru.admin.users_name":           "Имя",
	"ru.admin.users_notime":         "неизвестно",
	"ru.admin.users_password":       "Пароль",
	"ru.admin.users_registered":     "Время создания",
	"ru.admin.users_reindex":        "Переиндексировать пользователей",
	"ru.admin.users_title":          "Менеджер пользователей",
	"ru.auth.cookie_tip":            "Отправляя эту форму, вы разрешаете вики хранить cookie в вашем браузере. Это позволит движку связывать ваши правки с вашей учётной записью. Вы будете авторизованы, пока не выйдете из учётной записи.",
	"ru.auth.error_password":        "Неверный пароль.",
	"ru.auth.error_telegram":        "Не удалось авторизоваться через Телеграм.",
	"ru.auth.error_username":        "Неизвестное имя пользователя.",
	"ru.auth.go_back":               "Назад",
	"ru.auth.go_home":               "Домой",
	"ru.auth.go_login":              "На страницу входа",
	"ru.auth.lock_title":            "Доступ закрыт",
	"ru.auth.login_button":          "Войти",
	"ru.auth.login_header":          "Вход в «{{.name}}»",
	"ru.auth.login_title":           "Вход",
	"ru.auth.logout_anon":           "Вы не можете выйти, потому что ещё не вошли.",
	"ru.auth.logout_button":         "Подтвердить",
	"ru.auth.logout_header":         "Выйти?",
	"ru.auth.logout_title":          "Выйти?",
	"ru.auth.noauth":                "Аутентификация отключена. Вы можете делать правки анонимно.",
	"ru.auth.noregister":            "Регистрация в текущее время недоступна. Администраторы могут вручную создать вам учётную запись, свяжитесь с ними.",
	"ru.auth.password":              "Пароль",
	"ru.auth.password_tip":          "Сервер хранит ваш пароль в зашифрованном виде, даже администраторы не смогут его прочесть.",
	"ru.auth.register_button":       "Зарегистрироваться",
	"ru.auth.register_header":       "Регистрация на «{{.name}}»",
	"ru.auth.register_title":        "Регистрация",
	"ru.auth.telegram_tip":          "Вы можете войти с помощью Телеграм. Это сработает, если у вашего профиля есть @имя, и оно не занято в этой вики.",
	"ru.auth.try_again":             "Ещё раз",
	"ru.auth.username":              "Логин",
	"ru.edit.actions":               "Действия",
	"ru.edit.bold":                  "Жирный",
	"ru.edit.bullets":               "Маркир. список",
	"ru.edit.code":                  "Код-блок",
	"ru.edit.date":                  "Текущая дата",
	"ru.edit.heading":               "Заголовок",
	"ru.edit.help":                  "{{.link}} о микоразметке",
	"ru.edit.help_link":             "Подробнее",
	"ru.edit.highlight":             "Выделение",
	"ru.edit.hr":                    "Гориз. черта",
	"ru.edit.italic":                "Курсив",
	"ru.edit.link":                  "Ссылка",
	"ru.edit.link_title":            "Текст",
	"ru.edit.markup":                "Разметка",
	"ru.edit.mono":                  "Моноширинный",
	"ru.edit.new_hypha":             "Вы создаёте новую гифу.",
	"ru.edit.numbers":               "Нумер. список",
	"ru.edit.preview":               "Предпросмотр",
	"ru.edit.preview_tip":           "Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:",
	"ru.edit.preview_title":         "Предпросмотр «%s»",
	"ru.edit.rocket":                "Ссылка-ракета",
	"ru.edit.save":                  "Сохранить",
	"ru.edit.selflink":              "Ссылка на вас",
	"ru.edit.strike":                "Зачёркнутый",
	"ru.edit.sub":                   "Подстрочный",
	"ru.edit.super":                 "Надстрочный",
	"ru.edit.tag":                   "Опишите ваши правки:",
	"ru.edit.time":                  "Текущее время",
	"ru.edit.title":                 "Редактирование «%s»",
	"ru.edit.transclude":            "Трансклюзия",
	"ru.edit.underline":             "Подчеркивание",
	"ru.help.attachment":            "Вложение",
	"ru.help.configuration":         "Конфигурация (для администраторов)",
	"ru.help.empty_error_line_1":    "Попробуйте поискать другую страницу, способную вам помочь.",
	"ru.help.empty_error_line_2a":   "Если вы хотите написать эту страницу сами, будем рады вашим правкам в ",
	"ru.help.empty_error_line_2b":   "Микоризы.",
	"ru.help.empty_error_link":      "репозитории",
	"ru.help.empty_error_title":     "Этой страницы не существует!",
	"ru.help.entry_not_found":       "Запись не найдена",
	"ru.help.hypha":                 "Гифа",
	"ru.help.interface":             "Интерфейс",
	"ru.help.lock":                  "Блокировка",
	"ru.help.main":                  "Введение",
	"ru.help.mycomarkup":            "Микоразметка",
	"ru.help.prevnext":              "Назад/далее",
	"ru.help.recent_changes":        "Недавние изменения",
	"ru.help.sibling_hyphae":        "Гифы-сиблинги",
	"ru.help.special_pages":         "Специальные страницы",
	"ru.help.telegram":              "Авторизация через Телеграм",
	"ru.help.title":                 "Справка",
	"ru.help.top_bar":               "Верхняя панель",
	"ru.help.topics":                "Темы справки",
	"ru.help.whitelist":             "Белый список",
	"ru.ui.about_admins":            "Администраторы:",
	"ru.ui.about_homepage":          "Домашняя гифа:",
	"ru.ui.about_hyphae":            "См. {{.link}}, чтобы узнать о гифах в этой вики.",
	"ru.ui.about_noauth":            "В этой вики нет авторизации",
	"ru.ui.about_title":             "О вики «{{.name}}»",
	"ru.ui.about_usercount":         "Число пользователей:",
	"ru.ui.about_version":           "Версия {{.pre}}Микоризы{{.post}}:",
	"ru.ui.admin_panel":             "Администрирование",
	"ru.ui.ask_delete":              "Удалить «%s»?",
	"ru.ui.ask_delete_tip":          "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.",
	"ru.ui.ask_delete_verb":         "удалить",
	"ru.ui.ask_really":              "Вы действительно хотите {{.verb}} гифу «{{.name}}»?",
	"ru.ui.ask_rename":              "Переименовать «%s»",
	"ru.ui.ask_unattach":            "Открепить «%s»?",
	"ru.ui.ask_unattach_verb":       "открепить",
	"ru.ui.attach_empty":            "Эта гифа не имеет вложения, здесь вы можете его загрузить.",
	"ru.ui.attach_include":          "Добавление",
	"ru.ui.attach_include_tip":      "Это вложение – изображение. Чтобы добавить его в текст гифы, используйте синтаксис ниже:",
	"ru.ui.attach_link":             "Что такое вложение?",
	"ru.ui.attach_new":              "Прикрепить",
	"ru.ui.attach_new_tip":          "Вы можете загрузить новое вложение. Пожалуйста, не загружайте слишком большие изображения без необходимости, чтобы впоследствии не ждать её долгую загрузку.",
	"ru.ui.attach_remove":           "Открепить",
	"ru.ui.attach_remove_button":    "Открепить",
	"ru.ui.attach_remove_tip":       "Заметьте, чтобы заменить вложение, вам не нужно его перед этим откреплять.",
	"ru.ui.attach_size_value":       "{{.n}} %s",
	"ru.ui.attach_size_value+few":   "байта",
	"ru.ui.attach_size_value+many":  "байт",
	"ru.ui.attach_size_value+one":   "байт",
	"ru.ui.attach_stat":             "Свойства",
	"ru.ui.attach_stat_mime":        "MIME-тип:",
	"ru.ui.attach_stat_size":        "Размер файла:",
	"ru.ui.attach_tip":              "На этой странице вы можете управлять вложением.",
	"ru.ui.attach_title":            "Вложение «{{.name}}»",
	"ru.ui.attach_upload":           "Загрузить",
	"ru.ui.attachment_link":         "Вложение",
	"ru.ui.backlinks_desc":          "Ниже перечислены гифы, содержащие ссылку на выбранную гифу.",
	"ru.ui.backlinks_link":          "{{.n}} %s сюда",
	"ru.ui.backlinks_link+few":      "ссылки",
	"ru.ui.backlinks_link+many":     "ссылок",
	"ru.ui.backlinks_link+one":      "ссылка",
	"ru.ui.backlinks_query":         "Обратные ссылки на «{{.query}}»",
	"ru.ui.backlinks_title":         "Обратные ссылки на {{.query}}",
	"ru.ui.cancel":                  "Отмена",
	"ru.ui.close_dialog":            "Закрыть этот диалог",
	"ru.ui.confirm":                 "Применить",
	"ru.ui.delete_link":             "Удалить",
	"ru.ui.diff_title":              "Разница для «{{.name}}» из {{.rev}}",
	"ru.ui.edit_link":               "Редактировать",
	"ru.ui.error":                   "Ошибка",
	"ru.ui.error_go_back":           "Вернуться к гифе.",
	"ru.ui.error_text_fetch":        "Не удалось получить текстовые данные",
	"ru.ui.error_try_again":         "Попробуйте ещё раз",
	"ru.ui.header_no_rights":        "Вы должны быть модератором, чтобы обновить ссылки в заголовке.",
	"ru.ui.history_link":            "История",
	"ru.ui.history_title":           "История «%s»",
	"ru.ui.list_desc":               "В этой вики {{.n}} %s.",
	"ru.ui.list_desc+few":           "гифы",
	"ru.ui.list_desc+many":          "гиф",
	"ru.ui.list_desc+one":           "гифа",
	"ru.ui.list_heading":            "Список гиф",
	"ru.ui.list_title":              "Список страниц",
	"ru.ui.login":                   "Войти",
	"ru.ui.media_download":          "Скачать медиа",
	"ru.ui.media_noaudio":           "Ваш браузер не поддерживает аудио.",
	"ru.ui.media_noaudio_link":      "Скачать аудио",
	"ru.ui.media_novideo":           "Ваш браузер не поддерживает видео.",
	"ru.ui.media_novideo_link":      "Скачать видео",
	"ru.ui.no_rights":               "Недостаточно прав",
	"ru.ui.notexist_heading":        "Эта гифа не существует",
	"ru.ui.notexist_login":          "Войти в свою учётную запись, если она у вас есть",
	"ru.ui.notexist_media":          "Загрузить медиа",
	"ru.ui.notexist_media_tip1":     "Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные – просто скачать. Позже вы можете дописать пояснение к этому медиа.",
	"ru.ui.notexist_norights":       "У вас нет прав для создания новых гиф. Вы можете:",
	"ru.ui.notexist_register":       "Создать новую учётную запись",
	"ru.ui.notexist_write":          "Написать текст",
	"ru.ui.notexist_write_button":   "Создать",
	"ru.ui.notexist_write_myco":     "микоразметки",
	"ru.ui.notexist_write_tip1":     "Напишите заметку, дневник, статью, рассказ или иной текст с помощью {{.myco}}. Сохраняется полная история правок документа.",
	"ru.ui.notexist_write_tip2":     "Не забывайте следовать правилам оформления этой вики, если они имеются.",
	"ru.ui.random_no_hyphae":        "В этой вики нет гиф",
	"ru.ui.random_no_hyphae_tip":    "Невозможно отобразить случайную гифу, потому что вики не содержит ни одной гифы",
	"ru.ui.recent_count_post":       "недавних изменений",
	"ru.ui.recent_count_pre":        "Отобразить",
	"ru.ui.recent_empty":            "Не удалось найти последние изменения.",
	"ru.ui.recent_heading":          "Недавние изменения",
	"ru.ui.recent_subscribe":        "Подписаться через {{.rss}}, {{.atom}} или {{.json}}",
	"ru.ui.recent_subscribe_json":   "JSON-ленту",
	"ru.ui.recent_title":            "{{.n}} %s",
	"ru.ui.recent_title+few":        "недавних изменения",
	"ru.ui.recent_title+many":       "недавних изменений",
	"ru.ui.recent_title+one":        "недавнее изменение",
	"ru.ui.register":                "Регистрация",
	"ru.ui.reindex_no_rights":       "Вы должны быть администратором, чтобы переиндексировать гифы.",
	"ru.ui.rename_link":             "Переименовать",
	"ru.ui.rename_recurse":          "Также переименовать подгифы",
	"ru.ui.rename_tip":              "Если вы переименуете эту гифу, сломаются все ссылки, ведущие на неё, а также исходящие относительные ссылки. Также вы потеряете всю текущую историю для нового названия. Переименовывайте аккуратно.",
	"ru.ui.rename_to":               "Новое название",
	"ru.ui.revision_link":           "Посмотреть код микоразметки для этой ревизии",
	"ru.ui.revision_no_text":        "В этой ревизии гифы не было текста.",
	"ru.ui.revision_title":          "{{.name}} из {{.rev}}",
	"ru.ui.revision_warning":        "Обратите внимание, просмотр вложений в истории гифы пока что недоступен.",
	"ru.ui.search_results_desc":     "Название каждой из существующих гиф сопоставлено с запросом. Подходящие гифы приведены ниже.",
	"ru.ui.search_results_query":    "Результаты поиска для «{{.query}}»",
	"ru.ui.search_results_title":    "Поиск: {{.query}}",
	"ru.ui.sibling_hyphae":          "Гифы-сиблинги",
	"ru.ui.subhyphae":               "Подгифы",
	"ru.ui.text_link":               "Посмотреть разметку",
	"ru.ui.title_search":            "Поиск по названию",
	"ru.ui.users_admins":            "Администраторы",
	"ru.ui.users_editors":           "Редакторы",
	"ru.ui.users_heading":           "Список пользователей",
	"ru.ui.users_moderators":        "Модераторы",
	"ru.ui.users_title":             "Список пользователей",
	"en.ui.attach_stat": "Stat",
	"en.ui.attach_stat_mime": "MIME type:",
	"en.ui.attach_stat_size": "File size:",
	"en.ui.attach_tip": "You can manage the hypha's attachment on this page.",
	"en.ui.attach_title": "Attachment of {{.name}}",
	"en.ui.attach_upload": "Upload",
	"en.ui.attachment_link": "Manage attachment",
	"en.ui.backlinks_desc": "Hyphae which have a link to the selected hypha are listed below.",
	"en.ui.backlinks_link": "{{.n}} backlink%s",
	"en.ui.backlinks_link+one": "",
	"en.ui.backlinks_link+other": "s",
	"en.ui.backlinks_query": "Backlinks to ‘{{.query}}’",
	"en.ui.backlinks_title": "Backlinks to {{.query}}",
	"en.ui.cancel": "Cancel",
	"en.ui.close_dialog": "Close this dialog",
	"en.ui.confirm": "Confirm",
	"en.ui.delete_link": "Delete",
	"en.ui.diff_title": "Diff of {{.name}} at {{.rev}}",
	"en.ui.edit_link": "Edit text",
	"en.ui.error": "Error",
	"en.ui.error_go_back": "Go back to the hypha.",
	"en.ui.error_text_fetch": "Could not fetch text data",
	"en.ui.error_try_again": "Try again",
	"en.ui.header_no_rights": "You must be a moderator to update header links.",
	"en.ui.history_link": "View history",
	"en.ui.history_title": "History of %s",
	"en.ui.list_desc": "This wiki has {{.n}} %s.",
	"en.ui.list_desc+one": "hypha",
	"en.ui.list_desc+other": "hyphae",
	"en.ui.list_heading": "List of hyphae",
	"en.ui.list_title": "List of pages",
	"en.ui.login": "Login",
	"en.ui.media_download": "Download media",
	"en.ui.media_noaudio": "Your browser does not support audio.",
	"en.ui.media_noaudio_link": "Download audio",
	"en.ui.media_novideo": "Your browser does not support video.",
	"en.ui.media_novideo_link": "Download video",
	"en.ui.no_rights": "Not enough rights",
	"en.ui.notexist_heading": "This hypha does not exist",
	"en.ui.notexist_login": "Log in to your account, if you have one",
	"en.ui.notexist_media": "Upload a media",
	"en.ui.notexist_media_tip1": "Upload a picture, a video or an audio. Most common formats can be accessed from the browser, others can be only downloaded afterwards. You can write a description for the media later.",
	"en.ui.notexist_norights": "You are not authorized to create new hyphae. Here is what you can do:",
	"en.ui.notexist_register": "Register a new account",
	"en.ui.notexist_write": "Write a text",
	"en.ui.notexist_write_button": "Create",
	"en.ui.notexist_write_myco": "Mycomarkup",
	"en.ui.notexist_write_tip1": "Write a note, a diary, an article, a story or anything textual using {{.myco}}. Full history of edits to the document will be saved.",
	"en.ui.notexist_write_tip2": "Make sure to follow this wiki's writing conventions if there are any.",
	"en.ui.random_no_hyphae": "There are no hyphae",
	"en.ui.random_no_hyphae_tip": "It is impossible to display a random hypha because the wiki does not contain any hyphae",
	"en.ui.recent_count_post": "recent changes",
	"en.ui.recent_count_pre": "See",
	"en.ui.recent_empty": "Could not find any recent changes.",
	"en.ui.recent_heading": "Recent Changes",
	"en.ui.recent_subscribe": "Subscribe via {{.rss}}, {{.atom}} or {{.json}}",
	"en.ui.recent_subscribe_json": "JSON feed",
	"en.ui.recent_title": "{{.n}} recent change%s",
	"en.ui.recent_title+one": "",
	"en.ui.recent_title+other": "s",
	"en.ui.register": "Register",
	"en.ui.reindex_no_rights": "You must be an admin to reindex hyphae.",
	"en.ui.rename_link": "Rename",
	"en.ui.rename_recurse": "Rename subhyphae too",
	"en.ui.rename_tip": "If you rename this hypha, all incoming links and all relative outcoming links will break. You will also lose all history for the new name. Rename carefully.",
	"en.ui.rename_to": "New name",
	"en.ui.revision_link": "Get Mycomarkup source of this revision",
	"en.ui.revision_no_text": "This hypha had no text at this revision.",
	"en.ui.revision_title": "{{.name}} at {{.rev}}",
	"en.ui.revision_warning": "Please note that viewing attachments of hyphae is not supported in history for now.",
	"en.ui.search_results_desc": "Every hypha name has been compared with the query. Hyphae that have matched the query are listed below.",
	"en.ui.search_results_query": "Search results for ‘{{.query}}’",
	"en.ui.search_results_title": "Search: {{.query}}",
	"en.ui.sibling_hyphae": "Sibling hyphae",
	"en.ui.subhyphae": "Subhyphae",
	"en.ui.text_link": "View markup",
	"en.ui.title_search": "Search by title",
	"en.ui.users_admins": "Admins",
	"en.ui.users_editors": "Editors",
	"en.ui.users_heading": "List of users",
	"en.ui.users_moderators": "Moderators",
	"en.ui.users_title": "User list",
	"ru.admin.newuser_create": "Создать",
	"ru.admin.newuser_title": "Новый пользователь",
	"ru.admin.panel_about": "Об этой вики",
	"ru.admin.panel_reindex": "Переиндексировать гифы",
	"ru.admin.panel_safe": "Безопасные действия",
	"ru.admin.panel_shutdown": "Отключить вики",
	"ru.admin.panel_title": "Панель администратора",
	"ru.admin.panel_unsafe": "Опасные действия",
	"ru.admin.panel_updateheader": "Обновить ссылки верхней панели",
	"ru.admin.panel_userlist": "Список пользователей",
	"ru.admin.panel_users": "Менеджер пользователей",
	"ru.admin.user_delete": "Удалить",
	"ru.admin.user_delete_heading": "Удалить пользователя",
	"ru.admin.user_delete_tip": "Удаляет пользователя из базы данных. Правки пользователя будут сохранены. Имя пользователя освободится для повторной регистрации.",
	"ru.admin.user_delete_warn": "Вы уверены, что хотите удалить {{.name}} из базы данных? Это действие нельзя отменить.",
	"ru.admin.user_group_heading": "Изменить группу",
	"ru.admin.user_title": "Пользователь %s",
	"ru.admin.user_update": "Обновить",
	"ru.admin.users_actions": "Действия",
	"ru.admin.users_create": "Создать пользователя",
	"ru.admin.users_edit": "Изменить",
	"ru.admin.users_group": "Группа",
	"ru.admin.users_name": "Имя",
	"ru.admin.users_notime": "неизвестно",
	"ru.admin.users_password": "Пароль",
	"ru.admin.users_registered": "Время создания",
	"ru.admin.users_reindex": "Переиндексировать пользователей",
	"ru.admin.users_title": "Менеджер пользователей",
	"ru.auth.cookie_tip": "Отправляя эту форму, вы разрешаете вики хранить cookie в вашем браузере. Это позволит движку связывать ваши правки с вашей учётной записью. Вы будете авторизованы, пока не выйдете из учётной записи.",
	"ru.auth.error_password": "Неверный пароль.",
	"ru.auth.error_telegram": "Не удалось авторизоваться через Телеграм.",
	"ru.auth.error_username": "Неизвестное имя пользователя.",
	"ru.auth.go_back": "Назад",
	"ru.auth.go_home": "Домой",
	"ru.auth.go_login": "На страницу входа",
	"ru.auth.lock_title": "Доступ закрыт",
	"ru.auth.login_button": "Войти",
	"ru.auth.login_header": "Вход в «{{.name}}»",
	"ru.auth.login_title": "Вход",
	"ru.auth.logout_anon": "Вы не можете выйти, потому что ещё не вошли.",
	"ru.auth.logout_button": "Подтвердить",
	"ru.auth.logout_header": "Выйти?",
	"ru.auth.logout_title": "Выйти?",
	"ru.auth.noauth": "Аутентификация отключена. Вы можете делать правки анонимно.",
	"ru.auth.noregister": "Регистрация в текущее время недоступна. Администраторы могут вручную создать вам учётную запись, свяжитесь с ними.",
	"ru.auth.password": "Пароль",
	"ru.auth.password_tip": "Сервер хранит ваш пароль в зашифрованном виде, даже администраторы не смогут его прочесть.",
	"ru.auth.register_button": "Зарегистрироваться",
	"ru.auth.register_header": "Регистрация на «{{.name}}»",
	"ru.auth.register_title": "Регистрация",
	"ru.auth.telegram_tip": "Вы можете войти с помощью Телеграм. Это сработает, если у вашего профиля есть @имя, и оно не занято в этой вики.",
	"ru.auth.try_again": "Ещё раз",
	"ru.auth.username": "Логин",
	"ru.edit.actions": "Действия",
	"ru.edit.bold": "Жирный",
	"ru.edit.bullets": "Маркир. список",
	"ru.edit.code": "Код-блок",
	"ru.edit.date": "Текущая дата",
	"ru.edit.heading": "Заголовок",
	"ru.edit.help": "{{.link}} о микоразметке",
	"ru.edit.help_link": "Подробнее",
	"ru.edit.highlight": "Выделение",
	"ru.edit.hr": "Гориз. черта",
	"ru.edit.italic": "Курсив",
	"ru.edit.link": "Ссылка",
	"ru.edit.link_title": "Текст",
	"ru.edit.markup": "Разметка",
	"ru.edit.mono": "Моноширинный",
	"ru.edit.new_hypha": "Вы создаёте новую гифу.",
	"ru.edit.numbers": "Нумер. список",
	"ru.edit.preview": "Предпросмотр",
	"ru.edit.preview_tip": "Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:",
	"ru.edit.preview_title": "Предпросмотр «%s»",
	"ru.edit.rocket": "Ссылка-ракета",
	"ru.edit.save": "Сохранить",
	"ru.edit.selflink": "Ссылка на вас",
	"ru.edit.strike": "Зачёркнутый",
	"ru.edit.sub": "Подстрочный",
	"ru.edit.super": "Надстрочный",
	"ru.edit.tag": "Опишите ваши правки:",
	"ru.edit.time": "Текущее время",
	"ru.edit.title": "Редактирование «%s»",
	"ru.edit.transclude": "Трансклюзия",
	"ru.edit.underline": "Подчеркивание",
	"ru.help.attachment": "Вложение",
	"ru.help.configuration": "Конфигурация (для администраторов)",
	"ru.help.empty_error_line_1": "Попробуйте поискать другую страницу, способную вам помочь.",
	"ru.help.empty_error_line_2a": "Если вы хотите написать эту страницу сами, будем рады вашим правкам в ",
	"ru.help.empty_error_line_2b": "Микоризы.",
	"ru.help.empty_error_link": "репозитории",
	"ru.help.empty_error_title": "Этой страницы не существует!",
	"ru.help.entry_not_found": "Запись не найдена",
	"ru.help.hypha": "Гифа",
	"ru.help.interface": "Интерфейс",
	"ru.help.lock": "Блокировка",
	"ru.help.main": "Введение",
	"ru.help.mycomarkup": "Микоразметка",
	"ru.help.prevnext": "Назад/далее",
	"ru.help.recent_changes": "Недавние изменения",
	"ru.help.sibling_hyphae": "Гифы-сиблинги",
	"ru.help.special_pages": "Специальные страницы",
	"ru.help.telegram": "Авторизация через Телеграм",
	"ru.help.title": "Справка",
	"ru.help.top_bar": "Верхняя панель",
	"ru.help.topics": "Темы справки",
	"ru.help.whitelist": "Белый список",
	"ru.ui.about_admins": "Администраторы:",
	"ru.ui.about_homepage": "Домашняя гифа:",
	"ru.ui.about_hyphae": "См. {{.link}}, чтобы узнать о гифах в этой вики.",
	"ru.ui.about_noauth": "В этой вики нет авторизации",
	"ru.ui.about_title": "О вики «{{.name}}»",
	"ru.ui.about_usercount": "Число пользователей:",
	"ru.ui.about_version": "Версия {{.pre}}Микоризы{{.post}}:",
	"ru.ui.admin_panel": "Администрирование",
	"ru.ui.ask_delete": "Удалить «%s»?",
	"ru.ui.ask_delete_tip": "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.",
	"ru.ui.ask_delete_verb": "удалить",
	"ru.ui.ask_really": "Вы действительно хотите {{.verb}} гифу «{{.name}}»?",
	"ru.ui.ask_rename": "Переименовать «%s»",
	"ru.ui.ask_unattach": "Открепить «%s»?",
	"ru.ui.ask_unattach_verb": "открепить",
	"ru.ui.attach_empty": "Эта гифа не имеет вложения, здесь вы можете его загрузить.",
	"ru.ui.attach_include": "Добавление",
	"ru.ui.attach_include_tip": "Это вложение – изображение. Чтобы добавить его в текст гифы, используйте синтаксис ниже:",
	"ru.ui.attach_link": "Что такое вложение?",
	"ru.ui.attach_new": "Прикрепить",
	"ru.ui.attach_new_tip": "Вы можете загрузить новое вложение. Пожалуйста, не загружайте слишком большие изображения без необходимости, чтобы впоследствии не ждать её долгую загрузку.",
	"ru.ui.attach_remove": "Открепить",
	"ru.ui.attach_remove_button": "Открепить",
	"ru.ui.attach_remove_tip": "Заметьте, чтобы заменить вложение, вам не нужно его перед этим откреплять.",
	"ru.ui.attach_size_value": "{{.n}} %s",
	"ru.ui.attach_size_value+few": "байта",
	"ru.ui.attach_size_value+many": "байт",
	"ru.ui.attach_size_value+one": "байт",
	"ru.ui.attach_stat": "Свойства",
	"ru.ui.attach_stat_mime": "MIME-тип:",
	"ru.ui.attach_stat_size": "Размер файла:",
	"ru.ui.attach_tip": "На этой странице вы можете управлять вложением.",
	"ru.ui.attach_title": "Вложение «{{.name}}»",
	"ru.ui.attach_upload": "Загрузить",
	"ru.ui.attachment_link": "Вложение",
	"ru.ui.backlinks_desc": "Ниже перечислены гифы, содержащие ссылку на выбранную гифу.",
	"ru.ui.backlinks_link": "{{.n}} %s сюда",
	"ru.ui.backlinks_link+few": "ссылки",
	"ru.ui.backlinks_link+many": "ссылок",
	"ru.ui.backlinks_link+one": "ссылка",
	"ru.ui.backlinks_query": "Обратные ссылки на «{{.query}}»",
	"ru.ui.backlinks_title": "Обратные ссылки на {{.query}}",
	"ru.ui.cancel": "Отмена",
	"ru.ui.close_dialog": "Закрыть этот диалог",
	"ru.ui.confirm": "Применить",
	"ru.ui.delete_link": "Удалить",
	"ru.ui.diff_title": "Разница для «{{.name}}» из {{.rev}}",
	"ru.ui.edit_link": "Редактировать",
	"ru.ui.error": "Ошибка",
	"ru.ui.error_go_back": "Вернуться к гифе.",
	"ru.ui.error_text_fetch": "Не удалось получить текстовые данные",
	"ru.ui.error_try_again": "Попробуйте ещё раз",
	"ru.ui.header_no_rights": "Вы должны быть модератором, чтобы обновить ссылки в заголовке.",
	"ru.ui.history_link": "История",
	"ru.ui.history_title": "История «%s»",
	"ru.ui.list_desc": "В этой вики {{.n}} %s.",
	"ru.ui.list_desc+few": "гифы",
	"ru.ui.list_desc+many": "гиф",
	"ru.ui.list_desc+one": "гифа",
	"ru.ui.list_heading": "Список гиф",
	"ru.ui.list_title": "Список страниц",
	"ru.ui.login": "Войти",
	"ru.ui.media_download": "Скачать медиа",
	"ru.ui.media_noaudio": "Ваш браузер не поддерживает аудио.",
	"ru.ui.media_noaudio_link": "Скачать аудио",
	"ru.ui.media_novideo": "Ваш браузер не поддерживает видео.",
	"ru.ui.media_novideo_link": "Скачать видео",
	"ru.ui.no_rights": "Недостаточно прав",
	"ru.ui.notexist_heading": "Эта гифа не существует",
	"ru.ui.notexist_login": "Войти в свою учётную запись, если она у вас есть",
	"ru.ui.notexist_media": "Загрузить медиа",
	"ru.ui.notexist_media_tip1": "Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные – просто скачать. Позже вы можете дописать пояснение к этому медиа.",
	"ru.ui.notexist_norights": "У вас нет прав для создания новых гиф. Вы можете:",
	"ru.ui.notexist_register": "Создать новую учётную запись",
	"ru.ui.notexist_write": "Написать текст",
	"ru.ui.notexist_write_button": "Создать",
	"ru.ui.notexist_write_myco": "микоразметки",
	"ru.ui.notexist_write_tip1": "Напишите заметку, дневник, статью, рассказ или иной текст с помощью {{.myco}}. Сохраняется полная история правок документа.",
	"ru.ui.notexist_write_tip2": "Не забывайте следовать правилам оформления этой вики, если они имеются.",
	"ru.ui.random_no_hyphae": "В этой вики нет гиф",
	"ru.ui.random_no_hyphae_tip": "Невозможно отобразить случайную гифу, потому что вики не содержит ни одной гифы",
	"ru.ui.recent_count_post": "недавних изменений",
	"ru.ui.recent_count_pre": "Отобразить",
	"ru.ui.recent_empty": "Не удалось найти последние изменения.",
	"ru.ui.recent_heading": "Недавние изменения",
	"ru.ui.recent_subscribe": "Подписаться через {{.rss}}, {{.atom}} или {{.json}}",
	"ru.ui.recent_subscribe_json": "JSON-ленту",
	"ru.ui.recent_title": "{{.n}} %s",
	"ru.ui.recent_title+few": "недавних изменения",
	"ru.ui.recent_title+many": "недавних изменений",
	"ru.ui.recent_title+one": "недавнее изменение",
	"ru.ui.register": "Регистрация",
	"ru.ui.reindex_no_rights": "Вы должны быть администратором, чтобы переиндексировать гифы.",
	"ru.ui.rename_link": "Переименовать",
	"ru.ui.rename_recurse": "Также переименовать подгифы",
	"ru.ui.rename_tip": "Если вы переименуете эту гифу, сломаются все ссылки, ведущие на неё, а также исходящие относительные ссылки. Также вы потеряете всю текущую историю для нового названия. Переименовывайте аккуратно.",
	"ru.ui.rename_to": "Новое название",
	"ru.ui.revision_link": "Посмотреть код микоразметки для этой ревизии",
	"ru.ui.revision_no_text": "В этой ревизии гифы не было текста.",
	"ru.ui.revision_title": "{{.name}} из {{.rev}}",
	"ru.ui.revision_warning": "Обратите внимание, просмотр вложений в истории гифы пока что недоступен.",
	"ru.ui.search_results_desc": "Название каждой из существующих гиф сопоставлено с запросом. Подходящие гифы приведены ниже.",
	"ru.ui.search_results_query": "Результаты поиска для «{{.query}}»",
	"ru.ui.search_results_title": "Поиск: {{.query}}",
	"ru.ui.sibling_hyphae": "Гифы-сиблинги",
	"ru.ui.subhyphae": "Подгифы",
	"ru.ui.text_link": "Посмотреть разметку",
	"ru.ui.title_search": "Поиск по названию",
	"ru.ui.users_admins": "Администраторы",
	"ru.ui.users_editors": "Редакторы",
	"ru.ui.users_heading": "Список пользователей",
	"ru.ui.users_moderators": "Модераторы",
	"ru.ui.users_title": "Список пользователей",
}

type Replacements map[string]interface{}

type Localizer struct {
	Locale         string
	Locale	 string
	FallbackLocale string
	Localizations  map[string]string
}


@@ 487,11 487,11 @@ func (t Localizer) GetWithLocale(locale, key string, replacements ...*Replacemen
		}
	}

	// If the str doesn't have any substitutions, no need to
	// template.Execute.
        // If the str doesn't have any substitutions, no need to
        // template.Execute.
	if strings.Index(str, "}}") == -1 {
		return str
	}
                return str
        }

	return t.replace(str, replacements...)
}

M views/stuff.qtpl => views/stuff.qtpl +17 -4
@@ 1,4 1,5 @@
{% import "path/filepath" %}
{% import "sort" %}
{% import "github.com/bouncepaw/mycorrhiza/cfg" %}
{% import "github.com/bouncepaw/mycorrhiza/hyphae" %}
{% import "github.com/bouncepaw/mycorrhiza/user" %}


@@ 213,6 214,9 @@ for u := range user.YieldUsers() {
		editors = append(editors, u.Name)
	}
}
sort.Strings(admins)
sort.Strings(moderators)
sort.Strings(editors)
%}
	<section>
		<h2>{%s lc.Get("ui.users_admins") %}</h2>


@@ 242,11 246,20 @@ for u := range user.YieldUsers() {
	<h1>{%s lc.Get("ui.list_heading") %}</h1>
	<p>{%s lc.GetPlural("ui.list_desc", hyphae.Count()) %}</p>
	<ul class="hypha-list">
		{% for h := range hyphae.YieldExistingHyphae() %}
		{% code 
		hyphaNames := make(chan string)
		sortedHypha := hyphae.PathographicSort(hyphaNames)
		for hypha := range hyphae.YieldExistingHyphae() {
			hyphaNames <- hypha.Name
		}
		close(hyphaNames)
		%}
		{% for hyphaName := range sortedHypha %}
		{% code hypha := hyphae.ByName(hyphaName) %}
		<li class="hypha-list__entry">
			<a class="hypha-list__link" href="/hypha/{%s h.Name %}">{%s util.BeautifulName(h.Name) %}</a>
			{% if h.BinaryPath != "" %}
			<span class="hypha-list__amnt-type">{%s filepath.Ext(h.BinaryPath)[1:] %}</span>
			<a class="hypha-list__link" href="/hypha/{%s hypha.Name %}">{%s util.BeautifulName(hypha.Name) %}</a>
			{% if hypha.BinaryPath != "" %}
			<span class="hypha-list__amnt-type">{%s filepath.Ext(hypha.BinaryPath)[1:] %}</span>
			{% endif %}
		</li>
		{% endfor %}

M views/stuff.qtpl.go => views/stuff.qtpl.go +489 -466
@@ 8,62 8,65 @@ package views
import "path/filepath"

//line views/stuff.qtpl:2
import "github.com/bouncepaw/mycorrhiza/cfg"
import "sort"

//line views/stuff.qtpl:3
import "github.com/bouncepaw/mycorrhiza/hyphae"
import "github.com/bouncepaw/mycorrhiza/cfg"

//line views/stuff.qtpl:4
import "github.com/bouncepaw/mycorrhiza/user"
import "github.com/bouncepaw/mycorrhiza/hyphae"

//line views/stuff.qtpl:5
import "github.com/bouncepaw/mycorrhiza/util"
import "github.com/bouncepaw/mycorrhiza/user"

//line views/stuff.qtpl:6
import "github.com/bouncepaw/mycorrhiza/util"

//line views/stuff.qtpl:7
import "github.com/bouncepaw/mycorrhiza/l18n"

//line views/stuff.qtpl:8
//line views/stuff.qtpl:9
import (
	qtio422016 "io"

	qt422016 "github.com/valyala/quicktemplate"
)

//line views/stuff.qtpl:8
//line views/stuff.qtpl:9
var (
	_ = qtio422016.Copy
	_ = qt422016.AcquireByteBuffer
)

//line views/stuff.qtpl:8
//line views/stuff.qtpl:9
func StreamBaseHTML(qw422016 *qt422016.Writer, title, body string, lc *l18n.Localizer, u *user.User, headElements ...string) {
//line views/stuff.qtpl:8
//line views/stuff.qtpl:9
	qw422016.N().S(`
<!doctype html>
<html lang="`)
//line views/stuff.qtpl:10
//line views/stuff.qtpl:11
	qw422016.E().S(lc.Locale)
//line views/stuff.qtpl:10
//line views/stuff.qtpl:11
	qw422016.N().S(`">
	<head>
		<meta charset="utf-8">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<title>`)
//line views/stuff.qtpl:14
//line views/stuff.qtpl:15
	qw422016.E().S(title)
//line views/stuff.qtpl:14
//line views/stuff.qtpl:15
	qw422016.N().S(`</title>
		<link rel="shortcut icon" href="/static/favicon.ico">
		<link rel="stylesheet" href="/static/style.css">
		<script src="/static/shortcuts.js"></script>
		`)
//line views/stuff.qtpl:18
//line views/stuff.qtpl:19
	for _, el := range headElements {
//line views/stuff.qtpl:18
//line views/stuff.qtpl:19
		qw422016.N().S(el)
//line views/stuff.qtpl:18
//line views/stuff.qtpl:19
	}
//line views/stuff.qtpl:18
//line views/stuff.qtpl:19
	qw422016.N().S(`
	</head>
	<body>


@@ 73,144 76,144 @@ func StreamBaseHTML(qw422016 *qt422016.Writer, title, body string, lc *l18n.Loca
					<li class="top-bar__section top-bar__section_home">
						<div class="top-bar__home-link-wrapper">
							<a class="top-bar__home-link" href="/">`)
//line views/stuff.qtpl:26
//line views/stuff.qtpl:27
	qw422016.E().S(cfg.WikiName)
//line views/stuff.qtpl:26
//line views/stuff.qtpl:27
	qw422016.N().S(`</a>
						</div>
					</li>
					<li class="top-bar__section top-bar__section_search">
						<form class="top-bar__search" method="GET" action="/title-search">
							<input type="text" name="q" placeholder="`)
//line views/stuff.qtpl:31
//line views/stuff.qtpl:32
	qw422016.E().S(lc.Get("ui.title_search"))
//line views/stuff.qtpl:31
//line views/stuff.qtpl:32
	qw422016.N().S(`" class="top-bar__search-bar">
						</form>
					</li>
					<li class="top-bar__section top-bar__section_auth">
					`)
//line views/stuff.qtpl:35
//line views/stuff.qtpl:36
	if cfg.UseAuth {
//line views/stuff.qtpl:35
//line views/stuff.qtpl:36
		qw422016.N().S(`
						<ul class="top-bar__auth auth-links">
							<li class="auth-links__box auth-links__user-box">
								`)
//line views/stuff.qtpl:38
//line views/stuff.qtpl:39
		if u.Group == "anon" {
//line views/stuff.qtpl:38
//line views/stuff.qtpl:39
			qw422016.N().S(`
								<a href="/login" class="auth-links__link auth-links__login-link">`)
//line views/stuff.qtpl:39
//line views/stuff.qtpl:40
			qw422016.E().S(lc.Get("ui.login"))
//line views/stuff.qtpl:39
//line views/stuff.qtpl:40
			qw422016.N().S(`</a>
								`)
//line views/stuff.qtpl:40
//line views/stuff.qtpl:41
		} else {
//line views/stuff.qtpl:40
//line views/stuff.qtpl:41
			qw422016.N().S(`
								<a href="/hypha/`)
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.N().S(`/`)
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.E().S(u.Name)
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.N().S(`" class="auth-links__link auth-links__user-link">`)
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.E().S(util.BeautifulName(u.Name))
//line views/stuff.qtpl:41
//line views/stuff.qtpl:42
			qw422016.N().S(`</a>
								`)
//line views/stuff.qtpl:42
//line views/stuff.qtpl:43
		}
//line views/stuff.qtpl:42
//line views/stuff.qtpl:43
		qw422016.N().S(`
							</li>
							`)
//line views/stuff.qtpl:44
//line views/stuff.qtpl:45
		if cfg.AllowRegistration && u.Group == "anon" {
//line views/stuff.qtpl:44
//line views/stuff.qtpl:45
			qw422016.N().S(`
							<li class="auth-links__box auth-links__register-box">
								<a href="/register" class="auth-links__link auth-links__register-link">`)
//line views/stuff.qtpl:46
//line views/stuff.qtpl:47
			qw422016.E().S(lc.Get("ui.register"))
//line views/stuff.qtpl:46
//line views/stuff.qtpl:47
			qw422016.N().S(`</a>
							</li>
							`)
//line views/stuff.qtpl:48
//line views/stuff.qtpl:49
		}
//line views/stuff.qtpl:48
//line views/stuff.qtpl:49
		qw422016.N().S(`
							`)
//line views/stuff.qtpl:49
//line views/stuff.qtpl:50
		if u.Group == "admin" {
//line views/stuff.qtpl:49
//line views/stuff.qtpl:50
			qw422016.N().S(`
							<li class="auth-links__box auth-links__admin-box">
								<a href="/admin" class="auth-links__link auth-links__admin-link">`)
//line views/stuff.qtpl:51
//line views/stuff.qtpl:52
			qw422016.E().S(lc.Get("ui.admin_panel"))
//line views/stuff.qtpl:51
//line views/stuff.qtpl:52
			qw422016.N().S(`</a>
							</li>
							`)
//line views/stuff.qtpl:53
//line views/stuff.qtpl:54
		}
//line views/stuff.qtpl:53
//line views/stuff.qtpl:54
		qw422016.N().S(`
						</ul>
					`)
//line views/stuff.qtpl:55
//line views/stuff.qtpl:56
	}
//line views/stuff.qtpl:55
//line views/stuff.qtpl:56
	qw422016.N().S(`
					</li>
					<li class="top-bar__section top-bar__section_highlights">
						<ul class="top-bar__highlights">
`)
//line views/stuff.qtpl:59
//line views/stuff.qtpl:60
	for _, link := range cfg.HeaderLinks {
//line views/stuff.qtpl:59
		qw422016.N().S(`						`)
//line views/stuff.qtpl:60
		qw422016.N().S(`						`)
//line views/stuff.qtpl:61
		if link.Href != "/" {
//line views/stuff.qtpl:60
//line views/stuff.qtpl:61
			qw422016.N().S(`
							<li class="top-bar__highlight">
								<a class="top-bar__highlight-link" href="`)
//line views/stuff.qtpl:62
//line views/stuff.qtpl:63
			qw422016.E().S(link.Href)
//line views/stuff.qtpl:62
//line views/stuff.qtpl:63
			qw422016.N().S(`">`)
//line views/stuff.qtpl:62
//line views/stuff.qtpl:63
			qw422016.E().S(link.Display)
//line views/stuff.qtpl:62
//line views/stuff.qtpl:63
			qw422016.N().S(`</a>
							</li>
						`)
//line views/stuff.qtpl:64
//line views/stuff.qtpl:65
		}
//line views/stuff.qtpl:64
//line views/stuff.qtpl:65
		qw422016.N().S(`
`)
//line views/stuff.qtpl:65
//line views/stuff.qtpl:66
	}
//line views/stuff.qtpl:65
//line views/stuff.qtpl:66
	qw422016.N().S(`						</ul>
					</li>
				</ul>
			</nav>
		</header>
		`)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:72
	qw422016.N().S(body)
//line views/stuff.qtpl:71
//line views/stuff.qtpl:72
	qw422016.N().S(`
		<template id="dialog-template">
			<div class="dialog-backdrop"></div>


@@ 218,9 221,9 @@ func StreamBaseHTML(qw422016 *qt422016.Writer, title, body string, lc *l18n.Loca
				<div class="dialog__header">
					<h1 class="dialog__title"></h1>
					<button class="dialog__close-button" aria-label="`)
//line views/stuff.qtpl:77
//line views/stuff.qtpl:78
	qw422016.E().S(lc.Get("ui.close_dialog"))
//line views/stuff.qtpl:77
//line views/stuff.qtpl:78
	qw422016.N().S(`"></button>
				</div>



@@ 228,517 231,517 @@ func StreamBaseHTML(qw422016 *qt422016.Writer, title, body string, lc *l18n.Loca
			</div>
		</template>
		`)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:84
	StreamCommonScripts(qw422016)
//line views/stuff.qtpl:83
//line views/stuff.qtpl:84
	qw422016.N().S(`
		<script src="/static/view.js"></script>
	</body>
</html>
`)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
}

//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
func WriteBaseHTML(qq422016 qtio422016.Writer, title, body string, lc *l18n.Localizer, u *user.User, headElements ...string) {
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	StreamBaseHTML(qw422016, title, body, lc, u, headElements...)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
}

//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
func BaseHTML(title, body string, lc *l18n.Localizer, u *user.User, headElements ...string) string {
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	WriteBaseHTML(qb422016, title, body, lc, u, headElements...)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
	return qs422016
//line views/stuff.qtpl:87
//line views/stuff.qtpl:88
}

//line views/stuff.qtpl:89
//line views/stuff.qtpl:90
func StreamTitleSearchHTML(qw422016 *qt422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:89
//line views/stuff.qtpl:90
	qw422016.N().S(`
<div class="layout">
<main class="main-width title-search">
	<h1>`)
//line views/stuff.qtpl:92
//line views/stuff.qtpl:93
	qw422016.E().S(lc.Get("ui.search_results_query", &l18n.Replacements{"query": query}))
//line views/stuff.qtpl:92
//line views/stuff.qtpl:93
	qw422016.N().S(`</h1>
	<p>`)
//line views/stuff.qtpl:93
//line views/stuff.qtpl:94
	qw422016.E().S(lc.Get("ui.search_results_desc"))
//line views/stuff.qtpl:93
//line views/stuff.qtpl:94
	qw422016.N().S(`</p>
	<ul class="title-search__results">
	`)
//line views/stuff.qtpl:95
//line views/stuff.qtpl:96
	for hyphaName := range generator(query) {
//line views/stuff.qtpl:95
//line views/stuff.qtpl:96
		qw422016.N().S(`
		<li class="title-search__entry">
			<a class="title-search__link wikilink" href="/hypha/`)
//line views/stuff.qtpl:97
//line views/stuff.qtpl:98
		qw422016.E().S(hyphaName)
//line views/stuff.qtpl:97
//line views/stuff.qtpl:98
		qw422016.N().S(`">`)
//line views/stuff.qtpl:97
//line views/stuff.qtpl:98
		qw422016.E().S(util.BeautifulName(hyphaName))
//line views/stuff.qtpl:97
//line views/stuff.qtpl:98
		qw422016.N().S(`</a>
		</li>
	`)
//line views/stuff.qtpl:99
//line views/stuff.qtpl:100
	}
//line views/stuff.qtpl:99
//line views/stuff.qtpl:100
	qw422016.N().S(`
</main>
</div>
`)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
}

//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
func WriteTitleSearchHTML(qq422016 qtio422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	StreamTitleSearchHTML(qw422016, query, generator, lc)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
}

//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
func TitleSearchHTML(query string, generator func(string) <-chan string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	WriteTitleSearchHTML(qb422016, query, generator, lc)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
	return qs422016
//line views/stuff.qtpl:102
//line views/stuff.qtpl:103
}

// It outputs a poorly formatted JSON, but it works and is valid.

//line views/stuff.qtpl:105
//line views/stuff.qtpl:106
func StreamTitleSearchJSON(qw422016 *qt422016.Writer, query string, generator func(string) <-chan string) {
//line views/stuff.qtpl:105
//line views/stuff.qtpl:106
	qw422016.N().S(`
`)
//line views/stuff.qtpl:107
//line views/stuff.qtpl:108
	// Lol
	counter := 0

//line views/stuff.qtpl:109
//line views/stuff.qtpl:110
	qw422016.N().S(`
{
	"source_query": "`)
//line views/stuff.qtpl:111
//line views/stuff.qtpl:112
	qw422016.E().S(query)
//line views/stuff.qtpl:111
//line views/stuff.qtpl:112
	qw422016.N().S(`",
	"results": [
	`)
//line views/stuff.qtpl:113
//line views/stuff.qtpl:114
	for hyphaName := range generator(query) {
//line views/stuff.qtpl:113
//line views/stuff.qtpl:114
		qw422016.N().S(`
		`)
//line views/stuff.qtpl:114
//line views/stuff.qtpl:115
		if counter > 0 {
//line views/stuff.qtpl:114
//line views/stuff.qtpl:115
			qw422016.N().S(`, `)
//line views/stuff.qtpl:114
//line views/stuff.qtpl:115
		}
//line views/stuff.qtpl:114
//line views/stuff.qtpl:115
		qw422016.N().S(`{
			"canonical_name": "`)
//line views/stuff.qtpl:115
//line views/stuff.qtpl:116
		qw422016.E().S(hyphaName)
//line views/stuff.qtpl:115
//line views/stuff.qtpl:116
		qw422016.N().S(`",
			"beautiful_name": "`)
//line views/stuff.qtpl:116
//line views/stuff.qtpl:117
		qw422016.E().S(util.BeautifulName(hyphaName))
//line views/stuff.qtpl:116
//line views/stuff.qtpl:117
		qw422016.N().S(`",
			"url": "`)
//line views/stuff.qtpl:117
//line views/stuff.qtpl:118
		qw422016.E().S(cfg.URL + "/hypha/" + hyphaName)
//line views/stuff.qtpl:117
//line views/stuff.qtpl:118
		qw422016.N().S(`"
		}`)
//line views/stuff.qtpl:118
//line views/stuff.qtpl:119
		counter++

//line views/stuff.qtpl:118
//line views/stuff.qtpl:119
		qw422016.N().S(`
	`)
//line views/stuff.qtpl:119
//line views/stuff.qtpl:120
	}
//line views/stuff.qtpl:119
//line views/stuff.qtpl:120
	qw422016.N().S(`
	]
}
`)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
}

//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
func WriteTitleSearchJSON(qq422016 qtio422016.Writer, query string, generator func(string) <-chan string) {
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	StreamTitleSearchJSON(qw422016, query, generator)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
}

//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
func TitleSearchJSON(query string, generator func(string) <-chan string) string {
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	WriteTitleSearchJSON(qb422016, query, generator)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
	return qs422016
//line views/stuff.qtpl:122
//line views/stuff.qtpl:123
}

//line views/stuff.qtpl:124
//line views/stuff.qtpl:125
func StreamBacklinksHTML(qw422016 *qt422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:124
//line views/stuff.qtpl:125
	qw422016.N().S(`
<div class="layout">
<main class="main-width backlinks">
	<h1>`)
//line views/stuff.qtpl:127
//line views/stuff.qtpl:128
	qw422016.E().S(lc.Get("ui.backlinks_query", &l18n.Replacements{"query": query}))
//line views/stuff.qtpl:127
//line views/stuff.qtpl:128
	qw422016.N().S(`</h1>
	<p>`)
//line views/stuff.qtpl:128
//line views/stuff.qtpl:129
	qw422016.E().S(lc.Get("ui.backlinks_desc"))
//line views/stuff.qtpl:128
//line views/stuff.qtpl:129
	qw422016.N().S(`</p>
	<ul class="backlinks__list">
	`)
//line views/stuff.qtpl:130
//line views/stuff.qtpl:131
	for hyphaName := range generator(query) {
//line views/stuff.qtpl:130
//line views/stuff.qtpl:131
		qw422016.N().S(`
		<li class="backlinks__entry">
			<a class="backlinks__link wikilink" href="/hypha/`)
//line views/stuff.qtpl:132
//line views/stuff.qtpl:133
		qw422016.E().S(hyphaName)
//line views/stuff.qtpl:132
//line views/stuff.qtpl:133
		qw422016.N().S(`">`)
//line views/stuff.qtpl:132
//line views/stuff.qtpl:133
		qw422016.E().S(util.BeautifulName(hyphaName))
//line views/stuff.qtpl:132
//line views/stuff.qtpl:133
		qw422016.N().S(`</a>
		</li>
	`)
//line views/stuff.qtpl:134
//line views/stuff.qtpl:135
	}
//line views/stuff.qtpl:134
//line views/stuff.qtpl:135
	qw422016.N().S(`
</main>
</div>
`)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
}

//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
func WriteBacklinksHTML(qq422016 qtio422016.Writer, query string, generator func(string) <-chan string, lc *l18n.Localizer) {
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	StreamBacklinksHTML(qw422016, query, generator, lc)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
}

//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
func BacklinksHTML(query string, generator func(string) <-chan string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	WriteBacklinksHTML(qb422016, query, generator, lc)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
	return qs422016
//line views/stuff.qtpl:137
//line views/stuff.qtpl:138
}

//line views/stuff.qtpl:139
//line views/stuff.qtpl:140
func StreamHelpHTML(qw422016 *qt422016.Writer, content, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:139
//line views/stuff.qtpl:140
	qw422016.N().S(`
<div class="layout">
<main class="main-width help">
	<article>
	`)
//line views/stuff.qtpl:143
//line views/stuff.qtpl:144
	qw422016.N().S(content)
//line views/stuff.qtpl:143
//line views/stuff.qtpl:144
	qw422016.N().S(`
	</article>
</main>
`)
//line views/stuff.qtpl:146
//line views/stuff.qtpl:147
	qw422016.N().S(helpTopicsHTML(lang, lc))
//line views/stuff.qtpl:146
//line views/stuff.qtpl:147
	qw422016.N().S(`
</div>
`)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
}

//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
func WriteHelpHTML(qq422016 qtio422016.Writer, content, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	StreamHelpHTML(qw422016, content, lang, lc)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
}

//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
func HelpHTML(content, lang string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	WriteHelpHTML(qb422016, content, lang, lc)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
	return qs422016
//line views/stuff.qtpl:148
//line views/stuff.qtpl:149
}

//line views/stuff.qtpl:150
//line views/stuff.qtpl:151
func StreamHelpEmptyErrorHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:150
//line views/stuff.qtpl:151
	qw422016.N().S(`
<h1>`)
//line views/stuff.qtpl:151
//line views/stuff.qtpl:152
	qw422016.E().S(lc.Get("help.empty_error_title"))
//line views/stuff.qtpl:151
//line views/stuff.qtpl:152
	qw422016.N().S(`</h1>
<p>`)
//line views/stuff.qtpl:152
//line views/stuff.qtpl:153
	qw422016.E().S(lc.Get("help.empty_error_line_1"))
//line views/stuff.qtpl:152
//line views/stuff.qtpl:153
	qw422016.N().S(`</p>
<p>`)
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.E().S(lc.Get("help.empty_error_line_2a"))
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.N().S(` <a class="wikilink wikilink_external wikilink_https" href="https://github.com/bouncepaw/mycorrhiza">`)
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.E().S(lc.Get("help.empty_error_link"))
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.N().S(`</a> `)
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.E().S(lc.Get("help.empty_error_line_2b"))
//line views/stuff.qtpl:153
//line views/stuff.qtpl:154
	qw422016.N().S(`</p>
`)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
}

//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
func WriteHelpEmptyErrorHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	StreamHelpEmptyErrorHTML(qw422016, lc)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
}

//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
func HelpEmptyErrorHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	WriteHelpEmptyErrorHTML(qb422016, lc)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
	return qs422016
//line views/stuff.qtpl:154
//line views/stuff.qtpl:155
}

//line views/stuff.qtpl:156
//line views/stuff.qtpl:157
func streamhelpTopicsHTML(qw422016 *qt422016.Writer, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:156
//line views/stuff.qtpl:157
	qw422016.N().S(`
<aside class="help-topics layout-card">
	<h2 class="layout-card__title">`)
//line views/stuff.qtpl:158
//line views/stuff.qtpl:159
	qw422016.E().S(lc.GetWithLocale(lang, "help.topics"))
//line views/stuff.qtpl:158
//line views/stuff.qtpl:159
	qw422016.N().S(`</h2>
	<ul class="help-topics__list">
		<li><a href="/help/`)
//line views/stuff.qtpl:160
//line views/stuff.qtpl:161
	qw422016.E().S(lang)
//line views/stuff.qtpl:160
//line views/stuff.qtpl:161
	qw422016.N().S(`">`)
//line views/stuff.qtpl:160
//line views/stuff.qtpl:161
	qw422016.E().S(lc.GetWithLocale(lang, "help.main"))
//line views/stuff.qtpl:160
//line views/stuff.qtpl:161
	qw422016.N().S(`</a></li>
		<li><a href="/help/`)
//line views/stuff.qtpl:161
//line views/stuff.qtpl:162
	qw422016.E().S(lang)
//line views/stuff.qtpl:161
//line views/stuff.qtpl:162
	qw422016.N().S(`/hypha">`)
//line views/stuff.qtpl:161
//line views/stuff.qtpl:162
	qw422016.E().S(lc.GetWithLocale(lang, "help.hypha"))
//line views/stuff.qtpl:161
//line views/stuff.qtpl:162
	qw422016.N().S(`</a>
			<ul>
				<li><a href="/help/`)
//line views/stuff.qtpl:163
//line views/stuff.qtpl:164
	qw422016.E().S(lang)
//line views/stuff.qtpl:163
//line views/stuff.qtpl:164
	qw422016.N().S(`/attachment">`)
//line views/stuff.qtpl:163
//line views/stuff.qtpl:164
	qw422016.E().S(lc.GetWithLocale(lang, "help.attachment"))
//line views/stuff.qtpl:163
//line views/stuff.qtpl:164
	qw422016.N().S(`</a></li>
			</ul>
		</li>
		<li><a href="/help/`)
//line views/stuff.qtpl:166
//line views/stuff.qtpl:167
	qw422016.E().S(lang)
//line views/stuff.qtpl:166
//line views/stuff.qtpl:167
	qw422016.N().S(`/mycomarkup">`)
//line views/stuff.qtpl:166
//line views/stuff.qtpl:167
	qw422016.E().S(lc.GetWithLocale(lang, "help.mycomarkup"))
//line views/stuff.qtpl:166
//line views/stuff.qtpl:167
	qw422016.N().S(`</a></li>
		<li>`)
//line views/stuff.qtpl:167
//line views/stuff.qtpl:168
	qw422016.E().S(lc.GetWithLocale(lang, "help.interface"))
//line views/stuff.qtpl:167
//line views/stuff.qtpl:168
	qw422016.N().S(`
			<ul>
				<li><a href="/help/`)
//line views/stuff.qtpl:169
//line views/stuff.qtpl:170
	qw422016.E().S(lang)
//line views/stuff.qtpl:169
//line views/stuff.qtpl:170
	qw422016.N().S(`/prevnext">`)
//line views/stuff.qtpl:169
//line views/stuff.qtpl:170
	qw422016.E().S(lc.GetWithLocale(lang, "help.prevnext"))
//line views/stuff.qtpl:169
//line views/stuff.qtpl:170
	qw422016.N().S(`</a></li>
				<li><a href="/help/`)
//line views/stuff.qtpl:170
//line views/stuff.qtpl:171
	qw422016.E().S(lang)
//line views/stuff.qtpl:170
//line views/stuff.qtpl:171
	qw422016.N().S(`/top_bar">`)
//line views/stuff.qtpl:170
//line views/stuff.qtpl:171
	qw422016.E().S(lc.GetWithLocale(lang, "help.top_bar"))
//line views/stuff.qtpl:170
//line views/stuff.qtpl:171
	qw422016.N().S(`</a></li>
				<li><a href="/help/`)
//line views/stuff.qtpl:171
//line views/stuff.qtpl:172
	qw422016.E().S(lang)
//line views/stuff.qtpl:171
//line views/stuff.qtpl:172
	qw422016.N().S(`/sibling_hyphae_section">`)
//line views/stuff.qtpl:171
//line views/stuff.qtpl:172
	qw422016.E().S(lc.GetWithLocale(lang, "help.sibling_hyphae"))
//line views/stuff.qtpl:171
//line views/stuff.qtpl:172
	qw422016.N().S(`</a></li>
				<li>...</li>
			</ul>
		</li>
		<li>`)
//line views/stuff.qtpl:175
//line views/stuff.qtpl:176
	qw422016.E().S(lc.GetWithLocale(lang, "help.special_pages"))
//line views/stuff.qtpl:175
//line views/stuff.qtpl:176
	qw422016.N().S(`
			<ul>
				<li><a href="/help/`)
//line views/stuff.qtpl:177
//line views/stuff.qtpl:178
	qw422016.E().S(lang)
//line views/stuff.qtpl:177
//line views/stuff.qtpl:178
	qw422016.N().S(`/recent_changes">`)
//line views/stuff.qtpl:177
//line views/stuff.qtpl:178
	qw422016.E().S(lc.GetWithLocale(lang, "help.recent_changes"))
//line views/stuff.qtpl:177
//line views/stuff.qtpl:178
	qw422016.N().S(`</a></li>
			</ul>
		</li>
		<li>`)
//line views/stuff.qtpl:180
//line views/stuff.qtpl:181
	qw422016.E().S(lc.GetWithLocale(lang, "help.configuration"))
//line views/stuff.qtpl:180
//line views/stuff.qtpl:181
	qw422016.N().S(`
			<ul>
				<li><a href="/help/`)
//line views/stuff.qtpl:182
//line views/stuff.qtpl:183
	qw422016.E().S(lang)
//line views/stuff.qtpl:182
//line views/stuff.qtpl:183
	qw422016.N().S(`/lock">`)
//line views/stuff.qtpl:182
//line views/stuff.qtpl:183
	qw422016.E().S(lc.GetWithLocale(lang, "help.lock"))
//line views/stuff.qtpl:182
//line views/stuff.qtpl:183
	qw422016.N().S(`</a></li>
				<li><a href="/help/`)
//line views/stuff.qtpl:183
//line views/stuff.qtpl:184
	qw422016.E().S(lang)
//line views/stuff.qtpl:183
//line views/stuff.qtpl:184
	qw422016.N().S(`/whitelist">`)
//line views/stuff.qtpl:183
//line views/stuff.qtpl:184
	qw422016.E().S(lc.GetWithLocale(lang, "help.whitelist"))
//line views/stuff.qtpl:183
//line views/stuff.qtpl:184
	qw422016.N().S(`</a></li>
				<li><a href="/help/`)
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
	qw422016.E().S(lang)
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
	qw422016.N().S(`/telegram">`)
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
	qw422016.E().S(lc.GetWithLocale(lang, "help.telegram"))
//line views/stuff.qtpl:184
//line views/stuff.qtpl:185
	qw422016.N().S(`</a></li>
				<li>...</li>
			</ul>


@@ 746,91 749,91 @@ func streamhelpTopicsHTML(qw422016 *qt422016.Writer, lang string, lc *l18n.Local
	</ul>
</aside>
`)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
}

//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
func writehelpTopicsHTML(qq422016 qtio422016.Writer, lang string, lc *l18n.Localizer) {
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	streamhelpTopicsHTML(qw422016, lang, lc)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
}

//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
func helpTopicsHTML(lang string, lc *l18n.Localizer) string {
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	writehelpTopicsHTML(qb422016, lang, lc)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
	return qs422016
//line views/stuff.qtpl:190
//line views/stuff.qtpl:191
}

//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
func streamhelpTopicBadgeHTML(qw422016 *qt422016.Writer, lang, topic string) {
//line views/stuff.qtpl:192
//line views/stuff.qtpl:193
	qw422016.N().S(`
<a class="help-topic-badge" href="/help/`)
//line views/stuff.qtpl:193
//line views/stuff.qtpl:194
	qw422016.E().S(lang)
//line views/stuff.qtpl:193
//line views/stuff.qtpl:194
	qw422016.N().S(`/`)
//line views/stuff.qtpl:193
//line views/stuff.qtpl:194
	qw422016.E().S(topic)
//line views/stuff.qtpl:193
//line views/stuff.qtpl:194
	qw422016.N().S(`">?</a>
`)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
}

//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
func writehelpTopicBadgeHTML(qq422016 qtio422016.Writer, lang, topic string) {
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	streamhelpTopicBadgeHTML(qw422016, lang, topic)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
}

//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
func helpTopicBadgeHTML(lang, topic string) string {
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	writehelpTopicBadgeHTML(qb422016, lang, topic)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
	return qs422016
//line views/stuff.qtpl:194
//line views/stuff.qtpl:195
}

//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
func StreamUserListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:196
//line views/stuff.qtpl:197
	qw422016.N().S(`
<div class="layout">
<main class="main-width user-list">
	<h1>`)
//line views/stuff.qtpl:199
//line views/stuff.qtpl:200
	qw422016.E().S(lc.Get("ui.users_heading"))
//line views/stuff.qtpl:199
//line views/stuff.qtpl:200
	qw422016.N().S(`</h1>
`)
//line views/stuff.qtpl:201
//line views/stuff.qtpl:202
	var (
		admins     = make([]string, 0)
		moderators = make([]string, 0)


@@ 846,386 849,406 @@ func StreamUserListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
			editors = append(editors, u.Name)
		}
	}
	sort.Strings(admins)
	sort.Strings(moderators)
	sort.Strings(editors)

//line views/stuff.qtpl:216
//line views/stuff.qtpl:220
	qw422016.N().S(`
	<section>
		<h2>`)
//line views/stuff.qtpl:218
//line views/stuff.qtpl:222
	qw422016.E().S(lc.Get("ui.users_admins"))
//line views/stuff.qtpl:218
//line views/stuff.qtpl:222
	qw422016.N().S(`</h2>
		<ol>`)
//line views/stuff.qtpl:219
//line views/stuff.qtpl:223
	for _, name := range admins {
//line views/stuff.qtpl:219
//line views/stuff.qtpl:223
		qw422016.N().S(`
			<li><a href="/hypha/`)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.N().S(`/`)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.E().S(name)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.N().S(`">`)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.E().S(name)
//line views/stuff.qtpl:220
//line views/stuff.qtpl:224
		qw422016.N().S(`</a></li>
		`)
//line views/stuff.qtpl:221
//line views/stuff.qtpl:225
	}
//line views/stuff.qtpl:221
//line views/stuff.qtpl:225
	qw422016.N().S(`</ol>
	</section>
	<section>
		<h2>`)
//line views/stuff.qtpl:224
//line views/stuff.qtpl:228
	qw422016.E().S(lc.Get("ui.users_moderators"))
//line views/stuff.qtpl:224
//line views/stuff.qtpl:228
	qw422016.N().S(`</h2>
		<ol>`)
//line views/stuff.qtpl:225
//line views/stuff.qtpl:229
	for _, name := range moderators {
//line views/stuff.qtpl:225
//line views/stuff.qtpl:229
		qw422016.N().S(`
			<li><a href="/hypha/`)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.N().S(`/`)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.E().S(name)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.N().S(`">`)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.E().S(name)
//line views/stuff.qtpl:226
//line views/stuff.qtpl:230
		qw422016.N().S(`</a></li>
		`)
//line views/stuff.qtpl:227
//line views/stuff.qtpl:231
	}
//line views/stuff.qtpl:227
//line views/stuff.qtpl:231
	qw422016.N().S(`</ol>
	</section>
	<section>
		<h2>`)
//line views/stuff.qtpl:230
//line views/stuff.qtpl:234
	qw422016.E().S(lc.Get("ui.users_editors"))
//line views/stuff.qtpl:230
//line views/stuff.qtpl:234
	qw422016.N().S(`</h2>
		<ol>`)
//line views/stuff.qtpl:231
//line views/stuff.qtpl:235
	for _, name := range editors {
//line views/stuff.qtpl:231
//line views/stuff.qtpl:235
		qw422016.N().S(`
			<li><a href="/hypha/`)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.N().S(`/`)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.E().S(name)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.N().S(`">`)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.E().S(name)
//line views/stuff.qtpl:232
//line views/stuff.qtpl:236
		qw422016.N().S(`</a></li>
		`)
//line views/stuff.qtpl:233
//line views/stuff.qtpl:237
	}
//line views/stuff.qtpl:233
//line views/stuff.qtpl:237
	qw422016.N().S(`</ol>
	</section>
</main>
</div>
`)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
}

//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
func WriteUserListHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	StreamUserListHTML(qw422016, lc)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
}

//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
func UserListHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	WriteUserListHTML(qb422016, lc)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
	return qs422016
//line views/stuff.qtpl:237
//line views/stuff.qtpl:241
}

//line views/stuff.qtpl:239
//line views/stuff.qtpl:243
func StreamHyphaListHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:239
//line views/stuff.qtpl:243
	qw422016.N().S(`
<div class="layout">
<main class="main-width">
	<h1>`)
//line views/stuff.qtpl:242
//line views/stuff.qtpl:246
	qw422016.E().S(lc.Get("ui.list_heading"))
//line views/stuff.qtpl:242
//line views/stuff.qtpl:246
	qw422016.N().S(`</h1>
	<p>`)
//line views/stuff.qtpl:243
//line views/stuff.qtpl:247
	qw422016.E().S(lc.GetPlural("ui.list_desc", hyphae.Count()))
//line views/stuff.qtpl:243
//line views/stuff.qtpl:247
	qw422016.N().S(`</p>
	<ul class="hypha-list">
		`)
//line views/stuff.qtpl:245
	for h := range hyphae.YieldExistingHyphae() {
//line views/stuff.qtpl:245
//line views/stuff.qtpl:250
	hyphaNames := make(chan string)
	sortedHypha := hyphae.PathographicSort(hyphaNames)
	for hypha := range hyphae.YieldExistingHyphae() {
		hyphaNames <- hypha.Name
	}
	close(hyphaNames)

//line views/stuff.qtpl:256
	qw422016.N().S(`
		`)
//line views/stuff.qtpl:257
	for hyphaName := range sortedHypha {
//line views/stuff.qtpl:257
		qw422016.N().S(`
		`)
//line views/stuff.qtpl:258
		hypha := hyphae.ByName(hyphaName)

//line views/stuff.qtpl:258
		qw422016.N().S(`
		<li class="hypha-list__entry">
			<a class="hypha-list__link" href="/hypha/`)
//line views/stuff.qtpl:247
		qw422016.E().S(h.Name)
//line views/stuff.qtpl:247
//line views/stuff.qtpl:260
		qw422016.E().S(hypha.Name)
//line views/stuff.qtpl:260
		qw422016.N().S(`">`)
//line views/stuff.qtpl:247
		qw422016.E().S(util.BeautifulName(h.Name))
//line views/stuff.qtpl:247
//line views/stuff.qtpl:260
		qw422016.E().S(util.BeautifulName(hypha.Name))
//line views/stuff.qtpl:260
		qw422016.N().S(`</a>
			`)
//line views/stuff.qtpl:248
		if h.BinaryPath != "" {
//line views/stuff.qtpl:248
//line views/stuff.qtpl:261
		if hypha.BinaryPath != "" {
//line views/stuff.qtpl:261
			qw422016.N().S(`
			<span class="hypha-list__amnt-type">`)
//line views/stuff.qtpl:249
			qw422016.E().S(filepath.Ext(h.BinaryPath)[1:])
//line views/stuff.qtpl:249
//line views/stuff.qtpl:262
			qw422016.E().S(filepath.Ext(hypha.BinaryPath)[1:])
//line views/stuff.qtpl:262
			qw422016.N().S(`</span>
			`)
//line views/stuff.qtpl:250
//line views/stuff.qtpl:263
		}
//line views/stuff.qtpl:250
//line views/stuff.qtpl:263
		qw422016.N().S(`
		</li>
		`)
//line views/stuff.qtpl:252
//line views/stuff.qtpl:265
	}
//line views/stuff.qtpl:252
//line views/stuff.qtpl:265
	qw422016.N().S(`
	</ul>
</main>
</div>
`)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
}

//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
func WriteHyphaListHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	StreamHyphaListHTML(qw422016, lc)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
}

//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
func HyphaListHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	WriteHyphaListHTML(qb422016, lc)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
	return qs422016
//line views/stuff.qtpl:256
//line views/stuff.qtpl:269
}

//line views/stuff.qtpl:258
//line views/stuff.qtpl:271
func StreamAboutHTML(qw422016 *qt422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:258
//line views/stuff.qtpl:271
	qw422016.N().S(`
<div class="layout">
<main class="main-width">
	<section>
		<h1>`)
//line views/stuff.qtpl:262
//line views/stuff.qtpl:275
	qw422016.E().S(lc.Get("ui.about_title", &l18n.Replacements{"name": cfg.WikiName}))
//line views/stuff.qtpl:262
//line views/stuff.qtpl:275
	qw422016.N().S(`</h1>
		<ul>
			<li><b>`)
//line views/stuff.qtpl:264
//line views/stuff.qtpl:277
	qw422016.N().S(lc.Get("ui.about_version", &l18n.Replacements{"pre": "<a href=\"https://mycorrhiza.wiki\">", "post": "</a>"}))
//line views/stuff.qtpl:264
//line views/stuff.qtpl:277
	qw422016.N().S(`</b> 1.5.0</li>
`)
//line views/stuff.qtpl:265
//line views/stuff.qtpl:278
	if cfg.UseAuth {
//line views/stuff.qtpl:265
//line views/stuff.qtpl:278
		qw422016.N().S(`			<li><b>`)
//line views/stuff.qtpl:266
//line views/stuff.qtpl:279
		qw422016.E().S(lc.Get("ui.about_usercount"))
//line views/stuff.qtpl:266
//line views/stuff.qtpl:279
		qw422016.N().S(`</b> `)
//line views/stuff.qtpl:266
//line views/stuff.qtpl:279
		qw422016.N().DUL(user.Count())
//line views/stuff.qtpl:266
//line views/stuff.qtpl:279
		qw422016.N().S(`</li>
			<li><b>`)
//line views/stuff.qtpl:267
//line views/stuff.qtpl:280
		qw422016.E().S(lc.Get("ui.about_homepage"))
//line views/stuff.qtpl:267
//line views/stuff.qtpl:280
		qw422016.N().S(`</b> <a href="/">`)
//line views/stuff.qtpl:267
//line views/stuff.qtpl:280
		qw422016.E().S(cfg.HomeHypha)
//line views/stuff.qtpl:267
//line views/stuff.qtpl:280
		qw422016.N().S(`</a></li>
			<li><b>`)
//line views/stuff.qtpl:268
//line views/stuff.qtpl:281
		qw422016.E().S(lc.Get("ui.about_admins"))
//line views/stuff.qtpl:268
//line views/stuff.qtpl:281
		qw422016.N().S(`</b>`)
//line views/stuff.qtpl:268
//line views/stuff.qtpl:281
		for i, username := range user.ListUsersWithGroup("admin") {
//line views/stuff.qtpl:269
//line views/stuff.qtpl:282
			if i > 0 {
//line views/stuff.qtpl:269
//line views/stuff.qtpl:282
				qw422016.N().S(`<span aria-hidden="true">, </span>
`)
//line views/stuff.qtpl:270
//line views/stuff.qtpl:283
			}
//line views/stuff.qtpl:270
//line views/stuff.qtpl:283
			qw422016.N().S(`				<a href="/hypha/`)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.E().S(cfg.UserHypha)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.N().S(`/`)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.E().S(username)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.N().S(`">`)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.E().S(username)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
			qw422016.N().S(`</a>`)
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
		}
//line views/stuff.qtpl:271
//line views/stuff.qtpl:284
		qw422016.N().S(`</li>
`)
//line views/stuff.qtpl:272
//line views/stuff.qtpl:285
	} else {
//line views/stuff.qtpl:272
//line views/stuff.qtpl:285
		qw422016.N().S(`			<li>`)
//line views/stuff.qtpl:273
//line views/stuff.qtpl:286
		qw422016.E().S(lc.Get("ui.about_noauth"))
//line views/stuff.qtpl:273
//line views/stuff.qtpl:286
		qw422016.N().S(`</li>
`)
//line views/stuff.qtpl:274
//line views/stuff.qtpl:287
	}
//line views/stuff.qtpl:274
//line views/stuff.qtpl:287
	qw422016.N().S(`		</ul>
		<p>`)
//line views/stuff.qtpl:276
//line views/stuff.qtpl:289
	qw422016.N().S(lc.Get("ui.about_hyphae", &l18n.Replacements{"link": "<a href=\"/list\">/list</a>"}))
//line views/stuff.qtpl:276
//line views/stuff.qtpl:289
	qw422016.N().S(`</p>
	</section>
</main>
</div>
`)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
}

//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
func WriteAboutHTML(qq422016 qtio422016.Writer, lc *l18n.Localizer) {
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	StreamAboutHTML(qw422016, lc)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
}

//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
func AboutHTML(lc *l18n.Localizer) string {
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	WriteAboutHTML(qb422016, lc)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
	return qs422016
//line views/stuff.qtpl:280
//line views/stuff.qtpl:293
}

//line views/stuff.qtpl:282
//line views/stuff.qtpl:295
func StreamCommonScripts(qw422016 *qt422016.Writer) {
//line views/stuff.qtpl:282
//line views/stuff.qtpl:295
	qw422016.N().S(`
`)
//line views/stuff.qtpl:283
//line views/stuff.qtpl:296
	for _, scriptPath := range cfg.CommonScripts {
//line views/stuff.qtpl:283
//line views/stuff.qtpl:296
		qw422016.N().S(`
<script src="`)
//line views/stuff.qtpl:284
//line views/stuff.qtpl:297
		qw422016.E().S(scriptPath)
//line views/stuff.qtpl:284
//line views/stuff.qtpl:297
		qw422016.N().S(`"></script>
`)
//line views/stuff.qtpl:285
//line views/stuff.qtpl:298
	}
//line views/stuff.qtpl:285
//line views/stuff.qtpl:298
	qw422016.N().S(`
`)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
}

//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
func WriteCommonScripts(qq422016 qtio422016.Writer) {
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	qw422016 := qt422016.AcquireWriter(qq422016)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	StreamCommonScripts(qw422016)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	qt422016.ReleaseWriter(qw422016)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
}

//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
func CommonScripts() string {
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	qb422016 := qt422016.AcquireByteBuffer()
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	WriteCommonScripts(qb422016)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	qs422016 := string(qb422016.B)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	qt422016.ReleaseByteBuffer(qb422016)
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
	return qs422016
//line views/stuff.qtpl:286
//line views/stuff.qtpl:299
}