1
0
mirror of https://github.com/osmarks/mycorrhiza.git synced 2025-08-07 22:33:46 +00:00

Translate more error messages

Featuring own fork of go-localize! It's not in dependencies though.
This commit is contained in:
Mikhail Chekan 2021-10-10 11:51:34 +08:00 committed by Umar Getagazov
parent 8091638181
commit 0354945502
9 changed files with 561 additions and 482 deletions

View File

@ -1,6 +1,4 @@
// Code generated by go-localize; DO NOT EDIT. // Code generated by go-localize; DO NOT EDIT.
// This file was generated by robots at
// 2021-10-01 01:05:27.197649651 -0400 EDT m=+0.002749572
package l18n package l18n
@ -12,446 +10,482 @@ import (
) )
var localizations = map[string]string{ var localizations = map[string]string{
"en.admin.newuser_create": "Create", "en.admin.newuser_create": "Create",
"en.admin.newuser_title": "New user", "en.admin.newuser_title": "New user",
"en.admin.panel_about": "About this wiki", "en.admin.panel_about": "About this wiki",
"en.admin.panel_reindex": "Reindex hyphae", "en.admin.panel_reindex": "Reindex hyphae",
"en.admin.panel_safe": "Safe things", "en.admin.panel_safe": "Safe things",
"en.admin.panel_shutdown": "Shutdown wiki", "en.admin.panel_shutdown": "Shutdown wiki",
"en.admin.panel_title": "Administrative functions", "en.admin.panel_title": "Administrative functions",
"en.admin.panel_unsafe": "Dangerous things", "en.admin.panel_unsafe": "Dangerous things",
"en.admin.panel_updateheader": "Update header links", "en.admin.panel_updateheader": "Update header links",
"en.admin.panel_userlist": "User list", "en.admin.panel_userlist": "User list",
"en.admin.panel_users": "Manage users", "en.admin.panel_users": "Manage users",
"en.admin.user_delete": "Delete", "en.admin.user_delete": "Delete",
"en.admin.user_delete_heading": "Delete user", "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_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_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_group_heading": "Change group",
"en.admin.user_title": "User %s", "en.admin.user_title": "User %s",
"en.admin.user_update": "Update", "en.admin.user_update": "Update",
"en.admin.users_actions": "Actions", "en.admin.users_actions": "Actions",
"en.admin.users_create": "Create a new user", "en.admin.users_create": "Create a new user",
"en.admin.users_edit": "Edit", "en.admin.users_edit": "Edit",
"en.admin.users_group": "Group", "en.admin.users_group": "Group",
"en.admin.users_name": "Name", "en.admin.users_name": "Name",
"en.admin.users_notime": "unknown", "en.admin.users_notime": "unknown",
"en.admin.users_password": "Password", "en.admin.users_password": "Password",
"en.admin.users_registered": "Registered at", "en.admin.users_registered": "Registered at",
"en.admin.users_reindex": "Reindex users", "en.admin.users_reindex": "Reindex users",
"en.admin.users_title": "Manage 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.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_password": "Wrong password.",
"en.auth.error_telegram": "Could not authorize using Telegram.", "en.auth.error_telegram": "Could not authorize using Telegram.",
"en.auth.error_username": "Unknown username.", "en.auth.error_username": "Unknown username.",
"en.auth.go_back": "Go back", "en.auth.go_back": "Go back",
"en.auth.go_home": "Go home", "en.auth.go_home": "Go home",
"en.auth.go_login": "Go to the login page", "en.auth.go_login": "Go to the login page",
"en.auth.lock_title": "Locked", "en.auth.lock_title": "Locked",
"en.auth.login_button": "Log in", "en.auth.login_button": "Log in",
"en.auth.login_header": "Log in to {{.name}}", "en.auth.login_header": "Log in to {{.name}}",
"en.auth.login_title": "Login", "en.auth.login_title": "Login",
"en.auth.logout_anon": "You cannot log out because you are not logged in.", "en.auth.logout_anon": "You cannot log out because you are not logged in.",
"en.auth.logout_button": "Confirm", "en.auth.logout_button": "Confirm",
"en.auth.logout_header": "Log out?", "en.auth.logout_header": "Log out?",
"en.auth.logout_title": "Logout?", "en.auth.logout_title": "Logout?",
"en.auth.noauth": "Authentication is disabled. You can make edits anonymously.", "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.noregister": "Registrations are currently closed. Administrators can make an account for you by hand; contact them.",
"en.auth.password": "Password", "en.auth.password": "Password",
"en.auth.password_tip": "The server stores your password in an encrypted form; even administrators cannot read it.", "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_button": "Register",
"en.auth.register_header": "Register on {{.name}}", "en.auth.register_header": "Register on {{.name}}",
"en.auth.register_title": "Register", "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.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.try_again": "Try again",
"en.auth.username": "Username", "en.auth.username": "Username",
"en.edit.actions": "Actions", "en.edit.actions": "Actions",
"en.edit.bold": "Bold", "en.edit.bold": "Bold",
"en.edit.bullets": "Bullet list", "en.edit.bullets": "Bullet list",
"en.edit.code": "Code block", "en.edit.code": "Code block",
"en.edit.date": "Insert current date", "en.edit.date": "Insert current date",
"en.edit.heading": "Heading", "en.edit.heading": "Heading",
"en.edit.help": "{{.link}} about mycomarkup", "en.edit.help": "{{.link}} about mycomarkup",
"en.edit.help_link": "Learn more", "en.edit.help_link": "Learn more",
"en.edit.highlight": "Highlight", "en.edit.highlight": "Highlight",
"en.edit.hr": "Horizontal bar", "en.edit.hr": "Horizontal bar",
"en.edit.italic": "Italic", "en.edit.italic": "Italic",
"en.edit.link": "Link", "en.edit.link": "Link",
"en.edit.link_title": "Title", "en.edit.link_title": "Title",
"en.edit.markup": "Markup", "en.edit.markup": "Markup",
"en.edit.mono": "Monospace", "en.edit.mono": "Monospace",
"en.edit.new_hypha": "You are creating a new hypha.", "en.edit.new_hypha": "You are creating a new hypha.",
"en.edit.numbers": "Number list", "en.edit.numbers": "Number list",
"en.edit.preview": "Preview", "en.edit.preview": "Preview",
"en.edit.preview_tip": "Note that the hypha hasn't been saved yet. Here's the 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.preview_title": "Preview of %s",
"en.edit.rocket": "Rocketlink", "en.edit.rocket": "Rocketlink",
"en.edit.save": "Save", "en.edit.save": "Save",
"en.edit.selflink": "Link yourself", "en.edit.selflink": "Link yourself",
"en.edit.strike": "Strikethrough", "en.edit.strike": "Strikethrough",
"en.edit.sub": "Subtext", "en.edit.sub": "Subtext",
"en.edit.super": "Supertext", "en.edit.super": "Supertext",
"en.edit.tag": "Describe your changes:", "en.edit.tag": "Describe your changes:",
"en.edit.time": "Insert current time", "en.edit.time": "Insert current time",
"en.edit.title": "Edit %s", "en.edit.title": "Edit %s",
"en.edit.transclude": "Transclusion", "en.edit.transclude": "Transclusion",
"en.edit.underline": "Underline", "en.edit.underline": "Underline",
"en.help.attachment": "Attachment", "en.help.attachment": "Attachment",
"en.help.configuration": "Configuration (for administrators)", "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_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_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_line_2b": "to Mycorrhiza Wiki directly.",
"en.help.empty_error_link": "contributing", "en.help.empty_error_link": "contributing",
"en.help.empty_error_title": "This entry does not exist!", "en.help.empty_error_title": "This entry does not exist!",
"en.help.entry_not_found": "Entry not found", "en.help.entry_not_found": "Entry not found",
"en.help.hypha": "Hypha", "en.help.hypha": "Hypha",
"en.help.interface": "Interface", "en.help.interface": "Interface",
"en.help.lock": "Lock", "en.help.lock": "Lock",
"en.help.main": "Main", "en.help.main": "Main",
"en.help.mycomarkup": "Mycomarkup", "en.help.mycomarkup": "Mycomarkup",
"en.help.prevnext": "Previous/next", "en.help.prevnext": "Previous/next",
"en.help.recent_changes": "Recent changes", "en.help.recent_changes": "Recent changes",
"en.help.sibling_hyphae": "Sibling hyphae", "en.help.sibling_hyphae": "Sibling hyphae",
"en.help.special_pages": "Special pages", "en.help.special_pages": "Special pages",
"en.help.telegram": "Telegram authorization", "en.help.telegram": "Telegram authorization",
"en.help.title": "Help", "en.help.title": "Help",
"en.help.top_bar": "Top bar", "en.help.top_bar": "Top bar",
"en.help.topics": "Help topics", "en.help.topics": "Help topics",
"en.help.whitelist": "Whitelist", "en.help.whitelist": "Whitelist",
"en.ui.about_admins": "Administrators:", "en.ui.about_admins": "Administrators:",
"en.ui.about_homepage": "Home page:", "en.ui.about_homepage": "Home page:",
"en.ui.about_hyphae": "See {{.link}} for information about hyphae on this wiki.", "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_noauth": "This wiki does not use authorization",
"en.ui.about_title": "About {{.name}}", "en.ui.about_title": "About {{.name}}",
"en.ui.about_usercount": "User count:", "en.ui.about_usercount": "User count:",
"en.ui.about_version": "{{.pre}}Mycorrhiza Wiki{{.post}} version:", "en.ui.about_version": "{{.pre}}Mycorrhiza Wiki{{.post}} version:",
"en.ui.admin_panel": "Admin panel", "en.ui.act_noattachment": "No attachment",
"en.ui.ask_delete": "Delete %s?", "en.ui.act_noattachment_tip": "Cannot unattach this hypha because it has no attachment",
"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.act_norights": "Not enough rights",
"en.ui.ask_delete_verb": "delete", "en.ui.act_norights_attach": "You must be an editor to attach a hypha",
"en.ui.ask_really": "Do you really want to {{.verb}} hypha {{.name}}?", "en.ui.act_norights_delete": "Not enough rights to delete, you must be a moderator",
"en.ui.ask_rename": "Rename %s", "en.ui.act_norights_edit": "You must be an editor to edit a hypha",
"en.ui.ask_unattach": "Unattach %s?", "en.ui.act_norights_rename": "Not enough rights to rename, you must be a trusted editor",
"en.ui.ask_unattach_verb": "unattach", "en.ui.act_norights_unattach": "Not enough rights to unattach, you must be a trusted editor",
"en.ui.attach_empty": "This hypha has no attachment, you can upload it here.", "en.ui.act_notexist": "Does not exist",
"en.ui.attach_include": "Include", "en.ui.act_notexist_delete": "Cannot delete this hypha because it does not exist",
"en.ui.attach_include_tip": "This attachment is an image. To include it in a hypha, use a syntax like this:", "en.ui.act_notexist_rename": "Cannot rename this hypha because it does not exist",
"en.ui.attach_link": "What are attachments?", "en.ui.act_notexist_unattach": "Cannot unattach this hypha because it does not exist",
"en.ui.attach_new": "Attach", "en.ui.admin_panel": "Admin panel",
"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.ask_delete": "Delete %s?",
"en.ui.attach_remove": "Unattach", "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.attach_remove_button": "Unattach", "en.ui.ask_delete_verb": "delete",
"en.ui.attach_remove_tip": "Please note that you don't have to unattach before uploading a new attachment.", "en.ui.ask_really": "Do you really want to {{.verb}} hypha {{.name}}?",
"en.ui.attach_size_value": "{{.n}} byte%s", "en.ui.ask_rename": "Rename %s",
"en.ui.attach_size_value+one": "", "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_size_value+other": "s",
"en.ui.attach_stat": "Stat", "en.ui.attach_stat": "Stat",
"en.ui.attach_stat_mime": "MIME type:", "en.ui.attach_stat_mime": "MIME type:",
"en.ui.attach_stat_size": "File size:", "en.ui.attach_stat_size": "File size:",
"en.ui.attach_tip": "You can manage the hypha's attachment on this page.", "en.ui.attach_tip": "You can manage the hypha's attachment on this page.",
"en.ui.attach_title": "Attachment of {{.name}}", "en.ui.attach_title": "Attachment of {{.name}}",
"en.ui.attach_upload": "Upload", "en.ui.attach_upload": "Upload",
"en.ui.attachment_link": "Manage attachment", "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_desc": "Hyphae which have a link to the selected hypha are listed below.",
"en.ui.backlinks_link": "{{.n}} backlink%s", "en.ui.backlinks_link": "{{.n}} backlink%s",
"en.ui.backlinks_link+one": "", "en.ui.backlinks_link+one": "",
"en.ui.backlinks_link+other": "s", "en.ui.backlinks_link+other": "s",
"en.ui.backlinks_query": "Backlinks to {{.query}}", "en.ui.backlinks_query": "Backlinks to {{.query}}",
"en.ui.backlinks_title": "Backlinks to {{.query}}", "en.ui.backlinks_title": "Backlinks to {{.query}}",
"en.ui.cancel": "Cancel", "en.ui.cancel": "Cancel",
"en.ui.close_dialog": "Close this dialog", "en.ui.close_dialog": "Close this dialog",
"en.ui.confirm": "Confirm", "en.ui.confirm": "Confirm",
"en.ui.delete_link": "Delete", "en.ui.delete_link": "Delete",
"en.ui.diff_title": "Diff of {{.name}} at {{.rev}}", "en.ui.diff_title": "Diff of {{.name}} at {{.rev}}",
"en.ui.edit_link": "Edit text", "en.ui.edit_link": "Edit text",
"en.ui.error": "Error", "en.ui.error": "Error",
"en.ui.error_go_back": "Go back to the hypha.", "en.ui.error_go_back": "Go back to the hypha.",
"en.ui.error_text_fetch": "Could not fetch text data", "en.ui.error_text_fetch": "Could not fetch text data",
"en.ui.error_try_again": "Try again", "en.ui.error_try_again": "Try again",
"en.ui.header_no_rights": "You must be a moderator to update header links.", "en.ui.header_no_rights": "You must be a moderator to update header links.",
"en.ui.history_link": "View history", "en.ui.history_link": "View history",
"en.ui.history_title": "History of %s", "en.ui.history_title": "History of %s",
"en.ui.list_desc": "This wiki has {{.n}} %s.", "en.ui.list_desc": "This wiki has {{.n}} %s.",
"en.ui.list_desc+one": "hypha", "en.ui.list_desc+one": "hypha",
"en.ui.list_desc+other": "hyphae", "en.ui.list_desc+other": "hyphae",
"en.ui.list_heading": "List of hyphae", "en.ui.list_heading": "List of hyphae",
"en.ui.list_title": "List of pages", "en.ui.list_title": "List of pages",
"en.ui.login": "Login", "en.ui.login": "Login",
"en.ui.media_download": "Download media", "en.ui.media_download": "Download media",
"en.ui.media_noaudio": "Your browser does not support audio.", "en.ui.media_noaudio": "Your browser does not support audio.",
"en.ui.media_noaudio_link": "Download audio", "en.ui.media_noaudio_link": "Download audio",
"en.ui.media_novideo": "Your browser does not support video.", "en.ui.media_novideo": "Your browser does not support video.",
"en.ui.media_novideo_link": "Download video", "en.ui.media_novideo_link": "Download video",
"en.ui.no_rights": "Not enough rights", "en.ui.no_rights": "Not enough rights",
"en.ui.notexist_heading": "This hypha does not exist", "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_login": "Log in to your account, if you have one",
"en.ui.notexist_media": "Upload a media", "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_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_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_register": "Register a new account",
"en.ui.notexist_write": "Write a text", "en.ui.notexist_write": "Write a text",
"en.ui.notexist_write_button": "Create", "en.ui.notexist_write_button": "Create",
"en.ui.notexist_write_myco": "Mycomarkup", "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_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.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": "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.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_post": "recent changes",
"en.ui.recent_count_pre": "See", "en.ui.recent_count_pre": "See",
"en.ui.recent_empty": "Could not find any recent changes.", "en.ui.recent_empty": "Could not find any recent changes.",
"en.ui.recent_heading": "Recent Changes", "en.ui.recent_heading": "Recent Changes",
"en.ui.recent_subscribe": "Subscribe via {{.rss}}, {{.atom}} or {{.json}}", "en.ui.recent_subscribe": "Subscribe via {{.rss}}, {{.atom}} or {{.json}}",
"en.ui.recent_subscribe_json": "JSON feed", "en.ui.recent_subscribe_json": "JSON feed",
"en.ui.recent_title": "{{.n}} recent change%s", "en.ui.recent_title": "{{.n}} recent change%s",
"en.ui.recent_title+one": "", "en.ui.recent_title+one": "",
"en.ui.recent_title+other": "s", "en.ui.recent_title+other": "s",
"en.ui.register": "Register", "en.ui.register": "Register",
"en.ui.reindex_no_rights": "You must be an admin to reindex hyphae.", "en.ui.reindex_no_rights": "You must be an admin to reindex hyphae.",
"en.ui.rename_link": "Rename", "en.ui.rename_badname": "Invalid name",
"en.ui.rename_recurse": "Rename subhyphae too", "en.ui.rename_badname_tip": "Invalid new name. Names cannot contain characters {{.chars}}.",
"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_link": "Rename",
"en.ui.rename_to": "New name", "en.ui.rename_noname": "No name given",
"en.ui.revision_link": "Get Mycomarkup source of this revision", "en.ui.rename_noname_tip": "No new name is given",
"en.ui.revision_no_text": "This hypha had no text at this revision.", "en.ui.rename_recurse": "Rename subhyphae too",
"en.ui.revision_title": "{{.name}} at {{.rev}}", "en.ui.rename_taken": "Name taken",
"en.ui.revision_warning": "Please note that viewing attachments of hyphae is not supported in history for now.", "en.ui.rename_taken_tip": "Hypha named {{.name}} already exists, cannot rename",
"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.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.search_results_query": "Search results for {{.query}}", "en.ui.rename_to": "New name",
"en.ui.search_results_title": "Search: {{.query}}", "en.ui.revision_link": "Get Mycomarkup source of this revision",
"en.ui.sibling_hyphae": "Sibling hyphae", "en.ui.revision_no_text": "This hypha had no text at this revision.",
"en.ui.subhyphae": "Subhyphae", "en.ui.revision_title": "{{.name}} at {{.rev}}",
"en.ui.text_link": "View markup", "en.ui.revision_warning": "Please note that viewing attachments of hyphae is not supported in history for now.",
"en.ui.title_search": "Search by title", "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.users_admins": "Admins", "en.ui.search_results_query": "Search results for {{.query}}",
"en.ui.users_editors": "Editors", "en.ui.search_results_title": "Search: {{.query}}",
"en.ui.users_heading": "List of users", "en.ui.sibling_hyphae": "Sibling hyphae",
"en.ui.users_moderators": "Moderators", "en.ui.subhyphae": "Subhyphae",
"en.ui.users_title": "User list", "en.ui.text_link": "View markup",
"ru.admin.newuser_create": "Создать", "en.ui.title_search": "Search by title",
"ru.admin.newuser_title": "Новый пользователь", "en.ui.users_admins": "Admins",
"ru.admin.panel_about": "Об этой вики", "en.ui.users_editors": "Editors",
"ru.admin.panel_reindex": "Переиндексировать гифы", "en.ui.users_heading": "List of users",
"ru.admin.panel_safe": "Безопасные действия", "en.ui.users_moderators": "Moderators",
"ru.admin.panel_shutdown": "Отключить вики", "en.ui.users_title": "User list",
"ru.admin.panel_title": "Панель администратора", "ru.admin.newuser_create": "Создать",
"ru.admin.panel_unsafe": "Опасные действия", "ru.admin.newuser_title": "Новый пользователь",
"ru.admin.panel_updateheader": "Обновить ссылки верхней панели", "ru.admin.panel_about": "Об этой вики",
"ru.admin.panel_userlist": "Список пользователей", "ru.admin.panel_reindex": "Переиндексировать гифы",
"ru.admin.panel_users": "Менеджер пользователей", "ru.admin.panel_safe": "Безопасные действия",
"ru.admin.user_delete": "Удалить", "ru.admin.panel_shutdown": "Отключить вики",
"ru.admin.user_delete_heading": "Удалить пользователя", "ru.admin.panel_title": "Панель администратора",
"ru.admin.user_delete_tip": "Удаляет пользователя из базы данных. Правки пользователя будут сохранены. Имя пользователя освободится для повторной регистрации.", "ru.admin.panel_unsafe": "Опасные действия",
"ru.admin.user_delete_warn": "Вы уверены, что хотите удалить {{.name}} из базы данных? Это действие нельзя отменить.", "ru.admin.panel_updateheader": "Обновить ссылки верхней панели",
"ru.admin.user_group_heading": "Изменить группу", "ru.admin.panel_userlist": "Список пользователей",
"ru.admin.user_title": "Пользователь %s", "ru.admin.panel_users": "Менеджер пользователей",
"ru.admin.user_update": "Обновить", "ru.admin.user_delete": "Удалить",
"ru.admin.users_actions": "Действия", "ru.admin.user_delete_heading": "Удалить пользователя",
"ru.admin.users_create": "Создать пользователя", "ru.admin.user_delete_tip": "Удаляет пользователя из базы данных. Правки пользователя будут сохранены. Имя пользователя освободится для повторной регистрации.",
"ru.admin.users_edit": "Изменить", "ru.admin.user_delete_warn": "Вы уверены, что хотите удалить {{.name}} из базы данных? Это действие нельзя отменить.",
"ru.admin.users_group": "Группа", "ru.admin.user_group_heading": "Изменить группу",
"ru.admin.users_name": "Имя", "ru.admin.user_title": "Пользователь %s",
"ru.admin.users_notime": "неизвестно", "ru.admin.user_update": "Обновить",
"ru.admin.users_password": "Пароль", "ru.admin.users_actions": "Действия",
"ru.admin.users_registered": "Время создания", "ru.admin.users_create": "Создать пользователя",
"ru.admin.users_reindex": "Переиндексировать пользователей", "ru.admin.users_edit": "Изменить",
"ru.admin.users_title": "Менеджер пользователей", "ru.admin.users_group": "Группа",
"ru.auth.cookie_tip": "Отправляя эту форму, вы разрешаете вики хранить cookie в вашем браузере. Это позволит движку связывать ваши правки с вашей учётной записью. Вы будете авторизованы, пока не выйдете из учётной записи.", "ru.admin.users_name": "Имя",
"ru.auth.error_password": "Неверный пароль.", "ru.admin.users_notime": "неизвестно",
"ru.auth.error_telegram": "Не удалось авторизоваться через Телеграм.", "ru.admin.users_password": "Пароль",
"ru.auth.error_username": "Неизвестное имя пользователя.", "ru.admin.users_registered": "Время создания",
"ru.auth.go_back": "Назад", "ru.admin.users_reindex": "Переиндексировать пользователей",
"ru.auth.go_home": "Домой", "ru.admin.users_title": "Менеджер пользователей",
"ru.auth.go_login": "На страницу входа", "ru.auth.cookie_tip": "Отправляя эту форму, вы разрешаете вики хранить cookie в вашем браузере. Это позволит движку связывать ваши правки с вашей учётной записью. Вы будете авторизованы, пока не выйдете из учётной записи.",
"ru.auth.lock_title": "Доступ закрыт", "ru.auth.error_password": "Неверный пароль.",
"ru.auth.login_button": "Войти", "ru.auth.error_telegram": "Не удалось авторизоваться через Телеграм.",
"ru.auth.login_header": "Вход в «{{.name}}»", "ru.auth.error_username": "Неизвестное имя пользователя.",
"ru.auth.login_title": "Вход", "ru.auth.go_back": "Назад",
"ru.auth.logout_anon": "Вы не можете выйти, потому что ещё не вошли.", "ru.auth.go_home": "Домой",
"ru.auth.logout_button": "Подтвердить", "ru.auth.go_login": "На страницу входа",
"ru.auth.logout_header": "Выйти?", "ru.auth.lock_title": "Доступ закрыт",
"ru.auth.logout_title": "Выйти?", "ru.auth.login_button": "Войти",
"ru.auth.noauth": "Аутентификация отключена. Вы можете делать правки анонимно.", "ru.auth.login_header": "Вход в «{{.name}}»",
"ru.auth.noregister": "Регистрация в текущее время недоступна. Администраторы могут вручную создать вам учётную запись, свяжитесь с ними.", "ru.auth.login_title": "Вход",
"ru.auth.password": "Пароль", "ru.auth.logout_anon": "Вы не можете выйти, потому что ещё не вошли.",
"ru.auth.password_tip": "Сервер хранит ваш пароль в зашифрованном виде, даже администраторы не смогут его прочесть.", "ru.auth.logout_button": "Подтвердить",
"ru.auth.register_button": "Зарегистрироваться", "ru.auth.logout_header": "Выйти?",
"ru.auth.register_header": "Регистрация на «{{.name}}»", "ru.auth.logout_title": "Выйти?",
"ru.auth.register_title": "Регистрация", "ru.auth.noauth": "Аутентификация отключена. Вы можете делать правки анонимно.",
"ru.auth.telegram_tip": "Вы можете войти с помощью Телеграм. Это сработает, если у вашего профиля есть @имя, и оно не занято в этой вики.", "ru.auth.noregister": "Регистрация в текущее время недоступна. Администраторы могут вручную создать вам учётную запись, свяжитесь с ними.",
"ru.auth.try_again": "Ещё раз", "ru.auth.password": "Пароль",
"ru.auth.username": "Логин", "ru.auth.password_tip": "Сервер хранит ваш пароль в зашифрованном виде, даже администраторы не смогут его прочесть.",
"ru.edit.actions": "Действия", "ru.auth.register_button": "Зарегистрироваться",
"ru.edit.bold": "Жирный", "ru.auth.register_header": "Регистрация на «{{.name}}»",
"ru.edit.bullets": "Маркир. список", "ru.auth.register_title": "Регистрация",
"ru.edit.code": "Код-блок", "ru.auth.telegram_tip": "Вы можете войти с помощью Телеграм. Это сработает, если у вашего профиля есть @имя, и оно не занято в этой вики.",
"ru.edit.date": "Текущая дата", "ru.auth.try_again": "Ещё раз",
"ru.edit.heading": "Заголовок", "ru.auth.username": "Логин",
"ru.edit.help": "{{.link}} о микоразметке", "ru.edit.actions": "Действия",
"ru.edit.help_link": "Подробнее", "ru.edit.bold": "Жирный",
"ru.edit.highlight": "Выделение", "ru.edit.bullets": "Маркир. список",
"ru.edit.hr": "Гориз. черта", "ru.edit.code": "Код-блок",
"ru.edit.italic": "Курсив", "ru.edit.date": "Текущая дата",
"ru.edit.link": "Ссылка", "ru.edit.heading": "Заголовок",
"ru.edit.link_title": "Текст", "ru.edit.help": "{{.link}} о микоразметке",
"ru.edit.markup": "Разметка", "ru.edit.help_link": "Подробнее",
"ru.edit.mono": "Моноширинный", "ru.edit.highlight": "Выделение",
"ru.edit.new_hypha": "Вы создаёте новую гифу.", "ru.edit.hr": "Гориз. черта",
"ru.edit.numbers": "Нумер. список", "ru.edit.italic": "Курсив",
"ru.edit.preview": "Предпросмотр", "ru.edit.link": "Ссылка",
"ru.edit.preview_tip": "Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:", "ru.edit.link_title": "Текст",
"ru.edit.preview_title": "Предпросмотр «%s»", "ru.edit.markup": "Разметка",
"ru.edit.rocket": "Ссылка-ракета", "ru.edit.mono": "Моноширинный",
"ru.edit.save": "Сохранить", "ru.edit.new_hypha": "Вы создаёте новую гифу.",
"ru.edit.selflink": "Ссылка на вас", "ru.edit.numbers": "Нумер. список",
"ru.edit.strike": "Зачёркнутый", "ru.edit.preview": "Предпросмотр",
"ru.edit.sub": "Подстрочный", "ru.edit.preview_tip": "Заметьте, эта гифа ещё не сохранена. Вот её предпросмотр:",
"ru.edit.super": "Надстрочный", "ru.edit.preview_title": "Предпросмотр «%s»",
"ru.edit.tag": "Опишите ваши правки:", "ru.edit.rocket": "Ссылка-ракета",
"ru.edit.time": "Текущее время", "ru.edit.save": "Сохранить",
"ru.edit.title": "Редактирование «%s»", "ru.edit.selflink": "Ссылка на вас",
"ru.edit.transclude": "Трансклюзия", "ru.edit.strike": "Зачёркнутый",
"ru.edit.underline": "Подчеркивание", "ru.edit.sub": "Подстрочный",
"ru.help.attachment": "Вложение", "ru.edit.super": "Надстрочный",
"ru.help.configuration": "Конфигурация (для администраторов)", "ru.edit.tag": "Опишите ваши правки:",
"ru.help.empty_error_line_1": "Попробуйте поискать другую страницу, способную вам помочь.", "ru.edit.time": "Текущее время",
"ru.help.empty_error_line_2a": "Если вы хотите написать эту страницу сами, будем рады вашим правкам в ", "ru.edit.title": "Редактирование «%s»",
"ru.help.empty_error_line_2b": "Микоризы.", "ru.edit.transclude": "Трансклюзия",
"ru.help.empty_error_link": "репозитории", "ru.edit.underline": "Подчеркивание",
"ru.help.empty_error_title": "Этой страницы не существует!", "ru.help.attachment": "Вложение",
"ru.help.entry_not_found": "Запись не найдена", "ru.help.configuration": "Конфигурация (для администраторов)",
"ru.help.hypha": "Гифа", "ru.help.empty_error_line_1": "Попробуйте поискать другую страницу, способную вам помочь.",
"ru.help.interface": "Интерфейс", "ru.help.empty_error_line_2a": "Если вы хотите написать эту страницу сами, будем рады вашим правкам в ",
"ru.help.lock": "Блокировка", "ru.help.empty_error_line_2b": "Микоризы.",
"ru.help.main": "Введение", "ru.help.empty_error_link": "репозитории",
"ru.help.mycomarkup": "Микоразметка", "ru.help.empty_error_title": "Этой страницы не существует!",
"ru.help.prevnext": "Назад/далее", "ru.help.entry_not_found": "Запись не найдена",
"ru.help.recent_changes": "Недавние изменения", "ru.help.hypha": "Гифа",
"ru.help.sibling_hyphae": "Гифы-сиблинги", "ru.help.interface": "Интерфейс",
"ru.help.special_pages": "Специальные страницы", "ru.help.lock": "Блокировка",
"ru.help.telegram": "Авторизация через Телеграм", "ru.help.main": "Введение",
"ru.help.title": "Справка", "ru.help.mycomarkup": "Микоразметка",
"ru.help.top_bar": "Верхняя панель", "ru.help.prevnext": "Назад/далее",
"ru.help.topics": "Темы справки", "ru.help.recent_changes": "Недавние изменения",
"ru.help.whitelist": "Белый список", "ru.help.sibling_hyphae": "Гифы-сиблинги",
"ru.ui.about_admins": "Администраторы:", "ru.help.special_pages": "Специальные страницы",
"ru.ui.about_homepage": "Домашняя гифа:", "ru.help.telegram": "Авторизация через Телеграм",
"ru.ui.about_hyphae": "См. {{.link}}, чтобы узнать о гифах в этой вики.", "ru.help.title": "Справка",
"ru.ui.about_noauth": "В этой вики нет авторизации", "ru.help.top_bar": "Верхняя панель",
"ru.ui.about_title": "О вики «{{.name}}»", "ru.help.topics": "Темы справки",
"ru.ui.about_usercount": "Число пользователей:", "ru.help.whitelist": "Белый список",
"ru.ui.about_version": "Версия {{.pre}}Микоризы{{.post}}:", "ru.ui.about_admins": "Администраторы:",
"ru.ui.admin_panel": "Администрирование", "ru.ui.about_homepage": "Домашняя гифа:",
"ru.ui.ask_delete": "Удалить «%s»?", "ru.ui.about_hyphae": "См. {{.link}}, чтобы узнать о гифах в этой вики.",
"ru.ui.ask_delete_tip": "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.", "ru.ui.about_noauth": "В этой вики нет авторизации",
"ru.ui.ask_delete_verb": "удалить", "ru.ui.about_title": "О вики «{{.name}}»",
"ru.ui.ask_really": "Вы действительно хотите {{.verb}} гифу «{{.name}}»?", "ru.ui.about_usercount": "Число пользователей:",
"ru.ui.ask_rename": "Переименовать «%s»", "ru.ui.about_version": "Версия {{.pre}}Микоризы{{.post}}:",
"ru.ui.ask_unattach": "Открепить «%s»?", "ru.ui.act_noattachment": "Нет вложения",
"ru.ui.ask_unattach_verb": "открепить", "ru.ui.act_noattachment_tip": "Не могу открепить гифу, потому что в ней нет вложения",
"ru.ui.attach_empty": "Эта гифа не имеет вложения, здесь вы можете его загрузить.", "ru.ui.act_norights": "Недостаточно прав",
"ru.ui.attach_include": "Добавление", "ru.ui.act_norights_attach": "Вы должны быть редактором, чтобы прикреплять гифы",
"ru.ui.attach_include_tip": "Это вложение изображение. Чтобы добавить его в текст гифы, используйте синтаксис ниже:", "ru.ui.act_norights_delete": "Недостаточно прав для удаления, вы должны быть модератором",
"ru.ui.attach_link": "Что такое вложение?", "ru.ui.act_norights_edit": "Вы должны быть редактором, чтобы редактировать гифы",
"ru.ui.attach_new": "Прикрепить", "ru.ui.act_norights_rename": "Недостаточно прав для переименования, вы должны быть доверенным редактором",
"ru.ui.attach_new_tip": "Вы можете загрузить новое вложение. Пожалуйста, не загружайте слишком большие изображения без необходимости, чтобы впоследствии не ждать её долгую загрузку.", "ru.ui.act_norights_unattach": "Недостаточно прав для открепления, вы должны быть доверенным редактором",
"ru.ui.attach_remove": "Открепить", "ru.ui.act_notexist": "Не существует",
"ru.ui.attach_remove_button": "Открепить", "ru.ui.act_notexist_delete": "Нельзя удалить эту гифу, потому что она не существует",
"ru.ui.attach_remove_tip": "Заметьте, чтобы заменить вложение, вам не нужно его перед этим откреплять.", "ru.ui.act_notexist_rename": "Нельзя переименовать эту гифу, потому что она не существует",
"ru.ui.attach_size_value": "{{.n}} %s", "ru.ui.act_notexist_unattach": "Нельзя открепить эту гифу, потому что она не существует",
"ru.ui.attach_size_value+few": "байта", "ru.ui.admin_panel": "Администрирование",
"ru.ui.attach_size_value+many": "байт", "ru.ui.ask_delete": "Удалить «%s»?",
"ru.ui.attach_size_value+one": "байт", "ru.ui.ask_delete_tip": "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.",
"ru.ui.attach_stat": "Свойства", "ru.ui.ask_delete_verb": "удалить",
"ru.ui.attach_stat_mime": "MIME-тип:", "ru.ui.ask_really": "Вы действительно хотите {{.verb}} гифу «{{.name}}»?",
"ru.ui.attach_stat_size": "Размер файла:", "ru.ui.ask_rename": "Переименовать «%s»",
"ru.ui.attach_tip": "На этой странице вы можете управлять вложением.", "ru.ui.ask_unattach": "Открепить «%s»?",
"ru.ui.attach_title": "Вложение «{{.name}}»", "ru.ui.ask_unattach_verb": "открепить",
"ru.ui.attach_upload": "Загрузить", "ru.ui.attach_empty": "Эта гифа не имеет вложения, здесь вы можете его загрузить.",
"ru.ui.attachment_link": "Вложение", "ru.ui.attach_include": "Добавление",
"ru.ui.backlinks_desc": "Ниже перечислены гифы, содержащие ссылку на выбранную гифу.", "ru.ui.attach_include_tip": "Это вложение изображение. Чтобы добавить его в текст гифы, используйте синтаксис ниже:",
"ru.ui.backlinks_link": "{{.n}} %s сюда", "ru.ui.attach_link": "Что такое вложение?",
"ru.ui.backlinks_link+few": "ссылки", "ru.ui.attach_new": "Прикрепить",
"ru.ui.backlinks_link+many": "ссылок", "ru.ui.attach_new_tip": "Вы можете загрузить новое вложение. Пожалуйста, не загружайте слишком большие изображения без необходимости, чтобы впоследствии не ждать её долгую загрузку.",
"ru.ui.backlinks_link+one": "ссылка", "ru.ui.attach_remove": "Открепить",
"ru.ui.backlinks_query": "Обратные ссылки на «{{.query}}»", "ru.ui.attach_remove_button": "Открепить",
"ru.ui.backlinks_title": "Обратные ссылки на {{.query}}", "ru.ui.attach_remove_tip": "Заметьте, чтобы заменить вложение, вам не нужно его перед этим откреплять.",
"ru.ui.cancel": "Отмена", "ru.ui.attach_size_value": "{{.n}} %s",
"ru.ui.close_dialog": "Закрыть этот диалог", "ru.ui.attach_size_value+few": "байта",
"ru.ui.confirm": "Применить", "ru.ui.attach_size_value+many": "байт",
"ru.ui.delete_link": "Удалить", "ru.ui.attach_size_value+one": "байт",
"ru.ui.diff_title": "Разница для «{{.name}}» из {{.rev}}", "ru.ui.attach_stat": "Свойства",
"ru.ui.edit_link": "Редактировать", "ru.ui.attach_stat_mime": "MIME-тип:",
"ru.ui.error": "Ошибка", "ru.ui.attach_stat_size": "Размер файла:",
"ru.ui.error_go_back": "Вернуться к гифе.", "ru.ui.attach_tip": "На этой странице вы можете управлять вложением.",
"ru.ui.error_text_fetch": "Не удалось получить текстовые данные", "ru.ui.attach_title": "Вложение «{{.name}}»",
"ru.ui.error_try_again": "Попробуйте ещё раз", "ru.ui.attach_upload": "Загрузить",
"ru.ui.header_no_rights": "Вы должны быть модератором, чтобы обновить ссылки в заголовке.", "ru.ui.attachment_link": "Вложение",
"ru.ui.history_link": "История", "ru.ui.backlinks_desc": "Ниже перечислены гифы, содержащие ссылку на выбранную гифу.",
"ru.ui.history_title": "История «%s»", "ru.ui.backlinks_link": "{{.n}} %s сюда",
"ru.ui.list_desc": "В этой вики {{.n}} %s.", "ru.ui.backlinks_link+few": "ссылки",
"ru.ui.list_desc+few": "гифы", "ru.ui.backlinks_link+many": "ссылок",
"ru.ui.list_desc+many": "гиф", "ru.ui.backlinks_link+one": "ссылка",
"ru.ui.list_desc+one": "гифа", "ru.ui.backlinks_query": "Обратные ссылки на «{{.query}}»",
"ru.ui.list_heading": "Список гиф", "ru.ui.backlinks_title": "Обратные ссылки на {{.query}}",
"ru.ui.list_title": "Список страниц", "ru.ui.cancel": "Отмена",
"ru.ui.login": "Войти", "ru.ui.close_dialog": "Закрыть этот диалог",
"ru.ui.media_download": "Скачать медиа", "ru.ui.confirm": "Применить",
"ru.ui.media_noaudio": "Ваш браузер не поддерживает аудио.", "ru.ui.delete_link": "Удалить",
"ru.ui.media_noaudio_link": "Скачать аудио", "ru.ui.diff_title": "Разница для «{{.name}}» из {{.rev}}",
"ru.ui.media_novideo": "Ваш браузер не поддерживает видео.", "ru.ui.edit_link": "Редактировать",
"ru.ui.media_novideo_link": "Скачать видео", "ru.ui.error": "Ошибка",
"ru.ui.no_rights": "Недостаточно прав", "ru.ui.error_go_back": "Вернуться к гифе.",
"ru.ui.notexist_heading": "Эта гифа не существует", "ru.ui.error_text_fetch": "Не удалось получить текстовые данные",
"ru.ui.notexist_login": "Войти в свою учётную запись, если она у вас есть", "ru.ui.error_try_again": "Попробуйте ещё раз",
"ru.ui.notexist_media": "Загрузить медиа", "ru.ui.header_no_rights": "Вы должны быть модератором, чтобы обновить ссылки в заголовке.",
"ru.ui.notexist_media_tip1": "Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные просто скачать. Позже вы можете дописать пояснение к этому медиа.", "ru.ui.history_link": "История",
"ru.ui.notexist_norights": "У вас нет прав для создания новых гиф. Вы можете:", "ru.ui.history_title": "История «%s»",
"ru.ui.notexist_register": "Создать новую учётную запись", "ru.ui.list_desc": "В этой вики {{.n}} %s.",
"ru.ui.notexist_write": "Написать текст", "ru.ui.list_desc+few": "гифы",
"ru.ui.notexist_write_button": "Создать", "ru.ui.list_desc+many": "гиф",
"ru.ui.notexist_write_myco": "микоразметки", "ru.ui.list_desc+one": "гифа",
"ru.ui.notexist_write_tip1": "Напишите заметку, дневник, статью, рассказ или иной текст с помощью {{.myco}}. Сохраняется полная история правок документа.", "ru.ui.list_heading": "Список гиф",
"ru.ui.notexist_write_tip2": "Не забывайте следовать правилам оформления этой вики, если они имеются.", "ru.ui.list_title": "Список страниц",
"ru.ui.random_no_hyphae": "В этой вики нет гиф", "ru.ui.login": "Войти",
"ru.ui.random_no_hyphae_tip": "Невозможно отобразить случайную гифу, потому что вики не содержит ни одной гифы", "ru.ui.media_download": "Скачать медиа",
"ru.ui.recent_count_post": "недавних изменений", "ru.ui.media_noaudio": "Ваш браузер не поддерживает аудио.",
"ru.ui.recent_count_pre": "Отобразить", "ru.ui.media_noaudio_link": "Скачать аудио",
"ru.ui.recent_empty": "Не удалось найти последние изменения.", "ru.ui.media_novideo": "Ваш браузер не поддерживает видео.",
"ru.ui.recent_heading": "Недавние изменения", "ru.ui.media_novideo_link": "Скачать видео",
"ru.ui.recent_subscribe": "Подписаться через {{.rss}}, {{.atom}} или {{.json}}", "ru.ui.no_rights": "Недостаточно прав",
"ru.ui.recent_subscribe_json": "JSON-ленту", "ru.ui.notexist_heading": "Эта гифа не существует",
"ru.ui.recent_title": "{{.n}} %s", "ru.ui.notexist_login": "Войти в свою учётную запись, если она у вас есть",
"ru.ui.recent_title+few": "недавних изменения", "ru.ui.notexist_media": "Загрузить медиа",
"ru.ui.recent_title+many": "недавних изменений", "ru.ui.notexist_media_tip1": "Загрузите изображение, видео или аудио. Распространённые форматы можно просматривать из браузера, остальные просто скачать. Позже вы можете дописать пояснение к этому медиа.",
"ru.ui.recent_title+one": "недавнее изменение", "ru.ui.notexist_norights": "У вас нет прав для создания новых гиф. Вы можете:",
"ru.ui.register": "Регистрация", "ru.ui.notexist_register": "Создать новую учётную запись",
"ru.ui.reindex_no_rights": "Вы должны быть администратором, чтобы переиндексировать гифы.", "ru.ui.notexist_write": "Написать текст",
"ru.ui.rename_link": "Переименовать", "ru.ui.notexist_write_button": "Создать",
"ru.ui.rename_recurse": "Также переименовать подгифы", "ru.ui.notexist_write_myco": "микоразметки",
"ru.ui.rename_tip": "Если вы переименуете эту гифу, сломаются все ссылки, ведущие на неё, а также исходящие относительные ссылки. Также вы потеряете всю текущую историю для нового названия. Переименовывайте аккуратно.", "ru.ui.notexist_write_tip1": "Напишите заметку, дневник, статью, рассказ или иной текст с помощью {{.myco}}. Сохраняется полная история правок документа.",
"ru.ui.rename_to": "Новое название", "ru.ui.notexist_write_tip2": "Не забывайте следовать правилам оформления этой вики, если они имеются.",
"ru.ui.revision_link": "Посмотреть код микоразметки для этой ревизии", "ru.ui.random_no_hyphae": "В этой вики нет гиф",
"ru.ui.revision_no_text": "В этой ревизии гифы не было текста.", "ru.ui.random_no_hyphae_tip": "Невозможно отобразить случайную гифу, потому что вики не содержит ни одной гифы",
"ru.ui.revision_title": "{{.name}} из {{.rev}}", "ru.ui.recent_count_post": "недавних изменений",
"ru.ui.revision_warning": "Обратите внимание, просмотр вложений в истории гифы пока что недоступен.", "ru.ui.recent_count_pre": "Отобразить",
"ru.ui.search_results_desc": "Название каждой из существующих гиф сопоставлено с запросом. Подходящие гифы приведены ниже.", "ru.ui.recent_empty": "Не удалось найти последние изменения.",
"ru.ui.search_results_query": "Результаты поиска для «{{.query}}»", "ru.ui.recent_heading": "Недавние изменения",
"ru.ui.search_results_title": "Поиск: {{.query}}", "ru.ui.recent_subscribe": "Подписаться через {{.rss}}, {{.atom}} или {{.json}}",
"ru.ui.sibling_hyphae": "Гифы-сиблинги", "ru.ui.recent_subscribe_json": "JSON-ленту",
"ru.ui.subhyphae": "Подгифы", "ru.ui.recent_title": "{{.n}} %s",
"ru.ui.text_link": "Посмотреть разметку", "ru.ui.recent_title+few": "недавних изменения",
"ru.ui.title_search": "Поиск по названию", "ru.ui.recent_title+many": "недавних изменений",
"ru.ui.users_admins": "Администраторы", "ru.ui.recent_title+one": "недавнее изменение",
"ru.ui.users_editors": "Редакторы", "ru.ui.register": "Регистрация",
"ru.ui.users_heading": "Список пользователей", "ru.ui.reindex_no_rights": "Вы должны быть администратором, чтобы переиндексировать гифы.",
"ru.ui.users_moderators": "Модераторы", "ru.ui.rename_badname": "Некорректное название",
"ru.ui.users_title": "Список пользователей", "ru.ui.rename_badname_tip": "Новое название некорректно. Названия не могут содержать символы {{.chars}}.",
"ru.ui.rename_link": "Переименовать",
"ru.ui.rename_noname": "Нет названия",
"ru.ui.rename_noname_tip": "Не задано новое название",
"ru.ui.rename_recurse": "Также переименовать подгифы",
"ru.ui.rename_taken": "Название занято",
"ru.ui.rename_taken_tip": "Гифа {{.name}} уже существует, не могу переименовать",
"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 Replacements map[string]interface{}
type Localizer struct { type Localizer struct {
Locale string Locale string
FallbackLocale string FallbackLocale string
Localizations map[string]string Localizations map[string]string
} }
@ -487,11 +521,11 @@ func (t Localizer) GetWithLocale(locale, key string, replacements ...*Replacemen
} }
} }
// If the str doesn't have any substitutions, no need to // If the str doesn't have any substitutions, no need to
// template.Execute. // template.Execute.
if strings.Index(str, "}}") == -1 { if strings.Index(str, "}}") == -1 {
return str return str
} }
return t.replace(str, replacements...) return t.replace(str, replacements...)
} }

