Index: Makefile.classic ================================================================== --- Makefile.classic +++ Makefile.classic @@ -36,11 +36,11 @@ #TCC = gcc -O6 #TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage TCC = gcc -g -Os -Wall # To add support for HTTPS -TCC += -DFOSSIL_ENABLE_SSL +#TCC += -DFOSSIL_ENABLE_SSL #### Extra arguments for linking the finished binary. Fossil needs # to link against the Z-Lib compression library. There are no # other dependencies. We sometimes add the -static option here # so that we can build a static executable that will run in a @@ -47,11 +47,11 @@ # chroot jail. # LIB = -lz $(LDFLAGS) # If using HTTPS: -LIB += -lcrypto -lssl +#LIB += -lcrypto -lssl #### Tcl shell for use in running the fossil testsuite. If you do not # care about testing the end result, this can be blank. # TCLSH = tclsh Index: src/attach.c ================================================================== --- src/attach.c +++ src/attach.c @@ -49,19 +49,37 @@ " FROM attachment", -1 ); if( zPage ){ if( g.perm.RdWiki==0 ) login_needed(); - style_header("Attachments To %h", zPage); + style_header( +#ifdef LANG_RU + "Файлы к %h", +#elif LANG_EN + "Attachments To %h", +#endif + zPage); blob_appendf(&sql, " WHERE target=%Q", zPage); }else if( zTkt ){ if( g.perm.RdTkt==0 ) login_needed(); - style_header("Attachments To Ticket %.10s", zTkt); + style_header( +#ifdef LANG_RU + "Файлы к задаче %.10s", +#elif LANG_EN + "Attachments To Ticket %.10s", +#endif + zTkt); blob_appendf(&sql, " WHERE target GLOB '%q*'", zTkt); }else{ if( g.perm.RdTkt==0 && g.perm.RdWiki==0 ) login_needed(); - style_header("All Attachments"); + style_header( +#ifdef LANG_RU + "Все файлы" +#elif LANG_EN + "All Attachments" +#endif + ); } blob_appendf(&sql, " ORDER BY mtime DESC"); db_prepare(&q, "%s", blob_str(&sql)); @
Ошибка: неверный код.
+#elif LANG_EN @Error: Incorrect security code.
+#endif } +#ifdef LANG_RU + @Указанный файл будет удален.
+#elif LANG_EN @The attachment below has been deleted.
+#endif } if( P("del") && ((zTktUuid && g.perm.WrTkt) || (zWikiName && g.perm.WrWiki)) ){ form_begin(0, "%R/ainfo/%s", zUuid); +#ifdef LANG_RU + @Подтвердите удаление указанного файла. + @ +#elif LANG_EN @
Confirm you want to delete the attachment shown below. @ +#endif @ } isModerator = (zTktUuid && g.perm.ModTkt) || (zWikiName && g.perm.ModWiki); if( isModerator && (zModAction = P("modaction"))!=0 ){ @@ -460,64 +570,121 @@ } if( strcmp(zModAction,"approve")==0 ){ moderation_approve(rid); } } +#ifdef LANG_RU + style_header("Информация о вложении"); + style_submenu_element("Как есть", "Как есть", "%R/artifact/%S", zUuid); + + @
| ID артефакта: | +#elif LANG_EN style_header("Attachment Details"); style_submenu_element("Raw", "Raw", "%R/artifact/%S", zUuid); @
|---|
| Artifact ID: | +#endif @%z(href("%R/artifact/%s",zUuid))%s(zUuid) if( g.perm.Setup ){ @ (%d(rid)) } modPending = moderation_pending(rid); if( modPending ){ +#ifdef LANG_RU + @ *** Ожидает утверждения модератором *** +#elif LANG_EN @ *** Awaiting Moderator Approval *** +#endif } if( zTktUuid ){ +#ifdef LANG_RU + @ |
|---|---|
| Задача: | +#elif LANG_EN @|
| Ticket: | +#endif @%z(href("%R/tktview/%s",zTktUuid))%s(zTktUuid) |
| Вики-страница: | +#elif LANG_EN @|
| Wiki Page: | +#endif @%z(href("%R/wiki?name=%t",zWikiName))%h(zWikiName) |
| Дата: | +#elif LANG_EN @ |
| Date: | +#endif hyperlink_to_date(zDate, " |
| Пользователь: | +#elif LANG_EN @ |
| User: | +#endif hyperlink_to_user(pAttach->zUser, zDate, " |
| Артефакт : | +#elif LANG_EN @|
| Artifact Attached: | +#endif @%z(href("%R/artifact/%s",zSrc))%s(zSrc) if( g.perm.Setup ){ @ (%d(ridSrc)) } +#ifdef LANG_RU + @ |
| Имя файла: | %h(zName) |
| Filename: | %h(zName) |
| MIME-Type: | %h(zMime) |
| Описание: | %h(zDesc) |
| Description: | %h(zDesc) |
form_begin(0, "%R/ainfo/%s", zUuid); @} +#ifdef LANG_RU + @
+#elif LANG_EN @ Delete this change
+#endif @
+#elif LANG_EN @ Approve this change
+#endif @ @ @
blob_zero(&attach); if( zMime==0 || strncmp(zMime,"text/", 5)==0 ){ const char *z; const char *zLn = P("ln"); @@ -531,11 +698,11 @@ @ %h(z) @ } }else if( strncmp(zMime, "image/", 6)==0 ){ @@@ -572,16 +739,24 @@ @ %s(zHeader) } cnt++; @- style_submenu_element("Image", "Image", "%R/raw/%S?m=%s", zSrc, zMime); + style_submenu_element("Изображение", "Изображение", "%R/raw/%S?m=%s", zSrc, zMime); }else{ int sz = db_int(0, "SELECT size FROM blob WHERE rid=%d", ridSrc); @ (file is %d(sz) bytes of binary data) } @
| SHA1 Hash: | %s(zUuid) + @ |
|---|---|
| +#ifdef LANG_RU + @ SHA1 хэш: +#elif LANG_EN + @ SHA1 Hash: +#endif + @ | %s(zUuid) if( g.perm.Setup ){ +#ifdef LANG_RU + @ (ID записи: %d(rid)) +#elif LANG_EN @ (Record ID: %d(rid)) +#endif } @ |
| Date: | +#ifdef LANG_RU + @ |
| Дата: | +#elif LANG_EN + @ |
| Date: | +#endif hyperlink_to_date(zDate, " |
| Оригинальная дата: | +#elif LANG_EN @ |
| Original Date: | +#endif hyperlink_to_date(zOrigDate, " |
| Исправлявший пользователь: | +#elif LANG_EN @ |
| Edited User: | +#endif hyperlink_to_user(zEUser,zDate," |
| Первый пользователь: | +#elif LANG_EN @ |
| Original User: | +#endif hyperlink_to_user(zUser,zDate," |
| Пользователь: | +#elif LANG_EN @ |
| User: | +#endif hyperlink_to_user(zUser,zDate," |
| Исправленный комментарий: | %w(zEComment) |
| Первоначальный комментарий: | %w(zComment) |
| Edited Comment: | %w(zEComment) |
| Original Comment: | %w(zComment) |
| Comment: | %w(zComment) |
| Comment: | %w(zComment) |
| Получено от: | + @%h(zUser) @ %h(zIpAddr) %s(zDate) |
| Received From: | @%h(zUser) @ %h(zIpAddr) on %s(zDate) |
| События: | + @ %z(href("%R/timeline?f=%S",zUuid))ближние + if( zParent ){ + @ | %z(href("%R/timeline?p=%S",zUuid))родители + } + if( !isLeaf ){ + @ | %z(href("%R/timeline?d=%S",zUuid))потомки + } + if( zParent && !isLeaf ){ + @ | %z(href("%R/timeline?dp=%S",zUuid))обои + } +#elif LANG_EN @ |
| Timelines: | @ %z(href("%R/timeline?f=%S",zUuid))family if( zParent ){ @ | %z(href("%R/timeline?p=%S",zUuid))ancestors } @@ -564,10 +677,11 @@ @ | %z(href("%R/timeline?d=%S",zUuid))descendants } if( zParent && !isLeaf ){ @ | %z(href("%R/timeline?dp=%S",zUuid))both } +#endif db_prepare(&q, "SELECT substr(tag.tagname,5) FROM tagxref, tag " " WHERE rid=%d AND tagtype>0 " " AND tag.tagid=tagxref.tagid " " AND +tag.tagname GLOB 'sym-*'", rid); while( db_step(&q)==SQLITE_ROW ){ @@ -578,78 +692,151 @@ /* The Download: line */ if( g.perm.Zip ){ char *zUrl = mprintf("%R/tarball/%t-%S.tar.gz?uuid=%s", - zProjName, zUuid, zUuid); + zProjName, zUuid, zUuid); @ |
| Downloads: | @ %z(href("%s",zUrl))Tarball @ | %z(href("%R/zip/%t-%S.zip?uuid=%s",zProjName,zUuid,zUuid)) +#ifdef LANG_RU + @ ZIP архив +#elif LANG_EN @ ZIP archive +#endif fossil_free(zUrl); } - @ |
| Другие ссылки: | + @+ @ %z(href("%R/dir?ci=%S",zUuid))файлы + @ | %z(href("%R/artifact/%S",zUuid))манифест +#elif LANG_EN @ |
| Other Links: | @@ %z(href("%R/dir?ci=%S",zUuid))files @ | %z(href("%R/fileage?name=%S",zUuid))file ages @ | %z(href("%R/artifact/%S",zUuid))manifest +#endif if( g.perm.Write ){ +#ifdef LANG_RU + @ | %z(href("%R/ci_edit?r=%S",zUuid))изменить +#elif LANG_EN @ | %z(href("%R/ci_edit?r=%S",zUuid))edit +#endif } @ | @
Only differences that match regular expression "%h(zRe)" @ are shown.
} db_prepare(&q, @@ -696,12 +883,22 @@ login_check_credentials(); if( !g.perm.RdWiki ){ login_needed(); return; } rid = name_to_rid_www("name"); if( rid==0 || (pWiki = manifest_get(rid, CFTYPE_WIKI))==0 ){ - style_header("Wiki Page Information Error"); + style_header( +#ifdef LANG_RU + "Ошибка информации о странице" +#elif LANG_EN + "Wiki Page Information Error" +#endif + ); +#ifdef LANG_RU + @ Объект не найден: %h(g.argv[2]) +#elif LANG_EN @ No such object: %h(P("name")) +#endif style_footer(); return; } if( g.perm.ModWiki && (zModAction = P("modaction"))!=0 ){ if( strcmp(zModAction,"delete")==0 ){ @@ -711,62 +908,117 @@ } if( strcmp(zModAction,"approve")==0 ){ moderation_approve(rid); } } +#ifdef LANG_RU + style_header("Правка \"%h\"", pWiki->zWikiTitle); +#elif LANG_EN style_header("Update of \"%h\"", pWiki->zWikiTitle); +#endif zUuid = db_text(0, "SELECT uuid FROM blob WHERE rid=%d", rid); zDate = db_text(0, "SELECT datetime(%.17g)", pWiki->rDate); +#ifdef LANG_RU + style_submenu_element("Как есть", "Как есть", "artifact/%S", zUuid); + style_submenu_element("История", "История", "whistory?name=%t", + pWiki->zWikiTitle); + style_submenu_element("Страница", "Страница", "wiki?name=%t", + pWiki->zWikiTitle); +#elif LANG_EN style_submenu_element("Raw", "Raw", "artifact/%S", zUuid); style_submenu_element("History", "History", "whistory?name=%t", pWiki->zWikiTitle); style_submenu_element("Page", "Page", "wiki?name=%t", pWiki->zWikiTitle); +#endif login_anonymous_available(); +#ifdef LANG_RU + @| ID артефакта: | +#elif LANG_EN @|
|---|---|
| Artifact ID: | +#endif @%z(href("%R/artifact/%s",zUuid))%s(zUuid) if( g.perm.Setup ){ @ (%d(rid)) } modPending = moderation_pending(rid); if( modPending ){ +#ifdef LANG_RU + @ *** Ожидает утверждения модератором *** +#elif LANG_EN @ *** Awaiting Moderator Approval *** +#endif } @ |
| Имя страницы: | %h(pWiki->zWikiTitle) |
| Дата: | + hyperlink_to_date(zDate, " |
| Создавший пользователь: | +#elif LANG_EN @ |
| Page Name: | %h(pWiki->zWikiTitle) |
| Date: | hyperlink_to_date(zDate, " |
| Original User: | +#endif hyperlink_to_user(pWiki->zUser, zDate, " |
| Родител%s(pWiki->nParent==1?"ь":"и"): | +#elif LANG_EN @ |
| Parent%s(pWiki->nParent==1?"":"s"): |
+#endif
for(i=0; i |
@ @} +#ifdef LANG_RU + @
%h(z)
style_footer(); } /* @@ -794,20 +1051,38 @@ static Manifest *vdiff_parse_manifest(const char *zParam, int *pRid){ int rid; *pRid = rid = name_to_rid_www(zParam); if( rid==0 ){ - const char *z = P(zParam); - if( z==0 || z[0]==0 ){ - webpage_error("Missing \"%s\" query parameter.", zParam); - }else{ - webpage_error("No such artifact: \"%s\"", z); - } - return 0; + const char *z = P(zParam); + if( z==0 || z[0]==0 ){ + webpage_error( +#ifdef LANG_RU + "Отсутствует параметр \"%s\" в запросе." +#elif LANG_EN + "Missing \"%s\" query parameter." +#endif + , zParam); + }else{ + webpage_error( +#ifdef LANG_RU + "Артефакт не найден: \"%s\"" +#elif LANG_EN + "No such artifact: \"%s\"" +#endif + , z); + } + return 0; } if( !is_a_version(rid) ){ - webpage_error("Artifact %s is not a checkin.", P(zParam)); + webpage_error( +#ifdef LANG_RU + "Артефакт не Фиксация.", +#elif LANG_EN + "Artifact %s is not a checkin.", +#endif + P(zParam)); return 0; } return manifest_get(rid, CFTYPE_MANIFEST); } @@ -840,11 +1115,15 @@ hyperlink_to_uuid(zUuid); blob_zero(&comment); db_column_blob(&q, 2, &comment); wiki_convert(&comment, 0, wikiFlags); blob_reset(&comment); +#ifdef LANG_RU + @ (пользователь: +#elif LANG_EN @ (user: +#endif hyperlink_to_user(zUser,zDate,","); if( zTagList && zTagList[0] && g.perm.Hyperlink ){ int i; const char *z = zTagList; Blob links; @@ -856,16 +1135,28 @@ href("%R/timeline?r=%#t&nd&c=%t",i,z,zDate), i,z, &z[i] ); if( z[i]==0 ) break; z += i+2; } +#ifdef LANG_RU + @ метка: %s(blob_str(&links)), +#elif LANG_EN @ tags: %s(blob_str(&links)), +#endif blob_reset(&links); }else{ - @ tags: %h(zTagList), +#ifdef LANG_RU + @ метка: %h(zTagList), +#elif LANG_EN + @ метка: %h(zTagList), +#endif } +#ifdef LANG_RU + @ дата: +#elif LANG_EN @ date: +#endif hyperlink_to_date(zDate, ")"); } db_finalize(&q); } @@ -917,25 +1208,47 @@ showDetail = atoi(PD("detail","0")); if( !showDetail && sideBySide ) showDetail = 1; zFrom = P("from"); zTo = P("to"); if( !sideBySide ){ - style_submenu_element("Side-by-side Diff", "sbsdiff", + style_submenu_element( +#ifdef LANG_RU + "Различия бок-о-бок", "sbsdiff", +#elif LANG_EN + "Side-by-side Diff", "sbsdiff", +#endif "%R/vdiff?from=%T&to=%T&detail=%d&sbs=1", zFrom, zTo, showDetail); }else{ - style_submenu_element("Unified Diff", "udiff", + style_submenu_element( +#ifdef LANG_RU + "Различия разом", "udiff", +#elif LANG_EN + "Unified Diff", "udiff", +#endif "%R/vdiff?from=%T&to=%T&detail=%d&sbs=0", zFrom, zTo, showDetail); } style_submenu_element("Invert", "invert", "%R/vdiff?from=%T&to=%T&detail=%d&sbs=%d", zTo, zFrom, showDetail, sideBySide); +#ifdef LANG_RU + style_header("Различия в фиксации"); + @+ checkin_description(ridFrom); +#elif LANG_EN style_header("Check-in Differences"); @Difference From:
checkin_description(ridFrom); - @To:
+#endif + @+#ifdef LANG_RU + @ и: +#elif LANG_EN + @ To: +#endif + @
checkin_description(ridTo); @if( pRe ){ @Only differences that match regular expression "%h(zRe)" @ are shown.
@@ -1273,32 +1586,71 @@ content_get(v2, &c2); text_diff(&c1, &c2, pOut, pRe, diffFlags); blob_reset(&c1); blob_reset(&c2); if( !isPatch ){ +#ifdef LANG_RU + style_header("Различия"); +#elif LANG_EN style_header("Diff"); - style_submenu_element("Patch", "Patch", "%s/fdiff?v1=%T&v2=%T&patch", +#endif + style_submenu_element( +#ifdef LANG_RU + "Патч", "Патч", +#elif LANG_EN + "Patch", "Patch", +#endif + "%s/fdiff?v1=%T&v2=%T&patch", g.zTop, P("v1"), P("v2")); if( !sideBySide ){ - style_submenu_element("Side-by-side Diff", "sbsdiff", + style_submenu_element( +#ifdef LANG_RU + "Различия бок-о-бок", "sbsdiff", +#elif LANG_EN + "Side-by-side Diff", "sbsdiff", +#endif "%s/fdiff?v1=%T&v2=%T&sbs=1", g.zTop, P("v1"), P("v2")); }else{ - style_submenu_element("Unified Diff", "udiff", + style_submenu_element( +#ifdef LANG_RU + "Различия разом", "udiff", +#elif LANG_EN + "Unified Diff", "udiff", +#endif "%s/fdiff?v1=%T&v2=%T&sbs=0", g.zTop, P("v1"), P("v2")); } if( P("smhdr")!=0 ){ +#ifdef LANG_RU + @Различия между артефактом +#elif LANG_EN @
Differences From Artifact - @ %z(href("%R/artifact/%S",zV1))[%S(zV1)] To +#endif + @ %z(href("%R/artifact/%S",zV1))[%S(zV1)] +#ifdef LANG_RU + @ и +#elif LANG_EN + @ To +#endif @ %z(href("%R/artifact/%S",zV2))[%S(zV2)].
}else{ - @Differences From - @ Artifact %z(href("%R/artifact/%S",zV1))[%S(zV1)]:
+#ifdef LANG_RU + @Различия между артефактом +#elif LANG_EN + @
Differences From Artifact +#endif + @ %z(href("%R/artifact/%S",zV1))[%S(zV1)]:
object_description(v1, 0, 0); - @To Artifact %z(href("%R/artifact/%S",zV2))[%S(zV2)]:
+ @+#ifdef LANG_RU + @ и артефактом +#elif LANG_EN + @ To Artifact +#endif + @ %z(href("%R/artifact/%S",zV2))[%S(zV2)]:
object_description(v2, 0, 0); } if( pRe ){ @ Only differences that match regular expression "%h(zRe)" @ are shown. @@ -1416,27 +1768,55 @@ if( !g.perm.Read ){ login_needed(); return; } if( rid==0 ) fossil_redirect_home(); if( g.perm.Admin ){ const char *zUuid = db_text("", "SELECT uuid FROM blob WHERE rid=%d", rid); if( db_exists("SELECT 1 FROM shun WHERE uuid='%s'", zUuid) ){ - style_submenu_element("Unshun","Unshun", "%s/shun?uuid=%s&sub=1", + style_submenu_element( +#ifdef LANG_RU + "Восстановить","Восстановить", +#elif LANG_EN + "Unshun","Unshun", +#endif + "%s/shun?uuid=%s&sub=1", g.zTop, zUuid); }else{ - style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun", + style_submenu_element( +#ifdef LANG_RU + "Стереть","Стереть", +#elif LANG_EN + "Shun","Shun", +#endif + "%s/shun?shun=%s#addshun", g.zTop, zUuid); } } - style_header("Hex Artifact Content"); + style_header( +#ifdef LANG_RU + "Содержимое бинарного артефакта" +#elif LANG_EN + "Hex Artifact Content" +#endif + ); zUuid = db_text("?","SELECT uuid FROM blob WHERE rid=%d", rid); if( g.perm.Setup ){ +#ifdef LANG_RU + @Артефакт %s(zUuid) (%d(rid)):
+ }else{ + @Artifact %s(zUuid):
+#elif LANG_EN @Artifact %s(zUuid) (%d(rid)):
}else{ @Artifact %s(zUuid):
+#endif } blob_zero(&downloadName); object_description(rid, 0, &downloadName); +#ifdef LANG_RU + style_submenu_element("Скачать", "Скачать", +#elif LANG_EN style_submenu_element("Download", "Download", +#endif "%s/raw/%T?name=%s", g.zTop, blob_str(&downloadName), zUuid); @
content_get(rid, &content); @hexdump(&content); @@ -1573,23 +1953,42 @@ }else{ style_submenu_element("Shun","Shun", "%s/shun?shun=%s#addshun", g.zTop, zUuid); } } +#ifdef LANG_RU + style_header("Содержимое артефакта"); +#elif LANG_EN style_header("Artifact Content"); +#endif zUuid = db_text("?", "SELECT uuid FROM blob WHERE rid=%d", rid); if( g.perm.Setup ){ +#ifdef LANG_RU + @Артефакт %s(zUuid) (%d(rid)):
+ }else{ + @Артефакт %s(zUuid):
+#elif LANG_EN @Artifact %s(zUuid) (%d(rid)):
}else{ @Artifact %s(zUuid):
+#endif } + @} style_footer(); } Index: src/login.c ================================================================== --- src/login.c +++ src/login.c @@ -493,22 +493,38 @@ " WHERE uid=%d" " AND (constant_time_cmp(pw,%Q)=0" " OR constant_time_cmp(pw,%Q)=0)", g.userUid, zSha1Pw, zPasswd) ){ sleep(1); +#ifdef LANG_RU + zErrMsg = + @blob_zero(&downloadName); objType = object_description(rid, 0, &downloadName); +#ifdef LANG_RU + style_submenu_element("Скачать", "Скачать", +#elif LANG_EN style_submenu_element("Download", "Download", +#endif "%R/raw/%T?name=%s", blob_str(&downloadName), zUuid); if( db_exists("SELECT 1 FROM mlink WHERE fid=%d", rid) ){ +#ifdef LANG_RU + style_submenu_element("Используется в фиксациях", "Используется в фиксациях", +#elif LANG_EN style_submenu_element("Checkins Using", "Checkins Using", +#endif "%R/timeline?uf=%s&n=200",zUuid); } asText = P("txt")!=0; zMime = mimetype_from_name(blob_str(&downloadName)); if( zMime ){ @@ -1597,20 +1996,35 @@ if( asText ){ style_submenu_element("Html", "Html", "%s/artifact/%s", g.zTop, zUuid); }else{ renderAsHtml = 1; - style_submenu_element("Text", "Text", + style_submenu_element( +#ifdef LANG_RU + "Текст", "Показать как текст", +#elif LANG_EN + "Text", "Text", +#endif "%s/artifact/%s?txt=1", g.zTop, zUuid); } }else if( fossil_strcmp(zMime, "application/x-fossil-wiki")==0 ){ if( asText ){ - style_submenu_element("Wiki", "Wiki", + style_submenu_element( +#ifdef LANG_RU + "Вики", "Показать как вики", +#elif LANG_EN + "Wiki", "Wiki", +#endif "%s/artifact/%s", g.zTop, zUuid); }else{ renderAsWiki = 1; - style_submenu_element("Text", "Text", + style_submenu_element( +#ifdef LANG_RU + "Текст", "Показать как текст", +#elif LANG_EN + "Text", "Text", +#endif "%s/artifact/%s?txt=1", g.zTop, zUuid); } } } if( (objType & (OBJTYPE_WIKI|OBJTYPE_TICKET))!=0 ){ @@ -1644,11 +2058,15 @@ }else if( strncmp(zMime, "image/", 6)==0 ){ @
style_submenu_element("Image", "Image", "%R/raw/%S?m=%s", zUuid, zMime); }else{ +#ifdef LANG_RU + @ (бинарный файл, байт: %d(blob_size(&content))) +#elif LANG_EN @ (file is %d(blob_size(&content)) bytes of binary data) +#endif } @
+ @ Вы ввели неверный старый пароль. + @ Ваш пароль не изменен. + @
+#elif LANG_EN zErrMsg = - @- @ You entered an incorrect old password while attempting to change - @ your password. Your password is unchanged. - @
+ @+ @ You entered an incorrect old password while attempting to change + @ your password. Your password is unchanged. + @
+#endif ; }else if( fossil_strcmp(zNew1,zNew2)!=0 ){ +#ifdef LANG_RU + zErrMsg = + @+ @ Два введенных новых пароля не совпадают. + @ Ваш пароль не изменен. + @
+#elif LANG_EN zErrMsg = - @- @ The two copies of your new passwords do not match. - @ Your password is unchanged. - @
+ @+ @ The two copies of your new passwords do not match. + @ Your password is unchanged. + @
+#endif ; }else{ char *zNewPw = sha1_shared_secret(zNew1, g.zLogin, 0); char *zChngPw; char *zErr; @@ -543,14 +559,21 @@ /* Attempting to log in as a user other than anonymous. */ uid = login_search_uid(zUsername, zPasswd); if( uid<=0 ){ sleep(1); +#ifdef LANG_RU zErrMsg = @+ @ Вы ввели неверный пароль или имя несущестующего пользователя. + @
+#elif LANG_EN + zErrMsg = + @@ You entered an unknown user or an incorrect password. @
+#endif ; record_login_attempt(zUsername, zIpAddr, 0); }else{ /* Non-anonymous login is successful. Set a cookie of the form: ** @@ -561,11 +584,17 @@ */ login_set_user_cookie(zUsername, uid, NULL); redirect_to_g(); } } - style_header("Login/Logout"); + style_header( +#ifdef LANG_RU + "Вход/Выход" +#elif LANG_EN + "Login/Logout" +#endif + ); @ %s(zErrMsg) if( zGoto && P("anon")==0 ){ @A login is required for %h(zGoto).
} form_begin(0, "%R/login"); @@ -572,29 +601,45 @@ if( zGoto ){ @ } @@
@ - if( g.zLogin==0 ){ - @- @ @User ID: + @+#ifdef LANG_RU + @ Пользователь: +#elif LANG_EN + @ User ID: +#endif + @ if( anonFlag ){ @}else{ @ } @ - @ if( g.zLogin==0 ){ zAnonPw = db_text(0, "SELECT pw FROM user" " WHERE login='anonymous'" " AND cap!=''"); } @Password: + @+#ifdef LANG_RU + @ Пароль: +#elif LANG_EN + @ Password: +#endif + @ @@ @ @+#ifdef LANG_RU + @ @ Enter - }else{ - @
You are currently logged in as %h(g.zLogin)
- @To change your login to a different user, enter - } - @ your user-id and password at the left and press the - @ "Login" button. Your user name will be stored in a browser cookie. - @ You must configure your web browser to accept cookies in order for - @ the login to take.
+#ifdef LANG_RU + if( g.zLogin==0 ){ + @Укажите + }else{ + @
Вы вошли как %h(g.zLogin)
+ @Чтобы войти под другим именем, укажите + } + @ имя пользователя и пароль, и нажмите кнопку "Вход". + @ Введенное имя будет сохранено в куках браузера. + @ Вы должны разрешить браузеру сохранять куки для возможности входа + @ на сайт.
+#elif LANG_EN + if( g.zLogin==0 ){ + @Enter + }else{ + @
You are currently logged in as %h(g.zLogin)
+ @To change your login to a different user, enter + } + @ your user-id and password at the left and press the + @ "Login" button. Your user name will be stored in a browser cookie. + @ You must configure your web browser to accept cookies in order for + @ the login to take.
+#endif + if( db_get_boolean("self-register", 0) ){ +#ifdef LANG_RU + @Если у вас нет аккаунта, вы можете + @ зарегистрироваться. +#elif LANG_EN @
If you do not have an account, you can @ create one. +#endif } + if( zAnonPw ){ unsigned int uSeed = captcha_seed(); char const *zDecoded = captcha_decode(uSeed); int bAutoCaptcha = db_get_boolean("auto-captcha", 0); char *zCaptcha = captcha_render(zDecoded); @
+#ifdef LANG_RU + @ Гости могут указать anonymous как имя пользователя + @ и ввести 8-символьный пароль, указанный ниже:
+#elif LANG_EN @ Visitors may enter anonymous as the user-ID with @ the 8-character hexadecimal password shown below: +#endif @free(zCaptcha); } if( g.zLogin ){ @if( bAutoCaptcha ) { - @ } @
@ %h(zCaptcha) @
+#ifdef LANG_RU + @Для выхода + @ нажмите эту кнопку:
+#elif LANG_EN @
+ @To log off the system (and delete your login cookie) @ press the following button:
+#endif } @ if( g.perm.Password ){ @
@
+#ifdef LANG_RU + @Для смены своего пароля введите текущий пароль и два раза + @ новый, после чего нажмите кнопку "Изменить пароль".
+ @