/* * Copyright (c) 2016-present, Yann Collet, Facebook, Inc. * All rights reserved. * * This source code is licensed under both the BSD-style license (found in the * LICENSE file in the root directory of this source tree) and the GPLv2 (found * in the COPYING file in the root directory of this source tree). * You may select, at your option, one of the above-listed licenses. */ #include "zstd_lazy.h" /*-************************************* * Binary Tree search ***************************************/ /** ZSTD_insertBt1() : add one or multiple positions to tree. * ip : assumed <= iend-8 . * @return : nb of positions added */ static U32 ZSTD_insertBt1(ZSTD_CCtx* zc, const BYTE* const ip, const U32 mls, const BYTE* const iend, U32 nbCompares, U32 extDict) { U32* const hashTable = zc->hashTable; U32 const hashLog = zc->appliedParams.cParams.hashLog; size_t const h = ZSTD_hashPtr(ip, hashLog, mls); U32* const bt = zc->chainTable; U32 const btLog = zc->appliedParams.cParams.chainLog - 1; U32 const btMask = (1 << btLog) - 1; U32 matchIndex = hashTable[h]; size_t commonLengthSmaller=0, commonLengthLarger=0; const BYTE* const base = zc->base; const BYTE* const dictBase = zc->dictBase; const U32 dictLimit = zc->dictLimit; const BYTE* const dictEnd = dictBase + dictLimit; const BYTE* const prefixStart = base + dictLimit; const BYTE* match; const U32 current = (U32)(ip-base); const U32 btLow = btMask >= current ? 0 : current - btMask; U32* smallerPtr = bt + 2*(current&btMask); U32* largerPtr = smallerPtr + 1; U32 dummy32; /* to be nullified at the end */ U32 const windowLow = zc->lowLimit; U32 matchEndIdx = current+8; size_t bestLength = 8; #ifdef ZSTD_C_PREDICT U32 predictedSmall = *(bt + 2*((current-1)&btMask) + 0); U32 predictedLarge = *(bt + 2*((current-1)&btMask) + 1); predictedSmall += (predictedSmall>0); predictedLarge += (predictedLarge>0); #endif /* ZSTD_C_PREDICT */ assert(ip <= iend-8); /* required for h calculation */ hashTable[h] = current; /* Update Hash Table */ while (nbCompares-- && (matchIndex > windowLow)) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ #ifdef ZSTD_C_PREDICT /* note : can create issues when hlog small <= 11 */ const U32* predictPtr = bt + 2*((matchIndex-1) & btMask); /* written this way, as bt is a roll buffer */ if (matchIndex == predictedSmall) { /* no need to check length, result known */ *smallerPtr = matchIndex; if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ predictedSmall = predictPtr[1] + (predictPtr[1]>0); continue; } if (matchIndex == predictedLarge) { *largerPtr = matchIndex; if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ largerPtr = nextPtr; matchIndex = nextPtr[0]; predictedLarge = predictPtr[0] + (predictPtr[0]>0); continue; } #endif if ((!extDict) || (matchIndex+matchLength >= dictLimit)) { match = base + matchIndex; if (match[matchLength] == ip[matchLength]) matchLength += ZSTD_count(ip+matchLength+1, match+matchLength+1, iend) +1; } else { match = dictBase + matchIndex; matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); if (matchIndex+matchLength >= dictLimit) match = base + matchIndex; /* to prepare for next usage of match[matchLength] */ } if (matchLength > bestLength) { bestLength = matchLength; if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; } if (ip+matchLength == iend) /* equal : no way to know if inf or sup */ break; /* drop , to guarantee consistency ; miss a bit of compression, but other solutions can corrupt tree */ if (match[matchLength] < ip[matchLength]) { /* necessarily within buffer */ /* match+1 is smaller than current */ *smallerPtr = matchIndex; /* update smaller idx */ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop searching */ smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ } else { /* match is larger than current */ *largerPtr = matchIndex; commonLengthLarger = matchLength; if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop searching */ largerPtr = nextPtr; matchIndex = nextPtr[0]; } } *smallerPtr = *largerPtr = 0; if (bestLength > 384) return MIN(192, (U32)(bestLength - 384)); /* speed optimization */ if (matchEndIdx > current + 8) return matchEndIdx - (current + 8); return 1; } static size_t ZSTD_insertBtAndFindBestMatch ( ZSTD_CCtx* zc, const BYTE* const ip, const BYTE* const iend, size_t* offsetPtr, U32 nbCompares, const U32 mls, U32 extDict) { U32* const hashTable = zc->hashTable; U32 const hashLog = zc->appliedParams.cParams.hashLog; size_t const h = ZSTD_hashPtr(ip, hashLog, mls); U32* const bt = zc->chainTable; U32 const btLog = zc->appliedParams.cParams.chainLog - 1; U32 const btMask = (1 << btLog) - 1; U32 matchIndex = hashTable[h]; size_t commonLengthSmaller=0, commonLengthLarger=0; const BYTE* const base = zc->base; const BYTE* const dictBase = zc->dictBase; const U32 dictLimit = zc->dictLimit; const BYTE* const dictEnd = dictBase + dictLimit; const BYTE* const prefixStart = base + dictLimit; const U32 current = (U32)(ip-base); const U32 btLow = btMask >= current ? 0 : current - btMask; const U32 windowLow = zc->lowLimit; U32* smallerPtr = bt + 2*(current&btMask); U32* largerPtr = bt + 2*(current&btMask) + 1; U32 matchEndIdx = current+8; U32 dummy32; /* to be nullified at the end */ size_t bestLength = 0; assert(ip <= iend-8); /* required for h calculation */ hashTable[h] = current; /* Update Hash Table */ while (nbCompares-- && (matchIndex > windowLow)) { U32* const nextPtr = bt + 2*(matchIndex & btMask); size_t matchLength = MIN(commonLengthSmaller, commonLengthLarger); /* guaranteed minimum nb of common bytes */ const BYTE* match; if ((!extDict) || (matchIndex+matchLength >= dictLimit)) { match = base + matchIndex; if (match[matchLength] == ip[matchLength]) matchLength += ZSTD_count(ip+matchLength+1, match+matchLength+1, iend) +1; } else { match = dictBase + matchIndex; matchLength += ZSTD_count_2segments(ip+matchLength, match+matchLength, iend, dictEnd, prefixStart); if (matchIndex+matchLength >= dictLimit) match = base + matchIndex; /* to prepare for next usage of match[matchLength] */ } if (matchLength > bestLength) { if (matchLength > matchEndIdx - matchIndex) matchEndIdx = matchIndex + (U32)matchLength; if ( (4*(int)(matchLength-bestLength)) > (int)(ZSTD_highbit32(current-matchIndex+1) - ZSTD_highbit32((U32)offsetPtr[0]+1)) ) bestLength = matchLength, *offsetPtr = ZSTD_REP_MOVE + current - matchIndex; if (ip+matchLength == iend) /* equal : no way to know if inf or sup */ break; /* drop, to guarantee consistency (miss a little bit of compression) */ } if (match[matchLength] < ip[matchLength]) { /* match is smaller than current */ *smallerPtr = matchIndex; /* update smaller idx */ commonLengthSmaller = matchLength; /* all smaller will now have at least this guaranteed common length */ if (matchIndex <= btLow) { smallerPtr=&dummy32; break; } /* beyond tree size, stop the search */ smallerPtr = nextPtr+1; /* new "smaller" => larger of match */ matchIndex = nextPtr[1]; /* new matchIndex larger than previous (closer to current) */ } else { /* match is larger than current */ *largerPtr = matchIndex; commonLengthLarger = matchLength; if (matchIndex <= btLow) { largerPtr=&dummy32; break; } /* beyond tree size, stop the search */ largerPtr = nextPtr; matchIndex = nextPtr[0]; } } *smallerPtr = *largerPtr = 0; zc->nextToUpdate = (matchEndIdx > current + 8) ? matchEndIdx - 8 : current+1; return bestLength; } void ZSTD_updateTree(ZSTD_CCtx* zc, const BYTE* const ip, const BYTE* const iend, const U32 nbCompares, const U32 mls) { const BYTE* const base = zc->base; const U32 target = (U32)(ip - base); U32 idx = zc->nextToUpdate; while(idx < target) idx += ZSTD_insertBt1(zc, base+idx, mls, iend, nbCompares, 0); } /** ZSTD_BtFindBestMatch() : Tree updater, providing best match */ static size_t ZSTD_BtFindBestMatch ( ZSTD_CCtx* zc, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 mls) { if (ip < zc->base + zc->nextToUpdate) return 0; /* skipped area */ ZSTD_updateTree(zc, ip, iLimit, maxNbAttempts, mls); return ZSTD_insertBtAndFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, mls, 0); } static size_t ZSTD_BtFindBestMatch_selectMLS ( ZSTD_CCtx* zc, /* Index table will be updated */ const BYTE* ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 matchLengthSearch) { switch(matchLengthSearch) { default : /* includes case 3 */ case 4 : return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4); case 5 : return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5); case 7 : case 6 : return ZSTD_BtFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6); } } void ZSTD_updateTree_extDict(ZSTD_CCtx* zc, const BYTE* const ip, const BYTE* const iend, const U32 nbCompares, const U32 mls) { const BYTE* const base = zc->base; const U32 target = (U32)(ip - base); U32 idx = zc->nextToUpdate; while (idx < target) idx += ZSTD_insertBt1(zc, base+idx, mls, iend, nbCompares, 1); } /** Tree updater, providing best match */ static size_t ZSTD_BtFindBestMatch_extDict ( ZSTD_CCtx* zc, const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 mls) { if (ip < zc->base + zc->nextToUpdate) return 0; /* skipped area */ ZSTD_updateTree_extDict(zc, ip, iLimit, maxNbAttempts, mls); return ZSTD_insertBtAndFindBestMatch(zc, ip, iLimit, offsetPtr, maxNbAttempts, mls, 1); } static size_t ZSTD_BtFindBestMatch_selectMLS_extDict ( ZSTD_CCtx* zc, /* Index table will be updated */ const BYTE* ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 matchLengthSearch) { switch(matchLengthSearch) { default : /* includes case 3 */ case 4 : return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4); case 5 : return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5); case 7 : case 6 : return ZSTD_BtFindBestMatch_extDict(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6); } } /* ********************************* * Hash Chain ***********************************/ #define NEXT_IN_CHAIN(d, mask) chainTable[(d) & mask] /* Update chains up to ip (excluded) Assumption : always within prefix (i.e. not within extDict) */ U32 ZSTD_insertAndFindFirstIndex (ZSTD_CCtx* zc, const BYTE* ip, U32 mls) { U32* const hashTable = zc->hashTable; const U32 hashLog = zc->appliedParams.cParams.hashLog; U32* const chainTable = zc->chainTable; const U32 chainMask = (1 << zc->appliedParams.cParams.chainLog) - 1; const BYTE* const base = zc->base; const U32 target = (U32)(ip - base); U32 idx = zc->nextToUpdate; while(idx < target) { /* catch up */ size_t const h = ZSTD_hashPtr(base+idx, hashLog, mls); NEXT_IN_CHAIN(idx, chainMask) = hashTable[h]; hashTable[h] = idx; idx++; } zc->nextToUpdate = target; return hashTable[ZSTD_hashPtr(ip, hashLog, mls)]; } /* inlining is important to hardwire a hot branch (template emulation) */ FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_generic ( ZSTD_CCtx* zc, /* Index table will be updated */ const BYTE* const ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 mls, const U32 extDict) { U32* const chainTable = zc->chainTable; const U32 chainSize = (1 << zc->appliedParams.cParams.chainLog); const U32 chainMask = chainSize-1; const BYTE* const base = zc->base; const BYTE* const dictBase = zc->dictBase; const U32 dictLimit = zc->dictLimit; const BYTE* const prefixStart = base + dictLimit; const BYTE* const dictEnd = dictBase + dictLimit; const U32 lowLimit = zc->lowLimit; const U32 current = (U32)(ip-base); const U32 minChain = current > chainSize ? current - chainSize : 0; int nbAttempts=maxNbAttempts; size_t ml=4-1; /* HC4 match finder */ U32 matchIndex = ZSTD_insertAndFindFirstIndex (zc, ip, mls); for ( ; (matchIndex>lowLimit) & (nbAttempts>0) ; nbAttempts--) { const BYTE* match; size_t currentMl=0; if ((!extDict) || matchIndex >= dictLimit) { match = base + matchIndex; if (match[ml] == ip[ml]) /* potentially better */ currentMl = ZSTD_count(ip, match, iLimit); } else { match = dictBase + matchIndex; if (MEM_read32(match) == MEM_read32(ip)) /* assumption : matchIndex <= dictLimit-4 (by table construction) */ currentMl = ZSTD_count_2segments(ip+4, match+4, iLimit, dictEnd, prefixStart) + 4; } /* save best solution */ if (currentMl > ml) { ml = currentMl; *offsetPtr = current - matchIndex + ZSTD_REP_MOVE; if (ip+currentMl == iLimit) break; /* best possible, avoids read overflow on next attempt */ } if (matchIndex <= minChain) break; matchIndex = NEXT_IN_CHAIN(matchIndex, chainMask); } return ml; } FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_selectMLS ( ZSTD_CCtx* zc, const BYTE* ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 matchLengthSearch) { switch(matchLengthSearch) { default : /* includes case 3 */ case 4 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4, 0); case 5 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5, 0); case 7 : case 6 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6, 0); } } FORCE_INLINE_TEMPLATE size_t ZSTD_HcFindBestMatch_extDict_selectMLS ( ZSTD_CCtx* zc, const BYTE* ip, const BYTE* const iLimit, size_t* offsetPtr, const U32 maxNbAttempts, const U32 matchLengthSearch) { switch(matchLengthSearch) { default : /* includes case 3 */ case 4 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 4, 1); case 5 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 5, 1); case 7 : case 6 : return ZSTD_HcFindBestMatch_generic(zc, ip, iLimit, offsetPtr, maxNbAttempts, 6, 1); } } /* ******************************* * Common parser - lazy strategy *********************************/ FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_lazy_generic(ZSTD_CCtx* ctx, const void* src, size_t srcSize, const U32 searchMethod, const U32 depth) { seqStore_t* seqStorePtr = &(ctx->seqStore); const BYTE* const istart = (const BYTE*)src; const BYTE* ip = istart; const BYTE* anchor = istart; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; const BYTE* const base = ctx->base + ctx->dictLimit; U32 const maxSearches = 1 << ctx->appliedParams.cParams.searchLog; U32 const mls = ctx->appliedParams.cParams.searchLength; typedef size_t (*searchMax_f)(ZSTD_CCtx* zc, const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr, U32 maxNbAttempts, U32 matchLengthSearch); searchMax_f const searchMax = searchMethod ? ZSTD_BtFindBestMatch_selectMLS : ZSTD_HcFindBestMatch_selectMLS; U32 offset_1 = seqStorePtr->rep[0], offset_2 = seqStorePtr->rep[1], savedOffset=0; /* init */ ip += (ip==base); ctx->nextToUpdate3 = ctx->nextToUpdate; { U32 const maxRep = (U32)(ip-base); if (offset_2 > maxRep) savedOffset = offset_2, offset_2 = 0; if (offset_1 > maxRep) savedOffset = offset_1, offset_1 = 0; } /* Match Loop */ while (ip < ilimit) { size_t matchLength=0; size_t offset=0; const BYTE* start=ip+1; /* check repCode */ if ((offset_1>0) & (MEM_read32(ip+1) == MEM_read32(ip+1 - offset_1))) { /* repcode : we take it */ matchLength = ZSTD_count(ip+1+4, ip+1+4-offset_1, iend) + 4; if (depth==0) goto _storeSequence; } /* first search (depth 0) */ { size_t offsetFound = 99999999; size_t const ml2 = searchMax(ctx, ip, iend, &offsetFound, maxSearches, mls); if (ml2 > matchLength) matchLength = ml2, start = ip, offset=offsetFound; } if (matchLength < 4) { ip += ((ip-anchor) >> g_searchStrength) + 1; /* jump faster over incompressible sections */ continue; } /* let's try to find a better solution */ if (depth>=1) while (ip<ilimit) { ip ++; if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const mlRep = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(mlRep * 3); int const gain1 = (int)(matchLength*3 - ZSTD_highbit32((U32)offset+1) + 1); if ((mlRep >= 4) && (gain2 > gain1)) matchLength = mlRep, offset = 0, start = ip; } { size_t offset2=99999999; size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls); int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 4); if ((ml2 >= 4) && (gain2 > gain1)) { matchLength = ml2, offset = offset2, start = ip; continue; /* search a better one */ } } /* let's find an even better one */ if ((depth==2) && (ip<ilimit)) { ip ++; if ((offset) && ((offset_1>0) & (MEM_read32(ip) == MEM_read32(ip - offset_1)))) { size_t const ml2 = ZSTD_count(ip+4, ip+4-offset_1, iend) + 4; int const gain2 = (int)(ml2 * 4); int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 1); if ((ml2 >= 4) && (gain2 > gain1)) matchLength = ml2, offset = 0, start = ip; } { size_t offset2=99999999; size_t const ml2 = searchMax(ctx, ip, iend, &offset2, maxSearches, mls); int const gain2 = (int)(ml2*4 - ZSTD_highbit32((U32)offset2+1)); /* raw approx */ int const gain1 = (int)(matchLength*4 - ZSTD_highbit32((U32)offset+1) + 7); if ((ml2 >= 4) && (gain2 > gain1)) { matchLength = ml2, offset = offset2, start = ip; continue; } } } break; /* nothing found : store previous solution */ } /* NOTE: * start[-offset+ZSTD_REP_MOVE-1] is undefined behavior. * (-offset+ZSTD_REP_MOVE-1) is unsigned, and is added to start, which * overflows the pointer, which is undefined behavior. */ /* catch up */ if (offset) { while ( (start > anchor) && (start > base+offset-ZSTD_REP_MOVE) && (start[-1] == (start-offset+ZSTD_REP_MOVE)[-1]) ) /* only search for offset within prefix */ { start--; matchLength++; } offset_2 = offset_1; offset_1 = (U32)(offset - ZSTD_REP_MOVE); } /* store sequence */ _storeSequence: { size_t const litLength = start - anchor; ZSTD_storeSeq(seqStorePtr, litLength, anchor, (U32)offset, matchLength-MINMATCH); anchor = ip = start + matchLength; } /* check immediate repcode */ while ( (ip <= ilimit) && ((offset_2>0) & (MEM_read32(ip) == MEM_read32(ip - offset_2)) )) { /* store sequence */ matchLength = ZSTD_count(ip+4, ip+4-offset_2, iend) + 4; offset = offset_2; offset_2 = offset_1; offset_1 = (U32)offset; /* swap repcodes */ ZSTD_storeSeq(seqStorePtr, 0, anchor, 0, matchLength-MINMATCH); ip += matchLength; anchor = ip; continue; /* faster when present ... (?) */ } } /* Save reps for next block */ seqStorePtr->repToConfirm[0] = offset_1 ? offset_1 : savedOffset; seqStorePtr->repToConfirm[1] = offset_2 ? offset_2 : savedOffset; /* Return the last literals size */ return iend - anchor; } size_t ZSTD_compressBlock_btlazy2(ZSTD_CCtx* ctx, const void* src, size_t srcSize) { return ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 1, 2); } size_t ZSTD_compressBlock_lazy2(ZSTD_CCtx* ctx, const void* src, size_t srcSize) { return ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 2); } size_t ZSTD_compressBlock_lazy(ZSTD_CCtx* ctx, const void* src, size_t srcSize) { return ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 1); } size_t ZSTD_compressBlock_greedy(ZSTD_CCtx* ctx, const void* src, size_t srcSize) { return ZSTD_compressBlock_lazy_generic(ctx, src, srcSize, 0, 0); } FORCE_INLINE_TEMPLATE size_t ZSTD_compressBlock_lazy_extDict_generic(ZSTD_CCtx* ctx, const void* src, size_t srcSize, const U32 searchMethod, const U32 depth) { seqStore_t* seqStorePtr = &(ctx->seqStore); const BYTE* const istart = (const BYTE*)src; const BYTE* ip = istart; const BYTE* anchor = istart; const BYTE* const iend = istart + srcSize; const BYTE* const ilimit = iend - 8; const BYTE* const base = ctx->base; const U32 dictLimit = ctx->dictLimit; const U32 lowestIndex = ctx->lowLimit; const BYTE* const prefixStart = base + dictLimit; const BYTE* const dictBase = ctx->dictBase; const BYTE* const dictEnd = dictBase + dictLimit; const BYTE* const dictStart = dictBase + ctx->lowLimit; const U32 maxSearches = 1 << ctx->appliedParams.cParams.searchLog; const U32 mls = ctx->appliedParams.cParams.searchLength; typedef size_t (*searchMax_f)(ZSTD_CCtx* zc, const BYTE* ip, const BYTE* iLimit, size_t* offsetPtr, U32 maxNbAttempts, U32 matchLengthSearch); searchMax_f searchMax =# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" "POT-Creation-Date: 2014-05-15 01:54-0400\n" "PO-Revision-Date: 2014-05-15 05:54+0000\n" "Last-Translator: I Robot\n" "Language-Team: Spanish (Peru) (http://www.transifex.com/projects/p/owncloud/language/es_PE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_PE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ajax/share.php:87 msgid "Expiration date is in the past." msgstr "" #: ajax/share.php:119 ajax/share.php:161 #, php-format msgid "Couldn't send mail to following users: %s " msgstr "" #: ajax/update.php:10 msgid "Turned on maintenance mode" msgstr "" #: ajax/update.php:13 msgid "Turned off maintenance mode" msgstr "" #: ajax/update.php:16 msgid "Updated database" msgstr "" #: avatar/controller.php:62 msgid "No image or file provided" msgstr "" #: avatar/controller.php:81 msgid "Unknown filetype" msgstr "" #: avatar/controller.php:85 msgid "Invalid image" msgstr "" #: avatar/controller.php:115 avatar/controller.php:142 msgid "No temporary profile picture available, try again" msgstr "" #: avatar/controller.php:135 msgid "No crop data provided" msgstr "" #: js/config.php:43 msgid "Sunday" msgstr "" #: js/config.php:44 msgid "Monday" msgstr "" #: js/config.php:45 msgid "Tuesday" msgstr "" #: js/config.php:46 msgid "Wednesday" msgstr "" #: js/config.php:47 msgid "Thursday" msgstr "" #: js/config.php:48 msgid "Friday" msgstr "" #: js/config.php:49 msgid "Saturday" msgstr "" #: js/config.php:54 msgid "January" msgstr "" #: js/config.php:55 msgid "February" msgstr "" #: js/config.php:56 msgid "March" msgstr "" #: js/config.php:57 msgid "April" msgstr "" #: js/config.php:58 msgid "May" msgstr "" #: js/config.php:59 msgid "June" msgstr "" #: js/config.php:60 msgid "July" msgstr "" #: js/config.php:61 msgid "August" msgstr "" #: js/config.php:62 msgid "September" msgstr "" #: js/config.php:63 msgid "October" msgstr "" #: js/config.php:64 msgid "November" msgstr "" #: js/config.php:65 msgid "December" msgstr "" #: js/js.js:483 msgid "Settings" msgstr "" #: js/js.js:583 msgid "Saving..." msgstr "" #: js/js.js:1240 msgid "seconds ago" msgstr "" #: js/js.js:1241 msgid "%n minute ago" msgid_plural "%n minutes ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1242 msgid "%n hour ago" msgid_plural "%n hours ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1243 msgid "today" msgstr "" #: js/js.js:1244 msgid "yesterday" msgstr "" #: js/js.js:1245 msgid "%n day ago" msgid_plural "%n days ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1246 msgid "last month" msgstr "" #: js/js.js:1247 msgid "%n month ago" msgid_plural "%n months ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1248 msgid "last year" msgstr "" #: js/js.js:1249 msgid "years ago" msgstr "" #: js/oc-dialogs.js:95 js/oc-dialogs.js:236 msgid "Yes" msgstr "" #: js/oc-dialogs.js:105 js/oc-dialogs.js:246 msgid "No" msgstr "" #: js/oc-dialogs.js:184 msgid "Choose" msgstr "" #: js/oc-dialogs.js:210 msgid "Error loading file picker template: {error}" msgstr "" #: js/oc-dialogs.js:263 msgid "Ok" msgstr "" #: js/oc-dialogs.js:283 msgid "Error loading message template: {error}" msgstr "" #: js/oc-dialogs.js:411 msgid "{count} file conflict" msgid_plural "{count} file conflicts" msgstr[0] "" msgstr[1] "" #: js/oc-dialogs.js:425 msgid "One file conflict" msgstr "" #: js/oc-dialogs.js:431 msgid "New Files" msgstr "" #: js/oc-dialogs.js:432 msgid "Already existing files" msgstr "" #: js/oc-dialogs.js:434 msgid "Which files do you want to keep?" msgstr "" #: js/oc-dialogs.js:435 msgid "" "If you select both versions, the copied file will have a number added to its" " name." msgstr "" #: js/oc-dialogs.js:443 msgid "Cancel" msgstr "" #: js/oc-dialogs.js:453 msgid "Continue" msgstr "" #: js/oc-dialogs.js:500 js/oc-dialogs.js:513 msgid "(all selected)" msgstr "" #: js/oc-dialogs.js:503 js/oc-dialogs.js:517 msgid "({count} selected)" msgstr "" #: js/oc-dialogs.js:525 msgid "Error loading file exists template" msgstr "" #: js/setup.js:84 msgid "Very weak password" msgstr "" #: js/setup.js:85 msgid "Weak password" msgstr "" #: js/setup.js:86 msgid "So-so password" msgstr "" #: js/setup.js:87 msgid "Good password" msgstr "" #: js/setup.js:88 msgid "Strong password" msgstr "" #: js/share.js:51 js/share.js:66 js/share.js:106 msgid "Shared" msgstr "" #: js/share.js:109 msgid "Share" msgstr "" #: js/share.js:158 js/share.js:171 js/share.js:178 js/share.js:747 #: templates/installation.php:10 msgid "Error" msgstr "" #: js/share.js:160 js/share.js:810 msgid "Error while sharing" msgstr "" #: js/share.js:171 msgid "Error while unsharing" msgstr "" #: js/share.js:178 msgid "Error while changing permissions" msgstr "" #: js/share.js:188 msgid "Shared with you and the group {group} by {owner}" msgstr "" #: js/share.js:190 msgid "Shared with you by {owner}" msgstr "" #: js/share.js:214 msgid "Share with user or group …" msgstr "" #: js/share.js:220 msgid "Share link" msgstr "" #: js/share.js:226 msgid "" "The public link will expire no later than {days} days after it is created" msgstr "" #: js/share.js:228 msgid "By default the public link will expire after {days} days" msgstr "" #: js/share.js:234 msgid "Password protect" msgstr "" #: js/share.js:236 templates/installation.php:60 templates/login.php:40 msgid "Password" msgstr "" #: js/share.js:241 msgid "Allow Public Upload" msgstr "" #: js/share.js:245 msgid "Email link to person" msgstr "" #: js/share.js:246 msgid "Send" msgstr "" #: js/share.js:251 msgid "Set expiration date" msgstr "" #: js/share.js:252 msgid "Expiration date" msgstr "" #: js/share.js:289 msgid "Share via email:" msgstr "" #: js/share.js:292 msgid "No people found" msgstr "" #: js/share.js:336 js/share.js:397 msgid "group" msgstr "" #: js/share.js:369 msgid "Resharing is not allowed" msgstr "" #: js/share.js:413 msgid "Shared in {item} with {user}" msgstr "" #: js/share.js:435 msgid "Unshare" msgstr "" #: js/share.js:443 msgid "notify by email" msgstr "" #: js/share.js:446 msgid "can edit" msgstr "" #: js/share.js:448 msgid "access control" msgstr "" #: js/share.js:451 msgid "create" msgstr "" #: js/share.js:454 msgid "update" msgstr "" #: js/share.js:457 msgid "delete" msgstr "" #: js/share.js:460 msgid "share" msgstr "" #: js/share.js:734 msgid "Password protected" msgstr "" #: js/share.js:747 msgid "Error unsetting expiration date" msgstr "" #: js/share.js:768 msgid "Error setting expiration date" msgstr "" #: js/share.js:797 msgid "Sending ..." msgstr "" #: js/share.js:808 msgid "Email sent" msgstr "" #: js/share.js:832 msgid "Warning" msgstr "" #: js/tags.js:4 msgid "The object type is not specified." msgstr "" #: js/tags.js:13 msgid "Enter new" msgstr "" #: js/tags.js:27 msgid "Delete" msgstr "" #: js/tags.js:31 msgid "Add" msgstr "" #: js/tags.js:39 msgid "Edit tags" msgstr "" #: js/tags.js:57 msgid "Error loading dialog template: {error}" msgstr "" #: js/tags.js:264 msgid "No tags selected for deletion." msgstr "" #: js/update.js:8 msgid "Please reload the page." msgstr "" #: js/update.js:17 msgid "" "The update was unsuccessful. Please report this issue to the <a " "href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud " "community</a>." msgstr "" #: js/update.js:21 msgid "The update was successful. Redirecting you to ownCloud now." msgstr "" #: lostpassword/controller.php:70 #, php-format msgid "%s password reset" msgstr "" #: lostpassword/controller.php:72 msgid "" "A problem has occurred whilst sending the email, please contact your " "administrator." msgstr "" #: lostpassword/templates/email.php:2 msgid "Use the following link to reset your password: {link}" msgstr "" #: lostpassword/templates/lostpassword.php:7 msgid "" "The link to reset your password has been sent to your email.<br>If you do " "not receive it within a reasonable amount of time, check your spam/junk " "folders.<br>If it is not there ask your local administrator ." msgstr "" #: lostpassword/templates/lostpassword.php:15 msgid "Request failed!<br>Did you make sure your email/username was right?" msgstr "" #: lostpassword/templates/lostpassword.php:18 msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:21 templates/installation.php:53 #: templates/login.php:32 msgid "Username" msgstr "" #: lostpassword/templates/lostpassword.php:25 msgid "" "Your files are encrypted. If you haven't enabled the recovery key, there " "will be no way to get your data back after your password is reset. If you " "are not sure what to do, please contact your administrator before you " "continue. Do you really want to continue?" msgstr "" #: lostpassword/templates/lostpassword.php:27 msgid "Yes, I really want to reset my password now" msgstr "" #: lostpassword/templates/lostpassword.php:30 msgid "Reset" msgstr "" #: lostpassword/templates/resetpassword.php:4 msgid "Your password was reset" msgstr "" #: lostpassword/templates/resetpassword.php:5 msgid "To login page" msgstr "" #: lostpassword/templates/resetpassword.php:8 msgid "New password" msgstr "" #: lostpassword/templates/resetpassword.php:11 msgid "Reset password" msgstr "" #: setup/controller.php:140 #, php-format msgid "" "Mac OS X is not supported and %s will not work properly on this platform. " "Use it at your own risk! " msgstr "" #: setup/controller.php:144 msgid "" "For the best results, please consider using a GNU/Linux server instead." msgstr "" #: strings.php:5 msgid "Personal" msgstr "" #: strings.php:6 msgid "Users" msgstr "" #: strings.php:7 templates/layout.user.php:116 msgid "Apps" msgstr "" #: strings.php:8 msgid "Admin" msgstr "" #: strings.php:9 msgid "Help" msgstr "" #: tags/controller.php:22 msgid "Error loading tags" msgstr "" #: tags/controller.php:48 msgid "Tag already exists" msgstr "" #: tags/controller.php:64 msgid "Error deleting tag(s)" msgstr "" #: tags/controller.php:75 msgid "Error tagging" msgstr "" #: tags/controller.php:86 msgid "Error untagging" msgstr "" #: tags/controller.php:97 msgid "Error favoriting" msgstr "" #: tags/controller.php:108 msgid "Error unfavoriting" msgstr "" #: templates/403.php:12 msgid "Access forbidden" msgstr "" #: templates/404.php:15 msgid "Cloud not found" msgstr "" #: templates/altmail.php:2 #, php-format msgid "" "Hey there,\n" "\n" "just letting you know that %s shared %s with you.\n" "View it: %s\n" "\n" msgstr "" #: templates/altmail.php:4 templates/mail.php:17 #, php-format msgid "The share will expire on %s." msgstr "" #: templates/altmail.php:7 templates/mail.php:20 msgid "Cheers!" msgstr "" #: templates/installation.php:25 templates/installation.php:32 #: templates/installation.php:39 msgid "Security Warning" msgstr "" #: templates/installation.php:26 msgid "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" msgstr "" #: templates/installation.php:27 #, php-format msgid "Please update your PHP installation to use %s securely." msgstr "" #: templates/installation.php:33 msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." msgstr "" #: templates/installation.php:34 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." msgstr "" #: templates/installation.php:40 msgid "" "Your data directory and files are probably accessible from the internet " "because the .htaccess file does not work." msgstr "" #: templates/installation.php:42 #, php-format msgid "" "For information how to properly configure your server, please see the <a " "href=\"%s\" target=\"_blank\">documentation</a>." msgstr "" #: templates/installation.php:48 msgid "Create an <strong>admin account</strong>" msgstr "" #: templates/installation.php:70 msgid "Storage & database" msgstr "" #: templates/installation.php:77 msgid "Data folder" msgstr "" #: templates/installation.php:90 msgid "Configure the database" msgstr "" #: templates/installation.php:94 msgid "will be used" msgstr "" #: templates/installation.php:109 msgid "Database user" msgstr "" #: templates/installation.php:118 msgid "Database password" msgstr "" #: templates/installation.php:123 msgid "Database name" msgstr "" #: templates/installation.php:132 msgid "Database tablespace" msgstr "" #: templates/installation.php:140 msgid "Database host" msgstr "" #: templates/installation.php:150 msgid "Finish setup" msgstr "" #: templates/installation.php:150 msgid "Finishing …" msgstr "" #: templates/layout.user.php:40 msgid "" "This application requires JavaScript to be enabled for correct operation. " "Please <a href=\"http://enable-javascript.com/\" target=\"_blank\">enable " "JavaScript</a> and re-load this interface." msgstr "" #: templates/layout.user.php:44 #, php-format msgid "%s is available. Get more information on how to update." msgstr "" #: templates/layout.user.php:74 templates/singleuser.user.php:8 msgid "Log out" msgstr "" #: templates/login.php:9 msgid "Automatic logon rejected!" msgstr "" #: templates/login.php:10 msgid "" "If you did not change your password recently, your account may be " "compromised!" msgstr "" #: templates/login.php:12 msgid "Please change your password to secure your account again." msgstr "" #: templates/login.php:17 msgid "Server side authentication failed!" msgstr "" #: templates/login.php:18 msgid "Please contact your administrator." msgstr "" #: templates/login.php:46 msgid "Lost your password?" msgstr "" #: templates/login.php:51 msgid "remember" msgstr "" #: templates/login.php:54 msgid "Log in" msgstr "" #: templates/login.php:60 msgid "Alternative Logins" msgstr "" #: templates/mail.php:15 #, php-format msgid "" "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> " "with you.<br><a href=\"%s\">View it!</a><br><br>" msgstr "" #: templates/singleuser.user.php:3 msgid "This ownCloud instance is currently in single user mode." msgstr "" #: templates/singleuser.user.php:4 msgid "This means only administrators can use the instance." msgstr "" #: templates/singleuser.user.php:5 templates/update.user.php:5 msgid "" "Contact your system administrator if this message persists or appeared " "unexpectedly." msgstr "" #: templates/singleuser.user.php:7 templates/update.user.php:6 msgid "Thank you for your patience." msgstr "" #: templates/update.admin.php:3 #, php-format msgid "Updating ownCloud to version %s, this may take a while." msgstr "" #: templates/update.user.php:3 msgid "" "This ownCloud instance is currently being updated, which may take a while." msgstr "" #: templates/update.user.php:4 msgid "Please reload this page after a short time to continue using ownCloud." msgstr ""
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: ownCloud\n" "Report-Msgid-Bugs-To: translations@owncloud.org\n" "POT-Creation-Date: 2014-05-15 01:54-0400\n" "PO-Revision-Date: 2014-05-15 05:54+0000\n" "Last-Translator: I Robot\n" "Language-Team: Spanish (Peru) (http://www.transifex.com/projects/p/owncloud/language/es_PE/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: es_PE\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #: ajax/share.php:87 msgid "Expiration date is in the past." msgstr "" #: ajax/share.php:119 ajax/share.php:161 #, php-format msgid "Couldn't send mail to following users: %s " msgstr "" #: ajax/update.php:10 msgid "Turned on maintenance mode" msgstr "" #: ajax/update.php:13 msgid "Turned off maintenance mode" msgstr "" #: ajax/update.php:16 msgid "Updated database" msgstr "" #: avatar/controller.php:62 msgid "No image or file provided" msgstr "" #: avatar/controller.php:81 msgid "Unknown filetype" msgstr "" #: avatar/controller.php:85 msgid "Invalid image" msgstr "" #: avatar/controller.php:115 avatar/controller.php:142 msgid "No temporary profile picture available, try again" msgstr "" #: avatar/controller.php:135 msgid "No crop data provided" msgstr "" #: js/config.php:43 msgid "Sunday" msgstr "" #: js/config.php:44 msgid "Monday" msgstr "" #: js/config.php:45 msgid "Tuesday" msgstr "" #: js/config.php:46 msgid "Wednesday" msgstr "" #: js/config.php:47 msgid "Thursday" msgstr "" #: js/config.php:48 msgid "Friday" msgstr "" #: js/config.php:49 msgid "Saturday" msgstr "" #: js/config.php:54 msgid "January" msgstr "" #: js/config.php:55 msgid "February" msgstr "" #: js/config.php:56 msgid "March" msgstr "" #: js/config.php:57 msgid "April" msgstr "" #: js/config.php:58 msgid "May" msgstr "" #: js/config.php:59 msgid "June" msgstr "" #: js/config.php:60 msgid "July" msgstr "" #: js/config.php:61 msgid "August" msgstr "" #: js/config.php:62 msgid "September" msgstr "" #: js/config.php:63 msgid "October" msgstr "" #: js/config.php:64 msgid "November" msgstr "" #: js/config.php:65 msgid "December" msgstr "" #: js/js.js:483 msgid "Settings" msgstr "" #: js/js.js:583 msgid "Saving..." msgstr "" #: js/js.js:1240 msgid "seconds ago" msgstr "" #: js/js.js:1241 msgid "%n minute ago" msgid_plural "%n minutes ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1242 msgid "%n hour ago" msgid_plural "%n hours ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1243 msgid "today" msgstr "" #: js/js.js:1244 msgid "yesterday" msgstr "" #: js/js.js:1245 msgid "%n day ago" msgid_plural "%n days ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1246 msgid "last month" msgstr "" #: js/js.js:1247 msgid "%n month ago" msgid_plural "%n months ago" msgstr[0] "" msgstr[1] "" #: js/js.js:1248 msgid "last year" msgstr "" #: js/js.js:1249 msgid "years ago" msgstr "" #: js/oc-dialogs.js:95 js/oc-dialogs.js:236 msgid "Yes" msgstr "" #: js/oc-dialogs.js:105 js/oc-dialogs.js:246 msgid "No" msgstr "" #: js/oc-dialogs.js:184 msgid "Choose" msgstr "" #: js/oc-dialogs.js:210 msgid "Error loading file picker template: {error}" msgstr "" #: js/oc-dialogs.js:263 msgid "Ok" msgstr "" #: js/oc-dialogs.js:283 msgid "Error loading message template: {error}" msgstr "" #: js/oc-dialogs.js:411 msgid "{count} file conflict" msgid_plural "{count} file conflicts" msgstr[0] "" msgstr[1] "" #: js/oc-dialogs.js:425 msgid "One file conflict" msgstr "" #: js/oc-dialogs.js:431 msgid "New Files" msgstr "" #: js/oc-dialogs.js:432 msgid "Already existing files" msgstr "" #: js/oc-dialogs.js:434 msgid "Which files do you want to keep?" msgstr "" #: js/oc-dialogs.js:435 msgid "" "If you select both versions, the copied file will have a number added to its" " name." msgstr "" #: js/oc-dialogs.js:443 msgid "Cancel" msgstr "" #: js/oc-dialogs.js:453 msgid "Continue" msgstr "" #: js/oc-dialogs.js:500 js/oc-dialogs.js:513 msgid "(all selected)" msgstr "" #: js/oc-dialogs.js:503 js/oc-dialogs.js:517 msgid "({count} selected)" msgstr "" #: js/oc-dialogs.js:525 msgid "Error loading file exists template" msgstr "" #: js/setup.js:84 msgid "Very weak password" msgstr "" #: js/setup.js:85 msgid "Weak password" msgstr "" #: js/setup.js:86 msgid "So-so password" msgstr "" #: js/setup.js:87 msgid "Good password" msgstr "" #: js/setup.js:88 msgid "Strong password" msgstr "" #: js/share.js:51 js/share.js:66 js/share.js:106 msgid "Shared" msgstr "" #: js/share.js:109 msgid "Share" msgstr "" #: js/share.js:158 js/share.js:171 js/share.js:178 js/share.js:747 #: templates/installation.php:10 msgid "Error" msgstr "" #: js/share.js:160 js/share.js:810 msgid "Error while sharing" msgstr "" #: js/share.js:171 msgid "Error while unsharing" msgstr "" #: js/share.js:178 msgid "Error while changing permissions" msgstr "" #: js/share.js:188 msgid "Shared with you and the group {group} by {owner}" msgstr "" #: js/share.js:190 msgid "Shared with you by {owner}" msgstr "" #: js/share.js:214 msgid "Share with user or group …" msgstr "" #: js/share.js:220 msgid "Share link" msgstr "" #: js/share.js:226 msgid "" "The public link will expire no later than {days} days after it is created" msgstr "" #: js/share.js:228 msgid "By default the public link will expire after {days} days" msgstr "" #: js/share.js:234 msgid "Password protect" msgstr "" #: js/share.js:236 templates/installation.php:60 templates/login.php:40 msgid "Password" msgstr "" #: js/share.js:241 msgid "Allow Public Upload" msgstr "" #: js/share.js:245 msgid "Email link to person" msgstr "" #: js/share.js:246 msgid "Send" msgstr "" #: js/share.js:251 msgid "Set expiration date" msgstr "" #: js/share.js:252 msgid "Expiration date" msgstr "" #: js/share.js:289 msgid "Share via email:" msgstr "" #: js/share.js:292 msgid "No people found" msgstr "" #: js/share.js:336 js/share.js:397 msgid "group" msgstr "" #: js/share.js:369 msgid "Resharing is not allowed" msgstr "" #: js/share.js:413 msgid "Shared in {item} with {user}" msgstr "" #: js/share.js:435 msgid "Unshare" msgstr "" #: js/share.js:443 msgid "notify by email" msgstr "" #: js/share.js:446 msgid "can edit" msgstr "" #: js/share.js:448 msgid "access control" msgstr "" #: js/share.js:451 msgid "create" msgstr "" #: js/share.js:454 msgid "update" msgstr "" #: js/share.js:457 msgid "delete" msgstr "" #: js/share.js:460 msgid "share" msgstr "" #: js/share.js:734 msgid "Password protected" msgstr "" #: js/share.js:747 msgid "Error unsetting expiration date" msgstr "" #: js/share.js:768 msgid "Error setting expiration date" msgstr "" #: js/share.js:797 msgid "Sending ..." msgstr "" #: js/share.js:808 msgid "Email sent" msgstr "" #: js/share.js:832 msgid "Warning" msgstr "" #: js/tags.js:4 msgid "The object type is not specified." msgstr "" #: js/tags.js:13 msgid "Enter new" msgstr "" #: js/tags.js:27 msgid "Delete" msgstr "" #: js/tags.js:31 msgid "Add" msgstr "" #: js/tags.js:39 msgid "Edit tags" msgstr "" #: js/tags.js:57 msgid "Error loading dialog template: {error}" msgstr "" #: js/tags.js:264 msgid "No tags selected for deletion." msgstr "" #: js/update.js:8 msgid "Please reload the page." msgstr "" #: js/update.js:17 msgid "" "The update was unsuccessful. Please report this issue to the <a " "href=\"https://github.com/owncloud/core/issues\" target=\"_blank\">ownCloud " "community</a>." msgstr "" #: js/update.js:21 msgid "The update was successful. Redirecting you to ownCloud now." msgstr "" #: lostpassword/controller.php:70 #, php-format msgid "%s password reset" msgstr "" #: lostpassword/controller.php:72 msgid "" "A problem has occurred whilst sending the email, please contact your " "administrator." msgstr "" #: lostpassword/templates/email.php:2 msgid "Use the following link to reset your password: {link}" msgstr "" #: lostpassword/templates/lostpassword.php:7 msgid "" "The link to reset your password has been sent to your email.<br>If you do " "not receive it within a reasonable amount of time, check your spam/junk " "folders.<br>If it is not there ask your local administrator ." msgstr "" #: lostpassword/templates/lostpassword.php:15 msgid "Request failed!<br>Did you make sure your email/username was right?" msgstr "" #: lostpassword/templates/lostpassword.php:18 msgid "You will receive a link to reset your password via Email." msgstr "" #: lostpassword/templates/lostpassword.php:21 templates/installation.php:53 #: templates/login.php:32 msgid "Username" msgstr "" #: lostpassword/templates/lostpassword.php:25 msgid "" "Your files are encrypted. If you haven't enabled the recovery key, there " "will be no way to get your data back after your password is reset. If you " "are not sure what to do, please contact your administrator before you " "continue. Do you really want to continue?" msgstr "" #: lostpassword/templates/lostpassword.php:27 msgid "Yes, I really want to reset my password now" msgstr "" #: lostpassword/templates/lostpassword.php:30 msgid "Reset" msgstr "" #: lostpassword/templates/resetpassword.php:4 msgid "Your password was reset" msgstr "" #: lostpassword/templates/resetpassword.php:5 msgid "To login page" msgstr "" #: lostpassword/templates/resetpassword.php:8 msgid "New password" msgstr "" #: lostpassword/templates/resetpassword.php:11 msgid "Reset password" msgstr "" #: setup/controller.php:140 #, php-format msgid "" "Mac OS X is not supported and %s will not work properly on this platform. " "Use it at your own risk! " msgstr "" #: setup/controller.php:144 msgid "" "For the best results, please consider using a GNU/Linux server instead." msgstr "" #: strings.php:5 msgid "Personal" msgstr "" #: strings.php:6 msgid "Users" msgstr "" #: strings.php:7 templates/layout.user.php:116 msgid "Apps" msgstr "" #: strings.php:8 msgid "Admin" msgstr "" #: strings.php:9 msgid "Help" msgstr "" #: tags/controller.php:22 msgid "Error loading tags" msgstr "" #: tags/controller.php:48 msgid "Tag already exists" msgstr "" #: tags/controller.php:64 msgid "Error deleting tag(s)" msgstr "" #: tags/controller.php:75 msgid "Error tagging" msgstr "" #: tags/controller.php:86 msgid "Error untagging" msgstr "" #: tags/controller.php:97 msgid "Error favoriting" msgstr "" #: tags/controller.php:108 msgid "Error unfavoriting" msgstr "" #: templates/403.php:12 msgid "Access forbidden" msgstr "" #: templates/404.php:15 msgid "Cloud not found" msgstr "" #: templates/altmail.php:2 #, php-format msgid "" "Hey there,\n" "\n" "just letting you know that %s shared %s with you.\n" "View it: %s\n" "\n" msgstr "" #: templates/altmail.php:4 templates/mail.php:17 #, php-format msgid "The share will expire on %s." msgstr "" #: templates/altmail.php:7 templates/mail.php:20 msgid "Cheers!" msgstr "" #: templates/installation.php:25 templates/installation.php:32 #: templates/installation.php:39 msgid "Security Warning" msgstr "" #: templates/installation.php:26 msgid "Your PHP version is vulnerable to the NULL Byte attack (CVE-2006-7243)" msgstr "" #: templates/installation.php:27 #, php-format msgid "Please update your PHP installation to use %s securely." msgstr "" #: templates/installation.php:33 msgid "" "No secure random number generator is available, please enable the PHP " "OpenSSL extension." msgstr "" #: templates/installation.php:34 msgid "" "Without a secure random number generator an attacker may be able to predict " "password reset tokens and take over your account." msgstr "" #: templates/installation.php:40 msgid "" "Your data directory and files are probably accessible from the internet " "because the .htaccess file does not work." msgstr "" #: templates/installation.php:42 #, php-format msgid "" "For information how to properly configure your server, please see the <a " "href=\"%s\" target=\"_blank\">documentation</a>." msgstr "" #: templates/installation.php:48 msgid "Create an <strong>admin account</strong>" msgstr "" #: templates/installation.php:70 msgid "Storage & database" msgstr "" #: templates/installation.php:77 msgid "Data folder" msgstr "" #: templates/installation.php:90 msgid "Configure the database" msgstr "" #: templates/installation.php:94 msgid "will be used" msgstr "" #: templates/installation.php:109 msgid "Database user" msgstr "" #: templates/installation.php:118 msgid "Database password" msgstr "" #: templates/installation.php:123 msgid "Database name" msgstr "" #: templates/installation.php:132 msgid "Database tablespace" msgstr "" #: templates/installation.php:140 msgid "Database host" msgstr "" #: templates/installation.php:150 msgid "Finish setup" msgstr "" #: templates/installation.php:150 msgid "Finishing …" msgstr "" #: templates/layout.user.php:40 msgid "" "This application requires JavaScript to be enabled for correct operation. " "Please <a href=\"http://enable-javascript.com/\" target=\"_blank\">enable " "JavaScript</a> and re-load this interface." msgstr "" #: templates/layout.user.php:44 #, php-format msgid "%s is available. Get more information on how to update." msgstr "" #: templates/layout.user.php:74 templates/singleuser.user.php:8 msgid "Log out" msgstr "" #: templates/login.php:9 msgid "Automatic logon rejected!" msgstr "" #: templates/login.php:10 msgid "" "If you did not change your password recently, your account may be " "compromised!" msgstr "" #: templates/login.php:12 msgid "Please change your password to secure your account again." msgstr "" #: templates/login.php:17 msgid "Server side authentication failed!" msgstr "" #: templates/login.php:18 msgid "Please contact your administrator." msgstr "" #: templates/login.php:46 msgid "Lost your password?" msgstr "" #: templates/login.php:51 msgid "remember" msgstr "" #: templates/login.php:54 msgid "Log in" msgstr "" #: templates/login.php:60 msgid "Alternative Logins" msgstr "" #: templates/mail.php:15 #, php-format msgid "" "Hey there,<br><br>just letting you know that %s shared <strong>%s</strong> " "with you.<br><a href=\"%s\">View it!</a><br><br>" msgstr "" #: templates/singleuser.user.php:3 msgid "This ownCloud instance is currently in single user mode." msgstr "" #: templates/singleuser.user.php:4 msgid "This means only administrators can use the instance." msgstr "" #: templates/singleuser.user.php:5 templates/update.user.php:5 msgid "" "Contact your system administrator if this message persists or appeared " "unexpectedly." msgstr "" #: templates/singleuser.user.php:7 templates/update.user.php:6 msgid "Thank you for your patience." msgstr "" #: templates/update.admin.php:3 #, php-format msgid "Updating ownCloud to version %s, this may take a while." msgstr "" #: templates/update.user.php:3 msgid "" "This ownCloud instance is currently being updated, which may take a while." msgstr "" #: templates/update.user.php:4 msgid "Please reload this page after a short time to continue using ownCloud." msgstr ""