View File

@ -43,6 +43,25 @@
"rename_to": "New name", "rename_to": "New name",
"rename_recurse": "Rename subhyphae too", "rename_recurse": "Rename subhyphae too",
"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.", "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.",
"rename_taken": "Name taken",
"rename_taken_tip": "Hypha named {{.name}} already exists, cannot rename",
"rename_noname": "No name given",
"rename_noname_tip": "No new name is given",
"rename_badname": "Invalid name",
"rename_badname_tip": "Invalid new name. Names cannot contain characters {{.chars}}.",
"act_noattachment": "No attachment",
"act_noattachment_tip": "Cannot unattach this hypha because it has no attachment",
"act_norights": "Not enough rights",
"act_notexist": "Does not exist",
"act_norights_delete": "Not enough rights to delete, you must be a moderator",
"act_notexist_delete": "Cannot delete this hypha because it does not exist",
"act_norights_rename": "Not enough rights to rename, you must be a trusted editor",
"act_notexist_rename": "Cannot rename this hypha because it does not exist",
"act_norights_unattach": "Not enough rights to unattach, you must be a trusted editor",
"act_notexist_unattach": "Cannot unattach this hypha because it does not exist",
"act_norights_edit": "You must be an editor to edit a hypha",
"act_norights_attach": "You must be an editor to attach a hypha",
"ask_delete": "Delete %s?", "ask_delete": "Delete %s?",
"ask_delete_tip": "In this version of Mycorrhiza Wiki you cannot undelete a deleted hypha but the history can still be accessed.", "ask_delete_tip": "In this version of Mycorrhiza Wiki you cannot undelete a deleted hypha but the history can still be accessed.",

