Localization engine updated. Localization into Russian is completed.

main
Leonid Maslakov 2 weeks ago
parent eec7b62b23
commit f100bc427d
  1. 4
      internal/web/web_about.go
  2. 2
      internal/web/web_docs.go
  3. 2
      internal/web/web_embedded.go
  4. 2
      internal/web/web_embedded_help.go
  5. 3
      internal/web/web_error.go
  6. 4
      internal/web/web_main_get.go
  7. 3
      internal/web/web_main_new.go
  8. 8
      internal/web/web_translate.go
  9. 38
      web/about.tmpl
  10. 36
      web/docs_api_libs.tmpl
  11. 73
      web/docs_apiv1.tmpl
  12. 42
      web/locale/ru.locale
  13. 2
      web/main.tmpl

@ -34,11 +34,11 @@ type aboutTmpl struct {
AdminName string
AdminMail string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
type aboutMinTmp struct {
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
// Pattern: /about

@ -25,7 +25,7 @@ import (
type docsTmpl struct {
Highlight func(string, string) template.HTML
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
// Pattern: /docs

@ -34,7 +34,7 @@ type embTmpl struct {
Body template.HTML
ErrorNotFound bool
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
// Pattern: /emb/

@ -33,7 +33,7 @@ type embHelpTmpl struct {
Protocol string
Host string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
Highlight func(string, string) template.HTML
}

@ -19,6 +19,7 @@
package web
import (
"html/template"
"net/http"
)
@ -27,7 +28,7 @@ type errorTmpl struct {
Error string
AdminName string
AdminMail string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
func (data Data) errorBadRequest(rw http.ResponseWriter, req *http.Request) {

@ -38,12 +38,12 @@ type pasteTmpl struct {
LineEnd string
CreateTimeStr string
DeleteTimeStr string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
type pasteContinueTmpl struct {
ID string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
func (data Data) getPaste(rw http.ResponseWriter, req *http.Request) {

@ -20,6 +20,7 @@ package web
import (
"git.lcomrade.su/root/lenpaste/internal/netshare"
"html/template"
"net/http"
)
@ -28,7 +29,7 @@ type createTmpl struct {
BodyMaxLen int
MaxLifeTime int64
Lexers []string
Translate func(string) string
Translate func(string, ...interface{}) template.HTML
}
func (data Data) newPaste(rw http.ResponseWriter, req *http.Request) {

@ -21,6 +21,8 @@ package web
import (
"bytes"
"errors"
"fmt"
"html/template"
"io/ioutil"
"net/http"
"path/filepath"
@ -145,12 +147,12 @@ func (locales Locales) findLocale(req *http.Request) Locale {
return *locale
}
func (locale Locale) translate(s string) string {
func (locale Locale) translate(s string, a ...interface{}) template.HTML {
for key, val := range locale {
if key == s {
return val
return template.HTML(fmt.Sprintf(val, a...))
}
}
return s
return template.HTML(s)
}

@ -1,45 +1,45 @@
{{define "titlePrefix"}}{{ call .Translate `About` }} | {{end}}
{{define "titlePrefix"}}{{ call .Translate `about.Title` }} | {{end}}
{{define "headAppend"}}{{end}}
{{define "article"}}
{{if ne .ServerAbout ``}}
<h3>{{ call .Translate `About this server` }}</h3>
<h3>{{ call .Translate `about.AboutServerTitle` }}</h3>
{{.ServerAbout}}
{{end}}
{{if ne .ServerRules ``}}
<h3>{{ call .Translate `This server rules` }}</h3>
<h3>{{ call .Translate `about.RulesTitle` }}</h3>
{{.ServerRules}}
{{end}}
<h3>{{ call .Translate `Limits` }}</h3>
<h3>{{ call .Translate `about.Limit` }}</h3>
{{if ne .TitleMaxLen 0}}
{{if gt .TitleMaxLen 0}}
<p>{{ call .Translate `Maximum length of the paste title:` }} <code>{{.TitleMaxLen}}</code> {{ call .Translate `symbols` }}.<br/>
<p>{{call .Translate `about.LimitTitle` .TitleMaxLen}}<br/>
{{else}}
<p>{{ call .Translate `There is no limit to the size of the paste title.` }}</br>
<p>{{ call .Translate `about.LimitTitleNo` }}</br>
{{end}}
{{else}}
<p>{{ call .Translate `Paste titles are disabled on this server.` }}<br/>
<p>{{ call .Translate `about.LimitTitleDisable` }}<br/>
{{end}}
{{if gt .BodyMaxLen 0}}
{{ call .Translate `Maximum length of the paste body:` }} <code>{{.BodyMaxLen}}</code> {{ call .Translate `symbols`}}.</p>
{{call .Translate `about.LimitBody` .BodyMaxLen }}</p>
{{else}}
{{ call .Translate `There is no limit to the size of the paste body.` }}</p>
{{ call .Translate `about.LimitBodyNo` }}</p>
{{end}}
{{if or (ne .AdminName ``) (ne .AdminMail ``)}}
<h3>{{ call .Translate `Contact the administrator` }}</h3>
{{if ne .AdminName ``}}<p>{{ call .Translate `Name:` }} <code>{{.AdminName}}</code></p>{{end}}
{{if ne .AdminMail ``}}<p>{{ call .Translate `Email:` }} <a href="mailto:{{.AdminMail}}">{{.AdminMail}}</a></p>{{end}}
<h3>{{ call .Translate `about.AdminTitle` }}</h3>
{{if ne .AdminName ``}}<p>{{ call .Translate `about.AdminName` }} <code>{{.AdminName}}</code></p>{{end}}
{{if ne .AdminMail ``}}<p>{{ call .Translate `about.AdminEmail` }} <a href="mailto:{{.AdminMail}}">{{.AdminMail}}</a></p>{{end}}
{{end}}
<h3>{{ call .Translate `What is Lenpaste?` }}</h3>
<p>{{ call .Translate `This server uses Lenpaste version` }} <code>{{.Version}}</code>. {{ call .Translate `A little bit about it:` }}</p>
<h3>{{ call .Translate `about.LenpasteTitle` }}</h3>
<p>{{call .Translate `about.LenpasteMessage` .Version }}</p>
<ul>
<li>{{ call .Translate `Lenpaste is open source software. All` }} <a href="/about/source_code">{{ call .Translate `source code` }}</a> {{ call .Translate `is available under the` }} <a href="/about/license">AGPL 3</a> {{ call .Translate `license.` }}</li>
<li>{{ call .Translate `You don't need to register here.` }}</li>
<li>{{ call .Translate `This site does not use cookies to keep track of you.` }}</li>
<li>{{ call .Translate `Can work without JavaScript.` }}</li>
<li>{{ call .Translate `Lenpaste has its own` }} <a href="/docs/apiv1">API</a>.</li>
<li>{{ call .Translate `about.Lenpaste1` `/about/source_code` `/about/license` `AGPL 3` }}</li>
<li>{{ call .Translate `about.Lenpaste2` }}</li>
<li>{{ call .Translate `about.Lenpaste3` }}</li>
<li>{{ call .Translate `about.Lenpaste4` }}</li>
<li>{{ call .Translate `about.Lenpaste5` `/docs/apiv1` }}</li>
</ul>
{{end}}

@ -1,43 +1,43 @@
{{define "titlePrefix"}}{{ call .Translate `Libraries for working with API` }} | {{end}}
{{define "titlePrefix"}}{{ call .Translate `docsAPIv1Libs.Title` }} | {{end}}
{{define "headAppend"}}{{end}}
{{define "article"}}
<h3><a href="/docs">{{ call .Translate `Documentation` }}</a> / {{ call .Translate `Libraries for working with API` }}</h3>
<h4 id="recommended">{{ call .Translate `Recommended` }}</h4>
<h3><a href="/docs">{{ call .Translate `docs.Title` }}</a> / {{ call .Translate `docsAPIv1Libs.Title` }}</h3>
<h4 id="recommended">{{ call .Translate `docsAPIv1Libs.Recommended` }}</h4>
<table>
<th>{{ call .Translate `Name` }}</th>
<th>{{ call .Translate `Language` }}</th>
<th>{{ call .Translate `API version` }}</th>
<th>{{ call .Translate `Status` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Name` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Language` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.ApiVersion` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Status` }}</th>
<th>{{ call .Translate `License` }}</th>
<tr>
<td><a href="https://git.lcomrade.su/root/pasteapi.go" target="_blank">PasteAPI.go</a></td>
<td>Go</td>
<td>v1.0</td>
<td>{{ call .Translate `Official`}}</td>
<td>{{ call .Translate `docsAPIv1Libs.StatusOfficial`}}</td>
<td>MIT</td>
</tr>
</table>
<h4 id="out_of_date">{{ call .Translate `Out of date` }}</h4>
<p>{{ call .Translate `Updates for these libraries are no longer available. This means that they cannot be used with Lenpaste v1.0 and higher.` }}</p>
<h4 id="out_of_date">{{ call .Translate `docsAPIv1Libs.OutOfDateTitle` }}</h4>
<p>{{ call .Translate `docsAPIv1Libs.OutOfDataMessage` }}</p>
<table>
<th>{{ call .Translate `Name` }}</th>
<th>{{ call .Translate `Language` }}</th>
<th>{{ call .Translate `API version` }}</th>
<th>{{ call .Translate `Status` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Name` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Language` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.ApiVersion` }}</th>
<th>{{ call .Translate `docsAPIv1Libs.Status` }}</th>
<th>{{ call .Translate `License` }}</th>
<tr>
<td><a href="https://git.lcomrade.su/root/lenin" target="_blank">Lenin</a></td>
<td>Go</td>
<td>v0.2</td>
<td>{{ call .Translate `Official` }}</td>
<td>{{ call .Translate `GPL 3.0 or later` }}</td>
<td>{{ call .Translate `docsAPIv1Libs.StatusOfficial` }}</td>
<td>{{ call .Translate `docsAPIv1Libs.GPL3Later` }}</td>
</tr>
<tr>
<td><a href="https://github.com/rjdbcm/pylenin" target="_blank">PyLenin</a></td>
<td>Python</td>
<td>v0.1</td>
<td>{{ call .Translate `Unofficial` }}</td>
<td>{{ call .Translate `GPL 3.0 or later` }}</td>
<td>{{ call .Translate `docsAPIv1Libs.StatusUnofficial` }}</td>
<td>{{ call .Translate `docsAPIv1Libs.GPL3Later` }}</td>
</tr>
</table>
{{end}}

@ -1,96 +1,89 @@
{{define "titlePrefix"}}API v1 | {{end}}
{{define "titlePrefix"}}{{call .Translate `docsAPIv1.Title`}} | {{end}}
{{define "headAppend"}}{{end}}
{{define "article"}}
<h3><a href="/docs">Documentation</a> / API v1</h3>
<h3><a href="/docs">{{call .Translate `docs.Title`}}</a> / {{call .Translate `docsAPIv1.Title`}}</h3>
<h4 id="table-of-content">Table of content</h4>
<h4 id="table-of-content">{{call .Translate `docsAPIv1.TableOfContent`}}</h4>
<ul>
<li><a href="#new">POST <code>/api/v1/new</code></a></li>
<li><a href="#get">GET <code>/api/v1/get</code></a></li>
<li><a href="#getServerInfo">GET <code>/api/v1/getServerInfo</code></a></li>
<li><a href="#errors">Possible API Errors</a></li>
<li><a href="#errors">{{call .Translate `docsAPIv1.PossibleAPIErrors`}}</a></li>
</ul>
<h4 id="new">POST <code>/api/v1/new</code></h4>
<p>Request parameters:</p>
<p>{{call .Translate `docsAPIv1.RequestParameters`}}</p>
<table>
<th>Field</th>
<th>Required?</th>
<th>Default</th>
<th>Description</th>
<th>{{call .Translate `docsAPIv1.Field`}}</th>
<th>{{call .Translate `docsAPIv1.Required`}}</th>
<th>{{call .Translate `docsAPIv1.Default`}}</th>
<th>{{call .Translate `docsAPIv1.Description`}}</th>
<tr>
<td><code>title</code></td>
<td></td>
<td></td>
<td>Paste title.</td>
<td>{{call .Translate `docsAPIv1.ReqNewTitle`}}</td>
</tr>
<tr>
<td><code>body</code></td>
<td>Yes</td>
<td>{{call .Translate `docsAPIv1.RequiredYes`}}</td>
<td></td>
<td>Paste text.</td>
<td>{{call .Translate `docsAPIv1.ReqNewBody`}}</td>
</tr>
<tr>
<td><code>lineEnd</code></td>
<td></td>
<td><code>LF</code></td>
<td>
The end of a line in the paste body.
The text will be automatically recoded to match the selected end of line.
Can accept <code>LF</code>, <code>CRLF</code> or <code>CR</code>.
</td>
<td>{{call .Translate `docsAPIv1.ReqNewLineEnd`}}</td>
</tr>
<tr>
<td><code>syntax</code></td>
<td></td>
<td><code>plaintext</code></td>
<td>Paste syntax. You can get a list of semi-retained syntaxes using the <a href="#getServerInfo"><code>getServerInfo</code></a> method.</td>
<td>{{call .Translate `docsAPIv1.ReqNewSyntax` `#getServerInfo`}}</td>
</tr>
<tr>
<td><code>oneUse</code></td>
<td></td>
<td><code>false</code></td>
<td>If <code>true</code> then the paste is removed after opening.</td>
<td>{{call .Translate `docsAPIv1.ReqNewOneUse`}}</td>
</tr>
<tr>
<td><code>expiration</code></td>
<td></td>
<td><code>0</code></td>
<td>The "lifetime" of the paste in seconds. To prevent the paste from expiring, simply do not set this parameter.</td>
<td>{{call .Translate `docsAPIv1.ReqNewExpiration`}}</td>
</tr>
</table>
<p>Response example:</p>
<p>{{call .Translate `docsAPIv1.ResponseExample`}}</p>
{{ call .Highlight `{
"id": "XcmX9ON1"
}` `json`}}
<h4 id="get">GET <code>/api/v1/get</code></h4>
<p>Request parameters:</p>
<p>{{call .Translate `docsAPIv1.RequestParameters`}}</p>
<table>
<th>Field</th>
<th>Required?</th>
<th>Default</th>
<th>Description</th>
<th>{{call .Translate `docsAPIv1.Field`}}</th>
<th>{{call .Translate `docsAPIv1.Required`}}</th>
<th>{{call .Translate `docsAPIv1.Default`}}</th>
<th>{{call .Translate `docsAPIv1.Description`}}</th>
<tr>
<td><code>id</code></td>
<td>Yes</td>
<td>{{call .Translate `docsAPIv1.RequiredYes`}}</td>
<td></td>
<td>Paste ID.</td>
<td>{{call .Translate `docsAPIv1.ReqGetID`}}</td>
</tr>
<tr>
<td><code>openOneUse</code></td>
<td></td>
<td><code>false</code></td>
<td>
If <code>true</code>, it will be all the contents of the paste after which it will be deleted.
If it's <code>false</code>, you will only get the <code>id</code> and <code>oneUse</code>, but the paste will stay on the server.
</td>
<td>{{call .Translate `docsAPIv1.ReqGetOpenOneUse`}}</td>
</tr>
</table>
<p>Response example:</p>
<p>{{call .Translate `docsAPIv1.ResponseExample`}}</p>
{{ call .Highlight `{
"id": "XcmX9ON1",
"title": "Paste title.",
@ -112,7 +105,7 @@
<h4 id="getServerInfo">GET <code>/api/v1/getServerInfo</code></h4>
<p>Response example:</p>
<p>{{call .Translate `docsAPIv1.ResponseExample`}}</p>
{{ call .Highlight `{
"version": "0.2-60-g3fcc9ce",
"titleMaxlength": 100,
@ -141,32 +134,32 @@
}` `json`}}
<h4 id="errors">Possible API Errors</h4>
<p>This API method exists on the server, but you passed the wrong arguments for it.</p>
<h4 id="errors">{{call .Translate `docsAPIv1.PossibleAPIErrors`}}</h4>
<p>{{call .Translate `docsAPIv1.Error400`}}</p>
{{ call .Highlight `{
"code": 400,
"error": "Bad Request"
}` `json`}}
<p>There is no paste with this ID.</p>
<p>{{call .Translate `docsAPIv1.Error404n1`}}</p>
{{ call .Highlight `{
"code": 404,
"error": "Could not find ID"
}` `json`}}
<p>There is no such API method.</p>
<p>{{call .Translate `docsAPIv1.Error404n2`}}</p>
{{ call .Highlight `{
"code": 404,
"error": "Not Found"
}` `json`}}
<p>You made a mistake with HTTP request (example: you made POST instead of GET).</p>
<p>{{call .Translate `docsAPIv1.Error405`}}</p>
{{ call .Highlight `{
"code": 405,
"error": "Method Not Allowed"
}` `json`}}
<p>There was a failure on the server. Contact your server administrator to find out what the problem is.</p>
<p>{{call .Translate `docsAPIv1.Error500`}}</p>
{{ call .Highlight `{
"code": 500,
"error": "Internal Server Error"

@ -56,22 +56,22 @@ pasteEmd.ErrorNotFound=404 Не найдено
about.Title=О сайте
about.AboutServerTitle=Об этом сервер
about.RulesTitle=Правила этого сервера
about.LimitTitle=Лимиты
about.LimitTitle=Максимальная длина заголовка:
about.Limit=Лимиты
about.LimitTitle=Максимальная длина заголовка: <code>%d</code> символов.
about.LimitTitleNo=Длина заголовка не ограничена.
about.LimitTitleDisable=На этом сервере нельзя задать заголовок для отрывка.
about.LimitBody=Максимальная длина отрывка:
about.LimitBody=Максимальная длина отрывка: <code>%d</code> символов.
about.LimitBodyNo=Длина отрывка неограниченна.
about.AdminTitle=Связаться с администратором
about.AdminName=Имя:
about.AdminEmail=Почта:
about.LenpasteTitle=Что такое ЛенОтрывок
about.AdminName=Имя администратора:
about.AdminEmail=Почта администратора:
about.LenpasteTitle=Что такое ЛенОтрывок?
about.LenpasteMessage=На этом сервере использует ЛенОтрывок версии <code>%s</code>. Немного о нём:
about.Lenpaste1=ЛенОтрывок - это свободное ПО. Весь его исходный код доступен под лицензией %s.
about.Lenpaste1=ЛенОтрывок - это свободное ПО. Весь его <a href="%s">исходный код</a> доступен под лицензией <a href="%s">%s</a>.
about.Lenpaste2=Вам не нужно регистрироваться здесь.
about.Lenpaste3=Этот сайт не использует Cookie что бы следить за вами.
about.Lenpaste4=Этот сайт может работать без JavaScript.
about.Lenpaste5=У ЛенОтрывка есть свой собственный API.
about.Lenpaste5=У ЛенОтрывка есть свой собственный <a href="%s">API</a>.
sourceCode.Title=Исходный код
sourceCode.Message=К сожалению, пока нет возможности скачать исходный код непосредственно с этого сервера. Но вы можете загрузить его по ссылке:
@ -80,6 +80,30 @@ license.LicenseTitle=Лицензия
docs.Title=Документация
docsAPIv1.Title=API v1
docsAPIv1.TableOfContent=Оглавление
docsAPIv1.RequestParameters=Параметры запроса:
docsAPIv1.Field=Параметер
docsAPIv1.Required=Обязателен?
docsAPIv1.RequiredYes=Да
docsAPIv1.Default=По умолчанию
docsAPIv1.Description=Описание
docsAPIv1.ReqNewTitle=Заголовок отрывка.
docsAPIv1.ReqNewBody=Текст отрывка.
docsAPIv1.ReqNewLineEnd=Конец строки в тексте отрывка будет автоматически заменён на тот который указан этим параметром. Может принимать значения <code>LF</code>, <code>CRLF</code> или <code>CR</code>.
docsAPIv1.ReqNewSyntax=Подсветка синтаксиса в отрывке. Список доступных синтаксисов можно получить с помощью метода <a href="%s"><code>getServerInfo</code></a>.
docsAPIv1.ReqNewOneUse=Если равен <code>true</code>, то отрывок можно будет открыть только один раз после чего он будет удалён.
docsAPIv1.ReqNewExpiration=Указывает срок хранения отрывка в секундах. Если этот параметер равен <code>0</code>, то срок хранения будет не ограничен.
docsAPIv1.ReqGetID=Идентификатор отрывка.
docsAPIv1.ReqGetOpenOneUse=Если <code>true</code>, то будет возврашено всё содержимое отрывка, после чего он будет удалена. Если <code>false</code>, то API вернёт только <code>id</code> и <code>oneUse</code>, а отрывок не будет удалён.
docsAPIv1.ResponseExample=Пример ответа:
docsAPIv1.PossibleAPIErrors=Ошибки, возвращаемые API
docsAPIv1.Error400=Этот метод API существует на сервере, но вы вызвали его с неверными аргументами.
docsAPIv1.Error404n1=Отрывок с таким идентификатором отсутствует.
docsAPIv1.Error404n2=Такой метод API не существует.
docsAPIv1.Error405=Вы допустили ошибку в HTTP запросе (например: отправили POST вместо GET).
docsAPIv1.Error500=На сервере произошел сбой. Свяжитесь с администратором сервера, чтобы выяснить, в чем проблема.
docsAPIv1Libs.Title=Библиотеки для работа с API
docsAPIv1Libs.Recommended=Рекомендованые
docsAPIv1Libs.Name=Название
@ -91,5 +115,3 @@ docsAPIv1Libs.StatusUnofficial=Не офицальный
docsAPIv1Libs.GPL3Later=GPL 3.0 или старше
docsAPIv1Libs.OutOfDateTitle=Больше не обновляются
docsAPIv1Libs.OutOfDataMessage=Эти библиотеки больше не обновляются. Это означает, что они не могут использовать ЛенОтрывок API v1.0 и выше.
docsAPIv1.Title=API v1

@ -38,7 +38,7 @@
</select>
</div>
<div id="symbolCounterContainer" class="text-bar-right" style="align-self: flex-start;">
{{if gt .BodyMaxLen 0}}<span class="text-grey">{{printf (call .Translate `main.MaximumSymbols`) .BodyMaxLen}}</span>{{end}}
{{if gt .BodyMaxLen 0}}<span class="text-grey">{{call .Translate `main.MaximumSymbols` .BodyMaxLen}}</span>{{end}}
</div>
</div>
<div>

Loading…
Cancel
Save