View File

@ -45,6 +45,25 @@
"rename_to": "Новое название", "rename_to": "Новое название",
"rename_recurse": "Также переименовать подгифы", "rename_recurse": "Также переименовать подгифы",
"rename_tip": "Если вы переименуете эту гифу, сломаются все ссылки, ведущие на неё, а также исходящие относительные ссылки. Также вы потеряете всю текущую историю для нового названия. Переименовывайте аккуратно.", "rename_tip": "Если вы переименуете эту гифу, сломаются все ссылки, ведущие на неё, а также исходящие относительные ссылки. Также вы потеряете всю текущую историю для нового названия. Переименовывайте аккуратно.",
"rename_taken": "Название занято",
"rename_taken_tip": "Гифа {{.name}} уже существует, не могу переименовать",
"rename_noname": "Нет названия",
"rename_noname_tip": "Не задано новое название",
"rename_badname": "Некорректное название",
"rename_badname_tip": "Новое название некорректно. Названия не могут содержать символы {{.chars}}.",
"act_noattachment": "Нет вложения",
"act_noattachment_tip": "Не могу открепить гифу, потому что в ней нет вложения",
"act_norights": "Недостаточно прав",
"act_notexist": "Не существует",
"act_norights_delete": "Недостаточно прав для удаления, вы должны быть модератором",
"act_norights_rename": "Недостаточно прав для переименования, вы должны быть доверенным редактором",
"act_norights_unattach": "Недостаточно прав для открепления, вы должны быть доверенным редактором",
"act_norights_edit": "Вы должны быть редактором, чтобы редактировать гифы",
"act_norights_attach": "Вы должны быть редактором, чтобы прикреплять гифы",
"act_notexist_delete": "Нельзя удалить эту гифу, потому что она не существует",
"act_notexist_rename": "Нельзя переименовать эту гифу, потому что она не существует",
"act_notexist_unattach": "Нельзя открепить эту гифу, потому что она не существует",
"ask_delete": "Удалить «%s»?", "ask_delete": "Удалить «%s»?",
"ask_delete_tip": "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.", "ask_delete_tip": "В этой версии Микоризы нельзя отменить удаление гифы, но её история останется доступной.",

View File

@ -4,32 +4,33 @@ import (
"errors" "errors"
"github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user" "github.com/bouncepaw/mycorrhiza/user"
) )
func canFactory( func canFactory(
rejectLogger func(*hyphae.Hypha, *user.User, string), rejectLogger func(*hyphae.Hypha, *user.User, string),
action string, action string,
dispatcher func(*hyphae.Hypha, *user.User) (string, string), dispatcher func(*hyphae.Hypha, *user.User, *l18n.Localizer) (string, string),
noRightsMsg string, noRightsMsg string,
notExistsMsg string, notExistsMsg string,
careAboutExistence bool, careAboutExistence bool,
) func(*user.User, *hyphae.Hypha) (string, error) { ) func(*user.User, *hyphae.Hypha, *l18n.Localizer) (string, error) {
return func(u *user.User, h *hyphae.Hypha) (string, error) { return func(u *user.User, h *hyphae.Hypha, lc *l18n.Localizer) (string, error) {
if !u.CanProceed(action) { if !u.CanProceed(action) {
rejectLogger(h, u, "no rights") rejectLogger(h, u, "no rights")
return "Not enough rights", errors.New(noRightsMsg) return lc.Get("ui.act_no_rights"), errors.New(lc.Get(noRightsMsg))
} }
if careAboutExistence && !h.Exists { if careAboutExistence && !h.Exists {
rejectLogger(h, u, "does not exist") rejectLogger(h, u, "does not exist")
return "Does not exist", errors.New(notExistsMsg) return lc.Get("ui.act_notexist"), errors.New(lc.Get(notExistsMsg))
} }
if dispatcher == nil { if dispatcher == nil {
return "", nil return "", nil
} }
errmsg, errtitle := dispatcher(h, u) errmsg, errtitle := dispatcher(h, u, lc)
if errtitle == "" { if errtitle == "" {
return "", nil return "", nil
} }
@ -43,8 +44,8 @@ var (
rejectDeleteLog, rejectDeleteLog,
"delete-confirm", "delete-confirm",
nil, nil,
"Not enough rights to delete, you must be a moderator", "ui.act_norights_delete",
"Cannot delete this hypha because it does not exist", "ui.act_notexist_delete",
true, true,
) )
@ -52,24 +53,24 @@ var (
rejectRenameLog, rejectRenameLog,
"rename-confirm", "rename-confirm",
nil, nil,
"Not enough rights to rename, you must be a trusted editor", "ui.act_norights_rename",
"Cannot rename this hypha because it does not exist", "ui.act_notexist_rename",
true, true,
) )
CanUnattach = canFactory( CanUnattach = canFactory(
rejectUnattachLog, rejectUnattachLog,
"unattach-confirm", "unattach-confirm",
func(h *hyphae.Hypha, u *user.User) (errmsg, errtitle string) { func(h *hyphae.Hypha, u *user.User, lc *l18n.Localizer) (errmsg, errtitle string) {
if h.BinaryPath == "" { if h.BinaryPath == "" {
rejectUnattachLog(h, u, "no amnt") rejectUnattachLog(h, u, "no amnt")
return "Cannot unattach this hypha because it has no attachment", "No attachment" return lc.Get("ui.act_noattachment_tip"), lc.Get("ui.act_noattachment")
} }
return "", "" return "", ""
}, },
"Not enough rights to unattach, you must be a trusted editor", "ui.act_norights_unattach",
"Cannot unattach this hypha because it does not exist", "ui.act_notexist_unattach",
true, true,
) )
@ -77,7 +78,7 @@ var (
rejectEditLog, rejectEditLog,
"upload-text", "upload-text",
nil, nil,
"You must be an editor to edit a hypha", "ui.act_norights_edit",
"You cannot edit a hypha that does not exist", "You cannot edit a hypha that does not exist",
false, false,
) )
@ -86,8 +87,10 @@ var (
rejectAttachLog, rejectAttachLog,
"upload-binary", "upload-binary",
nil, nil,
"You must be an editor to attach a hypha", "ui.act_norights_attach",
"You cannot attach a hypha that does not exist", "You cannot attach a hypha that does not exist",
false, false,
) )
) )
/* I've left 'not exists' messages for edit and attach out of translation as they are not used -- chekoopa */

View File

@ -5,14 +5,15 @@ import (
"github.com/bouncepaw/mycorrhiza/history" "github.com/bouncepaw/mycorrhiza/history"
"github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user" "github.com/bouncepaw/mycorrhiza/user"
) )
// DeleteHypha deletes hypha and makes a history record about that. // DeleteHypha deletes hypha and makes a history record about that.
func DeleteHypha(u *user.User, h *hyphae.Hypha) (hop *history.Op, errtitle string) { func DeleteHypha(u *user.User, h *hyphae.Hypha, lc *l18n.Localizer) (hop *history.Op, errtitle string) {
hop = history.Operation(history.TypeDeleteHypha) hop = history.Operation(history.TypeDeleteHypha)
if errtitle, err := CanDelete(u, h); errtitle != "" { if errtitle, err := CanDelete(u, h, lc); errtitle != "" {
hop.WithErrAbort(err) hop.WithErrAbort(err)
return hop, errtitle return hop, errtitle
} }

View File

@ -7,40 +7,41 @@ import (
"github.com/bouncepaw/mycorrhiza/history" "github.com/bouncepaw/mycorrhiza/history"
"github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user" "github.com/bouncepaw/mycorrhiza/user"
"github.com/bouncepaw/mycorrhiza/util" "github.com/bouncepaw/mycorrhiza/util"
) )
func canRenameThisToThat(oh *hyphae.Hypha, nh *hyphae.Hypha, u *user.User) (errtitle string, err error) { func canRenameThisToThat(oh *hyphae.Hypha, nh *hyphae.Hypha, u *user.User, lc *l18n.Localizer) (errtitle string, err error) {
if nh.Exists { if nh.Exists {
rejectRenameLog(oh, u, fmt.Sprintf("name %s taken already", nh.Name)) rejectRenameLog(oh, u, fmt.Sprintf("name %s taken already", nh.Name))
return "Name taken", fmt.Errorf("Hypha named <a href='/hypha/%[1]s'>%[1]s</a> already exists, cannot rename", nh.Name) return lc.Get("ui.rename_taken"), fmt.Errorf(lc.Get("ui.rename_taken_tip", &l18n.Replacements{"name": "<a href='/hypha/%[1]s'>%[1]s</a>"}), nh.Name)
} }
if nh.Name == "" { if nh.Name == "" {
rejectRenameLog(oh, u, "no new name given") rejectRenameLog(oh, u, "no new name given")
return "No name given", errors.New("No new name is given") return lc.Get("ui.rename_noname"), errors.New(lc.Get("ui.rename_noname_tip"))
} }
if !hyphae.HyphaPattern.MatchString(nh.Name) { if !hyphae.HyphaPattern.MatchString(nh.Name) {
rejectRenameLog(oh, u, fmt.Sprintf("new name %s invalid", nh.Name)) rejectRenameLog(oh, u, fmt.Sprintf("new name %s invalid", nh.Name))
return "Invalid name", errors.New("Invalid new name. Names cannot contain characters <code>^?!:#@&gt;&lt;*|\"\\'&amp;%</code>") return lc.Get("ui.rename_badname"), errors.New(lc.Get("ui.rename_badname_tip", &l18n.Replacements{"chars": "<code>^?!:#@&gt;&lt;*|\"\\'&amp;%</code>"}))
} }
return "", nil return "", nil
} }
// RenameHypha renames hypha from old name `hyphaName` to `newName` and makes a history record about that. If `recursive` is `true`, its subhyphae will be renamed the same way. // RenameHypha renames hypha from old name `hyphaName` to `newName` and makes a history record about that. If `recursive` is `true`, its subhyphae will be renamed the same way.
func RenameHypha(h *hyphae.Hypha, newHypha *hyphae.Hypha, recursive bool, u *user.User) (hop *history.Op, errtitle string) { func RenameHypha(h *hyphae.Hypha, newHypha *hyphae.Hypha, recursive bool, u *user.User, lc *l18n.Localizer) (hop *history.Op, errtitle string) {
newHypha.Lock() newHypha.Lock()
defer newHypha.Unlock() defer newHypha.Unlock()
hop = history.Operation(history.TypeRenameHypha) hop = history.Operation(history.TypeRenameHypha)
if errtitle, err := CanRename(u, h); errtitle != "" { if errtitle, err := CanRename(u, h, lc); errtitle != "" {
hop.WithErrAbort(err) hop.WithErrAbort(err)
return hop, errtitle return hop, errtitle
} }
if errtitle, err := canRenameThisToThat(h, newHypha, u); errtitle != "" { if errtitle, err := canRenameThisToThat(h, newHypha, u, lc); errtitle != "" {
hop.WithErrAbort(err) hop.WithErrAbort(err)
return hop, errtitle return hop, errtitle
} }

View File

@ -5,14 +5,15 @@ import (
"github.com/bouncepaw/mycorrhiza/history" "github.com/bouncepaw/mycorrhiza/history"
"github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/user" "github.com/bouncepaw/mycorrhiza/user"
) )
// UnattachHypha unattaches hypha and makes a history record about that. // UnattachHypha unattaches hypha and makes a history record about that.
func UnattachHypha(u *user.User, h *hyphae.Hypha) (hop *history.Op, errtitle string) { func UnattachHypha(u *user.User, h *hyphae.Hypha, lc *l18n.Localizer) (hop *history.Op, errtitle string) {
hop = history.Operation(history.TypeUnattachHypha) hop = history.Operation(history.TypeUnattachHypha)
if errtitle, err := CanUnattach(u, h); errtitle != "" { if errtitle, err := CanUnattach(u, h, lc); errtitle != "" {
hop.WithErrAbort(err) hop.WithErrAbort(err)
return hop, errtitle return hop, errtitle
} }

View File

@ -14,12 +14,13 @@ import (
"github.com/bouncepaw/mycorrhiza/files" "github.com/bouncepaw/mycorrhiza/files"
"github.com/bouncepaw/mycorrhiza/history" "github.com/bouncepaw/mycorrhiza/history"
"github.com/bouncepaw/mycorrhiza/hyphae" "github.com/bouncepaw/mycorrhiza/hyphae"
"github.com/bouncepaw/mycorrhiza/l18n"
"github.com/bouncepaw/mycorrhiza/mimetype" "github.com/bouncepaw/mycorrhiza/mimetype"
"github.com/bouncepaw/mycorrhiza/user" "github.com/bouncepaw/mycorrhiza/user"
) )
// UploadText edits a hypha' text part and makes a history record about that. // UploadText edits a hypha' text part and makes a history record about that.
func UploadText(h *hyphae.Hypha, data []byte, message string, u *user.User) (hop *history.Op, errtitle string) { func UploadText(h *hyphae.Hypha, data []byte, message string, u *user.User, lc *l18n.Localizer) (hop *history.Op, errtitle string) {
hop = history.Operation(history.TypeEditText) hop = history.Operation(history.TypeEditText)
var action string var action string
if h.Exists { if h.Exists {
@ -34,7 +35,7 @@ func UploadText(h *hyphae.Hypha, data []byte, message string, u *user.User) (hop
hop.WithMsg(fmt.Sprintf("%s %s: %s", action, h.Name, message)) hop.WithMsg(fmt.Sprintf("%s %s: %s", action, h.Name, message))
} }
if errtitle, err := CanEdit(u, h); err != nil { if errtitle, err := CanEdit(u, h, lc); err != nil {
return hop.WithErrAbort(err), errtitle return hop.WithErrAbort(err), errtitle
} }
if len(bytes.TrimSpace(data)) == 0 && h.BinaryPath == "" { if len(bytes.TrimSpace(data)) == 0 && h.BinaryPath == "" {
@ -45,7 +46,7 @@ func UploadText(h *hyphae.Hypha, data []byte, message string, u *user.User) (hop
} }
// UploadBinary edits a hypha' attachment and makes a history record about that. // UploadBinary edits a hypha' attachment and makes a history record about that.
func UploadBinary(h *hyphae.Hypha, mime string, file multipart.File, u *user.User) (*history.Op, string) { func UploadBinary(h *hyphae.Hypha, mime string, file multipart.File, u *user.User, lc *l18n.Localizer) (*history.Op, string) {
var ( var (
hop = history.Operation(history.TypeEditBinary).WithMsg(fmt.Sprintf("Upload attachment for %s with type %s", h.Name, mime)) hop = history.Operation(history.TypeEditBinary).WithMsg(fmt.Sprintf("Upload attachment for %s with type %s", h.Name, mime))
data, err = io.ReadAll(file) data, err = io.ReadAll(file)
@ -54,7 +55,7 @@ func UploadBinary(h *hyphae.Hypha, mime string, file multipart.File, u *user.Use
if err != nil { if err != nil {
return hop.WithErrAbort(err), err.Error() return hop.WithErrAbort(err), err.Error()
} }
if errtitle, err := CanAttach(u, h); err != nil { if errtitle, err := CanAttach(u, h, lc); err != nil {
return hop.WithErrAbort(err), errtitle return hop.WithErrAbort(err), errtitle
} }
if len(data) == 0 { if len(data) == 0 {

View File

@ -35,7 +35,7 @@ func initMutators(r *mux.Router) {
func factoryHandlerAsker( func factoryHandlerAsker(
actionPath string, actionPath string,
asker func(*user.User, *hyphae.Hypha) (string, error), asker func(*user.User, *hyphae.Hypha, *l18n.Localizer) (string, error),
succTitleKey string, succTitleKey string,
succPageTemplate func(*http.Request, string, bool) string, succPageTemplate func(*http.Request, string, bool) string,
) func(http.ResponseWriter, *http.Request) { ) func(http.ResponseWriter, *http.Request) {
@ -47,7 +47,7 @@ func factoryHandlerAsker(
u = user.FromRequest(rq) u = user.FromRequest(rq)
lc = l18n.FromRequest(rq) lc = l18n.FromRequest(rq)
) )
if errtitle, err := asker(u, h); err != nil { if errtitle, err := asker(u, h, lc); err != nil {
httpErr( httpErr(
w, w,
lc, lc,
@ -112,15 +112,15 @@ func factoryHandlerConfirmer(
var handlerUnattachConfirm = factoryHandlerConfirmer( var handlerUnattachConfirm = factoryHandlerConfirmer(
"unattach-confirm", "unattach-confirm",
func(h *hyphae.Hypha, u *user.User, _ *http.Request) (*history.Op, string) { func(h *hyphae.Hypha, u *user.User, rq *http.Request) (*history.Op, string) {
return shroom.UnattachHypha(u, h) return shroom.UnattachHypha(u, h, l18n.FromRequest(rq))
}, },
) )
var handlerDeleteConfirm = factoryHandlerConfirmer( var handlerDeleteConfirm = factoryHandlerConfirmer(
"delete-confirm", "delete-confirm",
func(h *hyphae.Hypha, u *user.User, _ *http.Request) (*history.Op, string) { func(h *hyphae.Hypha, u *user.User, rq *http.Request) (*history.Op, string) {
return shroom.DeleteHypha(u, h) return shroom.DeleteHypha(u, h, l18n.FromRequest(rq))
}, },
) )
@ -136,7 +136,7 @@ func handlerRenameConfirm(w http.ResponseWriter, rq *http.Request) {
newHypha = hyphae.ByName(newName) newHypha = hyphae.ByName(newName)
recursive = rq.PostFormValue("recursive") == "true" recursive = rq.PostFormValue("recursive") == "true"
) )
hop, errtitle := shroom.RenameHypha(oldHypha, newHypha, recursive, u) hop, errtitle := shroom.RenameHypha(oldHypha, newHypha, recursive, u, lc)
if hop.HasErrors() { if hop.HasErrors() {
httpErr(w, lc, http.StatusInternalServerError, hyphaName, httpErr(w, lc, http.StatusInternalServerError, hyphaName,
errtitle, errtitle,
@ -158,7 +158,7 @@ func handlerEdit(w http.ResponseWriter, rq *http.Request) {
u = user.FromRequest(rq) u = user.FromRequest(rq)
lc = l18n.FromRequest(rq) lc = l18n.FromRequest(rq)
) )
if errtitle, err := shroom.CanEdit(u, h); err != nil { if errtitle, err := shroom.CanEdit(u, h, lc); err != nil {
httpErr(w, lc, http.StatusInternalServerError, hyphaName, httpErr(w, lc, http.StatusInternalServerError, hyphaName,
errtitle, errtitle,
err.Error()) err.Error())
@ -201,7 +201,7 @@ func handlerUploadText(w http.ResponseWriter, rq *http.Request) {
) )
if action != "Preview" { if action != "Preview" {
hop, errtitle = shroom.UploadText(h, []byte(textData), message, u) hop, errtitle = shroom.UploadText(h, []byte(textData), message, u, lc)
if hop.HasErrors() { if hop.HasErrors() {
httpErr(w, lc, http.StatusForbidden, hyphaName, httpErr(w, lc, http.StatusForbidden, hyphaName,
errtitle, errtitle,
@ -247,7 +247,7 @@ func handlerUploadBinary(w http.ResponseWriter, rq *http.Request) {
lc.Get("ui.error"), lc.Get("ui.error"),
err.Error()) err.Error())
} }
if errtitle, err := shroom.CanAttach(u, h); err != nil { if errtitle, err := shroom.CanAttach(u, h, lc); err != nil {
httpErr(w, lc, http.StatusInternalServerError, hyphaName, httpErr(w, lc, http.StatusInternalServerError, hyphaName,
errtitle, errtitle,
err.Error()) err.Error())
@ -264,7 +264,7 @@ func handlerUploadBinary(w http.ResponseWriter, rq *http.Request) {
} }
var ( var (
mime = handler.Header.Get("Content-Type") mime = handler.Header.Get("Content-Type")
hop, errtitle = shroom.UploadBinary(h, mime, file, u) hop, errtitle = shroom.UploadBinary(h, mime, file, u, lc)
) )
if hop.HasErrors() { if hop.HasErrors() {