Merge branch 'master' into MaterialDesign

Conflicts:
	src/AndroidFileChooserBinding/AndroidFileChooserBinding.csproj
	src/JavaFileStorageBindings/JavaFileStorageBindings.csproj
	src/KP2AKdbLibraryBinding/KP2AKdbLibraryBinding.csproj
	src/KeePass.sln
	src/KeePassLib2Android/KeePassLib2Android.csproj
	src/PluginSdkBinding/PluginSdkBinding.csproj
	src/keepass2android/AboutActivity.cs
	src/keepass2android/ExportDatabaseActivity.cs
	src/keepass2android/GroupActivity.cs
	src/keepass2android/GroupBaseActivity.cs
	src/keepass2android/Properties/AndroidManifest_net.xml
	src/keepass2android/keepass2android.csproj
	src/keepass2android/search/SearchProvider.cs
This commit is contained in:
Philipp Crocoll 2015-09-04 05:34:27 +02:00
commit c7cf120c1d
78 changed files with 11977 additions and 205 deletions

View File

@ -10,6 +10,7 @@
<RootNamespace>AndroidFileChooserBinding</RootNamespace>
<AssemblyName>AndroidFileChooserBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Xamarin.Android.Support.v4" version="20.0.0.4" targetFramework="MonoAndroid22" />
<package id="Xamarin.Android.Support.v4" version="20.0.0.4" targetFramework="MonoAndroid22" requireReinstallation="True" />
</packages>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/search"
android:icon="@android:drawable/ic_menu_search"
android:title="Search"
android:showAsAction="ifRoom"
android:actionViewClass="android.widget.SearchView"
/>
</menu>

View File

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<searchable xmlns:android="http://schemas.android.com/apk/res/android"
android:label="@string/search_label"
android:hint="@string/search_hint"
android:searchMode="showSearchLabelAsBadge"
android:searchSuggestAuthority="App1.SearchProvider"
android:searchSuggestSelection=" ?"
android:searchSuggestThreshold="2"
android:searchSuggestIntentAction="android.intent.action.VIEW"
android:searchSuggestIntentData="content://keepass2android.EntryActivity"
>
</searchable>

View File

@ -10,6 +10,8 @@
<RootNamespace>JavaFileStorageBindings</RootNamespace>
<AssemblyName>JavaFileStorageBindings</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -10,6 +10,7 @@
<RootNamespace>KP2AKdbLibraryBinding</RootNamespace>
<AssemblyName>KP2AKdbLibraryBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -36,6 +36,7 @@ EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MasterKeePlugin", "MasterKeePlugin\MasterKeePlugin.csproj", "{9A4C5BAA-1A8A-49B4-BBC3-60D4871FB36C}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MaterialTest2", "MaterialTest2\MaterialTest2.csproj", "{B7BBC4A2-0301-4DFF-B03C-C88CD4F1F890}"
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ZlibAndroid", "ZlibAndroid\ZlibAndroid.csproj", "{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@ -231,6 +232,30 @@ Global
{5CF675A5-9BEE-4720-BED9-D5BF14A2EBF9}.ReleaseNoNet|Mixed Platforms.Build.0 = ReleaseNoNet|Any CPU
{5CF675A5-9BEE-4720-BED9-D5BF14A2EBF9}.ReleaseNoNet|Win32.ActiveCfg = Release|Any CPU
{5CF675A5-9BEE-4720-BED9-D5BF14A2EBF9}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Win32.ActiveCfg = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|Win32.Build.0 = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|x64.ActiveCfg = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Debug|x64.Build.0 = Debug|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Any CPU.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Mixed Platforms.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Win32.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|Win32.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|x64.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.Release|x64.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Any CPU.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Any CPU.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Mixed Platforms.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Mixed Platforms.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Win32.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|Win32.Build.0 = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|x64.ActiveCfg = Release|Any CPU
{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}.ReleaseNoNet|x64.Build.0 = Release|Any CPU
{70D3844A-D9FA-4A64-B205-A84C6A822196}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{70D3844A-D9FA-4A64-B205-A84C6A822196}.Debug|Any CPU.Build.0 = Debug|Any CPU
{70D3844A-D9FA-4A64-B205-A84C6A822196}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU

View File

@ -12,7 +12,8 @@
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<AssemblyName>KeePassLib2Android</AssemblyName>
<TargetFrameworkVersion>v4.0.3</TargetFrameworkVersion>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>
@ -156,6 +157,10 @@
<Project>{70D3844A-D9FA-4A64-B205-A84C6A822196}</Project>
<Name>KP2AKdbLibraryBinding</Name>
</ProjectReference>
<ProjectReference Include="..\ZlibAndroid\ZlibAndroid.csproj">
<Project>{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}</Project>
<Name>ZlibAndroid</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>

View File

@ -114,7 +114,7 @@ namespace KeePassLib.Serialization
!m_bRepairMode);
if(m_pwDatabase.Compression == PwCompressionAlgorithm.GZip)
readerStream = new GZipStream(sHashed, CompressionMode.Decompress);
readerStream = new Ionic.Zlib.GZipStream(sHashed, Ionic.Zlib.CompressionMode.Decompress);
else readerStream = sHashed;
}
else if(kdbFormat == KdbxFormat.PlainXml)

View File

@ -115,7 +115,7 @@ namespace KeePassLib.Serialization
Stream sHashed = new HashedBlockStream(sEncrypted, true);
if(m_pwDatabase.Compression == PwCompressionAlgorithm.GZip)
writerStream = new GZipStream(sHashed, CompressionMode.Compress);
writerStream = new Ionic.Zlib.GZipStream(sHashed, Ionic.Zlib.CompressionMode.Compress);
else
writerStream = sHashed;
}

View File

@ -103,7 +103,7 @@ namespace KeePassLib.Translation
FileAccess.Write, FileShare.None);
#if !KeePassLibSD
GZipStream gz = new GZipStream(fs, CompressionMode.Compress);
Ionic.Zlib.GZipStream gz = new Ionic.Zlib.GZipStream(fs, Ionic.Zlib.CompressionMode.Compress);
#else
GZipOutputStream gz = new GZipOutputStream(fs);
#endif
@ -132,7 +132,7 @@ namespace KeePassLib.Translation
FileAccess.Read, FileShare.Read);
#if !KeePassLibSD
GZipStream gz = new GZipStream(fs, CompressionMode.Decompress);
Ionic.Zlib.GZipStream gz = new Ionic.Zlib.GZipStream(fs, Ionic.Zlib.CompressionMode.Decompress);
#else
GZipInputStream gz = new GZipInputStream(fs);
#endif

View File

@ -68,7 +68,7 @@ namespace KeePassLib.Utility
FileStream fsOut = new FileStream(strPath, FileMode.Create,
FileAccess.Write, FileShare.None);
GZipStream gz = new GZipStream(fsOut, CompressionMode.Compress);
Ionic.Zlib.GZipStream gz = new Ionic.Zlib.GZipStream(fsOut, CompressionMode.Compress);
m_swOut = new StreamWriter(gz);
AppLogEx.Log("Started logging on " + dtNow.ToString("s") + ".");

View File

@ -430,7 +430,7 @@ namespace KeePassLib.Utility
if(pbData.Length == 0) return pbData;
MemoryStream msCompressed = new MemoryStream();
GZipStream gz = new GZipStream(msCompressed, CompressionMode.Compress);
Ionic.Zlib.GZipStream gz = new Ionic.Zlib.GZipStream(msCompressed, Ionic.Zlib.CompressionMode.Compress);
MemoryStream msSource = new MemoryStream(pbData, false);
MemUtil.CopyStream(msSource, gz);
gz.Close();
@ -447,7 +447,7 @@ namespace KeePassLib.Utility
if(pbCompressed.Length == 0) return pbCompressed;
MemoryStream msCompressed = new MemoryStream(pbCompressed, false);
GZipStream gz = new GZipStream(msCompressed, CompressionMode.Decompress);
Ionic.Zlib.GZipStream gz = new Ionic.Zlib.GZipStream(msCompressed, Ionic.Zlib.CompressionMode.Decompress);
MemoryStream msData = new MemoryStream();
MemUtil.CopyStream(gz, msData);
gz.Close();

View File

@ -0,0 +1,13 @@
namespace keepass2android.Io
{
public partial class DropboxFileStorage
{
private const string AppKey = "";
private const string AppSecret = "";
}
public partial class DropboxAppFolderFileStorage
{
private const string AppKey = "";
private const string AppSecret = "";
}
}

View File

@ -10,6 +10,8 @@
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<AssemblyName>Kp2aKeyboardBinding</AssemblyName>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>True</DebugSymbols>

View File

@ -10,6 +10,8 @@
<RootNamespace>PluginSdkBinding</RootNamespace>
<AssemblyName>PluginSdkBinding</AssemblyName>
<FileAlignment>512</FileAlignment>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

View File

@ -12,6 +12,8 @@
<FileAlignment>512</FileAlignment>
<AndroidResgenFile>Resources\Resource.Designer.cs</AndroidResgenFile>
<GenerateSerializationAssemblies>Off</GenerateSerializationAssemblies>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>

814
src/ZlibAndroid/CRC32.cs Normal file
View File

@ -0,0 +1,814 @@
// CRC32.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2011 Dino Chiesa.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// Last Saved: <2011-August-02 18:25:54>
//
// ------------------------------------------------------------------
//
// This module defines the CRC32 class, which can do the CRC32 algorithm, using
// arbitrary starting polynomials, and bit reversal. The bit reversal is what
// distinguishes this CRC-32 used in BZip2 from the CRC-32 that is used in PKZIP
// files, or GZIP files. This class does both.
//
// ------------------------------------------------------------------
using System;
using Interop = System.Runtime.InteropServices;
namespace Ionic.Crc
{
/// <summary>
/// Computes a CRC-32. The CRC-32 algorithm is parameterized - you
/// can set the polynomial and enable or disable bit
/// reversal. This can be used for GZIP, BZip2, or ZIP.
/// </summary>
/// <remarks>
/// This type is used internally by DotNetZip; it is generally not used
/// directly by applications wishing to create, read, or manipulate zip
/// archive files.
/// </remarks>
[Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000C")]
[Interop.ComVisible(true)]
#if !NETCF
[Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
#endif
public class CRC32
{
/// <summary>
/// Indicates the total number of bytes applied to the CRC.
/// </summary>
public Int64 TotalBytesRead
{
get
{
return _TotalBytesRead;
}
}
/// <summary>
/// Indicates the current CRC for all blocks slurped in.
/// </summary>
public Int32 Crc32Result
{
get
{
return unchecked((Int32)(~_register));
}
}
/// <summary>
/// Returns the CRC32 for the specified stream.
/// </summary>
/// <param name="input">The stream over which to calculate the CRC32</param>
/// <returns>the CRC32 calculation</returns>
public Int32 GetCrc32(System.IO.Stream input)
{
return GetCrc32AndCopy(input, null);
}
/// <summary>
/// Returns the CRC32 for the specified stream, and writes the input into the
/// output stream.
/// </summary>
/// <param name="input">The stream over which to calculate the CRC32</param>
/// <param name="output">The stream into which to deflate the input</param>
/// <returns>the CRC32 calculation</returns>
public Int32 GetCrc32AndCopy(System.IO.Stream input, System.IO.Stream output)
{
if (input == null)
throw new Exception("The input stream must not be null.");
unchecked
{
byte[] buffer = new byte[BUFFER_SIZE];
int readSize = BUFFER_SIZE;
_TotalBytesRead = 0;
int count = input.Read(buffer, 0, readSize);
if (output != null) output.Write(buffer, 0, count);
_TotalBytesRead += count;
while (count > 0)
{
SlurpBlock(buffer, 0, count);
count = input.Read(buffer, 0, readSize);
if (output != null) output.Write(buffer, 0, count);
_TotalBytesRead += count;
}
return (Int32)(~_register);
}
}
/// <summary>
/// Get the CRC32 for the given (word,byte) combo. This is a
/// computation defined by PKzip for PKZIP 2.0 (weak) encryption.
/// </summary>
/// <param name="W">The word to start with.</param>
/// <param name="B">The byte to combine it with.</param>
/// <returns>The CRC-ized result.</returns>
public Int32 ComputeCrc32(Int32 W, byte B)
{
return _InternalComputeCrc32((UInt32)W, B);
}
internal Int32 _InternalComputeCrc32(UInt32 W, byte B)
{
return (Int32)(crc32Table[(W ^ B) & 0xFF] ^ (W >> 8));
}
/// <summary>
/// Update the value for the running CRC32 using the given block of bytes.
/// This is useful when using the CRC32() class in a Stream.
/// </summary>
/// <param name="block">block of bytes to slurp</param>
/// <param name="offset">starting point in the block</param>
/// <param name="count">how many bytes within the block to slurp</param>
public void SlurpBlock(byte[] block, int offset, int count)
{
if (block == null)
throw new Exception("The data buffer must not be null.");
// bzip algorithm
for (int i = 0; i < count; i++)
{
int x = offset + i;
byte b = block[x];
if (this.reverseBits)
{
UInt32 temp = (_register >> 24) ^ b;
_register = (_register << 8) ^ crc32Table[temp];
}
else
{
UInt32 temp = (_register & 0x000000FF) ^ b;
_register = (_register >> 8) ^ crc32Table[temp];
}
}
_TotalBytesRead += count;
}
/// <summary>
/// Process one byte in the CRC.
/// </summary>
/// <param name = "b">the byte to include into the CRC . </param>
public void UpdateCRC(byte b)
{
if (this.reverseBits)
{
UInt32 temp = (_register >> 24) ^ b;
_register = (_register << 8) ^ crc32Table[temp];
}
else
{
UInt32 temp = (_register & 0x000000FF) ^ b;
_register = (_register >> 8) ^ crc32Table[temp];
}
}
/// <summary>
/// Process a run of N identical bytes into the CRC.
/// </summary>
/// <remarks>
/// <para>
/// This method serves as an optimization for updating the CRC when a
/// run of identical bytes is found. Rather than passing in a buffer of
/// length n, containing all identical bytes b, this method accepts the
/// byte value and the length of the (virtual) buffer - the length of
/// the run.
/// </para>
/// </remarks>
/// <param name = "b">the byte to include into the CRC. </param>
/// <param name = "n">the number of times that byte should be repeated. </param>
public void UpdateCRC(byte b, int n)
{
while (n-- > 0)
{
if (this.reverseBits)
{
uint temp = (_register >> 24) ^ b;
_register = (_register << 8) ^ crc32Table[(temp >= 0)
? temp
: (temp + 256)];
}
else
{
UInt32 temp = (_register & 0x000000FF) ^ b;
_register = (_register >> 8) ^ crc32Table[(temp >= 0)
? temp
: (temp + 256)];
}
}
}
private static uint ReverseBits(uint data)
{
unchecked
{
uint ret = data;
ret = (ret & 0x55555555) << 1 | (ret >> 1) & 0x55555555;
ret = (ret & 0x33333333) << 2 | (ret >> 2) & 0x33333333;
ret = (ret & 0x0F0F0F0F) << 4 | (ret >> 4) & 0x0F0F0F0F;
ret = (ret << 24) | ((ret & 0xFF00) << 8) | ((ret >> 8) & 0xFF00) | (ret >> 24);
return ret;
}
}
private static byte ReverseBits(byte data)
{
unchecked
{
uint u = (uint)data * 0x00020202;
uint m = 0x01044010;
uint s = u & m;
uint t = (u << 2) & (m << 1);
return (byte)((0x01001001 * (s + t)) >> 24);
}
}
private void GenerateLookupTable()
{
crc32Table = new UInt32[256];
unchecked
{
UInt32 dwCrc;
byte i = 0;
do
{
dwCrc = i;
for (byte j = 8; j > 0; j--)
{
if ((dwCrc & 1) == 1)
{
dwCrc = (dwCrc >> 1) ^ dwPolynomial;
}
else
{
dwCrc >>= 1;
}
}
if (reverseBits)
{
crc32Table[ReverseBits(i)] = ReverseBits(dwCrc);
}
else
{
crc32Table[i] = dwCrc;
}
i++;
} while (i!=0);
}
#if VERBOSE
Console.WriteLine();
Console.WriteLine("private static readonly UInt32[] crc32Table = {");
for (int i = 0; i < crc32Table.Length; i+=4)
{
Console.Write(" ");
for (int j=0; j < 4; j++)
{
Console.Write(" 0x{0:X8}U,", crc32Table[i+j]);
}
Console.WriteLine();
}
Console.WriteLine("};");
Console.WriteLine();
#endif
}
private uint gf2_matrix_times(uint[] matrix, uint vec)
{
uint sum = 0;
int i=0;
while (vec != 0)
{
if ((vec & 0x01)== 0x01)
sum ^= matrix[i];
vec >>= 1;
i++;
}
return sum;
}
private void gf2_matrix_square(uint[] square, uint[] mat)
{
for (int i = 0; i < 32; i++)
square[i] = gf2_matrix_times(mat, mat[i]);
}
/// <summary>
/// Combines the given CRC32 value with the current running total.
/// </summary>
/// <remarks>
/// This is useful when using a divide-and-conquer approach to
/// calculating a CRC. Multiple threads can each calculate a
/// CRC32 on a segment of the data, and then combine the
/// individual CRC32 values at the end.
/// </remarks>
/// <param name="crc">the crc value to be combined with this one</param>
/// <param name="length">the length of data the CRC value was calculated on</param>
public void Combine(int crc, int length)
{
uint[] even = new uint[32]; // even-power-of-two zeros operator
uint[] odd = new uint[32]; // odd-power-of-two zeros operator
if (length == 0)
return;
uint crc1= ~_register;
uint crc2= (uint) crc;
// put operator for one zero bit in odd
odd[0] = this.dwPolynomial; // the CRC-32 polynomial
uint row = 1;
for (int i = 1; i < 32; i++)
{
odd[i] = row;
row <<= 1;
}
// put operator for two zero bits in even
gf2_matrix_square(even, odd);
// put operator for four zero bits in odd
gf2_matrix_square(odd, even);
uint len2 = (uint) length;
// apply len2 zeros to crc1 (first square will put the operator for one
// zero byte, eight zero bits, in even)
do {
// apply zeros operator for this bit of len2
gf2_matrix_square(even, odd);
if ((len2 & 1)== 1)
crc1 = gf2_matrix_times(even, crc1);
len2 >>= 1;
if (len2 == 0)
break;
// another iteration of the loop with odd and even swapped
gf2_matrix_square(odd, even);
if ((len2 & 1)==1)
crc1 = gf2_matrix_times(odd, crc1);
len2 >>= 1;
} while (len2 != 0);
crc1 ^= crc2;
_register= ~crc1;
//return (int) crc1;
return;
}
/// <summary>
/// Create an instance of the CRC32 class using the default settings: no
/// bit reversal, and a polynomial of 0xEDB88320.
/// </summary>
public CRC32() : this(false)
{
}
/// <summary>
/// Create an instance of the CRC32 class, specifying whether to reverse
/// data bits or not.
/// </summary>
/// <param name='reverseBits'>
/// specify true if the instance should reverse data bits.
/// </param>
/// <remarks>
/// <para>
/// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you
/// want a CRC32 with compatibility with BZip2, you should pass true
/// here. In the CRC-32 used by GZIP and PKZIP, the bits are not
/// reversed; Therefore if you want a CRC32 with compatibility with
/// those, you should pass false.
/// </para>
/// </remarks>
public CRC32(bool reverseBits) :
this( unchecked((int)0xEDB88320), reverseBits)
{
}
/// <summary>
/// Create an instance of the CRC32 class, specifying the polynomial and
/// whether to reverse data bits or not.
/// </summary>
/// <param name='polynomial'>
/// The polynomial to use for the CRC, expressed in the reversed (LSB)
/// format: the highest ordered bit in the polynomial value is the
/// coefficient of the 0th power; the second-highest order bit is the
/// coefficient of the 1 power, and so on. Expressed this way, the
/// polynomial for the CRC-32C used in IEEE 802.3, is 0xEDB88320.
/// </param>
/// <param name='reverseBits'>
/// specify true if the instance should reverse data bits.
/// </param>
///
/// <remarks>
/// <para>
/// In the CRC-32 used by BZip2, the bits are reversed. Therefore if you
/// want a CRC32 with compatibility with BZip2, you should pass true
/// here for the <c>reverseBits</c> parameter. In the CRC-32 used by
/// GZIP and PKZIP, the bits are not reversed; Therefore if you want a
/// CRC32 with compatibility with those, you should pass false for the
/// <c>reverseBits</c> parameter.
/// </para>
/// </remarks>
public CRC32(int polynomial, bool reverseBits)
{
this.reverseBits = reverseBits;
this.dwPolynomial = (uint) polynomial;
this.GenerateLookupTable();
}
/// <summary>
/// Reset the CRC-32 class - clear the CRC "remainder register."
/// </summary>
/// <remarks>
/// <para>
/// Use this when employing a single instance of this class to compute
/// multiple, distinct CRCs on multiple, distinct data blocks.
/// </para>
/// </remarks>
public void Reset()
{
_register = 0xFFFFFFFFU;
}
// private member vars
private UInt32 dwPolynomial;
private Int64 _TotalBytesRead;
private bool reverseBits;
private UInt32[] crc32Table;
private const int BUFFER_SIZE = 8192;
private UInt32 _register = 0xFFFFFFFFU;
}
/// <summary>
/// A Stream that calculates a CRC32 (a checksum) on all bytes read,
/// or on all bytes written.
/// </summary>
///
/// <remarks>
/// <para>
/// This class can be used to verify the CRC of a ZipEntry when
/// reading from a stream, or to calculate a CRC when writing to a
/// stream. The stream should be used to either read, or write, but
/// not both. If you intermix reads and writes, the results are not
/// defined.
/// </para>
///
/// <para>
/// This class is intended primarily for use internally by the
/// DotNetZip library.
/// </para>
/// </remarks>
public class CrcCalculatorStream : System.IO.Stream, System.IDisposable
{
private static readonly Int64 UnsetLengthLimit = -99;
internal System.IO.Stream _innerStream;
private CRC32 _Crc32;
private Int64 _lengthLimit = -99;
private bool _leaveOpen;
/// <summary>
/// The default constructor.
/// </summary>
/// <remarks>
/// <para>
/// Instances returned from this constructor will leave the underlying
/// stream open upon Close(). The stream uses the default CRC32
/// algorithm, which implies a polynomial of 0xEDB88320.
/// </para>
/// </remarks>
/// <param name="stream">The underlying stream</param>
public CrcCalculatorStream(System.IO.Stream stream)
: this(true, CrcCalculatorStream.UnsetLengthLimit, stream, null)
{
}
/// <summary>
/// The constructor allows the caller to specify how to handle the
/// underlying stream at close.
/// </summary>
/// <remarks>
/// <para>
/// The stream uses the default CRC32 algorithm, which implies a
/// polynomial of 0xEDB88320.
/// </para>
/// </remarks>
/// <param name="stream">The underlying stream</param>
/// <param name="leaveOpen">true to leave the underlying stream
/// open upon close of the <c>CrcCalculatorStream</c>; false otherwise.</param>
public CrcCalculatorStream(System.IO.Stream stream, bool leaveOpen)
: this(leaveOpen, CrcCalculatorStream.UnsetLengthLimit, stream, null)
{
}
/// <summary>
/// A constructor allowing the specification of the length of the stream
/// to read.
/// </summary>
/// <remarks>
/// <para>
/// The stream uses the default CRC32 algorithm, which implies a
/// polynomial of 0xEDB88320.
/// </para>
/// <para>
/// Instances returned from this constructor will leave the underlying
/// stream open upon Close().
/// </para>
/// </remarks>
/// <param name="stream">The underlying stream</param>
/// <param name="length">The length of the stream to slurp</param>
public CrcCalculatorStream(System.IO.Stream stream, Int64 length)
: this(true, length, stream, null)
{
if (length < 0)
throw new ArgumentException("length");
}
/// <summary>
/// A constructor allowing the specification of the length of the stream
/// to read, as well as whether to keep the underlying stream open upon
/// Close().
/// </summary>
/// <remarks>
/// <para>
/// The stream uses the default CRC32 algorithm, which implies a
/// polynomial of 0xEDB88320.
/// </para>
/// </remarks>
/// <param name="stream">The underlying stream</param>
/// <param name="length">The length of the stream to slurp</param>
/// <param name="leaveOpen">true to leave the underlying stream
/// open upon close of the <c>CrcCalculatorStream</c>; false otherwise.</param>
public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen)
: this(leaveOpen, length, stream, null)
{
if (length < 0)
throw new ArgumentException("length");
}
/// <summary>
/// A constructor allowing the specification of the length of the stream
/// to read, as well as whether to keep the underlying stream open upon
/// Close(), and the CRC32 instance to use.
/// </summary>
/// <remarks>
/// <para>
/// The stream uses the specified CRC32 instance, which allows the
/// application to specify how the CRC gets calculated.
/// </para>
/// </remarks>
/// <param name="stream">The underlying stream</param>
/// <param name="length">The length of the stream to slurp</param>
/// <param name="leaveOpen">true to leave the underlying stream
/// open upon close of the <c>CrcCalculatorStream</c>; false otherwise.</param>
/// <param name="crc32">the CRC32 instance to use to calculate the CRC32</param>
public CrcCalculatorStream(System.IO.Stream stream, Int64 length, bool leaveOpen,
CRC32 crc32)
: this(leaveOpen, length, stream, crc32)
{
if (length < 0)
throw new ArgumentException("length");
}
// This ctor is private - no validation is done here. This is to allow the use
// of a (specific) negative value for the _lengthLimit, to indicate that there
// is no length set. So we validate the length limit in those ctors that use an
// explicit param, otherwise we don't validate, because it could be our special
// value.
private CrcCalculatorStream
(bool leaveOpen, Int64 length, System.IO.Stream stream, CRC32 crc32)
: base()
{
_innerStream = stream;
_Crc32 = crc32 ?? new CRC32();
_lengthLimit = length;
_leaveOpen = leaveOpen;
}
/// <summary>
/// Gets the total number of bytes run through the CRC32 calculator.
/// </summary>
///
/// <remarks>
/// This is either the total number of bytes read, or the total number of
/// bytes written, depending on the direction of this stream.
/// </remarks>
public Int64 TotalBytesSlurped
{
get { return _Crc32.TotalBytesRead; }
}
/// <summary>
/// Provides the current CRC for all blocks slurped in.
/// </summary>
/// <remarks>
/// <para>
/// The running total of the CRC is kept as data is written or read
/// through the stream. read this property after all reads or writes to
/// get an accurate CRC for the entire stream.
/// </para>
/// </remarks>
public Int32 Crc
{
get { return _Crc32.Crc32Result; }
}
/// <summary>
/// Indicates whether the underlying stream will be left open when the
/// <c>CrcCalculatorStream</c> is Closed.
/// </summary>
/// <remarks>
/// <para>
/// Set this at any point before calling <see cref="Close()"/>.
/// </para>
/// </remarks>
public bool LeaveOpen
{
get { return _leaveOpen; }
set { _leaveOpen = value; }
}
/// <summary>
/// Read from the stream
/// </summary>
/// <param name="buffer">the buffer to read</param>
/// <param name="offset">the offset at which to start</param>
/// <param name="count">the number of bytes to read</param>
/// <returns>the number of bytes actually read</returns>
public override int Read(byte[] buffer, int offset, int count)
{
int bytesToRead = count;
// Need to limit the # of bytes returned, if the stream is intended to have
// a definite length. This is especially useful when returning a stream for
// the uncompressed data directly to the application. The app won't
// necessarily read only the UncompressedSize number of bytes. For example
// wrapping the stream returned from OpenReader() into a StreadReader() and
// calling ReadToEnd() on it, We can "over-read" the zip data and get a
// corrupt string. The length limits that, prevents that problem.
if (_lengthLimit != CrcCalculatorStream.UnsetLengthLimit)
{
if (_Crc32.TotalBytesRead >= _lengthLimit) return 0; // EOF
Int64 bytesRemaining = _lengthLimit - _Crc32.TotalBytesRead;
if (bytesRemaining < count) bytesToRead = (int)bytesRemaining;
}
int n = _innerStream.Read(buffer, offset, bytesToRead);
if (n > 0) _Crc32.SlurpBlock(buffer, offset, n);
return n;
}
/// <summary>
/// Write to the stream.
/// </summary>
/// <param name="buffer">the buffer from which to write</param>
/// <param name="offset">the offset at which to start writing</param>
/// <param name="count">the number of bytes to write</param>
public override void Write(byte[] buffer, int offset, int count)
{
if (count > 0) _Crc32.SlurpBlock(buffer, offset, count);
_innerStream.Write(buffer, offset, count);
}
/// <summary>
/// Indicates whether the stream supports reading.
/// </summary>
public override bool CanRead
{
get { return _innerStream.CanRead; }
}
/// <summary>
/// Indicates whether the stream supports seeking.
/// </summary>
/// <remarks>
/// <para>
/// Always returns false.
/// </para>
/// </remarks>
public override bool CanSeek
{
get { return false; }
}
/// <summary>
/// Indicates whether the stream supports writing.
/// </summary>
public override bool CanWrite
{
get { return _innerStream.CanWrite; }
}
/// <summary>
/// Flush the stream.
/// </summary>
public override void Flush()
{
_innerStream.Flush();
}
/// <summary>
/// Returns the length of the underlying stream.
/// </summary>
public override long Length
{
get
{
if (_lengthLimit == CrcCalculatorStream.UnsetLengthLimit)
return _innerStream.Length;
else return _lengthLimit;
}
}
/// <summary>
/// The getter for this property returns the total bytes read.
/// If you use the setter, it will throw
/// <see cref="NotSupportedException"/>.
/// </summary>
public override long Position
{
get { return _Crc32.TotalBytesRead; }
set { throw new NotSupportedException(); }
}
/// <summary>
/// Seeking is not supported on this stream. This method always throws
/// <see cref="NotSupportedException"/>
/// </summary>
/// <param name="offset">N/A</param>
/// <param name="origin">N/A</param>
/// <returns>N/A</returns>
public override long Seek(long offset, System.IO.SeekOrigin origin)
{
throw new NotSupportedException();
}
/// <summary>
/// This method always throws
/// <see cref="NotSupportedException"/>
/// </summary>
/// <param name="value">N/A</param>
public override void SetLength(long value)
{
throw new NotSupportedException();
}
void IDisposable.Dispose()
{
Close();
}
/// <summary>
/// Closes the stream.
/// </summary>
public override void Close()
{
base.Close();
if (!_leaveOpen)
_innerStream.Close();
}
}
}

1879
src/ZlibAndroid/Deflate.cs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,740 @@
// DeflateStream.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009-2010 Dino Chiesa.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2011-July-31 14:48:11>
//
// ------------------------------------------------------------------
//
// This module defines the DeflateStream class, which can be used as a replacement for
// the System.IO.Compression.DeflateStream class in the .NET BCL.
//
// ------------------------------------------------------------------
using System;
namespace Ionic.Zlib
{
/// <summary>
/// A class for compressing and decompressing streams using the Deflate algorithm.
/// </summary>
///
/// <remarks>
///
/// <para>
/// The DeflateStream is a <see
/// href="http://en.wikipedia.org/wiki/Decorator_pattern">Decorator</see> on a <see
/// cref="System.IO.Stream"/>. It adds DEFLATE compression or decompression to any
/// stream.
/// </para>
///
/// <para>
/// Using this stream, applications can compress or decompress data via stream
/// <c>Read</c> and <c>Write</c> operations. Either compresssion or decompression
/// can occur through either reading or writing. The compression format used is
/// DEFLATE, which is documented in <see
/// href="http://www.ietf.org/rfc/rfc1951.txt">IETF RFC 1951</see>, "DEFLATE
/// Compressed Data Format Specification version 1.3.".
/// </para>
///
/// <para>
/// This class is similar to <see cref="ZlibStream"/>, except that
/// <c>ZlibStream</c> adds the <see href="http://www.ietf.org/rfc/rfc1950.txt">RFC
/// 1950 - ZLIB</see> framing bytes to a compressed stream when compressing, or
/// expects the RFC1950 framing bytes when decompressing. The <c>DeflateStream</c>
/// does not.
/// </para>
///
/// </remarks>
///
/// <seealso cref="ZlibStream" />
/// <seealso cref="GZipStream" />
public class DeflateStream : System.IO.Stream
{
internal ZlibBaseStream _baseStream;
internal System.IO.Stream _innerStream;
bool _disposed;
/// <summary>
/// Create a DeflateStream using the specified CompressionMode.
/// </summary>
///
/// <remarks>
/// When mode is <c>CompressionMode.Compress</c>, the DeflateStream will use
/// the default compression level. The "captive" stream will be closed when
/// the DeflateStream is closed.
/// </remarks>
///
/// <example>
/// This example uses a DeflateStream to compress data from a file, and writes
/// the compressed data to another file.
/// <code>
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (var raw = System.IO.File.Create(fileToCompress + ".deflated"))
/// {
/// using (Stream compressor = new DeflateStream(raw, CompressionMode.Compress))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n;
/// while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
/// {
/// compressor.Write(buffer, 0, n);
/// }
/// }
/// }
/// }
/// </code>
///
/// <code lang="VB">
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using raw As FileStream = File.Create(fileToCompress &amp; ".deflated")
/// Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// End Using
/// </code>
/// </example>
/// <param name="stream">The stream which will be read or written.</param>
/// <param name="mode">Indicates whether the DeflateStream will compress or decompress.</param>
public DeflateStream(System.IO.Stream stream, CompressionMode mode)
: this(stream, mode, CompressionLevel.Default, false)
{
}
/// <summary>
/// Create a DeflateStream using the specified CompressionMode and the specified CompressionLevel.
/// </summary>
///
/// <remarks>
///
/// <para>
/// When mode is <c>CompressionMode.Decompress</c>, the level parameter is
/// ignored. The "captive" stream will be closed when the DeflateStream is
/// closed.
/// </para>
///
/// </remarks>
///
/// <example>
///
/// This example uses a DeflateStream to compress data from a file, and writes
/// the compressed data to another file.
///
/// <code>
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (var raw = System.IO.File.Create(fileToCompress + ".deflated"))
/// {
/// using (Stream compressor = new DeflateStream(raw,
/// CompressionMode.Compress,
/// CompressionLevel.BestCompression))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n= -1;
/// while (n != 0)
/// {
/// if (n &gt; 0)
/// compressor.Write(buffer, 0, n);
/// n= input.Read(buffer, 0, buffer.Length);
/// }
/// }
/// }
/// }
/// </code>
///
/// <code lang="VB">
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using raw As FileStream = File.Create(fileToCompress &amp; ".deflated")
/// Using compressor As Stream = New DeflateStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// End Using
/// </code>
/// </example>
/// <param name="stream">The stream to be read or written while deflating or inflating.</param>
/// <param name="mode">Indicates whether the <c>DeflateStream</c> will compress or decompress.</param>
/// <param name="level">A tuning knob to trade speed for effectiveness.</param>
public DeflateStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level)
: this(stream, mode, level, false)
{
}
/// <summary>
/// Create a <c>DeflateStream</c> using the specified
/// <c>CompressionMode</c>, and explicitly specify whether the
/// stream should be left open after Deflation or Inflation.
/// </summary>
///
/// <remarks>
///
/// <para>
/// This constructor allows the application to request that the captive stream
/// remain open after the deflation or inflation occurs. By default, after
/// <c>Close()</c> is called on the stream, the captive stream is also
/// closed. In some cases this is not desired, for example if the stream is a
/// memory stream that will be re-read after compression. Specify true for
/// the <paramref name="leaveOpen"/> parameter to leave the stream open.
/// </para>
///
/// <para>
/// The <c>DeflateStream</c> will use the default compression level.
/// </para>
///
/// <para>
/// See the other overloads of this constructor for example code.
/// </para>
/// </remarks>
///
/// <param name="stream">
/// The stream which will be read or written. This is called the
/// "captive" stream in other places in this documentation.
/// </param>
///
/// <param name="mode">
/// Indicates whether the <c>DeflateStream</c> will compress or decompress.
/// </param>
///
/// <param name="leaveOpen">true if the application would like the stream to
/// remain open after inflation/deflation.</param>
public DeflateStream(System.IO.Stream stream, CompressionMode mode, bool leaveOpen)
: this(stream, mode, CompressionLevel.Default, leaveOpen)
{
}
/// <summary>
/// Create a <c>DeflateStream</c> using the specified <c>CompressionMode</c>
/// and the specified <c>CompressionLevel</c>, and explicitly specify whether
/// the stream should be left open after Deflation or Inflation.
/// </summary>
///
/// <remarks>
///
/// <para>
/// When mode is <c>CompressionMode.Decompress</c>, the level parameter is ignored.
/// </para>
///
/// <para>
/// This constructor allows the application to request that the captive stream
/// remain open after the deflation or inflation occurs. By default, after
/// <c>Close()</c> is called on the stream, the captive stream is also
/// closed. In some cases this is not desired, for example if the stream is a
/// <see cref="System.IO.MemoryStream"/> that will be re-read after
/// compression. Specify true for the <paramref name="leaveOpen"/> parameter
/// to leave the stream open.
/// </para>
///
/// </remarks>
///
/// <example>
///
/// This example shows how to use a <c>DeflateStream</c> to compress data from
/// a file, and store the compressed data into another file.
///
/// <code>
/// using (var output = System.IO.File.Create(fileToCompress + ".deflated"))
/// {
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (Stream compressor = new DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n= -1;
/// while (n != 0)
/// {
/// if (n &gt; 0)
/// compressor.Write(buffer, 0, n);
/// n= input.Read(buffer, 0, buffer.Length);
/// }
/// }
/// }
/// // can write additional data to the output stream here
/// }
/// </code>
///
/// <code lang="VB">
/// Using output As FileStream = File.Create(fileToCompress &amp; ".deflated")
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using compressor As Stream = New DeflateStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// ' can write additional data to the output stream here.
/// End Using
/// </code>
/// </example>
/// <param name="stream">The stream which will be read or written.</param>
/// <param name="mode">Indicates whether the DeflateStream will compress or decompress.</param>
/// <param name="leaveOpen">true if the application would like the stream to remain open after inflation/deflation.</param>
/// <param name="level">A tuning knob to trade speed for effectiveness.</param>
public DeflateStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen)
{
_innerStream = stream;
_baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.DEFLATE, leaveOpen);
}
#region Zlib properties
/// <summary>
/// This property sets the flush behavior on the stream.
/// </summary>
/// <remarks> See the ZLIB documentation for the meaning of the flush behavior.
/// </remarks>
virtual public FlushType FlushMode
{
get { return (this._baseStream._flushMode); }
set
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
this._baseStream._flushMode = value;
}
}
/// <summary>
/// The size of the working buffer for the compression codec.
/// </summary>
///
/// <remarks>
/// <para>
/// The working buffer is used for all stream operations. The default size is
/// 1024 bytes. The minimum size is 128 bytes. You may get better performance
/// with a larger buffer. Then again, you might not. You would have to test
/// it.
/// </para>
///
/// <para>
/// Set this before the first call to <c>Read()</c> or <c>Write()</c> on the
/// stream. If you try to set it afterwards, it will throw.
/// </para>
/// </remarks>
public int BufferSize
{
get
{
return this._baseStream._bufferSize;
}
set
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
if (this._baseStream._workingBuffer != null)
throw new ZlibException("The working buffer is already set.");
if (value < ZlibConstants.WorkingBufferSizeMin)
throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin));
this._baseStream._bufferSize = value;
}
}
/// <summary>
/// The ZLIB strategy to be used during compression.
/// </summary>
///
/// <remarks>
/// By tweaking this parameter, you may be able to optimize the compression for
/// data with particular characteristics.
/// </remarks>
public CompressionStrategy Strategy
{
get
{
return this._baseStream.Strategy;
}
set
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
this._baseStream.Strategy = value;
}
}
/// <summary> Returns the total number of bytes input so far.</summary>
virtual public long TotalIn
{
get
{
return this._baseStream._z.TotalBytesIn;
}
}
/// <summary> Returns the total number of bytes output so far.</summary>
virtual public long TotalOut
{
get
{
return this._baseStream._z.TotalBytesOut;
}
}
#endregion
#region System.IO.Stream methods
/// <summary>
/// Dispose the stream.
/// </summary>
/// <remarks>
/// <para>
/// This may or may not result in a <c>Close()</c> call on the captive
/// stream. See the constructors that have a <c>leaveOpen</c> parameter
/// for more information.
/// </para>
/// <para>
/// Application code won't call this code directly. This method may be
/// invoked in two distinct scenarios. If disposing == true, the method
/// has been called directly or indirectly by a user's code, for example
/// via the public Dispose() method. In this case, both managed and
/// unmanaged resources can be referenced and disposed. If disposing ==
/// false, the method has been called by the runtime from inside the
/// object finalizer and this method should not reference other objects;
/// in that case only unmanaged resources must be referenced or
/// disposed.
/// </para>
/// </remarks>
/// <param name="disposing">
/// true if the Dispose method was invoked by user code.
/// </param>
protected override void Dispose(bool disposing)
{
try
{
if (!_disposed)
{
if (disposing && (this._baseStream != null))
this._baseStream.Close();
_disposed = true;
}
}
finally
{
base.Dispose(disposing);
}
}
/// <summary>
/// Indicates whether the stream can be read.
/// </summary>
/// <remarks>
/// The return value depends on whether the captive stream supports reading.
/// </remarks>
public override bool CanRead
{
get
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
return _baseStream._stream.CanRead;
}
}
/// <summary>
/// Indicates whether the stream supports Seek operations.
/// </summary>
/// <remarks>
/// Always returns false.
/// </remarks>
public override bool CanSeek
{
get { return false; }
}
/// <summary>
/// Indicates whether the stream can be written.
/// </summary>
/// <remarks>
/// The return value depends on whether the captive stream supports writing.
/// </remarks>
public override bool CanWrite
{
get
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
return _baseStream._stream.CanWrite;
}
}
/// <summary>
/// Flush the stream.
/// </summary>
public override void Flush()
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
_baseStream.Flush();
}
/// <summary>
/// Reading this property always throws a <see cref="NotImplementedException"/>.
/// </summary>
public override long Length
{
get { throw new NotImplementedException(); }
}
/// <summary>
/// The position of the stream pointer.
/// </summary>
///
/// <remarks>
/// Setting this property always throws a <see
/// cref="NotImplementedException"/>. Reading will return the total bytes
/// written out, if used in writing, or the total bytes read in, if used in
/// reading. The count may refer to compressed bytes or uncompressed bytes,
/// depending on how you've used the stream.
/// </remarks>
public override long Position
{
get
{
if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Writer)
return this._baseStream._z.TotalBytesOut;
if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Reader)
return this._baseStream._z.TotalBytesIn;
return 0;
}
set { throw new NotImplementedException(); }
}
/// <summary>
/// Read data from the stream.
/// </summary>
/// <remarks>
///
/// <para>
/// If you wish to use the <c>DeflateStream</c> to compress data while
/// reading, you can create a <c>DeflateStream</c> with
/// <c>CompressionMode.Compress</c>, providing an uncompressed data stream.
/// Then call Read() on that <c>DeflateStream</c>, and the data read will be
/// compressed as you read. If you wish to use the <c>DeflateStream</c> to
/// decompress data while reading, you can create a <c>DeflateStream</c> with
/// <c>CompressionMode.Decompress</c>, providing a readable compressed data
/// stream. Then call Read() on that <c>DeflateStream</c>, and the data read
/// will be decompressed as you read.
/// </para>
///
/// <para>
/// A <c>DeflateStream</c> can be used for <c>Read()</c> or <c>Write()</c>, but not both.
/// </para>
///
/// </remarks>
/// <param name="buffer">The buffer into which the read data should be placed.</param>
/// <param name="offset">the offset within that data array to put the first byte read.</param>
/// <param name="count">the number of bytes to read.</param>
/// <returns>the number of bytes actually read</returns>
public override int Read(byte[] buffer, int offset, int count)
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
return _baseStream.Read(buffer, offset, count);
}
/// <summary>
/// Calling this method always throws a <see cref="NotImplementedException"/>.
/// </summary>
/// <param name="offset">this is irrelevant, since it will always throw!</param>
/// <param name="origin">this is irrelevant, since it will always throw!</param>
/// <returns>irrelevant!</returns>
public override long Seek(long offset, System.IO.SeekOrigin origin)
{
throw new NotImplementedException();
}
/// <summary>
/// Calling this method always throws a <see cref="NotImplementedException"/>.
/// </summary>
/// <param name="value">this is irrelevant, since it will always throw!</param>
public override void SetLength(long value)
{
throw new NotImplementedException();
}
/// <summary>
/// Write data to the stream.
/// </summary>
/// <remarks>
///
/// <para>
/// If you wish to use the <c>DeflateStream</c> to compress data while
/// writing, you can create a <c>DeflateStream</c> with
/// <c>CompressionMode.Compress</c>, and a writable output stream. Then call
/// <c>Write()</c> on that <c>DeflateStream</c>, providing uncompressed data
/// as input. The data sent to the output stream will be the compressed form
/// of the data written. If you wish to use the <c>DeflateStream</c> to
/// decompress data while writing, you can create a <c>DeflateStream</c> with
/// <c>CompressionMode.Decompress</c>, and a writable output stream. Then
/// call <c>Write()</c> on that stream, providing previously compressed
/// data. The data sent to the output stream will be the decompressed form of
/// the data written.
/// </para>
///
/// <para>
/// A <c>DeflateStream</c> can be used for <c>Read()</c> or <c>Write()</c>,
/// but not both.
/// </para>
///
/// </remarks>
///
/// <param name="buffer">The buffer holding data to write to the stream.</param>
/// <param name="offset">the offset within that data array to find the first byte to write.</param>
/// <param name="count">the number of bytes to write.</param>
public override void Write(byte[] buffer, int offset, int count)
{
if (_disposed) throw new ObjectDisposedException("DeflateStream");
_baseStream.Write(buffer, offset, count);
}
#endregion
/// <summary>
/// Compress a string into a byte array using DEFLATE (RFC 1951).
/// </summary>
///
/// <remarks>
/// Uncompress it with <see cref="DeflateStream.UncompressString(byte[])"/>.
/// </remarks>
///
/// <seealso cref="DeflateStream.UncompressString(byte[])">DeflateStream.UncompressString(byte[])</seealso>
/// <seealso cref="DeflateStream.CompressBuffer(byte[])">DeflateStream.CompressBuffer(byte[])</seealso>
/// <seealso cref="GZipStream.CompressString(string)">GZipStream.CompressString(string)</seealso>
/// <seealso cref="ZlibStream.CompressString(string)">ZlibStream.CompressString(string)</seealso>
///
/// <param name="s">
/// A string to compress. The string will first be encoded
/// using UTF8, then compressed.
/// </param>
///
/// <returns>The string in compressed form</returns>
public static byte[] CompressString(String s)
{
using (var ms = new System.IO.MemoryStream())
{
System.IO.Stream compressor =
new DeflateStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression);
ZlibBaseStream.CompressString(s, compressor);
return ms.ToArray();
}
}
/// <summary>
/// Compress a byte array into a new byte array using DEFLATE.
/// </summary>
///
/// <remarks>
/// Uncompress it with <see cref="DeflateStream.UncompressBuffer(byte[])"/>.
/// </remarks>
///
/// <seealso cref="DeflateStream.CompressString(string)">DeflateStream.CompressString(string)</seealso>
/// <seealso cref="DeflateStream.UncompressBuffer(byte[])">DeflateStream.UncompressBuffer(byte[])</seealso>
/// <seealso cref="GZipStream.CompressBuffer(byte[])">GZipStream.CompressBuffer(byte[])</seealso>
/// <seealso cref="ZlibStream.CompressBuffer(byte[])">ZlibStream.CompressBuffer(byte[])</seealso>
///
/// <param name="b">
/// A buffer to compress.
/// </param>
///
/// <returns>The data in compressed form</returns>
public static byte[] CompressBuffer(byte[] b)
{
using (var ms = new System.IO.MemoryStream())
{
System.IO.Stream compressor =
new DeflateStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression );
ZlibBaseStream.CompressBuffer(b, compressor);
return ms.ToArray();
}
}
/// <summary>
/// Uncompress a DEFLATE'd byte array into a single string.
/// </summary>
///
/// <seealso cref="DeflateStream.CompressString(String)">DeflateStream.CompressString(String)</seealso>
/// <seealso cref="DeflateStream.UncompressBuffer(byte[])">DeflateStream.UncompressBuffer(byte[])</seealso>
/// <seealso cref="GZipStream.UncompressString(byte[])">GZipStream.UncompressString(byte[])</seealso>
/// <seealso cref="ZlibStream.UncompressString(byte[])">ZlibStream.UncompressString(byte[])</seealso>
///
/// <param name="compressed">
/// A buffer containing DEFLATE-compressed data.
/// </param>
///
/// <returns>The uncompressed string</returns>
public static String UncompressString(byte[] compressed)
{
using (var input = new System.IO.MemoryStream(compressed))
{
System.IO.Stream decompressor =
new DeflateStream(input, CompressionMode.Decompress);
return ZlibBaseStream.UncompressString(compressed, decompressor);
}
}
/// <summary>
/// Uncompress a DEFLATE'd byte array into a byte array.
/// </summary>
///
/// <seealso cref="DeflateStream.CompressBuffer(byte[])">DeflateStream.CompressBuffer(byte[])</seealso>
/// <seealso cref="DeflateStream.UncompressString(byte[])">DeflateStream.UncompressString(byte[])</seealso>
/// <seealso cref="GZipStream.UncompressBuffer(byte[])">GZipStream.UncompressBuffer(byte[])</seealso>
/// <seealso cref="ZlibStream.UncompressBuffer(byte[])">ZlibStream.UncompressBuffer(byte[])</seealso>
///
/// <param name="compressed">
/// A buffer containing data that has been compressed with DEFLATE.
/// </param>
///
/// <returns>The data in uncompressed form</returns>
public static byte[] UncompressBuffer(byte[] compressed)
{
using (var input = new System.IO.MemoryStream(compressed))
{
System.IO.Stream decompressor =
new DeflateStream( input, CompressionMode.Decompress );
return ZlibBaseStream.UncompressBuffer(compressed, decompressor);
}
}
}
}

File diff suppressed because it is too large Load Diff

436
src/ZlibAndroid/InfTree.cs Normal file
View File

@ -0,0 +1,436 @@
// Inftree.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2009-October-28 12:43:54>
//
// ------------------------------------------------------------------
//
// This module defines classes used in decompression. This code is derived
// from the jzlib implementation of zlib. In keeping with the license for jzlib,
// the copyright to that code is below.
//
// ------------------------------------------------------------------
//
// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the distribution.
//
// 3. The names of the authors may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------
//
// This program is based on zlib-1.1.3; credit to authors
// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
// and contributors of zlib.
//
// -----------------------------------------------------------------------
using System;
namespace Ionic.Zlib
{
sealed class InfTree
{
private const int MANY = 1440;
private const int Z_OK = 0;
private const int Z_STREAM_END = 1;
private const int Z_NEED_DICT = 2;
private const int Z_ERRNO = - 1;
private const int Z_STREAM_ERROR = - 2;
private const int Z_DATA_ERROR = - 3;
private const int Z_MEM_ERROR = - 4;
private const int Z_BUF_ERROR = - 5;
private const int Z_VERSION_ERROR = - 6;
internal const int fixed_bl = 9;
internal const int fixed_bd = 5;
//UPGRADE_NOTE: Final was removed from the declaration of 'fixed_tl'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] fixed_tl = new int[]{96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 192, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 160, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 224, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 144, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 208, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 176, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 240, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 200, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 168, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 232, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 152, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 216, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 184, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 248, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 196, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 164, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 228, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 148, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 212, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 180, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 244, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 204, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 172, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 236, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 156, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 220, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 188, 0, 8, 14, 0, 8, 142, 0, 8, 78, 0, 9, 252, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 194, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 162, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 226, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 146, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 210, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 178, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 242, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 202, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 170, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 234, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 154, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 218, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 186,
0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 250, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 198, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 166, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 230, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 150, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 214, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 182, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 246, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 206, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 174, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 238, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 158, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 222, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 190, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 254, 96, 7, 256, 0, 8, 80, 0, 8, 16, 84, 8, 115, 82, 7, 31, 0, 8, 112, 0, 8, 48, 0, 9, 193, 80, 7, 10, 0, 8, 96, 0, 8, 32, 0, 9, 161, 0, 8, 0, 0, 8, 128, 0, 8, 64, 0, 9, 225, 80, 7, 6, 0, 8, 88, 0, 8, 24, 0, 9, 145, 83, 7, 59, 0, 8, 120, 0, 8, 56, 0, 9, 209, 81, 7, 17, 0, 8, 104, 0, 8, 40, 0, 9, 177, 0, 8, 8, 0, 8, 136, 0, 8, 72, 0, 9, 241, 80, 7, 4, 0, 8, 84, 0, 8, 20, 85, 8, 227, 83, 7, 43, 0, 8, 116, 0, 8, 52, 0, 9, 201, 81, 7, 13, 0, 8, 100, 0, 8, 36, 0, 9, 169, 0, 8, 4, 0, 8, 132, 0, 8, 68, 0, 9, 233, 80, 7, 8, 0, 8, 92, 0, 8, 28, 0, 9, 153, 84, 7, 83, 0, 8, 124, 0, 8, 60, 0, 9, 217, 82, 7, 23, 0, 8, 108, 0, 8, 44, 0, 9, 185, 0, 8, 12, 0, 8, 140, 0, 8, 76, 0, 9, 249, 80, 7, 3, 0, 8, 82, 0, 8, 18, 85, 8, 163, 83, 7, 35, 0, 8, 114, 0, 8, 50, 0, 9, 197, 81, 7, 11, 0, 8, 98, 0, 8, 34, 0, 9, 165, 0, 8, 2, 0, 8, 130, 0, 8, 66, 0, 9, 229, 80, 7, 7, 0, 8, 90, 0, 8, 26, 0, 9, 149, 84, 7, 67, 0, 8, 122, 0, 8, 58, 0, 9, 213, 82, 7, 19, 0, 8, 106, 0, 8, 42, 0, 9, 181, 0, 8, 10, 0, 8, 138, 0, 8, 74, 0, 9, 245, 80, 7, 5, 0, 8, 86, 0, 8, 22, 192, 8, 0, 83, 7, 51, 0, 8, 118, 0, 8, 54, 0, 9, 205, 81, 7, 15, 0, 8, 102, 0, 8, 38, 0, 9, 173, 0, 8, 6, 0, 8, 134, 0, 8, 70, 0, 9, 237, 80, 7, 9, 0, 8, 94, 0, 8, 30, 0, 9, 157, 84, 7, 99, 0, 8, 126, 0, 8, 62, 0, 9, 221, 82, 7, 27, 0, 8, 110, 0, 8, 46, 0, 9, 189, 0, 8,
14, 0, 8, 142, 0, 8, 78, 0, 9, 253, 96, 7, 256, 0, 8, 81, 0, 8, 17, 85, 8, 131, 82, 7, 31, 0, 8, 113, 0, 8, 49, 0, 9, 195, 80, 7, 10, 0, 8, 97, 0, 8, 33, 0, 9, 163, 0, 8, 1, 0, 8, 129, 0, 8, 65, 0, 9, 227, 80, 7, 6, 0, 8, 89, 0, 8, 25, 0, 9, 147, 83, 7, 59, 0, 8, 121, 0, 8, 57, 0, 9, 211, 81, 7, 17, 0, 8, 105, 0, 8, 41, 0, 9, 179, 0, 8, 9, 0, 8, 137, 0, 8, 73, 0, 9, 243, 80, 7, 4, 0, 8, 85, 0, 8, 21, 80, 8, 258, 83, 7, 43, 0, 8, 117, 0, 8, 53, 0, 9, 203, 81, 7, 13, 0, 8, 101, 0, 8, 37, 0, 9, 171, 0, 8, 5, 0, 8, 133, 0, 8, 69, 0, 9, 235, 80, 7, 8, 0, 8, 93, 0, 8, 29, 0, 9, 155, 84, 7, 83, 0, 8, 125, 0, 8, 61, 0, 9, 219, 82, 7, 23, 0, 8, 109, 0, 8, 45, 0, 9, 187, 0, 8, 13, 0, 8, 141, 0, 8, 77, 0, 9, 251, 80, 7, 3, 0, 8, 83, 0, 8, 19, 85, 8, 195, 83, 7, 35, 0, 8, 115, 0, 8, 51, 0, 9, 199, 81, 7, 11, 0, 8, 99, 0, 8, 35, 0, 9, 167, 0, 8, 3, 0, 8, 131, 0, 8, 67, 0, 9, 231, 80, 7, 7, 0, 8, 91, 0, 8, 27, 0, 9, 151, 84, 7, 67, 0, 8, 123, 0, 8, 59, 0, 9, 215, 82, 7, 19, 0, 8, 107, 0, 8, 43, 0, 9, 183, 0, 8, 11, 0, 8, 139, 0, 8, 75, 0, 9, 247, 80, 7, 5, 0, 8, 87, 0, 8, 23, 192, 8, 0, 83, 7, 51, 0, 8, 119, 0, 8, 55, 0, 9, 207, 81, 7, 15, 0, 8, 103, 0, 8, 39, 0, 9, 175, 0, 8, 7, 0, 8, 135, 0, 8, 71, 0, 9, 239, 80, 7, 9, 0, 8, 95, 0, 8, 31, 0, 9, 159, 84, 7, 99, 0, 8, 127, 0, 8, 63, 0, 9, 223, 82, 7, 27, 0, 8, 111, 0, 8, 47, 0, 9, 191, 0, 8, 15, 0, 8, 143, 0, 8, 79, 0, 9, 255};
//UPGRADE_NOTE: Final was removed from the declaration of 'fixed_td'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] fixed_td = new int[]{80, 5, 1, 87, 5, 257, 83, 5, 17, 91, 5, 4097, 81, 5, 5, 89, 5, 1025, 85, 5, 65, 93, 5, 16385, 80, 5, 3, 88, 5, 513, 84, 5, 33, 92, 5, 8193, 82, 5, 9, 90, 5, 2049, 86, 5, 129, 192, 5, 24577, 80, 5, 2, 87, 5, 385, 83, 5, 25, 91, 5, 6145, 81, 5, 7, 89, 5, 1537, 85, 5, 97, 93, 5, 24577, 80, 5, 4, 88, 5, 769, 84, 5, 49, 92, 5, 12289, 82, 5, 13, 90, 5, 3073, 86, 5, 193, 192, 5, 24577};
// Tables for deflate from PKZIP's appnote.txt.
//UPGRADE_NOTE: Final was removed from the declaration of 'cplens'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] cplens = new int[]{3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
// see note #13 above about 258
//UPGRADE_NOTE: Final was removed from the declaration of 'cplext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] cplext = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112};
//UPGRADE_NOTE: Final was removed from the declaration of 'cpdist'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] cpdist = new int[]{1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577};
//UPGRADE_NOTE: Final was removed from the declaration of 'cpdext'. "ms-help://MS.VSCC.v80/dv_commoner/local/redirect.htm?index='!DefaultContextWindowIndex'&keyword='jlca1003'"
internal static readonly int[] cpdext = new int[]{0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
// If BMAX needs to be larger than 16, then h and x[] should be uLong.
internal const int BMAX = 15; // maximum bit length of any code
internal int[] hn = null; // hufts used in space
internal int[] v = null; // work area for huft_build
internal int[] c = null; // bit length count table
internal int[] r = null; // table entry for structure assignment
internal int[] u = null; // table stack
internal int[] x = null; // bit offsets, then code stack
private int huft_build(int[] b, int bindex, int n, int s, int[] d, int[] e, int[] t, int[] m, int[] hp, int[] hn, int[] v)
{
// Given a list of code lengths and a maximum table size, make a set of
// tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
// if the given code set is incomplete (the tables are still built in this
// case), Z_DATA_ERROR if the input is invalid (an over-subscribed set of
// lengths), or Z_MEM_ERROR if not enough memory.
int a; // counter for codes of length k
int f; // i repeats in table every f entries
int g; // maximum code length
int h; // table level
int i; // counter, current code
int j; // counter
int k; // number of bits in current code
int l; // bits per table (returned in m)
int mask; // (1 << w) - 1, to avoid cc -O bug on HP
int p; // pointer into c[], b[], or v[]
int q; // points to current table
int w; // bits before this table == (l * h)
int xp; // pointer into x
int y; // number of dummy codes added
int z; // number of entries in current table
// Generate counts for each bit length
p = 0; i = n;
do
{
c[b[bindex + p]]++; p++; i--; // assume all entries <= BMAX
}
while (i != 0);
if (c[0] == n)
{
// null input--all zero length codes
t[0] = - 1;
m[0] = 0;
return Z_OK;
}
// Find minimum and maximum length, bound *m by those
l = m[0];
for (j = 1; j <= BMAX; j++)
if (c[j] != 0)
break;
k = j; // minimum code length
if (l < j)
{
l = j;
}
for (i = BMAX; i != 0; i--)
{
if (c[i] != 0)
break;
}
g = i; // maximum code length
if (l > i)
{
l = i;
}
m[0] = l;
// Adjust last length count to fill out codes, if needed
for (y = 1 << j; j < i; j++, y <<= 1)
{
if ((y -= c[j]) < 0)
{
return Z_DATA_ERROR;
}
}
if ((y -= c[i]) < 0)
{
return Z_DATA_ERROR;
}
c[i] += y;
// Generate starting offsets into the value table for each length
x[1] = j = 0;
p = 1; xp = 2;
while (--i != 0)
{
// note that i == g from above
x[xp] = (j += c[p]);
xp++;
p++;
}
// Make a table of values in order of bit lengths
i = 0; p = 0;
do
{
if ((j = b[bindex + p]) != 0)
{
v[x[j]++] = i;
}
p++;
}
while (++i < n);
n = x[g]; // set n to length of v
// Generate the Huffman codes and for each, make the table entries
x[0] = i = 0; // first Huffman code is zero
p = 0; // grab values in bit order
h = - 1; // no tables yet--level -1
w = - l; // bits decoded == (l * h)
u[0] = 0; // just to keep compilers happy
q = 0; // ditto
z = 0; // ditto
// go through the bit lengths (k already is bits in shortest code)
for (; k <= g; k++)
{
a = c[k];
while (a-- != 0)
{
// here i is the Huffman code of length k bits for value *p
// make tables up to required level
while (k > w + l)
{
h++;
w += l; // previous table always l bits
// compute minimum size table less than or equal to l bits
z = g - w;
z = (z > l)?l:z; // table size upper limit
if ((f = 1 << (j = k - w)) > a + 1)
{
// try a k-w bit table
// too few codes for k-w bit table
f -= (a + 1); // deduct codes from patterns left
xp = k;
if (j < z)
{
while (++j < z)
{
// try smaller tables up to z bits
if ((f <<= 1) <= c[++xp])
break; // enough codes to use up j bits
f -= c[xp]; // else deduct codes from patterns
}
}
}
z = 1 << j; // table entries for j-bit table
// allocate new table
if (hn[0] + z > MANY)
{
// (note: doesn't matter for fixed)
return Z_DATA_ERROR; // overflow of MANY
}
u[h] = q = hn[0]; // DEBUG
hn[0] += z;
// connect to last table, if there is one
if (h != 0)
{
x[h] = i; // save pattern for backing up
r[0] = (sbyte) j; // bits in this table
r[1] = (sbyte) l; // bits to dump before this table
j = SharedUtils.URShift(i, (w - l));
r[2] = (int) (q - u[h - 1] - j); // offset to this table
Array.Copy(r, 0, hp, (u[h - 1] + j) * 3, 3); // connect to last table
}
else
{
t[0] = q; // first table is returned result
}
}
// set up table entry in r
r[1] = (sbyte) (k - w);
if (p >= n)
{
r[0] = 128 + 64; // out of values--invalid code
}
else if (v[p] < s)
{
r[0] = (sbyte) (v[p] < 256?0:32 + 64); // 256 is end-of-block
r[2] = v[p++]; // simple code is just the value
}
else
{
r[0] = (sbyte) (e[v[p] - s] + 16 + 64); // non-simple--look up in lists
r[2] = d[v[p++] - s];
}
// fill code-like entries with r
f = 1 << (k - w);
for (j = SharedUtils.URShift(i, w); j < z; j += f)
{
Array.Copy(r, 0, hp, (q + j) * 3, 3);
}
// backwards increment the k-bit code i
for (j = 1 << (k - 1); (i & j) != 0; j = SharedUtils.URShift(j, 1))
{
i ^= j;
}
i ^= j;
// backup over finished tables
mask = (1 << w) - 1; // needed on HP, cc -O bug
while ((i & mask) != x[h])
{
h--; // don't need to update q
w -= l;
mask = (1 << w) - 1;
}
}
}
// Return Z_BUF_ERROR if we were given an incomplete table
return y != 0 && g != 1?Z_BUF_ERROR:Z_OK;
}
internal int inflate_trees_bits(int[] c, int[] bb, int[] tb, int[] hp, ZlibCodec z)
{
int result;
initWorkArea(19);
hn[0] = 0;
result = huft_build(c, 0, 19, 19, null, null, tb, bb, hp, hn, v);
if (result == Z_DATA_ERROR)
{
z.Message = "oversubscribed dynamic bit lengths tree";
}
else if (result == Z_BUF_ERROR || bb[0] == 0)
{
z.Message = "incomplete dynamic bit lengths tree";
result = Z_DATA_ERROR;
}
return result;
}
internal int inflate_trees_dynamic(int nl, int nd, int[] c, int[] bl, int[] bd, int[] tl, int[] td, int[] hp, ZlibCodec z)
{
int result;
// build literal/length tree
initWorkArea(288);
hn[0] = 0;
result = huft_build(c, 0, nl, 257, cplens, cplext, tl, bl, hp, hn, v);
if (result != Z_OK || bl[0] == 0)
{
if (result == Z_DATA_ERROR)
{
z.Message = "oversubscribed literal/length tree";
}
else if (result != Z_MEM_ERROR)
{
z.Message = "incomplete literal/length tree";
result = Z_DATA_ERROR;
}
return result;
}
// build distance tree
initWorkArea(288);
result = huft_build(c, nl, nd, 0, cpdist, cpdext, td, bd, hp, hn, v);
if (result != Z_OK || (bd[0] == 0 && nl > 257))
{
if (result == Z_DATA_ERROR)
{
z.Message = "oversubscribed distance tree";
}
else if (result == Z_BUF_ERROR)
{
z.Message = "incomplete distance tree";
result = Z_DATA_ERROR;
}
else if (result != Z_MEM_ERROR)
{
z.Message = "empty distance tree with lengths";
result = Z_DATA_ERROR;
}
return result;
}
return Z_OK;
}
internal static int inflate_trees_fixed(int[] bl, int[] bd, int[][] tl, int[][] td, ZlibCodec z)
{
bl[0] = fixed_bl;
bd[0] = fixed_bd;
tl[0] = fixed_tl;
td[0] = fixed_td;
return Z_OK;
}
private void initWorkArea(int vsize)
{
if (hn == null)
{
hn = new int[1];
v = new int[vsize];
c = new int[BMAX + 1];
r = new int[3];
u = new int[BMAX];
x = new int[BMAX + 1];
}
else
{
if (v.Length < vsize)
{
v = new int[vsize];
}
Array.Clear(v,0,vsize);
Array.Clear(c,0,BMAX+1);
r[0]=0; r[1]=0; r[2]=0;
// for(int i=0; i<BMAX; i++){u[i]=0;}
//Array.Copy(c, 0, u, 0, BMAX);
Array.Clear(u,0,BMAX);
// for(int i=0; i<BMAX+1; i++){x[i]=0;}
//Array.Copy(c, 0, x, 0, BMAX + 1);
Array.Clear(x,0,BMAX+1);
}
}
}
}

1796
src/ZlibAndroid/Inflate.cs Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,44 @@
Images, layout descriptions, binary blobs and string dictionaries can be included
in your application as resource files. Various Android APIs are designed to
operate on the resource IDs instead of dealing with images, strings or binary blobs
directly.
For example, a sample Android app that contains a user interface layout (main.axml),
an internationalization string table (strings.xml) and some icons (drawable-XXX/icon.png)
would keep its resources in the "Resources" directory of the application:
Resources/
drawable/
icon.png
layout/
main.axml
values/
strings.xml
In order to get the build system to recognize Android resources, set the build action to
"AndroidResource". The native Android APIs do not operate directly with filenames, but
instead operate on resource IDs. When you compile an Android application that uses resources,
the build system will package the resources for distribution and generate a class called "R"
(this is an Android convention) that contains the tokens for each one of the resources
included. For example, for the above Resources layout, this is what the R class would expose:
public class R {
public class drawable {
public const int icon = 0x123;
}
public class layout {
public const int main = 0x456;
}
public class strings {
public const int first_string = 0xabc;
public const int second_string = 0xbcd;
}
}
You would then use R.drawable.icon to reference the drawable/icon.png file, or R.layout.main
to reference the layout/main.axml file, or R.strings.first_string to reference the first
string in the dictionary file values/strings.xml.

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="library_name">ZlibAndroid</string>
</resources>

423
src/ZlibAndroid/Tree.cs Normal file
View File

@ -0,0 +1,423 @@
// Tree.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2009-October-28 13:29:50>
//
// ------------------------------------------------------------------
//
// This module defines classes for zlib compression and
// decompression. This code is derived from the jzlib implementation of
// zlib. In keeping with the license for jzlib, the copyright to that
// code is below.
//
// ------------------------------------------------------------------
//
// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the distribution.
//
// 3. The names of the authors may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------
//
// This program is based on zlib-1.1.3; credit to authors
// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
// and contributors of zlib.
//
// -----------------------------------------------------------------------
using System;
namespace Ionic.Zlib
{
sealed class Tree
{
private static readonly int HEAP_SIZE = (2 * InternalConstants.L_CODES + 1);
// extra bits for each length code
internal static readonly int[] ExtraLengthBits = new int[]
{
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0
};
// extra bits for each distance code
internal static readonly int[] ExtraDistanceBits = new int[]
{
0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13
};
// extra bits for each bit length code
internal static readonly int[] extra_blbits = new int[]{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 7};
internal static readonly sbyte[] bl_order = new sbyte[]{16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
// The lengths of the bit length codes are sent in order of decreasing
// probability, to avoid transmitting the lengths for unused bit
// length codes.
internal const int Buf_size = 8 * 2;
// see definition of array dist_code below
//internal const int DIST_CODE_LEN = 512;
private static readonly sbyte[] _dist_code = new sbyte[]
{
0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7,
8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
0, 0, 16, 17, 18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21,
22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
};
internal static readonly sbyte[] LengthCode = new sbyte[]
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11,
12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15,
16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17,
18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19,
20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
};
internal static readonly int[] LengthBase = new int[]
{
0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28,
32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 0
};
internal static readonly int[] DistanceBase = new int[]
{
0, 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192,
256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
};
/// <summary>
/// Map from a distance to a distance code.
/// </summary>
/// <remarks>
/// No side effects. _dist_code[256] and _dist_code[257] are never used.
/// </remarks>
internal static int DistanceCode(int dist)
{
return (dist < 256)
? _dist_code[dist]
: _dist_code[256 + SharedUtils.URShift(dist, 7)];
}
internal short[] dyn_tree; // the dynamic tree
internal int max_code; // largest code with non zero frequency
internal StaticTree staticTree; // the corresponding static tree
// Compute the optimal bit lengths for a tree and update the total bit length
// for the current block.
// IN assertion: the fields freq and dad are set, heap[heap_max] and
// above are the tree nodes sorted by increasing frequency.
// OUT assertions: the field len is set to the optimal bit length, the
// array bl_count contains the frequencies for each bit length.
// The length opt_len is updated; static_len is also updated if stree is
// not null.
internal void gen_bitlen(DeflateManager s)
{
short[] tree = dyn_tree;
short[] stree = staticTree.treeCodes;
int[] extra = staticTree.extraBits;
int base_Renamed = staticTree.extraBase;
int max_length = staticTree.maxLength;
int h; // heap index
int n, m; // iterate over the tree elements
int bits; // bit length
int xbits; // extra bits
short f; // frequency
int overflow = 0; // number of elements with bit length too large
for (bits = 0; bits <= InternalConstants.MAX_BITS; bits++)
s.bl_count[bits] = 0;
// In a first pass, compute the optimal bit lengths (which may
// overflow in the case of the bit length tree).
tree[s.heap[s.heap_max] * 2 + 1] = 0; // root of the heap
for (h = s.heap_max + 1; h < HEAP_SIZE; h++)
{
n = s.heap[h];
bits = tree[tree[n * 2 + 1] * 2 + 1] + 1;
if (bits > max_length)
{
bits = max_length; overflow++;
}
tree[n * 2 + 1] = (short) bits;
// We overwrite tree[n*2+1] which is no longer needed
if (n > max_code)
continue; // not a leaf node
s.bl_count[bits]++;
xbits = 0;
if (n >= base_Renamed)
xbits = extra[n - base_Renamed];
f = tree[n * 2];
s.opt_len += f * (bits + xbits);
if (stree != null)
s.static_len += f * (stree[n * 2 + 1] + xbits);
}
if (overflow == 0)
return ;
// This happens for example on obj2 and pic of the Calgary corpus
// Find the first bit length which could increase:
do
{
bits = max_length - 1;
while (s.bl_count[bits] == 0)
bits--;
s.bl_count[bits]--; // move one leaf down the tree
s.bl_count[bits + 1] = (short) (s.bl_count[bits + 1] + 2); // move one overflow item as its brother
s.bl_count[max_length]--;
// The brother of the overflow item also moves one step up,
// but this does not affect bl_count[max_length]
overflow -= 2;
}
while (overflow > 0);
for (bits = max_length; bits != 0; bits--)
{
n = s.bl_count[bits];
while (n != 0)
{
m = s.heap[--h];
if (m > max_code)
continue;
if (tree[m * 2 + 1] != bits)
{
s.opt_len = (int) (s.opt_len + ((long) bits - (long) tree[m * 2 + 1]) * (long) tree[m * 2]);
tree[m * 2 + 1] = (short) bits;
}
n--;
}
}
}
// Construct one Huffman tree and assigns the code bit strings and lengths.
// Update the total bit length for the current block.
// IN assertion: the field freq is set for all tree elements.
// OUT assertions: the fields len and code are set to the optimal bit length
// and corresponding code. The length opt_len is updated; static_len is
// also updated if stree is not null. The field max_code is set.
internal void build_tree(DeflateManager s)
{
short[] tree = dyn_tree;
short[] stree = staticTree.treeCodes;
int elems = staticTree.elems;
int n, m; // iterate over heap elements
int max_code = -1; // largest code with non zero frequency
int node; // new node being created
// Construct the initial heap, with least frequent element in
// heap[1]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
// heap[0] is not used.
s.heap_len = 0;
s.heap_max = HEAP_SIZE;
for (n = 0; n < elems; n++)
{
if (tree[n * 2] != 0)
{
s.heap[++s.heap_len] = max_code = n;
s.depth[n] = 0;
}
else
{
tree[n * 2 + 1] = 0;
}
}
// The pkzip format requires that at least one distance code exists,
// and that at least one bit should be sent even if there is only one
// possible code. So to avoid special checks later on we force at least
// two codes of non zero frequency.
while (s.heap_len < 2)
{
node = s.heap[++s.heap_len] = (max_code < 2?++max_code:0);
tree[node * 2] = 1;
s.depth[node] = 0;
s.opt_len--;
if (stree != null)
s.static_len -= stree[node * 2 + 1];
// node is 0 or 1 so it does not have extra bits
}
this.max_code = max_code;
// The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
// establish sub-heaps of increasing lengths:
for (n = s.heap_len / 2; n >= 1; n--)
s.pqdownheap(tree, n);
// Construct the Huffman tree by repeatedly combining the least two
// frequent nodes.
node = elems; // next internal node of the tree
do
{
// n = node of least frequency
n = s.heap[1];
s.heap[1] = s.heap[s.heap_len--];
s.pqdownheap(tree, 1);
m = s.heap[1]; // m = node of next least frequency
s.heap[--s.heap_max] = n; // keep the nodes sorted by frequency
s.heap[--s.heap_max] = m;
// Create a new node father of n and m
tree[node * 2] = unchecked((short) (tree[n * 2] + tree[m * 2]));
s.depth[node] = (sbyte) (System.Math.Max((byte) s.depth[n], (byte) s.depth[m]) + 1);
tree[n * 2 + 1] = tree[m * 2 + 1] = (short) node;
// and insert the new node in the heap
s.heap[1] = node++;
s.pqdownheap(tree, 1);
}
while (s.heap_len >= 2);
s.heap[--s.heap_max] = s.heap[1];
// At this point, the fields freq and dad are set. We can now
// generate the bit lengths.
gen_bitlen(s);
// The field len is now set, we can generate the bit codes
gen_codes(tree, max_code, s.bl_count);
}
// Generate the codes for a given tree and bit counts (which need not be
// optimal).
// IN assertion: the array bl_count contains the bit length statistics for
// the given tree and the field len is set for all tree elements.
// OUT assertion: the field code is set for all tree elements of non
// zero code length.
internal static void gen_codes(short[] tree, int max_code, short[] bl_count)
{
short[] next_code = new short[InternalConstants.MAX_BITS + 1]; // next code value for each bit length
short code = 0; // running code value
int bits; // bit index
int n; // code index
// The distribution counts are first used to generate the code values
// without bit reversal.
for (bits = 1; bits <= InternalConstants.MAX_BITS; bits++)
unchecked {
next_code[bits] = code = (short) ((code + bl_count[bits - 1]) << 1);
}
// Check that the bit counts in bl_count are consistent. The last code
// must be all ones.
//Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
// "inconsistent bit counts");
//Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
for (n = 0; n <= max_code; n++)
{
int len = tree[n * 2 + 1];
if (len == 0)
continue;
// Now reverse the bits
tree[n * 2] = unchecked((short) (bi_reverse(next_code[len]++, len)));
}
}
// Reverse the first len bits of a code, using straightforward code (a faster
// method would use a table)
// IN assertion: 1 <= len <= 15
internal static int bi_reverse(int code, int len)
{
int res = 0;
do
{
res |= code & 1;
code >>= 1; //SharedUtils.URShift(code, 1);
res <<= 1;
}
while (--len > 0);
return res >> 1;
}
}
}

546
src/ZlibAndroid/Zlib.cs Normal file
View File

@ -0,0 +1,546 @@
// Zlib.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009-2011 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// Last Saved: <2011-August-03 19:52:28>
//
// ------------------------------------------------------------------
//
// This module defines classes for ZLIB compression and
// decompression. This code is derived from the jzlib implementation of
// zlib, but significantly modified. The object model is not the same,
// and many of the behaviors are new or different. Nonetheless, in
// keeping with the license for jzlib, the copyright to that code is
// included below.
//
// ------------------------------------------------------------------
//
// The following notice applies to jzlib:
//
// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the distribution.
//
// 3. The names of the authors may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------
//
// jzlib is based on zlib-1.1.3.
//
// The following notice applies to zlib:
//
// -----------------------------------------------------------------------
//
// Copyright (C) 1995-2004 Jean-loup Gailly and Mark Adler
//
// The ZLIB software is provided 'as-is', without any express or implied
// warranty. In no event will the authors be held liable for any damages
// arising from the use of this software.
//
// Permission is granted to anyone to use this software for any purpose,
// including commercial applications, and to alter it and redistribute it
// freely, subject to the following restrictions:
//
// 1. The origin of this software must not be misrepresented; you must not
// claim that you wrote the original software. If you use this software
// in a product, an acknowledgment in the product documentation would be
// appreciated but is not required.
// 2. Altered source versions must be plainly marked as such, and must not be
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
//
// Jean-loup Gailly jloup@gzip.org
// Mark Adler madler@alumni.caltech.edu
//
// -----------------------------------------------------------------------
using System;
using Interop=System.Runtime.InteropServices;
namespace Ionic.Zlib
{
/// <summary>
/// Describes how to flush the current deflate operation.
/// </summary>
/// <remarks>
/// The different FlushType values are useful when using a Deflate in a streaming application.
/// </remarks>
public enum FlushType
{
/// <summary>No flush at all.</summary>
None = 0,
/// <summary>Closes the current block, but doesn't flush it to
/// the output. Used internally only in hypothetical
/// scenarios. This was supposed to be removed by Zlib, but it is
/// still in use in some edge cases.
/// </summary>
Partial,
/// <summary>
/// Use this during compression to specify that all pending output should be
/// flushed to the output buffer and the output should be aligned on a byte
/// boundary. You might use this in a streaming communication scenario, so that
/// the decompressor can get all input data available so far. When using this
/// with a ZlibCodec, <c>AvailableBytesIn</c> will be zero after the call if
/// enough output space has been provided before the call. Flushing will
/// degrade compression and so it should be used only when necessary.
/// </summary>
Sync,
/// <summary>
/// Use this during compression to specify that all output should be flushed, as
/// with <c>FlushType.Sync</c>, but also, the compression state should be reset
/// so that decompression can restart from this point if previous compressed
/// data has been damaged or if random access is desired. Using
/// <c>FlushType.Full</c> too often can significantly degrade the compression.
/// </summary>
Full,
/// <summary>Signals the end of the compression/decompression stream.</summary>
Finish,
}
/// <summary>
/// The compression level to be used when using a DeflateStream or ZlibStream with CompressionMode.Compress.
/// </summary>
public enum CompressionLevel
{
/// <summary>
/// None means that the data will be simply stored, with no change at all.
/// If you are producing ZIPs for use on Mac OSX, be aware that archives produced with CompressionLevel.None
/// cannot be opened with the default zip reader. Use a different CompressionLevel.
/// </summary>
None= 0,
/// <summary>
/// Same as None.
/// </summary>
Level0 = 0,
/// <summary>
/// The fastest but least effective compression.
/// </summary>
BestSpeed = 1,
/// <summary>
/// A synonym for BestSpeed.
/// </summary>
Level1 = 1,
/// <summary>
/// A little slower, but better, than level 1.
/// </summary>
Level2 = 2,
/// <summary>
/// A little slower, but better, than level 2.
/// </summary>
Level3 = 3,
/// <summary>
/// A little slower, but better, than level 3.
/// </summary>
Level4 = 4,
/// <summary>
/// A little slower than level 4, but with better compression.
/// </summary>
Level5 = 5,
/// <summary>
/// The default compression level, with a good balance of speed and compression efficiency.
/// </summary>
Default = 6,
/// <summary>
/// A synonym for Default.
/// </summary>
Level6 = 6,
/// <summary>
/// Pretty good compression!
/// </summary>
Level7 = 7,
/// <summary>
/// Better compression than Level7!
/// </summary>
Level8 = 8,
/// <summary>
/// The "best" compression, where best means greatest reduction in size of the input data stream.
/// This is also the slowest compression.
/// </summary>
BestCompression = 9,
/// <summary>
/// A synonym for BestCompression.
/// </summary>
Level9 = 9,
}
/// <summary>
/// Describes options for how the compression algorithm is executed. Different strategies
/// work better on different sorts of data. The strategy parameter can affect the compression
/// ratio and the speed of compression but not the correctness of the compresssion.
/// </summary>
public enum CompressionStrategy
{
/// <summary>
/// The default strategy is probably the best for normal data.
/// </summary>
Default = 0,
/// <summary>
/// The <c>Filtered</c> strategy is intended to be used most effectively with data produced by a
/// filter or predictor. By this definition, filtered data consists mostly of small
/// values with a somewhat random distribution. In this case, the compression algorithm
/// is tuned to compress them better. The effect of <c>Filtered</c> is to force more Huffman
/// coding and less string matching; it is a half-step between <c>Default</c> and <c>HuffmanOnly</c>.
/// </summary>
Filtered = 1,
/// <summary>
/// Using <c>HuffmanOnly</c> will force the compressor to do Huffman encoding only, with no
/// string matching.
/// </summary>
HuffmanOnly = 2,
}
/// <summary>
/// An enum to specify the direction of transcoding - whether to compress or decompress.
/// </summary>
public enum CompressionMode
{
/// <summary>
/// Used to specify that the stream should compress the data.
/// </summary>
Compress= 0,
/// <summary>
/// Used to specify that the stream should decompress the data.
/// </summary>
Decompress = 1,
}
/// <summary>
/// A general purpose exception class for exceptions in the Zlib library.
/// </summary>
[Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000E")]
public class ZlibException : System.Exception
{
/// <summary>
/// The ZlibException class captures exception information generated
/// by the Zlib library.
/// </summary>
public ZlibException()
: base()
{
}
/// <summary>
/// This ctor collects a message attached to the exception.
/// </summary>
/// <param name="s">the message for the exception.</param>
public ZlibException(System.String s)
: base(s)
{
}
}
internal class SharedUtils
{
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
public static int URShift(int number, int bits)
{
return (int)((uint)number >> bits);
}
#if NOT
/// <summary>
/// Performs an unsigned bitwise right shift with the specified number
/// </summary>
/// <param name="number">Number to operate on</param>
/// <param name="bits">Ammount of bits to shift</param>
/// <returns>The resulting number from the shift operation</returns>
public static long URShift(long number, int bits)
{
return (long) ((UInt64)number >> bits);
}
#endif
/// <summary>
/// Reads a number of characters from the current source TextReader and writes
/// the data to the target array at the specified index.
/// </summary>
///
/// <param name="sourceTextReader">The source TextReader to read from</param>
/// <param name="target">Contains the array of characteres read from the source TextReader.</param>
/// <param name="start">The starting index of the target array.</param>
/// <param name="count">The maximum number of characters to read from the source TextReader.</param>
///
/// <returns>
/// The number of characters read. The number will be less than or equal to
/// count depending on the data available in the source TextReader. Returns -1
/// if the end of the stream is reached.
/// </returns>
public static System.Int32 ReadInput(System.IO.TextReader sourceTextReader, byte[] target, int start, int count)
{
// Returns 0 bytes if not enough space in target
if (target.Length == 0) return 0;
char[] charArray = new char[target.Length];
int bytesRead = sourceTextReader.Read(charArray, start, count);
// Returns -1 if EOF
if (bytesRead == 0) return -1;
for (int index = start; index < start + bytesRead; index++)
target[index] = (byte)charArray[index];
return bytesRead;
}
internal static byte[] ToByteArray(System.String sourceString)
{
return System.Text.UTF8Encoding.UTF8.GetBytes(sourceString);
}
internal static char[] ToCharArray(byte[] byteArray)
{
return System.Text.UTF8Encoding.UTF8.GetChars(byteArray);
}
}
internal static class InternalConstants
{
internal static readonly int MAX_BITS = 15;
internal static readonly int BL_CODES = 19;
internal static readonly int D_CODES = 30;
internal static readonly int LITERALS = 256;
internal static readonly int LENGTH_CODES = 29;
internal static readonly int L_CODES = (LITERALS + 1 + LENGTH_CODES);
// Bit length codes must not exceed MAX_BL_BITS bits
internal static readonly int MAX_BL_BITS = 7;
// repeat previous bit length 3-6 times (2 bits of repeat count)
internal static readonly int REP_3_6 = 16;
// repeat a zero length 3-10 times (3 bits of repeat count)
internal static readonly int REPZ_3_10 = 17;
// repeat a zero length 11-138 times (7 bits of repeat count)
internal static readonly int REPZ_11_138 = 18;
}
internal sealed class StaticTree
{
internal static readonly short[] lengthAndLiteralsTreeCodes = new short[] {
12, 8, 140, 8, 76, 8, 204, 8, 44, 8, 172, 8, 108, 8, 236, 8,
28, 8, 156, 8, 92, 8, 220, 8, 60, 8, 188, 8, 124, 8, 252, 8,
2, 8, 130, 8, 66, 8, 194, 8, 34, 8, 162, 8, 98, 8, 226, 8,
18, 8, 146, 8, 82, 8, 210, 8, 50, 8, 178, 8, 114, 8, 242, 8,
10, 8, 138, 8, 74, 8, 202, 8, 42, 8, 170, 8, 106, 8, 234, 8,
26, 8, 154, 8, 90, 8, 218, 8, 58, 8, 186, 8, 122, 8, 250, 8,
6, 8, 134, 8, 70, 8, 198, 8, 38, 8, 166, 8, 102, 8, 230, 8,
22, 8, 150, 8, 86, 8, 214, 8, 54, 8, 182, 8, 118, 8, 246, 8,
14, 8, 142, 8, 78, 8, 206, 8, 46, 8, 174, 8, 110, 8, 238, 8,
30, 8, 158, 8, 94, 8, 222, 8, 62, 8, 190, 8, 126, 8, 254, 8,
1, 8, 129, 8, 65, 8, 193, 8, 33, 8, 161, 8, 97, 8, 225, 8,
17, 8, 145, 8, 81, 8, 209, 8, 49, 8, 177, 8, 113, 8, 241, 8,
9, 8, 137, 8, 73, 8, 201, 8, 41, 8, 169, 8, 105, 8, 233, 8,
25, 8, 153, 8, 89, 8, 217, 8, 57, 8, 185, 8, 121, 8, 249, 8,
5, 8, 133, 8, 69, 8, 197, 8, 37, 8, 165, 8, 101, 8, 229, 8,
21, 8, 149, 8, 85, 8, 213, 8, 53, 8, 181, 8, 117, 8, 245, 8,
13, 8, 141, 8, 77, 8, 205, 8, 45, 8, 173, 8, 109, 8, 237, 8,
29, 8, 157, 8, 93, 8, 221, 8, 61, 8, 189, 8, 125, 8, 253, 8,
19, 9, 275, 9, 147, 9, 403, 9, 83, 9, 339, 9, 211, 9, 467, 9,
51, 9, 307, 9, 179, 9, 435, 9, 115, 9, 371, 9, 243, 9, 499, 9,
11, 9, 267, 9, 139, 9, 395, 9, 75, 9, 331, 9, 203, 9, 459, 9,
43, 9, 299, 9, 171, 9, 427, 9, 107, 9, 363, 9, 235, 9, 491, 9,
27, 9, 283, 9, 155, 9, 411, 9, 91, 9, 347, 9, 219, 9, 475, 9,
59, 9, 315, 9, 187, 9, 443, 9, 123, 9, 379, 9, 251, 9, 507, 9,
7, 9, 263, 9, 135, 9, 391, 9, 71, 9, 327, 9, 199, 9, 455, 9,
39, 9, 295, 9, 167, 9, 423, 9, 103, 9, 359, 9, 231, 9, 487, 9,
23, 9, 279, 9, 151, 9, 407, 9, 87, 9, 343, 9, 215, 9, 471, 9,
55, 9, 311, 9, 183, 9, 439, 9, 119, 9, 375, 9, 247, 9, 503, 9,
15, 9, 271, 9, 143, 9, 399, 9, 79, 9, 335, 9, 207, 9, 463, 9,
47, 9, 303, 9, 175, 9, 431, 9, 111, 9, 367, 9, 239, 9, 495, 9,
31, 9, 287, 9, 159, 9, 415, 9, 95, 9, 351, 9, 223, 9, 479, 9,
63, 9, 319, 9, 191, 9, 447, 9, 127, 9, 383, 9, 255, 9, 511, 9,
0, 7, 64, 7, 32, 7, 96, 7, 16, 7, 80, 7, 48, 7, 112, 7,
8, 7, 72, 7, 40, 7, 104, 7, 24, 7, 88, 7, 56, 7, 120, 7,
4, 7, 68, 7, 36, 7, 100, 7, 20, 7, 84, 7, 52, 7, 116, 7,
3, 8, 131, 8, 67, 8, 195, 8, 35, 8, 163, 8, 99, 8, 227, 8
};
internal static readonly short[] distTreeCodes = new short[] {
0, 5, 16, 5, 8, 5, 24, 5, 4, 5, 20, 5, 12, 5, 28, 5,
2, 5, 18, 5, 10, 5, 26, 5, 6, 5, 22, 5, 14, 5, 30, 5,
1, 5, 17, 5, 9, 5, 25, 5, 5, 5, 21, 5, 13, 5, 29, 5,
3, 5, 19, 5, 11, 5, 27, 5, 7, 5, 23, 5 };
internal static readonly StaticTree Literals;
internal static readonly StaticTree Distances;
internal static readonly StaticTree BitLengths;
internal short[] treeCodes; // static tree or null
internal int[] extraBits; // extra bits for each code or null
internal int extraBase; // base index for extra_bits
internal int elems; // max number of elements in the tree
internal int maxLength; // max bit length for the codes
private StaticTree(short[] treeCodes, int[] extraBits, int extraBase, int elems, int maxLength)
{
this.treeCodes = treeCodes;
this.extraBits = extraBits;
this.extraBase = extraBase;
this.elems = elems;
this.maxLength = maxLength;
}
static StaticTree()
{
Literals = new StaticTree(lengthAndLiteralsTreeCodes, Tree.ExtraLengthBits, InternalConstants.LITERALS + 1, InternalConstants.L_CODES, InternalConstants.MAX_BITS);
Distances = new StaticTree(distTreeCodes, Tree.ExtraDistanceBits, 0, InternalConstants.D_CODES, InternalConstants.MAX_BITS);
BitLengths = new StaticTree(null, Tree.extra_blbits, 0, InternalConstants.BL_CODES, InternalConstants.MAX_BL_BITS);
}
}
/// <summary>
/// Computes an Adler-32 checksum.
/// </summary>
/// <remarks>
/// The Adler checksum is similar to a CRC checksum, but faster to compute, though less
/// reliable. It is used in producing RFC1950 compressed streams. The Adler checksum
/// is a required part of the "ZLIB" standard. Applications will almost never need to
/// use this class directly.
/// </remarks>
///
/// <exclude/>
public sealed class Adler
{
// largest prime smaller than 65536
private static readonly uint BASE = 65521;
// NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1
private static readonly int NMAX = 5552;
#pragma warning disable 3001
#pragma warning disable 3002
/// <summary>
/// Calculates the Adler32 checksum.
/// </summary>
/// <remarks>
/// <para>
/// This is used within ZLIB. You probably don't need to use this directly.
/// </para>
/// </remarks>
/// <example>
/// To compute an Adler32 checksum on a byte array:
/// <code>
/// var adler = Adler.Adler32(0, null, 0, 0);
/// adler = Adler.Adler32(adler, buffer, index, length);
/// </code>
/// </example>
public static uint Adler32(uint adler, byte[] buf, int index, int len)
{
if (buf == null)
return 1;
uint s1 = (uint) (adler & 0xffff);
uint s2 = (uint) ((adler >> 16) & 0xffff);
while (len > 0)
{
int k = len < NMAX ? len : NMAX;
len -= k;
while (k >= 16)
{
//s1 += (buf[index++] & 0xff); s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
s1 += buf[index++]; s2 += s1;
k -= 16;
}
if (k != 0)
{
do
{
s1 += buf[index++];
s2 += s1;
}
while (--k != 0);
}
s1 %= BASE;
s2 %= BASE;
}
return (uint)((s2 << 16) | s1);
}
#pragma warning restore 3001
#pragma warning restore 3002
}
}

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectTypeGuids>{EFBA0AD7-5A72-4C68-AF49-83D382785DCF};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}</ProjectTypeGuids>
<ProjectGuid>{6C29A7E7-E016-4FC1-B1A0-DEE26AC711BB}</ProjectGuid>
<OutputType>Library</OutputType>
<RootNamespace>ZlibAndroid</RootNamespace>
<AndroidResgenFile>Resources\Resource.designer.cs</AndroidResgenFile>
<AndroidResgenClass>Resource</AndroidResgenClass>
<MonoAndroidResourcePrefix>Resources</MonoAndroidResourcePrefix>
<MonoAndroidAssetsPrefix>Assets</MonoAndroidAssetsPrefix>
<AndroidUseLatestPlatformSdk>True</AndroidUseLatestPlatformSdk>
<AssemblyName>ZlibAndroid</AssemblyName>
<TargetFrameworkVersion>v5.0</TargetFrameworkVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug</OutputPath>
<DefineConstants>DEBUG;</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<AndroidLinkMode>None</AndroidLinkMode>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>full</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<ConsolePause>false</ConsolePause>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Xml" />
<Reference Include="System.Core" />
<Reference Include="Mono.Android" />
</ItemGroup>
<ItemGroup>
<Compile Include="Resources\Resource.designer.cs" />
<Compile Include="CRC32.cs" />
<Compile Include="Deflate.cs" />
<Compile Include="DeflateStream.cs" />
<Compile Include="GZipStream.cs" />
<Compile Include="Inflate.cs" />
<Compile Include="InfTree.cs" />
<Compile Include="Tree.cs" />
<Compile Include="Zlib.cs" />
<Compile Include="ZlibBaseStream.cs" />
<Compile Include="ZlibCodec.cs" />
<Compile Include="ZlibConstants.cs" />
<Compile Include="ZlibStream.cs" />
</ItemGroup>
<ItemGroup>
<None Include="Resources\AboutResources.txt" />
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\values\Strings.xml" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>

View File

@ -0,0 +1,627 @@
// ZlibBaseStream.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2011-August-06 21:22:38>
//
// ------------------------------------------------------------------
//
// This module defines the ZlibBaseStream class, which is an intnernal
// base class for DeflateStream, ZlibStream and GZipStream.
//
// ------------------------------------------------------------------
using System;
using System.IO;
namespace Ionic.Zlib
{
internal enum ZlibStreamFlavor { ZLIB = 1950, DEFLATE = 1951, GZIP = 1952 }
internal class ZlibBaseStream : System.IO.Stream
{
protected internal ZlibCodec _z = null; // deferred init... new ZlibCodec();
protected internal StreamMode _streamMode = StreamMode.Undefined;
protected internal FlushType _flushMode;
protected internal ZlibStreamFlavor _flavor;
protected internal CompressionMode _compressionMode;
protected internal CompressionLevel _level;
protected internal bool _leaveOpen;
protected internal byte[] _workingBuffer;
protected internal int _bufferSize = ZlibConstants.WorkingBufferSizeDefault;
protected internal byte[] _buf1 = new byte[1];
protected internal System.IO.Stream _stream;
protected internal CompressionStrategy Strategy = CompressionStrategy.Default;
// workitem 7159
Ionic.Crc.CRC32 crc;
protected internal string _GzipFileName;
protected internal string _GzipComment;
protected internal DateTime _GzipMtime;
protected internal int _gzipHeaderByteCount;
internal int Crc32 { get { if (crc == null) return 0; return crc.Crc32Result; } }
public ZlibBaseStream(System.IO.Stream stream,
CompressionMode compressionMode,
CompressionLevel level,
ZlibStreamFlavor flavor,
bool leaveOpen)
: base()
{
this._flushMode = FlushType.None;
//this._workingBuffer = new byte[WORKING_BUFFER_SIZE_DEFAULT];
this._stream = stream;
this._leaveOpen = leaveOpen;
this._compressionMode = compressionMode;
this._flavor = flavor;
this._level = level;
// workitem 7159
if (flavor == ZlibStreamFlavor.GZIP)
{
this.crc = new Ionic.Crc.CRC32();
}
}
protected internal bool _wantCompress
{
get
{
return (this._compressionMode == CompressionMode.Compress);
}
}
private ZlibCodec z
{
get
{
if (_z == null)
{
bool wantRfc1950Header = (this._flavor == ZlibStreamFlavor.ZLIB);
_z = new ZlibCodec();
if (this._compressionMode == CompressionMode.Decompress)
{
_z.InitializeInflate(wantRfc1950Header);
}
else
{
_z.Strategy = Strategy;
_z.InitializeDeflate(this._level, wantRfc1950Header);
}
}
return _z;
}
}
private byte[] workingBuffer
{
get
{
if (_workingBuffer == null)
_workingBuffer = new byte[_bufferSize];
return _workingBuffer;
}
}
public override void Write(System.Byte[] buffer, int offset, int count)
{
// workitem 7159
// calculate the CRC on the unccompressed data (before writing)
if (crc != null)
crc.SlurpBlock(buffer, offset, count);
if (_streamMode == StreamMode.Undefined)
_streamMode = StreamMode.Writer;
else if (_streamMode != StreamMode.Writer)
throw new ZlibException("Cannot Write after Reading.");
if (count == 0)
return;
// first reference of z property will initialize the private var _z
z.InputBuffer = buffer;
_z.NextIn = offset;
_z.AvailableBytesIn = count;
bool done = false;
do
{
_z.OutputBuffer = workingBuffer;
_z.NextOut = 0;
_z.AvailableBytesOut = _workingBuffer.Length;
int rc = (_wantCompress)
? _z.Deflate(_flushMode)
: _z.Inflate(_flushMode);
if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END)
throw new ZlibException((_wantCompress ? "de" : "in") + "flating: " + _z.Message);
//if (_workingBuffer.Length - _z.AvailableBytesOut > 0)
_stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut);
done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0;
// If GZIP and de-compress, we're done when 8 bytes remain.
if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress)
done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0);
}
while (!done);
}
private void finish()
{
if (_z == null) return;
if (_streamMode == StreamMode.Writer)
{
bool done = false;
do
{
_z.OutputBuffer = workingBuffer;
_z.NextOut = 0;
_z.AvailableBytesOut = _workingBuffer.Length;
int rc = (_wantCompress)
? _z.Deflate(FlushType.Finish)
: _z.Inflate(FlushType.Finish);
if (rc != ZlibConstants.Z_STREAM_END && rc != ZlibConstants.Z_OK)
{
string verb = (_wantCompress ? "de" : "in") + "flating";
if (_z.Message == null)
throw new ZlibException(String.Format("{0}: (rc = {1})", verb, rc));
else
throw new ZlibException(verb + ": " + _z.Message);
}
if (_workingBuffer.Length - _z.AvailableBytesOut > 0)
{
_stream.Write(_workingBuffer, 0, _workingBuffer.Length - _z.AvailableBytesOut);
}
done = _z.AvailableBytesIn == 0 && _z.AvailableBytesOut != 0;
// If GZIP and de-compress, we're done when 8 bytes remain.
if (_flavor == ZlibStreamFlavor.GZIP && !_wantCompress)
done = (_z.AvailableBytesIn == 8 && _z.AvailableBytesOut != 0);
}
while (!done);
Flush();
// workitem 7159
if (_flavor == ZlibStreamFlavor.GZIP)
{
if (_wantCompress)
{
// Emit the GZIP trailer: CRC32 and size mod 2^32
int c1 = crc.Crc32Result;
_stream.Write(BitConverter.GetBytes(c1), 0, 4);
int c2 = (Int32)(crc.TotalBytesRead & 0x00000000FFFFFFFF);
_stream.Write(BitConverter.GetBytes(c2), 0, 4);
}
else
{
throw new ZlibException("Writing with decompression is not supported.");
}
}
}
// workitem 7159
else if (_streamMode == StreamMode.Reader)
{
if (_flavor == ZlibStreamFlavor.GZIP)
{
if (!_wantCompress)
{
// workitem 8501: handle edge case (decompress empty stream)
if (_z.TotalBytesOut == 0L)
return;
// Read and potentially verify the GZIP trailer:
// CRC32 and size mod 2^32
byte[] trailer = new byte[8];
// workitems 8679 & 12554
if (_z.AvailableBytesIn < 8)
{
// Make sure we have read to the end of the stream
Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, _z.AvailableBytesIn);
int bytesNeeded = 8 - _z.AvailableBytesIn;
int bytesRead = _stream.Read(trailer,
_z.AvailableBytesIn,
bytesNeeded);
if (bytesNeeded != bytesRead)
{
throw new ZlibException(String.Format("Missing or incomplete GZIP trailer. Expected 8 bytes, got {0}.",
_z.AvailableBytesIn + bytesRead));
}
}
else
{
Array.Copy(_z.InputBuffer, _z.NextIn, trailer, 0, trailer.Length);
}
Int32 crc32_expected = BitConverter.ToInt32(trailer, 0);
Int32 crc32_actual = crc.Crc32Result;
Int32 isize_expected = BitConverter.ToInt32(trailer, 4);
Int32 isize_actual = (Int32)(_z.TotalBytesOut & 0x00000000FFFFFFFF);
if (crc32_actual != crc32_expected)
throw new ZlibException(String.Format("Bad CRC32 in GZIP trailer. (actual({0:X8})!=expected({1:X8}))", crc32_actual, crc32_expected));
if (isize_actual != isize_expected)
throw new ZlibException(String.Format("Bad size in GZIP trailer. (actual({0})!=expected({1}))", isize_actual, isize_expected));
}
else
{
throw new ZlibException("Reading with compression is not supported.");
}
}
}
}
private void end()
{
if (z == null)
return;
if (_wantCompress)
{
_z.EndDeflate();
}
else
{
_z.EndInflate();
}
_z = null;
}
public override void Close()
{
if (_stream == null) return;
try
{
finish();
}
finally
{
end();
if (!_leaveOpen) _stream.Close();
_stream = null;
}
}
public override void Flush()
{
_stream.Flush();
}
public override System.Int64 Seek(System.Int64 offset, System.IO.SeekOrigin origin)
{
throw new NotImplementedException();
//_outStream.Seek(offset, origin);
}
public override void SetLength(System.Int64 value)
{
_stream.SetLength(value);
}
#if NOT
public int Read()
{
if (Read(_buf1, 0, 1) == 0)
return 0;
// calculate CRC after reading
if (crc!=null)
crc.SlurpBlock(_buf1,0,1);
return (_buf1[0] & 0xFF);
}
#endif
private bool nomoreinput = false;
private string ReadZeroTerminatedString()
{
var list = new System.Collections.Generic.List<byte>();
bool done = false;
do
{
// workitem 7740
int n = _stream.Read(_buf1, 0, 1);
if (n != 1)
throw new ZlibException("Unexpected EOF reading GZIP header.");
else
{
if (_buf1[0] == 0)
done = true;
else
list.Add(_buf1[0]);
}
} while (!done);
byte[] a = list.ToArray();
return GZipStream.iso8859dash1.GetString(a, 0, a.Length);
}
private int _ReadAndValidateGzipHeader()
{
int totalBytesRead = 0;
// read the header on the first read
byte[] header = new byte[10];
int n = _stream.Read(header, 0, header.Length);
// workitem 8501: handle edge case (decompress empty stream)
if (n == 0)
return 0;
if (n != 10)
throw new ZlibException("Not a valid GZIP stream.");
if (header[0] != 0x1F || header[1] != 0x8B || header[2] != 8)
throw new ZlibException("Bad GZIP header.");
Int32 timet = BitConverter.ToInt32(header, 4);
_GzipMtime = GZipStream._unixEpoch.AddSeconds(timet);
totalBytesRead += n;
if ((header[3] & 0x04) == 0x04)
{
// read and discard extra field
n = _stream.Read(header, 0, 2); // 2-byte length field
totalBytesRead += n;
Int16 extraLength = (Int16)(header[0] + header[1] * 256);
byte[] extra = new byte[extraLength];
n = _stream.Read(extra, 0, extra.Length);
if (n != extraLength)
throw new ZlibException("Unexpected end-of-file reading GZIP header.");
totalBytesRead += n;
}
if ((header[3] & 0x08) == 0x08)
_GzipFileName = ReadZeroTerminatedString();
if ((header[3] & 0x10) == 0x010)
_GzipComment = ReadZeroTerminatedString();
if ((header[3] & 0x02) == 0x02)
Read(_buf1, 0, 1); // CRC16, ignore
return totalBytesRead;
}
public override System.Int32 Read(System.Byte[] buffer, System.Int32 offset, System.Int32 count)
{
// According to MS documentation, any implementation of the IO.Stream.Read function must:
// (a) throw an exception if offset & count reference an invalid part of the buffer,
// or if count < 0, or if buffer is null
// (b) return 0 only upon EOF, or if count = 0
// (c) if not EOF, then return at least 1 byte, up to <count> bytes
if (_streamMode == StreamMode.Undefined)
{
if (!this._stream.CanRead) throw new ZlibException("The stream is not readable.");
// for the first read, set up some controls.
_streamMode = StreamMode.Reader;
// (The first reference to _z goes through the private accessor which
// may initialize it.)
z.AvailableBytesIn = 0;
if (_flavor == ZlibStreamFlavor.GZIP)
{
_gzipHeaderByteCount = _ReadAndValidateGzipHeader();
// workitem 8501: handle edge case (decompress empty stream)
if (_gzipHeaderByteCount == 0)
return 0;
}
}
if (_streamMode != StreamMode.Reader)
throw new ZlibException("Cannot Read after Writing.");
if (count == 0) return 0;
if (nomoreinput && _wantCompress) return 0; // workitem 8557
if (buffer == null) throw new ArgumentNullException("buffer");
if (count < 0) throw new ArgumentOutOfRangeException("count");
if (offset < buffer.GetLowerBound(0)) throw new ArgumentOutOfRangeException("offset");
if ((offset + count) > buffer.GetLength(0)) throw new ArgumentOutOfRangeException("count");
int rc = 0;
// set up the output of the deflate/inflate codec:
_z.OutputBuffer = buffer;
_z.NextOut = offset;
_z.AvailableBytesOut = count;
// This is necessary in case _workingBuffer has been resized. (new byte[])
// (The first reference to _workingBuffer goes through the private accessor which
// may initialize it.)
_z.InputBuffer = workingBuffer;
do
{
// need data in _workingBuffer in order to deflate/inflate. Here, we check if we have any.
if ((_z.AvailableBytesIn == 0) && (!nomoreinput))
{
// No data available, so try to Read data from the captive stream.
_z.NextIn = 0;
_z.AvailableBytesIn = _stream.Read(_workingBuffer, 0, _workingBuffer.Length);
if (_z.AvailableBytesIn == 0)
nomoreinput = true;
}
// we have data in InputBuffer; now compress or decompress as appropriate
rc = (_wantCompress)
? _z.Deflate(_flushMode)
: _z.Inflate(_flushMode);
if (nomoreinput && (rc == ZlibConstants.Z_BUF_ERROR))
return 0;
if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END)
throw new ZlibException(String.Format("{0}flating: rc={1} msg={2}", (_wantCompress ? "de" : "in"), rc, _z.Message));
if ((nomoreinput || rc == ZlibConstants.Z_STREAM_END) && (_z.AvailableBytesOut == count))
break; // nothing more to read
}
//while (_z.AvailableBytesOut == count && rc == ZlibConstants.Z_OK);
while (_z.AvailableBytesOut > 0 && !nomoreinput && rc == ZlibConstants.Z_OK);
// workitem 8557
// is there more room in output?
if (_z.AvailableBytesOut > 0)
{
if (rc == ZlibConstants.Z_OK && _z.AvailableBytesIn == 0)
{
// deferred
}
// are we completely done reading?
if (nomoreinput)
{
// and in compression?
if (_wantCompress)
{
// no more input data available; therefore we flush to
// try to complete the read
rc = _z.Deflate(FlushType.Finish);
if (rc != ZlibConstants.Z_OK && rc != ZlibConstants.Z_STREAM_END)
throw new ZlibException(String.Format("Deflating: rc={0} msg={1}", rc, _z.Message));
}
}
}
rc = (count - _z.AvailableBytesOut);
// calculate CRC after reading
if (crc != null)
crc.SlurpBlock(buffer, offset, rc);
return rc;
}
public override System.Boolean CanRead
{
get { return this._stream.CanRead; }
}
public override System.Boolean CanSeek
{
get { return this._stream.CanSeek; }
}
public override System.Boolean CanWrite
{
get { return this._stream.CanWrite; }
}
public override System.Int64 Length
{
get { return _stream.Length; }
}
public override long Position
{
get { throw new NotImplementedException(); }
set { throw new NotImplementedException(); }
}
internal enum StreamMode
{
Writer,
Reader,
Undefined,
}
public static void CompressString(String s, Stream compressor)
{
byte[] uncompressed = System.Text.Encoding.UTF8.GetBytes(s);
using (compressor)
{
compressor.Write(uncompressed, 0, uncompressed.Length);
}
}
public static void CompressBuffer(byte[] b, Stream compressor)
{
// workitem 8460
using (compressor)
{
compressor.Write(b, 0, b.Length);
}
}
public static String UncompressString(byte[] compressed, Stream decompressor)
{
// workitem 8460
byte[] working = new byte[1024];
var encoding = System.Text.Encoding.UTF8;
using (var output = new MemoryStream())
{
using (decompressor)
{
int n;
while ((n = decompressor.Read(working, 0, working.Length)) != 0)
{
output.Write(working, 0, n);
}
}
// reset to allow read from start
output.Seek(0, SeekOrigin.Begin);
var sr = new StreamReader(output, encoding);
return sr.ReadToEnd();
}
}
public static byte[] UncompressBuffer(byte[] compressed, Stream decompressor)
{
// workitem 8460
byte[] working = new byte[1024];
using (var output = new MemoryStream())
{
using (decompressor)
{
int n;
while ((n = decompressor.Read(working, 0, working.Length)) != 0)
{
output.Write(working, 0, n);
}
}
return output.ToArray();
}
}
}
}

View File

@ -0,0 +1,717 @@
// ZlibCodec.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2009-November-03 15:40:51>
//
// ------------------------------------------------------------------
//
// This module defines a Codec for ZLIB compression and
// decompression. This code extends code that was based the jzlib
// implementation of zlib, but this code is completely novel. The codec
// class is new, and encapsulates some behaviors that are new, and some
// that were present in other classes in the jzlib code base. In
// keeping with the license for jzlib, the copyright to the jzlib code
// is included below.
//
// ------------------------------------------------------------------
//
// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the distribution.
//
// 3. The names of the authors may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------
//
// This program is based on zlib-1.1.3; credit to authors
// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
// and contributors of zlib.
//
// -----------------------------------------------------------------------
using System;
using Interop=System.Runtime.InteropServices;
namespace Ionic.Zlib
{
/// <summary>
/// Encoder and Decoder for ZLIB and DEFLATE (IETF RFC1950 and RFC1951).
/// </summary>
///
/// <remarks>
/// This class compresses and decompresses data according to the Deflate algorithm
/// and optionally, the ZLIB format, as documented in <see
/// href="http://www.ietf.org/rfc/rfc1950.txt">RFC 1950 - ZLIB</see> and <see
/// href="http://www.ietf.org/rfc/rfc1951.txt">RFC 1951 - DEFLATE</see>.
/// </remarks>
[Interop.GuidAttribute("ebc25cf6-9120-4283-b972-0e5520d0000D")]
[Interop.ComVisible(true)]
#if !NETCF
[Interop.ClassInterface(Interop.ClassInterfaceType.AutoDispatch)]
#endif
sealed public class ZlibCodec
{
/// <summary>
/// The buffer from which data is taken.
/// </summary>
public byte[] InputBuffer;
/// <summary>
/// An index into the InputBuffer array, indicating where to start reading.
/// </summary>
public int NextIn;
/// <summary>
/// The number of bytes available in the InputBuffer, starting at NextIn.
/// </summary>
/// <remarks>
/// Generally you should set this to InputBuffer.Length before the first Inflate() or Deflate() call.
/// The class will update this number as calls to Inflate/Deflate are made.
/// </remarks>
public int AvailableBytesIn;
/// <summary>
/// Total number of bytes read so far, through all calls to Inflate()/Deflate().
/// </summary>
public long TotalBytesIn;
/// <summary>
/// Buffer to store output data.
/// </summary>
public byte[] OutputBuffer;
/// <summary>
/// An index into the OutputBuffer array, indicating where to start writing.
/// </summary>
public int NextOut;
/// <summary>
/// The number of bytes available in the OutputBuffer, starting at NextOut.
/// </summary>
/// <remarks>
/// Generally you should set this to OutputBuffer.Length before the first Inflate() or Deflate() call.
/// The class will update this number as calls to Inflate/Deflate are made.
/// </remarks>
public int AvailableBytesOut;
/// <summary>
/// Total number of bytes written to the output so far, through all calls to Inflate()/Deflate().
/// </summary>
public long TotalBytesOut;
/// <summary>
/// used for diagnostics, when something goes wrong!
/// </summary>
public System.String Message;
internal DeflateManager dstate;
internal InflateManager istate;
internal uint _Adler32;
/// <summary>
/// The compression level to use in this codec. Useful only in compression mode.
/// </summary>
public CompressionLevel CompressLevel = CompressionLevel.Default;
/// <summary>
/// The number of Window Bits to use.
/// </summary>
/// <remarks>
/// This gauges the size of the sliding window, and hence the
/// compression effectiveness as well as memory consumption. It's best to just leave this
/// setting alone if you don't know what it is. The maximum value is 15 bits, which implies
/// a 32k window.
/// </remarks>
public int WindowBits = ZlibConstants.WindowBitsDefault;
/// <summary>
/// The compression strategy to use.
/// </summary>
/// <remarks>
/// This is only effective in compression. The theory offered by ZLIB is that different
/// strategies could potentially produce significant differences in compression behavior
/// for different data sets. Unfortunately I don't have any good recommendations for how
/// to set it differently. When I tested changing the strategy I got minimally different
/// compression performance. It's best to leave this property alone if you don't have a
/// good feel for it. Or, you may want to produce a test harness that runs through the
/// different strategy options and evaluates them on different file types. If you do that,
/// let me know your results.
/// </remarks>
public CompressionStrategy Strategy = CompressionStrategy.Default;
/// <summary>
/// The Adler32 checksum on the data transferred through the codec so far. You probably don't need to look at this.
/// </summary>
public int Adler32 { get { return (int)_Adler32; } }
/// <summary>
/// Create a ZlibCodec.
/// </summary>
/// <remarks>
/// If you use this default constructor, you will later have to explicitly call
/// InitializeInflate() or InitializeDeflate() before using the ZlibCodec to compress
/// or decompress.
/// </remarks>
public ZlibCodec() { }
/// <summary>
/// Create a ZlibCodec that either compresses or decompresses.
/// </summary>
/// <param name="mode">
/// Indicates whether the codec should compress (deflate) or decompress (inflate).
/// </param>
public ZlibCodec(CompressionMode mode)
{
if (mode == CompressionMode.Compress)
{
int rc = InitializeDeflate();
if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for deflate.");
}
else if (mode == CompressionMode.Decompress)
{
int rc = InitializeInflate();
if (rc != ZlibConstants.Z_OK) throw new ZlibException("Cannot initialize for inflate.");
}
else throw new ZlibException("Invalid ZlibStreamFlavor.");
}
/// <summary>
/// Initialize the inflation state.
/// </summary>
/// <remarks>
/// It is not necessary to call this before using the ZlibCodec to inflate data;
/// It is implicitly called when you call the constructor.
/// </remarks>
/// <returns>Z_OK if everything goes well.</returns>
public int InitializeInflate()
{
return InitializeInflate(this.WindowBits);
}
/// <summary>
/// Initialize the inflation state with an explicit flag to
/// govern the handling of RFC1950 header bytes.
/// </summary>
///
/// <remarks>
/// By default, the ZLIB header defined in <see
/// href="http://www.ietf.org/rfc/rfc1950.txt">RFC 1950</see> is expected. If
/// you want to read a zlib stream you should specify true for
/// expectRfc1950Header. If you have a deflate stream, you will want to specify
/// false. It is only necessary to invoke this initializer explicitly if you
/// want to specify false.
/// </remarks>
///
/// <param name="expectRfc1950Header">whether to expect an RFC1950 header byte
/// pair when reading the stream of data to be inflated.</param>
///
/// <returns>Z_OK if everything goes well.</returns>
public int InitializeInflate(bool expectRfc1950Header)
{
return InitializeInflate(this.WindowBits, expectRfc1950Header);
}
/// <summary>
/// Initialize the ZlibCodec for inflation, with the specified number of window bits.
/// </summary>
/// <param name="windowBits">The number of window bits to use. If you need to ask what that is,
/// then you shouldn't be calling this initializer.</param>
/// <returns>Z_OK if all goes well.</returns>
public int InitializeInflate(int windowBits)
{
this.WindowBits = windowBits;
return InitializeInflate(windowBits, true);
}
/// <summary>
/// Initialize the inflation state with an explicit flag to govern the handling of
/// RFC1950 header bytes.
/// </summary>
///
/// <remarks>
/// If you want to read a zlib stream you should specify true for
/// expectRfc1950Header. In this case, the library will expect to find a ZLIB
/// header, as defined in <see href="http://www.ietf.org/rfc/rfc1950.txt">RFC
/// 1950</see>, in the compressed stream. If you will be reading a DEFLATE or
/// GZIP stream, which does not have such a header, you will want to specify
/// false.
/// </remarks>
///
/// <param name="expectRfc1950Header">whether to expect an RFC1950 header byte pair when reading
/// the stream of data to be inflated.</param>
/// <param name="windowBits">The number of window bits to use. If you need to ask what that is,
/// then you shouldn't be calling this initializer.</param>
/// <returns>Z_OK if everything goes well.</returns>
public int InitializeInflate(int windowBits, bool expectRfc1950Header)
{
this.WindowBits = windowBits;
if (dstate != null) throw new ZlibException("You may not call InitializeInflate() after calling InitializeDeflate().");
istate = new InflateManager(expectRfc1950Header);
return istate.Initialize(this, windowBits);
}
/// <summary>
/// Inflate the data in the InputBuffer, placing the result in the OutputBuffer.
/// </summary>
/// <remarks>
/// You must have set InputBuffer and OutputBuffer, NextIn and NextOut, and AvailableBytesIn and
/// AvailableBytesOut before calling this method.
/// </remarks>
/// <example>
/// <code>
/// private void InflateBuffer()
/// {
/// int bufferSize = 1024;
/// byte[] buffer = new byte[bufferSize];
/// ZlibCodec decompressor = new ZlibCodec();
///
/// Console.WriteLine("\n============================================");
/// Console.WriteLine("Size of Buffer to Inflate: {0} bytes.", CompressedBytes.Length);
/// MemoryStream ms = new MemoryStream(DecompressedBytes);
///
/// int rc = decompressor.InitializeInflate();
///
/// decompressor.InputBuffer = CompressedBytes;
/// decompressor.NextIn = 0;
/// decompressor.AvailableBytesIn = CompressedBytes.Length;
///
/// decompressor.OutputBuffer = buffer;
///
/// // pass 1: inflate
/// do
/// {
/// decompressor.NextOut = 0;
/// decompressor.AvailableBytesOut = buffer.Length;
/// rc = decompressor.Inflate(FlushType.None);
///
/// if (rc != ZlibConstants.Z_OK &amp;&amp; rc != ZlibConstants.Z_STREAM_END)
/// throw new Exception("inflating: " + decompressor.Message);
///
/// ms.Write(decompressor.OutputBuffer, 0, buffer.Length - decompressor.AvailableBytesOut);
/// }
/// while (decompressor.AvailableBytesIn &gt; 0 || decompressor.AvailableBytesOut == 0);
///
/// // pass 2: finish and flush
/// do
/// {
/// decompressor.NextOut = 0;
/// decompressor.AvailableBytesOut = buffer.Length;
/// rc = decompressor.Inflate(FlushType.Finish);
///
/// if (rc != ZlibConstants.Z_STREAM_END &amp;&amp; rc != ZlibConstants.Z_OK)
/// throw new Exception("inflating: " + decompressor.Message);
///
/// if (buffer.Length - decompressor.AvailableBytesOut &gt; 0)
/// ms.Write(buffer, 0, buffer.Length - decompressor.AvailableBytesOut);
/// }
/// while (decompressor.AvailableBytesIn &gt; 0 || decompressor.AvailableBytesOut == 0);
///
/// decompressor.EndInflate();
/// }
///
/// </code>
/// </example>
/// <param name="flush">The flush to use when inflating.</param>
/// <returns>Z_OK if everything goes well.</returns>
public int Inflate(FlushType flush)
{
if (istate == null)
throw new ZlibException("No Inflate State!");
return istate.Inflate(flush);
}
/// <summary>
/// Ends an inflation session.
/// </summary>
/// <remarks>
/// Call this after successively calling Inflate(). This will cause all buffers to be flushed.
/// After calling this you cannot call Inflate() without a intervening call to one of the
/// InitializeInflate() overloads.
/// </remarks>
/// <returns>Z_OK if everything goes well.</returns>
public int EndInflate()
{
if (istate == null)
throw new ZlibException("No Inflate State!");
int ret = istate.End();
istate = null;
return ret;
}
/// <summary>
/// I don't know what this does!
/// </summary>
/// <returns>Z_OK if everything goes well.</returns>
public int SyncInflate()
{
if (istate == null)
throw new ZlibException("No Inflate State!");
return istate.Sync();
}
/// <summary>
/// Initialize the ZlibCodec for deflation operation.
/// </summary>
/// <remarks>
/// The codec will use the MAX window bits and the default level of compression.
/// </remarks>
/// <example>
/// <code>
/// int bufferSize = 40000;
/// byte[] CompressedBytes = new byte[bufferSize];
/// byte[] DecompressedBytes = new byte[bufferSize];
///
/// ZlibCodec compressor = new ZlibCodec();
///
/// compressor.InitializeDeflate(CompressionLevel.Default);
///
/// compressor.InputBuffer = System.Text.ASCIIEncoding.ASCII.GetBytes(TextToCompress);
/// compressor.NextIn = 0;
/// compressor.AvailableBytesIn = compressor.InputBuffer.Length;
///
/// compressor.OutputBuffer = CompressedBytes;
/// compressor.NextOut = 0;
/// compressor.AvailableBytesOut = CompressedBytes.Length;
///
/// while (compressor.TotalBytesIn != TextToCompress.Length &amp;&amp; compressor.TotalBytesOut &lt; bufferSize)
/// {
/// compressor.Deflate(FlushType.None);
/// }
///
/// while (true)
/// {
/// int rc= compressor.Deflate(FlushType.Finish);
/// if (rc == ZlibConstants.Z_STREAM_END) break;
/// }
///
/// compressor.EndDeflate();
///
/// </code>
/// </example>
/// <returns>Z_OK if all goes well. You generally don't need to check the return code.</returns>
public int InitializeDeflate()
{
return _InternalInitializeDeflate(true);
}
/// <summary>
/// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel.
/// </summary>
/// <remarks>
/// The codec will use the maximum window bits (15) and the specified
/// CompressionLevel. It will emit a ZLIB stream as it compresses.
/// </remarks>
/// <param name="level">The compression level for the codec.</param>
/// <returns>Z_OK if all goes well.</returns>
public int InitializeDeflate(CompressionLevel level)
{
this.CompressLevel = level;
return _InternalInitializeDeflate(true);
}
/// <summary>
/// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel,
/// and the explicit flag governing whether to emit an RFC1950 header byte pair.
/// </summary>
/// <remarks>
/// The codec will use the maximum window bits (15) and the specified CompressionLevel.
/// If you want to generate a zlib stream, you should specify true for
/// wantRfc1950Header. In this case, the library will emit a ZLIB
/// header, as defined in <see href="http://www.ietf.org/rfc/rfc1950.txt">RFC
/// 1950</see>, in the compressed stream.
/// </remarks>
/// <param name="level">The compression level for the codec.</param>
/// <param name="wantRfc1950Header">whether to emit an initial RFC1950 byte pair in the compressed stream.</param>
/// <returns>Z_OK if all goes well.</returns>
public int InitializeDeflate(CompressionLevel level, bool wantRfc1950Header)
{
this.CompressLevel = level;
return _InternalInitializeDeflate(wantRfc1950Header);
}
/// <summary>
/// Initialize the ZlibCodec for deflation operation, using the specified CompressionLevel,
/// and the specified number of window bits.
/// </summary>
/// <remarks>
/// The codec will use the specified number of window bits and the specified CompressionLevel.
/// </remarks>
/// <param name="level">The compression level for the codec.</param>
/// <param name="bits">the number of window bits to use. If you don't know what this means, don't use this method.</param>
/// <returns>Z_OK if all goes well.</returns>
public int InitializeDeflate(CompressionLevel level, int bits)
{
this.CompressLevel = level;
this.WindowBits = bits;
return _InternalInitializeDeflate(true);
}
/// <summary>
/// Initialize the ZlibCodec for deflation operation, using the specified
/// CompressionLevel, the specified number of window bits, and the explicit flag
/// governing whether to emit an RFC1950 header byte pair.
/// </summary>
///
/// <param name="level">The compression level for the codec.</param>
/// <param name="wantRfc1950Header">whether to emit an initial RFC1950 byte pair in the compressed stream.</param>
/// <param name="bits">the number of window bits to use. If you don't know what this means, don't use this method.</param>
/// <returns>Z_OK if all goes well.</returns>
public int InitializeDeflate(CompressionLevel level, int bits, bool wantRfc1950Header)
{
this.CompressLevel = level;
this.WindowBits = bits;
return _InternalInitializeDeflate(wantRfc1950Header);
}
private int _InternalInitializeDeflate(bool wantRfc1950Header)
{
if (istate != null) throw new ZlibException("You may not call InitializeDeflate() after calling InitializeInflate().");
dstate = new DeflateManager();
dstate.WantRfc1950HeaderBytes = wantRfc1950Header;
return dstate.Initialize(this, this.CompressLevel, this.WindowBits, this.Strategy);
}
/// <summary>
/// Deflate one batch of data.
/// </summary>
/// <remarks>
/// You must have set InputBuffer and OutputBuffer before calling this method.
/// </remarks>
/// <example>
/// <code>
/// private void DeflateBuffer(CompressionLevel level)
/// {
/// int bufferSize = 1024;
/// byte[] buffer = new byte[bufferSize];
/// ZlibCodec compressor = new ZlibCodec();
///
/// Console.WriteLine("\n============================================");
/// Console.WriteLine("Size of Buffer to Deflate: {0} bytes.", UncompressedBytes.Length);
/// MemoryStream ms = new MemoryStream();
///
/// int rc = compressor.InitializeDeflate(level);
///
/// compressor.InputBuffer = UncompressedBytes;
/// compressor.NextIn = 0;
/// compressor.AvailableBytesIn = UncompressedBytes.Length;
///
/// compressor.OutputBuffer = buffer;
///
/// // pass 1: deflate
/// do
/// {
/// compressor.NextOut = 0;
/// compressor.AvailableBytesOut = buffer.Length;
/// rc = compressor.Deflate(FlushType.None);
///
/// if (rc != ZlibConstants.Z_OK &amp;&amp; rc != ZlibConstants.Z_STREAM_END)
/// throw new Exception("deflating: " + compressor.Message);
///
/// ms.Write(compressor.OutputBuffer, 0, buffer.Length - compressor.AvailableBytesOut);
/// }
/// while (compressor.AvailableBytesIn &gt; 0 || compressor.AvailableBytesOut == 0);
///
/// // pass 2: finish and flush
/// do
/// {
/// compressor.NextOut = 0;
/// compressor.AvailableBytesOut = buffer.Length;
/// rc = compressor.Deflate(FlushType.Finish);
///
/// if (rc != ZlibConstants.Z_STREAM_END &amp;&amp; rc != ZlibConstants.Z_OK)
/// throw new Exception("deflating: " + compressor.Message);
///
/// if (buffer.Length - compressor.AvailableBytesOut &gt; 0)
/// ms.Write(buffer, 0, buffer.Length - compressor.AvailableBytesOut);
/// }
/// while (compressor.AvailableBytesIn &gt; 0 || compressor.AvailableBytesOut == 0);
///
/// compressor.EndDeflate();
///
/// ms.Seek(0, SeekOrigin.Begin);
/// CompressedBytes = new byte[compressor.TotalBytesOut];
/// ms.Read(CompressedBytes, 0, CompressedBytes.Length);
/// }
/// </code>
/// </example>
/// <param name="flush">whether to flush all data as you deflate. Generally you will want to
/// use Z_NO_FLUSH here, in a series of calls to Deflate(), and then call EndDeflate() to
/// flush everything.
/// </param>
/// <returns>Z_OK if all goes well.</returns>
public int Deflate(FlushType flush)
{
if (dstate == null)
throw new ZlibException("No Deflate State!");
return dstate.Deflate(flush);
}
/// <summary>
/// End a deflation session.
/// </summary>
/// <remarks>
/// Call this after making a series of one or more calls to Deflate(). All buffers are flushed.
/// </remarks>
/// <returns>Z_OK if all goes well.</returns>
public int EndDeflate()
{
if (dstate == null)
throw new ZlibException("No Deflate State!");
// TODO: dinoch Tue, 03 Nov 2009 15:39 (test this)
//int ret = dstate.End();
dstate = null;
return ZlibConstants.Z_OK; //ret;
}
/// <summary>
/// Reset a codec for another deflation session.
/// </summary>
/// <remarks>
/// Call this to reset the deflation state. For example if a thread is deflating
/// non-consecutive blocks, you can call Reset() after the Deflate(Sync) of the first
/// block and before the next Deflate(None) of the second block.
/// </remarks>
/// <returns>Z_OK if all goes well.</returns>
public void ResetDeflate()
{
if (dstate == null)
throw new ZlibException("No Deflate State!");
dstate.Reset();
}
/// <summary>
/// Set the CompressionStrategy and CompressionLevel for a deflation session.
/// </summary>
/// <param name="level">the level of compression to use.</param>
/// <param name="strategy">the strategy to use for compression.</param>
/// <returns>Z_OK if all goes well.</returns>
public int SetDeflateParams(CompressionLevel level, CompressionStrategy strategy)
{
if (dstate == null)
throw new ZlibException("No Deflate State!");
return dstate.SetParams(level, strategy);
}
/// <summary>
/// Set the dictionary to be used for either Inflation or Deflation.
/// </summary>
/// <param name="dictionary">The dictionary bytes to use.</param>
/// <returns>Z_OK if all goes well.</returns>
public int SetDictionary(byte[] dictionary)
{
if (istate != null)
return istate.SetDictionary(dictionary);
if (dstate != null)
return dstate.SetDictionary(dictionary);
throw new ZlibException("No Inflate or Deflate state!");
}
// Flush as much pending output as possible. All deflate() output goes
// through this function so some applications may wish to modify it
// to avoid allocating a large strm->next_out buffer and copying into it.
// (See also read_buf()).
internal void flush_pending()
{
int len = dstate.pendingCount;
if (len > AvailableBytesOut)
len = AvailableBytesOut;
if (len == 0)
return;
if (dstate.pending.Length <= dstate.nextPending ||
OutputBuffer.Length <= NextOut ||
dstate.pending.Length < (dstate.nextPending + len) ||
OutputBuffer.Length < (NextOut + len))
{
throw new ZlibException(String.Format("Invalid State. (pending.Length={0}, pendingCount={1})",
dstate.pending.Length, dstate.pendingCount));
}
Array.Copy(dstate.pending, dstate.nextPending, OutputBuffer, NextOut, len);
NextOut += len;
dstate.nextPending += len;
TotalBytesOut += len;
AvailableBytesOut -= len;
dstate.pendingCount -= len;
if (dstate.pendingCount == 0)
{
dstate.nextPending = 0;
}
}
// Read a new buffer from the current input stream, update the adler32
// and total number of bytes read. All deflate() input goes through
// this function so some applications may wish to modify it to avoid
// allocating a large strm->next_in buffer and copying from it.
// (See also flush_pending()).
internal int read_buf(byte[] buf, int start, int size)
{
int len = AvailableBytesIn;
if (len > size)
len = size;
if (len == 0)
return 0;
AvailableBytesIn -= len;
if (dstate.WantRfc1950HeaderBytes)
{
_Adler32 = Adler.Adler32(_Adler32, InputBuffer, NextIn, len);
}
Array.Copy(InputBuffer, NextIn, buf, start, len);
NextIn += len;
TotalBytesIn += len;
return len;
}
}
}

View File

@ -0,0 +1,128 @@
// ZlibConstants.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2009-November-03 18:50:19>
//
// ------------------------------------------------------------------
//
// This module defines constants used by the zlib class library. This
// code is derived from the jzlib implementation of zlib, but
// significantly modified. In keeping with the license for jzlib, the
// copyright to that code is included here.
//
// ------------------------------------------------------------------
//
// Copyright (c) 2000,2001,2002,2003 ymnk, JCraft,Inc. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
// this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright
// notice, this list of conditions and the following disclaimer in
// the documentation and/or other materials provided with the distribution.
//
// 3. The names of the authors may not be used to endorse or promote products
// derived from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES,
// INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JCRAFT,
// INC. OR ANY CONTRIBUTORS TO THIS SOFTWARE BE LIABLE FOR ANY DIRECT, INDIRECT,
// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
// OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// -----------------------------------------------------------------------
//
// This program is based on zlib-1.1.3; credit to authors
// Jean-loup Gailly(jloup@gzip.org) and Mark Adler(madler@alumni.caltech.edu)
// and contributors of zlib.
//
// -----------------------------------------------------------------------
using System;
namespace Ionic.Zlib
{
/// <summary>
/// A bunch of constants used in the Zlib interface.
/// </summary>
public static class ZlibConstants
{
/// <summary>
/// The maximum number of window bits for the Deflate algorithm.
/// </summary>
public const int WindowBitsMax = 15; // 32K LZ77 window
/// <summary>
/// The default number of window bits for the Deflate algorithm.
/// </summary>
public const int WindowBitsDefault = WindowBitsMax;
/// <summary>
/// indicates everything is A-OK
/// </summary>
public const int Z_OK = 0;
/// <summary>
/// Indicates that the last operation reached the end of the stream.
/// </summary>
public const int Z_STREAM_END = 1;
/// <summary>
/// The operation ended in need of a dictionary.
/// </summary>
public const int Z_NEED_DICT = 2;
/// <summary>
/// There was an error with the stream - not enough data, not open and readable, etc.
/// </summary>
public const int Z_STREAM_ERROR = -2;
/// <summary>
/// There was an error with the data - not enough data, bad data, etc.
/// </summary>
public const int Z_DATA_ERROR = -3;
/// <summary>
/// There was an error with the working buffer.
/// </summary>
public const int Z_BUF_ERROR = -5;
/// <summary>
/// The size of the working buffer used in the ZlibCodec class. Defaults to 8192 bytes.
/// </summary>
#if NETCF
public const int WorkingBufferSizeDefault = 8192;
#else
public const int WorkingBufferSizeDefault = 16384;
#endif
/// <summary>
/// The minimum size of the working buffer used in the ZlibCodec class. Currently it is 128 bytes.
/// </summary>
public const int WorkingBufferSizeMin = 1024;
}
}

View File

@ -0,0 +1,725 @@
// ZlibStream.cs
// ------------------------------------------------------------------
//
// Copyright (c) 2009 Dino Chiesa and Microsoft Corporation.
// All rights reserved.
//
// This code module is part of DotNetZip, a zipfile class library.
//
// ------------------------------------------------------------------
//
// This code is licensed under the Microsoft Public License.
// See the file License.txt for the license details.
// More info on: http://dotnetzip.codeplex.com
//
// ------------------------------------------------------------------
//
// last saved (in emacs):
// Time-stamp: <2011-July-31 14:53:33>
//
// ------------------------------------------------------------------
//
// This module defines the ZlibStream class, which is similar in idea to
// the System.IO.Compression.DeflateStream and
// System.IO.Compression.GZipStream classes in the .NET BCL.
//
// ------------------------------------------------------------------
using System;
using System.IO;
namespace Ionic.Zlib
{
/// <summary>
/// Represents a Zlib stream for compression or decompression.
/// </summary>
/// <remarks>
///
/// <para>
/// The ZlibStream is a <see
/// href="http://en.wikipedia.org/wiki/Decorator_pattern">Decorator</see> on a <see
/// cref="System.IO.Stream"/>. It adds ZLIB compression or decompression to any
/// stream.
/// </para>
///
/// <para> Using this stream, applications can compress or decompress data via
/// stream <c>Read()</c> and <c>Write()</c> operations. Either compresssion or
/// decompression can occur through either reading or writing. The compression
/// format used is ZLIB, which is documented in <see
/// href="http://www.ietf.org/rfc/rfc1950.txt">IETF RFC 1950</see>, "ZLIB Compressed
/// Data Format Specification version 3.3". This implementation of ZLIB always uses
/// DEFLATE as the compression method. (see <see
/// href="http://www.ietf.org/rfc/rfc1951.txt">IETF RFC 1951</see>, "DEFLATE
/// Compressed Data Format Specification version 1.3.") </para>
///
/// <para>
/// The ZLIB format allows for varying compression methods, window sizes, and dictionaries.
/// This implementation always uses the DEFLATE compression method, a preset dictionary,
/// and 15 window bits by default.
/// </para>
///
/// <para>
/// This class is similar to <see cref="DeflateStream"/>, except that it adds the
/// RFC1950 header and trailer bytes to a compressed stream when compressing, or expects
/// the RFC1950 header and trailer bytes when decompressing. It is also similar to the
/// <see cref="GZipStream"/>.
/// </para>
/// </remarks>
/// <seealso cref="DeflateStream" />
/// <seealso cref="GZipStream" />
public class ZlibStream : System.IO.Stream
{
internal ZlibBaseStream _baseStream;
bool _disposed;
/// <summary>
/// Create a <c>ZlibStream</c> using the specified <c>CompressionMode</c>.
/// </summary>
/// <remarks>
///
/// <para>
/// When mode is <c>CompressionMode.Compress</c>, the <c>ZlibStream</c>
/// will use the default compression level. The "captive" stream will be
/// closed when the <c>ZlibStream</c> is closed.
/// </para>
///
/// </remarks>
///
/// <example>
/// This example uses a <c>ZlibStream</c> to compress a file, and writes the
/// compressed data to another file.
/// <code>
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (var raw = System.IO.File.Create(fileToCompress + ".zlib"))
/// {
/// using (Stream compressor = new ZlibStream(raw, CompressionMode.Compress))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n;
/// while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
/// {
/// compressor.Write(buffer, 0, n);
/// }
/// }
/// }
/// }
/// </code>
/// <code lang="VB">
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using raw As FileStream = File.Create(fileToCompress &amp; ".zlib")
/// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// End Using
/// </code>
/// </example>
///
/// <param name="stream">The stream which will be read or written.</param>
/// <param name="mode">Indicates whether the ZlibStream will compress or decompress.</param>
public ZlibStream(System.IO.Stream stream, CompressionMode mode)
: this(stream, mode, CompressionLevel.Default, false)
{
}
/// <summary>
/// Create a <c>ZlibStream</c> using the specified <c>CompressionMode</c> and
/// the specified <c>CompressionLevel</c>.
/// </summary>
///
/// <remarks>
///
/// <para>
/// When mode is <c>CompressionMode.Decompress</c>, the level parameter is ignored.
/// The "captive" stream will be closed when the <c>ZlibStream</c> is closed.
/// </para>
///
/// </remarks>
///
/// <example>
/// This example uses a <c>ZlibStream</c> to compress data from a file, and writes the
/// compressed data to another file.
///
/// <code>
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (var raw = System.IO.File.Create(fileToCompress + ".zlib"))
/// {
/// using (Stream compressor = new ZlibStream(raw,
/// CompressionMode.Compress,
/// CompressionLevel.BestCompression))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n;
/// while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
/// {
/// compressor.Write(buffer, 0, n);
/// }
/// }
/// }
/// }
/// </code>
///
/// <code lang="VB">
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using raw As FileStream = File.Create(fileToCompress &amp; ".zlib")
/// Using compressor As Stream = New ZlibStream(raw, CompressionMode.Compress, CompressionLevel.BestCompression)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// End Using
/// </code>
/// </example>
///
/// <param name="stream">The stream to be read or written while deflating or inflating.</param>
/// <param name="mode">Indicates whether the ZlibStream will compress or decompress.</param>
/// <param name="level">A tuning knob to trade speed for effectiveness.</param>
public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level)
: this(stream, mode, level, false)
{
}
/// <summary>
/// Create a <c>ZlibStream</c> using the specified <c>CompressionMode</c>, and
/// explicitly specify whether the captive stream should be left open after
/// Deflation or Inflation.
/// </summary>
///
/// <remarks>
///
/// <para>
/// When mode is <c>CompressionMode.Compress</c>, the <c>ZlibStream</c> will use
/// the default compression level.
/// </para>
///
/// <para>
/// This constructor allows the application to request that the captive stream
/// remain open after the deflation or inflation occurs. By default, after
/// <c>Close()</c> is called on the stream, the captive stream is also
/// closed. In some cases this is not desired, for example if the stream is a
/// <see cref="System.IO.MemoryStream"/> that will be re-read after
/// compression. Specify true for the <paramref name="leaveOpen"/> parameter to leave the stream
/// open.
/// </para>
///
/// <para>
/// See the other overloads of this constructor for example code.
/// </para>
///
/// </remarks>
///
/// <param name="stream">The stream which will be read or written. This is called the
/// "captive" stream in other places in this documentation.</param>
/// <param name="mode">Indicates whether the ZlibStream will compress or decompress.</param>
/// <param name="leaveOpen">true if the application would like the stream to remain
/// open after inflation/deflation.</param>
public ZlibStream(System.IO.Stream stream, CompressionMode mode, bool leaveOpen)
: this(stream, mode, CompressionLevel.Default, leaveOpen)
{
}
/// <summary>
/// Create a <c>ZlibStream</c> using the specified <c>CompressionMode</c>
/// and the specified <c>CompressionLevel</c>, and explicitly specify
/// whether the stream should be left open after Deflation or Inflation.
/// </summary>
///
/// <remarks>
///
/// <para>
/// This constructor allows the application to request that the captive
/// stream remain open after the deflation or inflation occurs. By
/// default, after <c>Close()</c> is called on the stream, the captive
/// stream is also closed. In some cases this is not desired, for example
/// if the stream is a <see cref="System.IO.MemoryStream"/> that will be
/// re-read after compression. Specify true for the <paramref
/// name="leaveOpen"/> parameter to leave the stream open.
/// </para>
///
/// <para>
/// When mode is <c>CompressionMode.Decompress</c>, the level parameter is
/// ignored.
/// </para>
///
/// </remarks>
///
/// <example>
///
/// This example shows how to use a ZlibStream to compress the data from a file,
/// and store the result into another file. The filestream remains open to allow
/// additional data to be written to it.
///
/// <code>
/// using (var output = System.IO.File.Create(fileToCompress + ".zlib"))
/// {
/// using (System.IO.Stream input = System.IO.File.OpenRead(fileToCompress))
/// {
/// using (Stream compressor = new ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, true))
/// {
/// byte[] buffer = new byte[WORKING_BUFFER_SIZE];
/// int n;
/// while ((n= input.Read(buffer, 0, buffer.Length)) != 0)
/// {
/// compressor.Write(buffer, 0, n);
/// }
/// }
/// }
/// // can write additional data to the output stream here
/// }
/// </code>
/// <code lang="VB">
/// Using output As FileStream = File.Create(fileToCompress &amp; ".zlib")
/// Using input As Stream = File.OpenRead(fileToCompress)
/// Using compressor As Stream = New ZlibStream(output, CompressionMode.Compress, CompressionLevel.BestCompression, True)
/// Dim buffer As Byte() = New Byte(4096) {}
/// Dim n As Integer = -1
/// Do While (n &lt;&gt; 0)
/// If (n &gt; 0) Then
/// compressor.Write(buffer, 0, n)
/// End If
/// n = input.Read(buffer, 0, buffer.Length)
/// Loop
/// End Using
/// End Using
/// ' can write additional data to the output stream here.
/// End Using
/// </code>
/// </example>
///
/// <param name="stream">The stream which will be read or written.</param>
///
/// <param name="mode">Indicates whether the ZlibStream will compress or decompress.</param>
///
/// <param name="leaveOpen">
/// true if the application would like the stream to remain open after
/// inflation/deflation.
/// </param>
///
/// <param name="level">
/// A tuning knob to trade speed for effectiveness. This parameter is
/// effective only when mode is <c>CompressionMode.Compress</c>.
/// </param>
public ZlibStream(System.IO.Stream stream, CompressionMode mode, CompressionLevel level, bool leaveOpen)
{
_baseStream = new ZlibBaseStream(stream, mode, level, ZlibStreamFlavor.ZLIB, leaveOpen);
}
#region Zlib properties
/// <summary>
/// This property sets the flush behavior on the stream.
/// Sorry, though, not sure exactly how to describe all the various settings.
/// </summary>
virtual public FlushType FlushMode
{
get { return (this._baseStream._flushMode); }
set
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
this._baseStream._flushMode = value;
}
}
/// <summary>
/// The size of the working buffer for the compression codec.
/// </summary>
///
/// <remarks>
/// <para>
/// The working buffer is used for all stream operations. The default size is
/// 1024 bytes. The minimum size is 128 bytes. You may get better performance
/// with a larger buffer. Then again, you might not. You would have to test
/// it.
/// </para>
///
/// <para>
/// Set this before the first call to <c>Read()</c> or <c>Write()</c> on the
/// stream. If you try to set it afterwards, it will throw.
/// </para>
/// </remarks>
public int BufferSize
{
get
{
return this._baseStream._bufferSize;
}
set
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
if (this._baseStream._workingBuffer != null)
throw new ZlibException("The working buffer is already set.");
if (value < ZlibConstants.WorkingBufferSizeMin)
throw new ZlibException(String.Format("Don't be silly. {0} bytes?? Use a bigger buffer, at least {1}.", value, ZlibConstants.WorkingBufferSizeMin));
this._baseStream._bufferSize = value;
}
}
/// <summary> Returns the total number of bytes input so far.</summary>
virtual public long TotalIn
{
get { return this._baseStream._z.TotalBytesIn; }
}
/// <summary> Returns the total number of bytes output so far.</summary>
virtual public long TotalOut
{
get { return this._baseStream._z.TotalBytesOut; }
}
#endregion
#region System.IO.Stream methods
/// <summary>
/// Dispose the stream.
/// </summary>
/// <remarks>
/// <para>
/// This may or may not result in a <c>Close()</c> call on the captive
/// stream. See the constructors that have a <c>leaveOpen</c> parameter
/// for more information.
/// </para>
/// <para>
/// This method may be invoked in two distinct scenarios. If disposing
/// == true, the method has been called directly or indirectly by a
/// user's code, for example via the public Dispose() method. In this
/// case, both managed and unmanaged resources can be referenced and
/// disposed. If disposing == false, the method has been called by the
/// runtime from inside the object finalizer and this method should not
/// reference other objects; in that case only unmanaged resources must
/// be referenced or disposed.
/// </para>
/// </remarks>
/// <param name="disposing">
/// indicates whether the Dispose method was invoked by user code.
/// </param>
protected override void Dispose(bool disposing)
{
try
{
if (!_disposed)
{
if (disposing && (this._baseStream != null))
this._baseStream.Close();
_disposed = true;
}
}
finally
{
base.Dispose(disposing);
}
}
/// <summary>
/// Indicates whether the stream can be read.
/// </summary>
/// <remarks>
/// The return value depends on whether the captive stream supports reading.
/// </remarks>
public override bool CanRead
{
get
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
return _baseStream._stream.CanRead;
}
}
/// <summary>
/// Indicates whether the stream supports Seek operations.
/// </summary>
/// <remarks>
/// Always returns false.
/// </remarks>
public override bool CanSeek
{
get { return false; }
}
/// <summary>
/// Indicates whether the stream can be written.
/// </summary>
/// <remarks>
/// The return value depends on whether the captive stream supports writing.
/// </remarks>
public override bool CanWrite
{
get
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
return _baseStream._stream.CanWrite;
}
}
/// <summary>
/// Flush the stream.
/// </summary>
public override void Flush()
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
_baseStream.Flush();
}
/// <summary>
/// Reading this property always throws a <see cref="NotSupportedException"/>.
/// </summary>
public override long Length
{
get { throw new NotSupportedException(); }
}
/// <summary>
/// The position of the stream pointer.
/// </summary>
///
/// <remarks>
/// Setting this property always throws a <see
/// cref="NotSupportedException"/>. Reading will return the total bytes
/// written out, if used in writing, or the total bytes read in, if used in
/// reading. The count may refer to compressed bytes or uncompressed bytes,
/// depending on how you've used the stream.
/// </remarks>
public override long Position
{
get
{
if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Writer)
return this._baseStream._z.TotalBytesOut;
if (this._baseStream._streamMode == Ionic.Zlib.ZlibBaseStream.StreamMode.Reader)
return this._baseStream._z.TotalBytesIn;
return 0;
}
set { throw new NotSupportedException(); }
}
/// <summary>
/// Read data from the stream.
/// </summary>
///
/// <remarks>
///
/// <para>
/// If you wish to use the <c>ZlibStream</c> to compress data while reading,
/// you can create a <c>ZlibStream</c> with <c>CompressionMode.Compress</c>,
/// providing an uncompressed data stream. Then call <c>Read()</c> on that
/// <c>ZlibStream</c>, and the data read will be compressed. If you wish to
/// use the <c>ZlibStream</c> to decompress data while reading, you can create
/// a <c>ZlibStream</c> with <c>CompressionMode.Decompress</c>, providing a
/// readable compressed data stream. Then call <c>Read()</c> on that
/// <c>ZlibStream</c>, and the data will be decompressed as it is read.
/// </para>
///
/// <para>
/// A <c>ZlibStream</c> can be used for <c>Read()</c> or <c>Write()</c>, but
/// not both.
/// </para>
///
/// </remarks>
///
/// <param name="buffer">
/// The buffer into which the read data should be placed.</param>
///
/// <param name="offset">
/// the offset within that data array to put the first byte read.</param>
///
/// <param name="count">the number of bytes to read.</param>
///
/// <returns>the number of bytes read</returns>
public override int Read(byte[] buffer, int offset, int count)
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
return _baseStream.Read(buffer, offset, count);
}
/// <summary>
/// Calling this method always throws a <see cref="NotSupportedException"/>.
/// </summary>
/// <param name="offset">
/// The offset to seek to....
/// IF THIS METHOD ACTUALLY DID ANYTHING.
/// </param>
/// <param name="origin">
/// The reference specifying how to apply the offset.... IF
/// THIS METHOD ACTUALLY DID ANYTHING.
/// </param>
///
/// <returns>nothing. This method always throws.</returns>
public override long Seek(long offset, System.IO.SeekOrigin origin)
{
throw new NotSupportedException();
}
/// <summary>
/// Calling this method always throws a <see cref="NotSupportedException"/>.
/// </summary>
/// <param name="value">
/// The new value for the stream length.... IF
/// THIS METHOD ACTUALLY DID ANYTHING.
/// </param>
public override void SetLength(long value)
{
throw new NotSupportedException();
}
/// <summary>
/// Write data to the stream.
/// </summary>
///
/// <remarks>
///
/// <para>
/// If you wish to use the <c>ZlibStream</c> to compress data while writing,
/// you can create a <c>ZlibStream</c> with <c>CompressionMode.Compress</c>,
/// and a writable output stream. Then call <c>Write()</c> on that
/// <c>ZlibStream</c>, providing uncompressed data as input. The data sent to
/// the output stream will be the compressed form of the data written. If you
/// wish to use the <c>ZlibStream</c> to decompress data while writing, you
/// can create a <c>ZlibStream</c> with <c>CompressionMode.Decompress</c>, and a
/// writable output stream. Then call <c>Write()</c> on that stream,
/// providing previously compressed data. The data sent to the output stream
/// will be the decompressed form of the data written.
/// </para>
///
/// <para>
/// A <c>ZlibStream</c> can be used for <c>Read()</c> or <c>Write()</c>, but not both.
/// </para>
/// </remarks>
/// <param name="buffer">The buffer holding data to write to the stream.</param>
/// <param name="offset">the offset within that data array to find the first byte to write.</param>
/// <param name="count">the number of bytes to write.</param>
public override void Write(byte[] buffer, int offset, int count)
{
if (_disposed) throw new ObjectDisposedException("ZlibStream");
_baseStream.Write(buffer, offset, count);
}
#endregion
/// <summary>
/// Compress a string into a byte array using ZLIB.
/// </summary>
///
/// <remarks>
/// Uncompress it with <see cref="ZlibStream.UncompressString(byte[])"/>.
/// </remarks>
///
/// <seealso cref="ZlibStream.UncompressString(byte[])"/>
/// <seealso cref="ZlibStream.CompressBuffer(byte[])"/>
/// <seealso cref="GZipStream.CompressString(string)"/>
///
/// <param name="s">
/// A string to compress. The string will first be encoded
/// using UTF8, then compressed.
/// </param>
///
/// <returns>The string in compressed form</returns>
public static byte[] CompressString(String s)
{
using (var ms = new MemoryStream())
{
Stream compressor =
new ZlibStream(ms, CompressionMode.Compress, CompressionLevel.BestCompression);
ZlibBaseStream.CompressString(s, compressor);
return ms.ToArray();
}
}
/// <summary>
/// Compress a byte array into a new byte array using ZLIB.
/// </summary>
///
/// <remarks>
/// Uncompress it with <see cref="ZlibStream.UncompressBuffer(byte[])"/>.
/// </remarks>
///
/// <seealso cref="ZlibStream.CompressString(string)"/>
/// <seealso cref="ZlibStream.UncompressBuffer(byte[])"/>
///
/// <param name="b">
/// A buffer to compress.
/// </param>
///
/// <returns>The data in compressed form</returns>
public static byte[] CompressBuffer(byte[] b)
{
using (var ms = new MemoryStream())
{
Stream compressor =
new ZlibStream( ms, CompressionMode.Compress, CompressionLevel.BestCompression );
ZlibBaseStream.CompressBuffer(b, compressor);
return ms.ToArray();
}
}
/// <summary>
/// Uncompress a ZLIB-compressed byte array into a single string.
/// </summary>
///
/// <seealso cref="ZlibStream.CompressString(String)"/>
/// <seealso cref="ZlibStream.UncompressBuffer(byte[])"/>
///
/// <param name="compressed">
/// A buffer containing ZLIB-compressed data.
/// </param>
///
/// <returns>The uncompressed string</returns>
public static String UncompressString(byte[] compressed)
{
using (var input = new MemoryStream(compressed))
{
Stream decompressor =
new ZlibStream(input, CompressionMode.Decompress);
return ZlibBaseStream.UncompressString(compressed, decompressor);
}
}
/// <summary>
/// Uncompress a ZLIB-compressed byte array into a byte array.
/// </summary>
///
/// <seealso cref="ZlibStream.CompressBuffer(byte[])"/>
/// <seealso cref="ZlibStream.UncompressString(byte[])"/>
///
/// <param name="compressed">
/// A buffer containing ZLIB-compressed data.
/// </param>
///
/// <returns>The data in uncompressed form</returns>
public static byte[] UncompressBuffer(byte[] compressed)
{
using (var input = new MemoryStream(compressed))
{
Stream decompressor =
new ZlibStream( input, CompressionMode.Decompress );
return ZlibBaseStream.UncompressBuffer(compressed, decompressor);
}
}
}
}

View File

@ -1,10 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--Generated by crowdin.com-->
<resources>
<string name="change_entry">Изберете друг запис</string>
<string name="open_entry">Изберете</string>
<string name="open_entry">Изберете стойност</string>
<string name="open_entry_for_app">Търсене за въведено с \"%1$s\"</string>
<string name="kp2a_user">Потребител</string>
<string name="kp2a_password">Парола</string>
<string name="kp2a_auto_fill">Автоматично попълване разрешено</string>
<string name="kp2a_prefs">Входни настройки на данни</string>
<string name="kp2a_auto_fill">Автоматично попълване е включено</string>
<string name="kp2a_auto_fill_summary">Автоматично попълване при въведено празно поле, ако е Keepass2Android запис е на разположение за клавиатурата и има стойност, която съответства на полето на подсказване.</string>
<string name="kp2a_remember_auto_fill">Запомни скрития текст в полето</string>
<string name="kp2a_remember_auto_fill_summary">Ако текстово поле е попълнено чрез ръчно избиране на стойност от Keepass2Android, запомни коя стойност е въведена в текстовото поле. Полето по-късно ще бъде сравнено със скритата стойност.</string>
<string name="kp2a_simple_keyboard">Проста клавиатура</string>
<string name="kp2a_simple_keyboard_summary">Покажи простата 1 редова клавиатура ако стойноста е налична. Ако е изключена се показва диалог при натискане на бутон на Keepass2Android</string>
<string name="kp2a_lock_on_sendgodone">Заключване на базата данни, когато е готово</string>
<string name="kp2a_lock_on_sendgodone_summary">При натискане на клавиша Done/Send/Go на простата 1-редова клавиатура, автоматично се заключва на базата данни.</string>
<string name="kp2a_switch_on_sendgodone">Превключване на клавиатурата, когато свършиш</string>
<string name="kp2a_switch_on_sendgodone_summary">При натискане на клавиша Done/Send/Go на простата 1-редова клавиатура, превключи клавиатурата.</string>
</resources>

View File

@ -6,7 +6,7 @@
<string name="open_entry_for_app">Rechercher une entrée avec \"%1$s\"</string>
<string name="kp2a_user">Utilisateur</string>
<string name="kp2a_password">Mot de passe</string>
<string name="kp2a_prefs">Paramètres d\'entrée des informations d\'identification</string>
<string name="kp2a_prefs">Paramètres d\'entrée des identifiants</string>
<string name="kp2a_auto_fill">Remplissage automatique activé</string>
<string name="kp2a_auto_fill_summary">Renseigner automatiquement le texte lorsqu\'un champ vide est saisi, si une entrée Keepass2Android est disponible pour le clavier et qu\'il y a un champ qui correspond au texte d\'indication du champ.</string>
<string name="kp2a_remember_auto_fill">Rappeler le texte du champ d\'information</string>

View File

@ -6,9 +6,15 @@
<string name="open_entry_for_app">Søke etter oppføringen med \"%1$s\"</string>
<string name="kp2a_user">Bruker</string>
<string name="kp2a_password">Passord</string>
<string name="kp2a_prefs">Innstillinger for innloggingsdetaljer</string>
<string name="kp2a_auto_fill">Autofyll aktivert</string>
<string name="kp2a_auto_fill_summary">Fyll inn tomme felter automatisk dersom det fins en oppføring for tastaturet til Keepass2Android, og det fins en verdi som samsvarer med feltets hinttekst.</string>
<string name="kp2a_remember_auto_fill">Husk feltenes hinttekster</string>
<string name="kp2a_remember_auto_fill_summary">Dersom feltet fylles manuelt ved å velge en verdi fra Keepass2Android, husk verdien som ble skrevet inn i tekstfeltet. Tekstfeltet vil senere bli gjenkjent av dets hinttekst.</string>
<string name="kp2a_simple_keyboard">Enkelt tastatur</string>
<string name="kp2a_simple_keyboard_summary">Vis det enkle 1 rad tastaturet hvis det finnes en oppføring for tastaturet. Hvis deaktivert, vises en dialogboks når Keepass2Android tasten trykkes.</string>
<string name="kp2a_lock_on_sendgodone">Lås databasen når ferdig</string>
<string name="kp2a_lock_on_sendgodone_summary">Når du trykker tasten for Ferdig/Send/Gå på det enkle enlinjers tastturet, lås databasen automatisk.</string>
<string name="kp2a_switch_on_sendgodone">Bytt tastatur når ferdig</string>
<string name="kp2a_switch_on_sendgodone_summary">Når du trykker tasten for Ferdig/Send/Gå på det enkle enlinjers tastturet, bytt tastatur.</string>
</resources>

View File

@ -12,6 +12,9 @@
<string name="kp2a_remember_auto_fill">Lembrar os textos de dica de campo</string>
<string name="kp2a_remember_auto_fill_summary">Se um campo de texto é preenchido manualmente selecionando o valor de Keepass2Android, lembra-se de qual valor foi inserido no campo de texto. O campo de texto mais tarde é detectado novamente pelo seu texto de dica.</string>
<string name="kp2a_simple_keyboard">Teclado simples</string>
<string name="kp2a_simple_keyboard_summary">Mostrar teclado simples de 1 linha se existir uma entrada disponível para o teclado. Se desactivado, uma caixa de diálogo é mostrada quando é pressionada a tecla Keepass2Android.</string>
<string name="kp2a_lock_on_sendgodone">Bloquear base de dados no final</string>
<string name="kp2a_lock_on_sendgodone_summary">Ao pressionar a tecla Concluido/Enviar/Ir no teclado de 1 linha simples, bloquear a base de dados automaticamente.</string>
<string name="kp2a_switch_on_sendgodone">Trocar teclado ao concluir</string>
<string name="kp2a_switch_on_sendgodone_summary">Ao pressionar a tecla Concluido/Enviar/Ir no teclado de 1 linha simples, trocar o teclado.</string>
</resources>

View File

@ -2,7 +2,19 @@
<!--Generated by crowdin.com-->
<resources>
<string name="change_entry">Selectaţi o altă înregistrare</string>
<string name="open_entry">Alegeți înregistraea</string>
<string name="open_entry">Alegeți înregistrarea</string>
<string name="open_entry_for_app">Căutaţi înregistrarea \"%1$s\"</string>
<string name="kp2a_remember_auto_fill_summary">Dacă un câmp text este completat prin selectarea manual valoarea Keepass2Android, memoreaza valoarea care a intrat în câmpul de text. Câmpul de text este redetectat mai târziu de textul său de sugestie.</string>
<string name="kp2a_user">Utilizator</string>
<string name="kp2a_password">Parolă</string>
<string name="kp2a_prefs">Setări pentru introducerea datelor</string>
<string name="kp2a_auto_fill">Completarea-auto activată</string>
<string name="kp2a_auto_fill_summary">Completează automat când un câmp gol este selectat, dacă o înregistrare Keepass2Android este disponibilă pentru tastatură și există o valoare care corespunde textului sugestie al câmpului.</string>
<string name="kp2a_remember_auto_fill">Memorează textul de sugestie al câmpurilor</string>
<string name="kp2a_remember_auto_fill_summary">Dacă un câmp text este completat prin selectarea manuală a valorii Keepass2Android, memorează valoarea care era introdusă în câmpul de text. Câmpul de text este redetectat mai târziu de textul său de sugestie.</string>
<string name="kp2a_simple_keyboard">Tastatură simplă</string>
<string name="kp2a_simple_keyboard_summary">Arată tastatura simplă de un rând dacă o înregistrare este disponibilă pentru tastatură. Dacă este dezactivat, se afișează un dialog când tasta Keepass2Android este apăsată.</string>
<string name="kp2a_lock_on_sendgodone">Blochează baza de date când ai terminat</string>
<string name="kp2a_lock_on_sendgodone_summary">Când apeși tasta Done/Send/Go de pe tastatura simplă de un rând, blochează automat baza de date.</string>
<string name="kp2a_switch_on_sendgodone">Comută tastatura când ai terminat</string>
<string name="kp2a_switch_on_sendgodone_summary">După ce ai apăsat tasta Gata/Trimite/Mergi de pe tastatura simplă cu un rând, comută tastatura.</string>
</resources>

View File

@ -1,3 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<resources/>
<resources>
<string name="change_entry">Izberite drug vnos</string>
<string name="open_entry">Izberite vnos</string>
<string name="open_entry_for_app">Poišči vnos s/z \"%1$s\"</string>
<string name="kp2a_user">Uporabnik</string>
<string name="kp2a_password">Geslo</string>
<string name="kp2a_prefs">Nastavitve za vnos poveril</string>
<string name="kp2a_auto_fill">Samodejno izpolnjevanje omogočeno</string>
<string name="kp2a_auto_fill_summary">Samodejno izpolni besedilo, ko izbrano prazno polje, če je za tipkovnico na voljo vnos Keepass2Android in obstaja vrednost, ki se ujema z besedilom namiga polja.</string>
<string name="kp2a_remember_auto_fill">Zapomni si besedila namigov polj</string>
<string name="kp2a_remember_auto_fill_summary">Če je besedilo izpolnjeno z ročno izbiro vrednosti Keepass2Android, si zapomni, katera vrednost je bila vnesena v besedilno polje. To polje kasneje ponovno zazna njegovo besedilo namiga.</string>
<string name="kp2a_simple_keyboard">Preprosta tipkovnica</string>
<string name="kp2a_simple_keyboard_summary">Prikaži preprosto enovrstično tipkovnico, če je za tipkovnico vnos na voljo vnos. Če je onemogočeno, se ob pritisku na tipko Keepass2Android prikaže pogovorno okno.</string>
<string name="kp2a_lock_on_sendgodone">Zakleni podatkovno zbirko, ko je končano</string>
<string name="kp2a_lock_on_sendgodone_summary">Ob pritisku na tipko Končano/Pošlji/Pojdi na preprosti enovrstični tipkovnici samodejno zakleni podatkovno zbirko.</string>
<string name="kp2a_switch_on_sendgodone">Preklopi tipkovnico, ko je končano</string>
<string name="kp2a_switch_on_sendgodone_summary">Ob pritisku na tipko Končano/Pošlji/Pojdi na preprosti enovrstični tipkovnici preklopi tipkovnico.</string>
</resources>

View File

@ -8,4 +8,6 @@
<string name="kp2a_password">密碼</string>
<string name="kp2a_prefs">憑據輸入設置</string>
<string name="kp2a_auto_fill">自動輸入啟用</string>
<string name="kp2a_auto_fill_summary">當選擇空白欄位時,如果有可使用的 Keepass2Android 條目以及當網站符合條目資訊時將自動填入資料。</string>
<string name="kp2a_remember_auto_fill">記住欄位提示訊息</string>
</resources>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.net-->
<!--Generated by crowdin.com-->
<!--
Copyright (c) 2012 Hai Bison

View File

@ -67,7 +67,7 @@
<item quantity="other">Vyberte soubory&#8230;</item>
</plurals>
<plurals name="afc_title_choose_files_directories">
<item quantity="one">Vyberte soubor/složku&#8230;</item>
<item quantity="one">Vyberte soubor/ složku &#8230;</item>
<item quantity="few">Vyberte soubor/ složku &#8230;</item>
<item quantity="other">Vyberte soubory/ složky &#8230;</item>
</plurals>

View File

@ -22,7 +22,7 @@
<string name="afc_hint_clear">leeren</string>
<string name="afc_hint_folder_name">Verzeichnisname</string>
<string name="afc_hint_save_as_filename">Dateiname</string>
<string name="afc_hint_search">Suchtext</string>
<string name="afc_hint_search">Suche</string>
<string name="afc_msg_app_doesnot_have_permission_to_create_files">Diese Anwendung verfügt nicht über die Berechtigung zum Erstellen von Dateien / Ordnern.</string>
<string name="afc_msg_app_doesnot_have_permission_to_delete_files">Diese Anwendung verfügt nicht über die Berechtigung zum Löschen von Dateien / Ordnern.</string>
<string name="afc_msg_cancelled">Abgebrochen</string>
@ -44,7 +44,7 @@
<string name="afc_pmsg_filename_is_directory">\"%1$s\" ist ein Verzeichnis</string>
<string name="afc_pmsg_filename_is_invalid">Dateiname \"%1$s\" ist ungültig</string>
<string name="afc_pmsg_max_file_count_allowed">&#8230; hat mehr Dateien, maximal erlaubt: %1$d</string>
<string name="afc_pmsg_unknown_error">Unerwarteter Fehler: %1$s</string>
<string name="afc_pmsg_unknown_error">Unbekannter Fehler: %1$s</string>
<string name="afc_root">Root</string>
<string name="afc_title_advanced_selection">Wählen&#8230;</string>
<string name="afc_title_confirmation">Bestätigung</string>

View File

@ -45,7 +45,7 @@
<string name="afc_pmsg_filename_is_invalid">Tiedostonimi \"%1$s\" ei kelpaa</string>
<string name="afc_pmsg_max_file_count_allowed">...Liikaa tiedostoja, maksimimäärä on %1$,d</string>
<string name="afc_pmsg_unknown_error">Tuntematon virhe: %1$s</string>
<string name="afc_root">Root</string>
<string name="afc_root">Juuri</string>
<string name="afc_title_advanced_selection">Valitse...</string>
<string name="afc_title_confirmation">Vahvista</string>
<string name="afc_title_date">Pvm.</string>

View File

@ -31,7 +31,7 @@
<string name="afc_msg_cannot_save_a_file_here">Impossible d\'enregistrer un fichier ici</string>
<string name="afc_msg_done">Valider</string>
<string name="afc_msg_empty">Vide</string>
<string name="afc_msg_failed_please_try_again">Échec. Veuillez faire une nouvelle tentative.</string>
<string name="afc_msg_failed_please_try_again">Erreur. Veuillez essayer à nouveau.</string>
<string name="afc_msg_loading">Chargement en cours&#8230;</string>
<string name="afc_phone">Téléphone</string>
<string name="afc_pmsg_cannot_access_dir">Impossible d\'accéder à \"%1$s\"</string>
@ -58,10 +58,10 @@
<string name="afc_yesterday">Hier</string>
<plurals name="afc_title_choose_directories">
<item quantity="one">[one]
Choisir dossier...
Choisir un dossier...
[other]
Choisir dossier...
Choisir dossiers...</item>
Choisir un dossier...
Choisir des dossiers&#8230;</item>
<item quantity="other">[one]
Choisir un dossier...

View File

@ -6,4 +6,66 @@
See the file LICENSE at the root directory of this project for copying
permission.
-->
<resources/>
<resources>
<string name="afc_cmd_advanced_selection_all">Alle</string>
<string name="afc_cmd_advanced_selection_invert">Invertere valg</string>
<string name="afc_cmd_advanced_selection_none">Ingen</string>
<string name="afc_cmd_grid_view">Rutenettvisning</string>
<string name="afc_cmd_home">Hjem</string>
<string name="afc_cmd_list_view">Listevisning</string>
<string name="afc_cmd_new_folder">Ny mappe&#8230;</string>
<string name="afc_cmd_select_all_files">Velg alle filer</string>
<string name="afc_cmd_select_all_folders">Velg alle mapper</string>
<string name="afc_cmd_sort">Sorter&#8230;</string>
<string name="afc_file">filen</string>
<string name="afc_folder">mappen</string>
<string name="afc_hint_clear">tøm</string>
<string name="afc_hint_folder_name">mappenavn</string>
<string name="afc_hint_save_as_filename">filnavn</string>
<string name="afc_hint_search">søk</string>
<string name="afc_msg_app_doesnot_have_permission_to_create_files">Dette programmet har ikke tillatelse til å opprette filer/mapper</string>
<string name="afc_msg_app_doesnot_have_permission_to_delete_files">Dette programmet har ikke tillatelse til å slette filer/mapper</string>
<string name="afc_msg_cancelled">Avbrutt</string>
<string name="afc_msg_cannot_connect_to_file_provider_service">Kan ikke koble til filleveringstjenesten</string>
<string name="afc_msg_cannot_create_new_folder_here">Kan ikke opprette mappe her</string>
<string name="afc_msg_cannot_save_a_file_here">Kan ikke lagre fil her</string>
<string name="afc_msg_done">Ferdig</string>
<string name="afc_msg_empty">Tom</string>
<string name="afc_msg_failed_please_try_again">Mislyktes. Vennligst prøv igjen.</string>
<string name="afc_msg_loading">Laster&#8230;</string>
<string name="afc_phone">Telefon</string>
<string name="afc_pmsg_cannot_access_dir">Får ikke tilgang til \"%1$s\"</string>
<string name="afc_pmsg_cannot_create_folder">Kan ikke opprette mappen \"%1$s\"</string>
<string name="afc_pmsg_cannot_delete_file">Kan ikke slette %1$s \"%2$s\"</string>
<string name="afc_pmsg_confirm_delete_file">Er du sikker på at du ønsker å slette denne %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Filen \"%1$s\" fins allerede.\n\nVil du erstatte den?</string>
<string name="afc_pmsg_deleting_file">Sletter %1$s \"%2$s\"&#8230;</string>
<string name="afc_pmsg_file_has_been_deleted">%1$s \"%2$s\" er slettet</string>
<string name="afc_pmsg_filename_is_directory">\"%1$s\" er en mappe</string>
<string name="afc_pmsg_filename_is_invalid">Filnavnet \"%1$s\" er ugyldig</string>
<string name="afc_pmsg_max_file_count_allowed">&#8230;har flere filer, maks tillatt: %1$,d</string>
<string name="afc_pmsg_unknown_error">Ukjent feil: %1$s</string>
<string name="afc_root">Toppnivå</string>
<string name="afc_title_advanced_selection">Velg&#8230;</string>
<string name="afc_title_confirmation">Bekreftelse</string>
<string name="afc_title_date">Dato</string>
<string name="afc_title_error">Feil</string>
<string name="afc_title_info">Info</string>
<string name="afc_title_name">Navn</string>
<string name="afc_title_save_as">Lagre som&#8230;</string>
<string name="afc_title_size">Størrelse</string>
<string name="afc_title_sort_by">Sorter etter&#8230;</string>
<string name="afc_yesterday">I går</string>
<plurals name="afc_title_choose_directories">
<item quantity="one">Velg mappe&#8230;</item>
<item quantity="other">Velg mapper&#8230;</item>
</plurals>
<plurals name="afc_title_choose_files">
<item quantity="one">Velg fil&#8230;</item>
<item quantity="other">Velg filer&#8230;</item>
</plurals>
<plurals name="afc_title_choose_files_directories">
<item quantity="one">Velg fil/mappe&#8230;</item>
<item quantity="other">Velg filer/mapper&#8230;</item>
</plurals>
</resources>

View File

@ -12,38 +12,38 @@
<string name="afc_cmd_advanced_selection_none">Nici unul</string>
<string name="afc_cmd_grid_view">Vizualizare grilă</string>
<string name="afc_cmd_home">Acasă</string>
<string name="afc_cmd_list_view">Vedere lista</string>
<string name="afc_cmd_list_view">Vizualizare lista</string>
<string name="afc_cmd_new_folder">Director nou&#8230;</string>
<string name="afc_cmd_select_all_files">Selectaţi toate fişierele</string>
<string name="afc_cmd_select_all_folders">Selectaţi toate directoarele</string>
<string name="afc_cmd_select_all_folders">Selectaţi toate folderele</string>
<string name="afc_cmd_sort">Sortare&#8230;</string>
<string name="afc_file">fişier</string>
<string name="afc_folder">director</string>
<string name="afc_hint_clear">goleşte</string>
<string name="afc_hint_folder_name">nume director</string>
<string name="afc_hint_save_as_filename">nume fisier</string>
<string name="afc_hint_folder_name">nume folder</string>
<string name="afc_hint_save_as_filename">nume fișier</string>
<string name="afc_hint_search">căutare</string>
<string name="afc_msg_app_doesnot_have_permission_to_create_files">Această aplicaţie nu are permisiunea de a crea fişiere / directoare</string>
<string name="afc_msg_app_doesnot_have_permission_to_delete_files">Această aplicaţie nu are permisiunea de a şterge fişiere / directoare</string>
<string name="afc_msg_app_doesnot_have_permission_to_create_files">Această aplicaţie nu are permisiunea de a crea fişiere / foldere</string>
<string name="afc_msg_app_doesnot_have_permission_to_delete_files">Această aplicaţie nu are permisiunea de a şterge fişiere / foldere</string>
<string name="afc_msg_cancelled">Anulat</string>
<string name="afc_msg_cannot_connect_to_file_provider_service">Conectare imposibila la furnizorul fisierului</string>
<string name="afc_msg_cannot_create_new_folder_here">Imposibil de creat dosarul nou aici</string>
<string name="afc_msg_cannot_connect_to_file_provider_service">Conectare imposibilă la furnizorul fișierului</string>
<string name="afc_msg_cannot_create_new_folder_here">Imposibil de creat folder nou aici</string>
<string name="afc_msg_cannot_save_a_file_here">Imposibil de salvat un fişier aici</string>
<string name="afc_msg_done">Gata</string>
<string name="afc_msg_empty">Gol</string>
<string name="afc_msg_failed_please_try_again">Esec. Vă rugăm să încercaţi din nou.</string>
<string name="afc_msg_loading">Se încarcă&#8230;</string>
<string name="afc_phone">Telefon</string>
<string name="afc_pmsg_cannot_access_dir">Nu pot accesa \"%1$s\"</string>
<string name="afc_pmsg_cannot_create_folder">Nu poate crea folderul \"%1$s\"</string>
<string name="afc_pmsg_cannot_access_dir">Nu se poate accesa \"%1$s\"</string>
<string name="afc_pmsg_cannot_create_folder">Nu se poate crea folderul \"%1$s\"</string>
<string name="afc_pmsg_cannot_delete_file">Imposibil de şters %1$s \"%2$s\"</string>
<string name="afc_pmsg_confirm_delete_file">Sigur vreți sa ștergeți acest %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Acest fişier \"%1$s\" exista deja.\n\nDoriţi să-l înlocuiți?</string>
<string name="afc_pmsg_confirm_delete_file">Sigur vreți să ștergeți acest %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Acest fişier \"%1$s\" există deja.\n\nDoriţi să-l înlocuiți?</string>
<string name="afc_pmsg_deleting_file">Ştergere %1$s \"%2$s\"&#8230;</string>
<string name="afc_pmsg_file_has_been_deleted">%1$s \"%2$s\" a fost şters</string>
<string name="afc_pmsg_filename_is_directory">\"%1$s\" este un dosar</string>
<string name="afc_pmsg_filename_is_invalid">Numele de fişier \"%1$s\" este invalid</string>
<string name="afc_pmsg_max_file_count_allowed">&#8230; are prea multe fişiere, maximum permis: %1$, d</string>
<string name="afc_pmsg_max_file_count_allowed">&#8230; are prea multe fişiere, maximum permis: %1$,d</string>
<string name="afc_pmsg_unknown_error">Eroare necunoscută: %1$s</string>
<string name="afc_root">Root</string>
<string name="afc_title_advanced_selection">Selectaţi&#8230;</string>

View File

@ -6,4 +6,72 @@
See the file LICENSE at the root directory of this project for copying
permission.
-->
<resources/>
<resources>
<string name="afc_cmd_advanced_selection_all">Vse</string>
<string name="afc_cmd_advanced_selection_invert">Obrni izbiro</string>
<string name="afc_cmd_advanced_selection_none">Brez</string>
<string name="afc_cmd_grid_view">Mrežni pogled</string>
<string name="afc_cmd_home">Domov</string>
<string name="afc_cmd_list_view">Pogled seznama</string>
<string name="afc_cmd_new_folder">Nova mapa &#8230;</string>
<string name="afc_cmd_select_all_files">Izberi vse datoteke</string>
<string name="afc_cmd_select_all_folders">Izberi vse mape</string>
<string name="afc_cmd_sort">Razvrsti &#8230;</string>
<string name="afc_file">datoteke</string>
<string name="afc_folder">mape</string>
<string name="afc_hint_clear">počisti</string>
<string name="afc_hint_folder_name">ime mape</string>
<string name="afc_hint_save_as_filename">ime datoteke</string>
<string name="afc_hint_search">išči</string>
<string name="afc_msg_app_doesnot_have_permission_to_create_files">Ta program nima dovoljenja za ustvarjanje datotek/map</string>
<string name="afc_msg_app_doesnot_have_permission_to_delete_files">Ta program nima dovoljenja za izbris datotek/map</string>
<string name="afc_msg_cancelled">Preklicano</string>
<string name="afc_msg_cannot_connect_to_file_provider_service">Povezava na storitev ponudnika datotek ni mogoča</string>
<string name="afc_msg_cannot_create_new_folder_here">Ustvarjanje mape na tem mestu ni mogoče</string>
<string name="afc_msg_cannot_save_a_file_here">Shranjevanje datoteke na tem mestu ni mogoče</string>
<string name="afc_msg_done">Končano</string>
<string name="afc_msg_empty">Prazno</string>
<string name="afc_msg_failed_please_try_again">Spodletelo. Poizkusite znova.</string>
<string name="afc_msg_loading">Nalaganje &#8230;</string>
<string name="afc_phone">Telefon</string>
<string name="afc_pmsg_cannot_access_dir">Dostop do \"%1$s\" ni mogoč</string>
<string name="afc_pmsg_cannot_create_folder">Ustvarjanje mape \"%1$s\" ni mogoče</string>
<string name="afc_pmsg_cannot_delete_file">Izbris %1$s \"%2$s\" ni mogoč</string>
<string name="afc_pmsg_confirm_delete_file">Ali res želite izbrisati to %1$s \"%2$s\"?</string>
<string name="afc_pmsg_confirm_replace_file">Ta datoteka \"%1$s\" že obstaja.\n\nAli jo želite nadomestiti?</string>
<string name="afc_pmsg_deleting_file">Brisanje %1$s \"%2$s\" &#8230;</string>
<string name="afc_pmsg_file_has_been_deleted">%1$s \"%2$s\" je bila izbrisana</string>
<string name="afc_pmsg_filename_is_directory">\"%1$s\" je mapa</string>
<string name="afc_pmsg_filename_is_invalid">Ime datoteke \"%1$s\" je neveljavno</string>
<string name="afc_pmsg_max_file_count_allowed">&#8230; ima več datotek, največje dovoljeno št.: %1,d</string>
<string name="afc_pmsg_unknown_error">Neznana napaka: %1$s</string>
<string name="afc_root">Koren</string>
<string name="afc_title_advanced_selection">Izberite &#8230;</string>
<string name="afc_title_confirmation">Potrditev</string>
<string name="afc_title_date">Datum</string>
<string name="afc_title_error">Napaka</string>
<string name="afc_title_info">Podatki</string>
<string name="afc_title_name">Ime</string>
<string name="afc_title_save_as">Shrani kot &#8230;</string>
<string name="afc_title_size">Velikost</string>
<string name="afc_title_sort_by">Razvrsti po &#8230;</string>
<string name="afc_yesterday">Včeraj</string>
<plurals name="afc_title_choose_directories">
<item quantity="one">Izberite mapo &#8230;</item>
<item quantity="two">Izberite mapi &#8230;</item>
<item quantity="few">Izberite mape &#8230;</item>
<item quantity="other">Izberite mape &#8230;</item>
</plurals>
<plurals name="afc_title_choose_files">
<item quantity="one">Izberite datoteko &#8230;</item>
<item quantity="two">Izberite datoteki &#8230;</item>
<item quantity="few">Izberite datoteke &#8230;</item>
<item quantity="other">Izberite datoteke &#8230;</item>
</plurals>
<plurals name="afc_title_choose_files_directories">
<item quantity="one">Izberite datoteko/mapo &#8230;</item>
<item quantity="two">Izberite datoteki/mapi &#8230;</item>
<item quantity="few">Izberite datoteke/mape &#8230;</item>
<item quantity="other">Izberite datoteke/mape &#8230;</item>
</plurals>
</resources>

View File

@ -10,7 +10,7 @@ namespace keepass2android
{
[Activity(Label = "@string/app_name",
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
Theme = "@style/MyTheme_ActionBar")]
Theme = "@style/MyTheme_ActionBar")]
[IntentFilter(new[] { "keepass2android.AboutActivity" }, Categories = new[] { Intent.CategoryDefault })]
public class AboutActivity: Activity, IDialogInterfaceOnDismissListener
{

View File

@ -26,6 +26,7 @@ namespace keepass2android
AlertDialog.Builder builder = new AlertDialog.Builder(new ContextThemeWrapper(ctx, Android.Resource.Style.ThemeHoloLightDialog));
builder.SetTitle(ctx.GetString(Resource.String.ChangeLog_title));
List<string> changeLog = new List<string>{
ctx.GetString(Resource.String.ChangeLog_0_9_8b),
ctx.GetString(Resource.String.ChangeLog_0_9_8),
#if !NoNet
//0.9.7b fixes were already included in 0.9.7 offline

View File

@ -361,6 +361,7 @@ namespace keepass2android
}
if (requestCode == RequestCodeDbFilename)
{
if (data.Data.Scheme == "content")
{
if ((int)Build.VERSION.SdkInt >= 19)

View File

@ -43,12 +43,34 @@ namespace keepass2android
static IEnumerable<Reminder> GetReminders()
{
yield return new Reminder
{
From = new DateTime(2014, 09, 20),
To = new DateTime(2014, 10, 06),
Key = "DonationOktoberfest2014"
{
From = new DateTime(2015, 09, 19),
To = new DateTime(2015, 10, 05),
Key = "DonationOktoberfest2015"
,ResourceToShow = Resource.Layout.donate
};
};
yield return new Reminder
{
From = new DateTime(2016, 09, 17),
To = new DateTime(2016, 10, 04),
Key = "DonationOktoberfest2016"
,ResourceToShow = Resource.Layout.donate
};
yield return new Reminder
{
From = new DateTime(2015, 09, 16),
To = new DateTime(2015, 10, 04),
Key = "DonationOktoberfest2017"
,ResourceToShow = Resource.Layout.donate
};
yield return new Reminder
{
From = new DateTime(2015, 09, 22),
To = new DateTime(2015, 10, 08),
Key = "DonationOktoberfest2018"
,ResourceToShow = Resource.Layout.donate
};
int thisYear = DateTime.Now.Year;

View File

@ -17,7 +17,7 @@ namespace keepass2android
[Activity(Label = "@string/app_name",
ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden,
Theme = "@style/MyTheme_ActionBar")]
[IntentFilter(new[] {"keepass2android.ExportDatabaseActivity"}, Categories = new[] {Intent.CategoryDefault})]
[IntentFilter(new[] {"kp2a.action.ExportDatabaseActivity"}, Categories = new[] {Intent.CategoryDefault})]
public class ExportDatabaseActivity : LockCloseActivity
{
FileFormatProvider[] _ffp = new FileFormatProvider[]
@ -56,6 +56,12 @@ namespace keepass2android
if (resultCode == KeePass.ExitFileStorageSelectionOk)
{
string protocolId = data.GetStringExtra("protocolId");
if (protocolId == "content")
{
Util.ShowBrowseDialog(this, RequestCodeDbFilename, true, true);
}
else
{
App.Kp2a.GetFileStorage(protocolId).StartSelectFile(new FileStorageSetupInitiatorActivity(this,
OnActivityResult,
defaultPath =>
@ -67,6 +73,7 @@ namespace keepass2android
Intents.RequestCodeFileBrowseForOpen);
}
), true, RequestCodeDbFilename, protocolId);
}
return;
}
@ -74,8 +81,33 @@ namespace keepass2android
{
if (requestCode == RequestCodeDbFilename)
{
string filename = Util.IntentToFilename(data, this);
if (data.Data.Scheme == "content")
{
if ((int)Android.OS.Build.VERSION.SdkInt >= 19)
{
//try to take persistable permissions
try
{
Kp2aLog.Log("TakePersistableUriPermission");
var takeFlags = data.Flags
& (ActivityFlags.GrantReadUriPermission
| ActivityFlags.GrantWriteUriPermission);
this.ContentResolver.TakePersistableUriPermission(data.Data, takeFlags);
}
catch (Exception e)
{
Kp2aLog.Log(e.ToString());
}
}
}
string filename = Util.IntentToFilename(data, this);
if (filename == null)
filename = data.DataString;
bool fileExists = data.GetBooleanExtra("group.pals.android.lib.ui.filechooser.FileChooserActivity.result_file_exists", true);
if (fileExists)

View File

@ -44,6 +44,8 @@ namespace keepass2android
[IntentFilter(new[] { "android.intent.action.SEARCH" })]
[MetaData("android.app.default_searchable", Value = "MaterialTest2.EntryEditActivity")]
[MetaData("android.app.searchable", Resource = "@xml/searchable_mattest")]
[IntentFilter(new string[]{"android.intent.action.SEARCH"})]
[MetaData("android.app.searchable",Resource=AppNames.Searchable)]
public class GroupActivity : GroupBaseActivity {
public const int Uninit = -1;

View File

@ -397,12 +397,12 @@ namespace keepass2android
MenuInflater inflater = MenuInflater;
inflater.Inflate(Resource.Menu.group, menu);
var searchManager = (SearchManager) GetSystemService(SearchService);
var searchManager = (SearchManager)GetSystemService (Context.SearchService);
IMenuItem searchItem = menu.FindItem(Resource.Id.menu_search);
var view = MenuItemCompat.GetActionView(searchItem);
var searchView = view.JavaCast<Android.Support.V7.Widget.SearchView>();
searchView.SetSearchableInfo(searchManager.GetSearchableInfo(ComponentName));
searchView.SetSearchableInfo (searchManager.GetSearchableInfo (ComponentName));
searchView.SetOnSuggestionListener(new SuggestionListener(searchView.SuggestionsAdapter, this, searchItem));
searchView.SetOnQueryTextListener(new OnQueryTextListener(this));

View File

@ -6,7 +6,9 @@
<string name="about_homepage">Уеб страница</string>
<string name="AboutText">Keepass2Android е мениджър за пароли който осигурява достъп четене/записване до KeePass 2.x база данни на Android.</string>
<string name="CreditsText">Потребителският интерфейс е базиран на KeepassDroid създаден от Brian Pellin. Кода действие на базите данни е базиран на KeePass на Dominik Reichl. Робота Android е репродукция или модифициран от разработения и споделен от Google и се използва в съответствие с лиценза Creative Commons 3.0 Attribution License.</string>
<string name="CreditsTextSFTP">SFTP поддръжка се осъществява чрез използване на библиотеката на JSch под BSD лиценз, създаден от JCraft, Inc.</string>
<string name="accept">Приемам</string>
<string name="deny">Отказано</string>
<string name="add_entry">Добавям запис</string>
<string name="add_url_entry">Създавам запис от страница</string>
<string name="add_group">Добавям група</string>
@ -25,6 +27,11 @@
<string name="show_kill_app_summary">Покажи бутон за спиране на приложението в екрана за парола (за параноични потребители)</string>
<string name="application">Приложение</string>
<string name="application_settings">Настройки на приложението</string>
<string name="ShowGroupnameInSearchResult_title">Показване на името на групата в резултата от търсенето</string>
<string name="ShowGroupnameInSearchResult_resume">Показване на името на групата под заглавието в резултатите от търсенето. Полезно е, ако няколко записа имат едно и също име.</string>
<string name="NavigationToGroupCompleted_message">Групата за показване е: %1$s</string>
<string name="ShowGroupInEntry_title">Покажи името на групата във вид на запис</string>
<string name="unknown_uri_scheme">Съжалявам! Keepass2Android не може да обработи върнатите URI %1$s. Свържете се с разработчика!</string>
<string name="security_prefs">Сигурност</string>
<string name="display_prefs">Покажи</string>
<string name="password_access_prefs">Достъп до въведените пароло</string>
@ -32,6 +39,14 @@
<string name="FileHandling_prefs">Работа с файлове</string>
<string name="keyboard_prefs">Клавиатура</string>
<string name="export_prefs">Експортиране на база данни...</string>
<string name="import_db_prefs">Импортиране на БД във вътрешна папка</string>
<string name="import_keyfile_prefs">Импортирай ключ от вътрешна папка</string>
<string name="keyboardswitch_prefs">Превключване на клавиатурата</string>
<string name="OnlyAvailableForLocalFiles">Достъпно само за локални файлове.</string>
<string name="FileIsInInternalDirectory">Файлът се съхранява във вътрешна папка</string>
<string name="DatabaseFileMoved">База данни файлът е копиран във вътрешна папка. Натиснете Ok, за да отворите ново местоположение. Забележка: Не забравяйте редовно да експортирате базата данни на безопасно място</string>
<string name="KeyfileMoved">Keyfile е копиран във вътрешна папка. Уверете се, че имате бекъп преди да го изтриете от текущото му място!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Не можете да използвате вътрешна папка ако key файла не е запомнен. Променете настройките на сигурността.</string>
<string name="brackets">Скоби</string>
<string name="cancel">Прекъсни</string>
<string name="ClearClipboard">Клиброда е изчистен.</string>
@ -40,6 +55,7 @@
<string name="copy_username">Изберете за да копиране потребителското име в клипборда</string>
<string name="copy_password">Изберете за да копирате парола в клипборда</string>
<string name="available_through_keyboard">Въвеждането е възможно чрез KP2A клавиатурата</string>
<string name="entry_is_available">е наличен</string>
<string name="not_possible_im_picker">Невъзможно отваряне на диалог за избиране на метод за въвеждане. Моля активирайте клавиатурата ръчно.</string>
<string name="please_activate_keyboard">Моля активирайте клавиатурата на Keepass2Android във вашата системни настройки.</string>
<string name="creating_db_key">Създаване на ключ на базата данни&#8230;</string>
@ -49,6 +65,7 @@
<string name="digits">Цифри</string>
<string name="disclaimer_formal">Keepass2Android е с АБСОЛЮТНО НИКАКВИ ГАРАНЦИИ. Това е свободен софтуер и вие сте свободни да го разпространявате при условията на GPL врсия 2 и по-късни.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Копиране в клипборда</string>
<string name="enter_filename">Въведете име на файла на базаданни</string>
<string name="entry_accessed">Достъп до</string>
<string name="entry_cancel">Отказ</string>
@ -58,17 +75,42 @@
<string name="entry_confpassword">Потвърди паролата</string>
<string name="entry_created">Създаден</string>
<string name="entry_expires">Изтича</string>
<string name="entry_group_name">Име на група</string>
<string name="entry_keyfile">Ключов файл (незадължителен)</string>
<string name="keyfile_heading">Key файл</string>
<string name="entry_modified">Модифициран</string>
<string name="entry_password">Парола</string>
<string name="entry_save">Запази</string>
<string name="entry_title">Име</string>
<string name="entry_url">URL</string>
<string name="entry_user_name">Потребителско име</string>
<string name="entry_extra_strings">Допълнителни низ полета</string>
<string name="entry_binaries">Прикачени файлове</string>
<string name="error_can_not_handle_uri">Keepass2Android не може да обработи този uri.</string>
<string name="error_could_not_create_group">Грешка при създаване на група.</string>
<string name="error_could_not_create_parent">Не може да се създаде директория.</string>
<string name="error_database_exists">Този файл вече съществува.</string>
<string name="error_database_settinoverrgs">Не можа да определи настройките на базата данни.</string>
<string name="error_failed_to_launch_link">Неуспешно отваряне на линк.</string>
<string name="error_filename_required">Изисква се име на файл.</string>
<string name="error_file_not_create">Не можа да създаде файл</string>
<string name="error_invalid_db">Невалидна база данни.</string>
<string name="error_invalid_path">Невалиден път.</string>
<string name="error_no_name">Името е задължително.</string>
<string name="error_nopass">Изисква се парола или ключов файл.</string>
<string name="error_pass_gen_type">Трябва да бъде избран поне един вид генератор за парола</string>
<string name="error_pass_match">Паролите не съвпадат.</string>
<string name="error_rounds_not_number">Кръга трябва да бъде число.</string>
<string name="error_title_required">Изисква се заглавие.</string>
<string name="error_wrong_length">Въведете положително число в полето \"дължина\"</string>
<string name="FileNotFound">Файлът не е намерен.</string>
<string name="file_browser">Файл браузър</string>
<string name="generate_password">Генериране на парола</string>
<string name="group">Група</string>
<string name="hint_comment">коментар</string>
<string name="hint_conf_pass">Потвърди паролата</string>
<string name="hint_generated_password">генерира парола</string>
<string name="hint_group_name">Име на група</string>
<string name="hint_keyfile">Ключов файл</string>
<string name="hint_length">Дължина</string>
<string name="hint_pass">парола</string>
@ -78,7 +120,11 @@
<string name="hint_override_url">замени url</string>
<string name="hint_tags">таг1, таг2</string>
<string name="hint_username">потребителско име</string>
<string name="InvalidPassword">Невалидна парола или ключов файл.</string>
<string name="invalid_algorithm">Невалиден алгоритъм.</string>
<string name="invalid_db_sig">Формат на базата данни не се разпознава.</string>
<string name="keyfile_does_not_exist">Файла на ключа не съществува.</string>
<string name="no_keyfile_selected">Няма избран ключов файл.</string>
<string name="keyfile_is_empty">Файла с ключа е празен.</string>
<string name="length">Дължина</string>
<string name="list_size_title">Размер на груповия списък</string>
@ -97,6 +143,8 @@
<string name="menu_db_settings">Настройка на базата данни</string>
<string name="menu_delete">Изтриване</string>
<string name="menu_move">Премести в друга група</string>
<string name="menu_move_light">Премести</string>
<string name="menu_navigate">Отиди в родителската група</string>
<string name="menu_donate">Дарете бира...</string>
<string name="menu_edit">Редактиране</string>
<string name="menu_hide_password">Скрий парола</string>
@ -128,13 +176,73 @@
<string name="remove_from_filelist">Премахване</string>
<string name="rijndael">Rijndael (AES)</string>
<string name="root">Главен</string>
<string name="rounds">Шифрован кръг</string>
<string name="rounds_explaination">По-високо криптиране на кръга осигурява допълнителна защита срещу атаки с груба сила, но може да забави зареждането и записването.</string>
<string name="database_name">Име на базата данни</string>
<string name="default_username"> Потребителско име по подразбиране за нови записи</string>
<string name="saving_database">Записване на база данни...</string>
<string name="exporting_database">Експортиране на база данни...</string>
<string name="export_database_successful">Базата данни е експортирана!</string>
<string name="space">Пространство</string>
<string name="search_label">Търсене</string>
<string name="show_password">Покажи паролата</string>
<string name="sort_menu">Сортирай по...</string>
<string name="sort_name">Сортиране по име</string>
<string name="sort_db">Сортирай по дата на създаване</string>
<string name="sort_moddate">Сортирай по дата на модификация</string>
<string name="sort_default">Запази ред по подразбиране</string>
<string name="special">Специални</string>
<string name="search_hint">Търси</string>
<string name="search_results">Резултати от търсенето</string>
<string name="search_in">Търсене в</string>
<string name="select_other_entry">Изберете друг запис</string>
<string name="select_group_then_add">Отворете желаната група, след което натиснете \"%1$s\"!</string>
<string name="insert_element_here">Вмъкни тук</string>
<string name="twofish">Twofish</string>
<string name="underline">Подчертаване</string>
<string name="unsupported_db_version">Неподдържана версия на базата данни.</string>
<string name="uppercase">Главни букви</string>
<string name="warning_read_only">Sd картата е само за четене. Може да не успеете да запазите промените във вашата база данни.</string>
<string name="warning_unmounted">Sd картата не е монтирана в момента на вашето устройство. Вие няма да можете да заредите или да създадете вашата база данни.</string>
<string name="version_label">Версия</string>
<string name="version_history">Хронология на версиите</string>
<string name="author">Keepass2Android е разработена от Philipp Crocoll.</string>
<string name="further_authors">Благодарение на девелопера %1$s.</string>
<string name="designers">Благодарение на иконата и оформлението дизайн вноски от %1$s.</string>
<string name="credit_plugin1">Twofish шифър плъгина за Keepass е разработен от Скот Грийнбърг и е включен в KP2A.</string>
<string name="credit_android_filechooser">Android-filechooser е разработена от Хай бизони</string>
<string name="credit_keyboard">KP2A клавиатурата се основава на Gingerbread клавиатурата от андроида отворен източник на проект и използва плъгин мениджър кода от клавиатурата на хакер от Клаус Weidner.</string>
<string name="please_note">Моля, обърнете внимание</string>
<string name="contributors">Сътрудници</string>
<string name="regular_expression">Регулярен израз</string>
<string name="TanExpiresOnUse_title">Тан изтича на използване</string>
<string name="TanExpiresOnUse_summary">Отбележи TAN записите с изтекъл срок при използването им</string>
<string name="ShowUsernameInList_title">Показвано име в списъка</string>
<string name="ShowUsernameInList_summary">Показване на потребителските имена под заглавията. Полезно за няколко сметки или TAN-а</string>
<string name="RememberRecentFiles_title">Запомни базите данни</string>
<string name="RememberRecentFiles_summary">Запомни последно отваряните бази данни ги показвай в екрана на отворената база данни.</string>
<string name="kp2a_findUrl">Keepass2Android: Намери парола</string>
<string name="excludeExpiredEntries">Изключи изтеклите записи</string>
<string name="search_options">Опции</string>
<string name="caseSensitive">Има разлика за голям-малък шрифт</string>
<string name="start_open_file">Отваряне на файл...</string>
<string name="start_create">Създаване на нова база данни...</string>
<string name="start_open_url">Отваряне на URL...</string>
<string name="start_create_import">Импортира файл в нова база данни</string>
<string name="enter_filename_details_url">Пълен URL адрес трябва да се зададе, включително протокол като http://.</string>
<string name="enter_filename_details_create_import">Файла за импортиране ще бъде избран в следващата стъпка.</string>
<string name="enable_quickunlock">Включете опцията \"Бързо отключване\"</string>
<string name="QuickUnlock_label">Въведете последните %1$d символа от вашата парола:</string>
<string name="QuickUnlock_button">Бързо отключване!</string>
<string name="QuickUnlock_lockButton">Затвори базата данни</string>
<string name="QuickUnlockDefaultEnabled_title">Включи Бързо отключване по подразбиране</string>
<string name="QuickUnlockDefaultEnabled_summary">Определя дали Бързо отключване е включено по подразбиране или не.</string>
<string name="ViewDatabaseSecure_title">Защити показването на базата данни</string>
<string name="ViewDatabaseSecure_summary">Ако е включено, снимките на екрана са блокирани и превюто на програмата не се показва в текущите работещи приложения</string>
<string name="QuickUnlockIconHidden_title">Скрий иконата за Бързо отключване</string>
<string name="QuickUnlockIconHidden_summary">Бързо отключване за съжаление не работи без да се показва нотификационна икона. Изберете тази опция за да използвате прозрачна икона.</string>
<string name="QuickUnlockIconHidden16_title">Скрий иконата за Бързо отключване</string>
<string name="QuickUnlockIconHidden16_summary">QuickUnlock изисква уведомяване за да работи правилно. Изберете тази опция за показване на уведомление без икона.</string>
<string name="QuickUnlockLength_title">Дължина на ключа за Бързо отключване</string>
<string name="QuickUnlockLength_summary">Максимален брой знаци използвани като парола за Бързо отключване.</string>
<string name="QuickUnlock_fail">Бързо отключване НЕУСПЕШНО: невярна парола!</string>
@ -146,6 +254,8 @@
<string name="SaveAttachmentDialog_open">Запази в кеша и отвори</string>
<string name="SaveAttachment_doneMessage">Файла е запазен в %1$s.</string>
<string name="SaveAttachment_Failed">Не може да запази приложения файл в %1$s.</string>
<string name="AddUrlToEntryDialog_title">Запомни текста за търсене?</string>
<string name="AddUrlToEntryDialog_text">Искате ли да съхраните търсения текст \"%1$s\" в избрания запис, за да го намерите автоматично следващия път?</string>
<string name="error_invalid_expiry_date">Невалиден формат за дата/време за изтекла дата!</string>
<string name="error_string_key">Име на полето е задължително за всеки стринг.</string>
<string name="field_name">Име на полето</string>
@ -161,6 +271,13 @@
<string name="UseFileTransactions_summary">Използвай тракзакция на файлове за записване на бази данни</string>
<string name="LockWhenScreenOff_title">Заключи когато изкл.екрана</string>
<string name="LockWhenScreenOff_summary">Заключи базата данни когато се изкл.екрана.</string>
<string name="ClearPasswordOnLeave_title">Изчиства въведената главна парола</string>
<string name="ClearPasswordOnLeave_summary">Изчиства въведената главна парола ако напуснете екрана без отключване на базата данни</string>
<string name="LockWhenNavigateBack_title">Заключване при излизане от приложението</string>
<string name="LockWhenNavigateBack_summary">Заключване на базата данни при излизане от приложението чрез натискане на бутона за връщане назад.</string>
<string name="NoDonateOption_title">Скрий опцията за дарения</string>
<string name="NoDonateOption_summary">Тази настройка е за дарители. Тя е достъпна след използване на Keepass2Android за известно време.</string>
<string name="NoDonateOption_question">Без дарения това приложение не може да съществува и няма да се подобрява непрекъснато! Ако сте все още не сте дарили, моля обмислете да го направите сега.</string>
<string name="UseOfflineCache_title">Кеширане на базатаданни</string>
<string name="UseOfflineCache_summary">Запази копие на отдалечената база данни в кеф папката. Това позволява да се използва отдалечена база данни когато сте офлайн.</string>
<string name="AcceptAllServerCertificates_title">SSL сертификати</string>
@ -168,4 +285,60 @@
<string name="ClearOfflineCache_title">Изчисване на кеша?</string>
<string name="ClearOfflineCache_question">Това ще изтрие всички кефирани бази данни. Всички промени докато сте били офлайн които не са синхронизиране ще бъдат изгубени! Продължаване?</string>
<string name="CheckForFileChangesOnSave_title">Провери за промени</string>
<string name="CheckForFileChangesOnSave_summary">Проверява дали файлът е променен външно преди записване на промените.</string>
<string name="CheckForDuplicateUuids_title">Проверка за дублирани UUID</string>
<string name="CheckForDuplicateUuids_summary">Проверете дали файлът на базата данни е повреден от наличието на множество записи със същия ИД. Това може да доведе до неочаквано поведение.</string>
<string name="ShowCopyToClipboardNotification_title">Уведомления от клипборда</string>
<string name="ShowCopyToClipboardNotification_summary">Направи достъпни чрез лентата за уведомление и клипборда потребителското име и парола. Пазете се прехващачи на пароли!</string>
<string name="ShowSeparateNotifications_title">Отделни уведомления</string>
<string name="ShowSeparateNotifications_summary">Показвай отделни съобщения за копиране на потребителско име и парола към clipboard и активиране от клавиатурата.</string>
<string name="ShowKp2aKeyboardNotification_title">KP2A клавиатура уведомяване</string>
<string name="ShowKp2aKeyboardNotification_summary">Направете пълния запис достъпен чрез KP2A клавиатурата (препоръчва се).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Превключване на клавиатурата</string>
<string name="OpenKp2aKeyboardAutomatically_summary">Отвори диалог за избор на клавиатура когато стойност е налична през KP2A клавиатура след търсене от браузъра.</string>
<string name="kp2a_switch_rooted">Автоматично превключване при рутнати устройства</string>
<string name="kp2a_switch_rooted_summary">Автоматично превключване към KP2A клавиатура, когато записът е отворен. Изисква рут достъп и Secure Settings приложение със System+. </string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_title">Автоматично превключване само след търсене</string>
<string name="AskOverwriteBinary_yes">Презаписване</string>
<string name="AskOverwriteBinary_no">Преименувай</string>
<string name="AttachFailed">Неуспешно добавяне на прикачен файл.</string>
<string name="RecycleBin">Кошче</string>
<string name="AskDeletePermanentlyEntry">Искате ли да изтриете този елемент окончателно? Натиснете не за рециклиране.</string>
<string name="AskDeletePermanentlyGroup">Искате ли да изтриете този елемент окончателно? Натиснете не за рециклиране.</string>
<string name="AskDeletePermanently_title">Изтриване завинаги?</string>
<string name="AskReloadFile_title">Презареди файла?</string>
<string name="AskReloadFile">Файла който е отворен в момента е променен от друга програма. Искате ли да го презареди?</string>
<string name="DuplicateUuidsError">Базата данни е повредена: дубликат идентификатори намерени. (Знаете запишете с Minikeepass?) Моля да импортирате отново в нова база данни с Keepass 2 за PC и изберете \"Създай нов ИД\".</string>
<string name="DuplicateUuidsErrorAdditional">Можете да забраните това съобщение за грешка в приложението настройки/настройки/файл обработка/проверка за дублирани UUID. Моля, обърнете внимание, че е възможно да имате неочаквано поведение. Препоръчително е да се определи на базата данни.</string>
<string name="synchronize_database_menu">Синхронизиране на базата данни...</string>
<string name="CannotMoveGroupHere">Може да преместите група към тази група.</string>
<string name="donate_question">Днес тя е Октоберфест! Ако ви харесва Keepass2Android: днес няма да бъде един добър ден да ми купи една бира?</string>
<string name="donate_bday_question">10 май? Това е моят рожден ден! Ако ви харесва този ап, защо не ми изпратите някои рожден ден Поздрави заедно с малък подарък за рождения ден? Това наистина ще ме направи щастлив! :-)</string>
<string name="donate_missedbday_question">О ти пропусна моя рожден ден на 10 май! Ако ви харесва този ап, защо не да ми изпратите някои рожден ден поздравления и малко подарък? Все още не е твърде късно, за да ме направи щастлив! :-)</string>
<string name="ok_donate">Кажи ми повече!</string>
<string name="no_thanks">Не, не ми харесва толкова много</string>
<string name="hint_sftp_host">host (ex: 192.168.0.1)</string>
<string name="hint_sftp_port">порт</string>
<string name="initial_directory">Начална директория (по избор):</string>
<string name="enter_sftp_login_title">Въведете SFTP входните данни:</string>
<string name="select_storage_type">Изберете типа на съхранение:</string>
<string name="filestoragename_file">Локален файл</string>
<string name="filestoragename_androidget">Получи от трети партия app</string>
<string name="filestoragename_androidsend">Изпрати на трети партия app</string>
<string name="filestoragename_ftp">FTP</string>
<string name="filestoragename_http">HTTP (WebDav)</string>
<string name="filestoragename_https">HTTPS (WebDav)</string>
<string name="filestoragename_dropbox">Dropbox</string>
<string name="filestoragename_dropboxKP2A">Dropbox (KP2A папка)</string>
<string name="filestoragehelp_dropboxKP2A">Ако не искате да дадете KP2A достъп до пълен живея, можете да изберете тази опция. Тя ще поиска достъп само до папката приложения/Keepass2Android. Това е особено подходящ, когато създавате нова база данни. Ако вече имате база данни, щракнете върху тази опция, за да създаде папката, след което поставете вашия файл в папката (от вашия компютър) и след това изберете тази опция отново за отваряне на файла.</string>
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_skydrive">OneDrive</string>
<string name="filestoragename_sftp">SFTP (SSH прехвърляне на файлове)</string>
<string name="filestorage_setup_title">Файла достъп инициализация</string>
<string name="database_location">Database местоположение</string>
<string name="help_database_location">Можете да съхранявате вашата база данни локално на вашето устройство Android или в облака (не офлайн версия само). Keepass2Android предоставя базата данни, дори ако сте офлайн. Тъй като базата данни е сигурно криптирани с AES 256 bit криптиране, никой няма да може да получите достъп до паролите ви освен вас. Препоръчваме да изберете Dropbox: тя е достъпна на всичките ви устройства и дори дава гръб на предишни версии на файлове.</string>
<string name="hint_database_location">Изберете къде искате да съхранявате в базата данни:</string>
<string name="button_change_location">Промяна на местоположението</string>
<string name="master_password">Главна парола</string>
<string name="help_master_password">Вашата база данни е шифрована с парола, въведете тук. Изберете сигурна парола за да се запази базата данни безопасно! Съвет: Съставляват едно изречение или две и въведете първите букви на думите като парола. Включете препинателни знаци.</string>
</resources>

View File

@ -24,7 +24,7 @@
<string name="app_timeout_summary">Temps abans de bloquejar la base de dades quan l\'applicació està inactiva.</string>
<string name="kill_app_label">Matar el procés d\'aplicació</string>
<string name="show_kill_app">Botó de tancament</string>
<string name="show_kill_app_summary">Mostra, un botó a la pantalla de contrasenya per matar el procés d\'aplicació (per a usuaris paranoics)</string>
<string name="show_kill_app_summary">Mostra un botó a la pantalla de contrasenya per matar el procés d\'aplicació (per a usuaris paranoics)</string>
<string name="application">Aplicació</string>
<string name="application_settings">Paràmetres de l\'aplicació</string>
<string name="ShowGroupnameInSearchResult_title">Mostra el nom de grup en el resultat de la cerca</string>
@ -32,9 +32,9 @@
<string name="NavigationToGroupCompleted_message">Grup mostrat ara: %1$s</string>
<string name="ShowGroupInEntry_title">Mostra el nom de grup en vista d\'entrada</string>
<string name="unknown_uri_scheme">Em sap greu! Keepass2Android no pot manejar les tornades URI %1$s. Si us plau, contacta amb el desenvolupador!</string>
<string name="security_prefs">Securetat</string>
<string name="security_prefs">Seguretat</string>
<string name="display_prefs">Mostrar</string>
<string name="password_access_prefs">Accés amb d\'entrada de contrasenya</string>
<string name="password_access_prefs">Accés amb entrada de contrasenya</string>
<string name="QuickUnlock_prefs">Desbloqueig ràpid</string>
<string name="FileHandling_prefs">Gestor d\'arxius</string>
<string name="keyboard_prefs">Teclat</string>
@ -65,6 +65,7 @@
<string name="digits">Dígits</string>
<string name="disclaimer_formal">Keepass2Android ve SENSE CAP MENA DE GARANTIA; Això és programari lliure, i pots redistribuïr-lo sota els termes de la llicència GPL versió 2 o posterior.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copiar al portapapers</string>
<string name="enter_filename">Introdueix el nom de la base de dades</string>
<string name="entry_accessed">Accedida</string>
<string name="entry_cancel">Cancel·la</string>
@ -123,11 +124,14 @@
<string name="invalid_algorithm">Algoritme invàlid.</string>
<string name="invalid_db_sig">Format de base de dades desconegut.</string>
<string name="keyfile_does_not_exist">Arxiu clau no existeix.</string>
<string name="no_keyfile_selected">Cap arxiu clau de seleccionat.</string>
<string name="keyfile_is_empty">Arxiu clau és buit.</string>
<string name="length">Longitud</string>
<string name="list_size_title">Mida de la llista de grups</string>
<string name="list_size_summary">Mida del text a la llista de grups</string>
<string name="loading_database">Carregant base de dades&#8230;</string>
<string name="lowercase">Minúscules</string>
<string name="MaskedPassword">*****</string>
<string name="maskpass_title">Emmascara contrasenya</string>
<string name="maskpass_summary">Amaga les contrasenyes per defecte</string>
<string name="menu_about">Sobre</string>
@ -138,15 +142,23 @@
<string name="menu_app_settings">Paràmetres</string>
<string name="menu_db_settings">Paràmetres de la base de dades</string>
<string name="menu_delete">Esborra</string>
<string name="menu_move">Moure a un altre grup</string>
<string name="menu_move_light">Moure</string>
<string name="menu_navigate">Navegui al grup superior</string>
<string name="menu_donate">Donar una cervesa...</string>
<string name="menu_edit">Editar</string>
<string name="menu_hide_password">Amaga contrasenya</string>
<string name="menu_lock">Bloqueja la base de dades</string>
<string name="menu_open">Obre</string>
<string name="menu_rename">Reanomena</string>
<string name="menu_search">Cerca</string>
<string name="menu_search_advanced">Cerca avançada</string>
<string name="menu_url">Ves a la URL</string>
<string name="menu_change_db">Canvi de base de dades&#8230;</string>
<string name="minus">Menys</string>
<string name="never">Mai</string>
<string name="yes"></string>
<string name="no">No</string>
<string name="no_keys">Sense entrades a la base de dades o grup.</string>
<string name="no_results">Cap resultat de cerca</string>
<string name="no_url_handler">Sense gestor per aquesta url.</string>
@ -155,42 +167,349 @@
<string name="omitbackup_summary">Omet els grups \'Còpia de seguretat\' i paperera dels resultats de cerca</string>
<string name="pass_filename">Nom de base de dades KeePass</string>
<string name="password_title">Introdueix contrasenya de la base de dades</string>
<string name="master_key_type">Seleccioneu el tipus de clau mestra:</string>
<string name="progress_create">Creant nova base de dades&#8230;</string>
<string name="create_database">Crear base de dades</string>
<string name="progress_title">Treballant&#8230;</string>
<string name="remember_keyfile_summary">Recorda la localització d\'arxius clau</string>
<string name="remember_keyfile_title">Guarda arxiu clau</string>
<string name="remove_from_filelist">Elimina</string>
<string name="rijndael">Rijndael (AES)</string>
<string name="root">Arrel</string>
<string name="rounds">Passades d\'encriptació</string>
<string name="rounds_explaination">Més passades d\'encriptació dónen protecció adicional contra atacs de força bruta, però poden alentir molt carregar i guardar la base de dades.</string>
<string name="rounds_hint">passades</string>
<string name="database_name">Nom de la base de dades</string>
<string name="default_username">Nom d\'usuari per defecte per noves entrades</string>
<string name="saving_database">Guardant la base de dades&#8230;</string>
<string name="exporting_database">Exportant la base de dades&#8230;</string>
<string name="export_database_successful">Base de dades exportada amb èxit!</string>
<string name="space">Espai</string>
<string name="search_label">Cerca</string>
<string name="show_password">Mostra contrasenya</string>
<string name="sort_menu">Ordena per...</string>
<string name="sort_name">Ordena per nom</string>
<string name="sort_db">Ordenació de base de dades</string>
<string name="sort_moddate">Ordenar per data modificació</string>
<string name="sort_default">Mantenir l\'ordre per defecte</string>
<string name="special">Especial</string>
<string name="search_hint">Trobar el que</string>
<string name="search_results">Resultats de cerca</string>
<string name="search_in">Cerca a</string>
<string name="select_other_entry">Selecciona una altra entrada</string>
<string name="select_group_then_add">Obrir el grup desitjat i prémer \"%1$s\"!</string>
<string name="insert_element_here">Inserir aquí</string>
<string name="twofish">Twofish</string>
<string name="underline">Subratllat</string>
<string name="unsupported_db_version">Versió de la base de dades no suportada.</string>
<string name="uppercase">Majúscules</string>
<string name="warning_read_only">La teva tarja SD és de només lectura. No podràs guardar canvis a la teva base de dades.</string>
<string name="warning_unmounted">La teva tarja SD no està muntada al teu dispositiu. No podràs carregar ni guardar una base de dades.</string>
<string name="version_label">Versió</string>
<string name="version_history">Historial de versions</string>
<string name="author">Keepass2Android és desenvolupat per Philipp Crocoll.</string>
<string name="further_authors">Gràcies a les aportacions de codi de %1$s.</string>
<string name="designers">Gràcies a les aportacions de disseny icona i disseny per %1$s.</string>
<string name="credit_plugin1">El Plugin de xifratge Twofish per Keepass va ser desenvolupat per Scott Greenberg i està inclòs en KP2A.</string>
<string name="credit_android_filechooser">androide-filechooser va ser desenvolupat per Hai bisó</string>
<string name="credit_keyboard">El teclat de l\'KP2A es basa en el teclat de Gingerbread del projecte de font oberta Android i utilitza el codi del Gesto de Conectors del teclat Hacker per Klaus Weidner.</string>
<string name="please_note">Tingueu en compte</string>
<string name="contributors">Contribuïdors</string>
<string name="regular_expression">Expressió regular</string>
<string name="TanExpiresOnUse_title">TAN expira en ús</string>
<string name="TanExpiresOnUse_summary">Marca entrades TAN caducades quan siguin utilitzades</string>
<string name="ShowUsernameInList_title">Mostra nom d\'usuari en llista</string>
<string name="ShowUsernameInList_summary">Mostrar noms d\'usuari sota títols d\'entrada. Útil per a comptes múltiples o TANs.</string>
<string name="RememberRecentFiles_title">Recordeu les bases de dades</string>
<string name="RememberRecentFiles_summary">Recordeu les bases de dades recentment obertes i mostrar-les en la pantalla de d\'obrir base de dades.</string>
<string name="kp2a_findUrl">Keepass2Android: Localitzar contrasenya</string>
<string name="excludeExpiredEntries">Excloure les entrades caducats</string>
<string name="search_options">Opcions</string>
<string name="caseSensitive">Majúscules i minúscules</string>
<string name="start_open_file">Obrir arxiu...</string>
<string name="start_create">Crear base de dades nova...</string>
<string name="start_open_url">Obrir URL...</string>
<string name="start_create_import">Importar fitxer a nova base de dades...</string>
<string name="enter_filename_details_url">Cal especificar l\'URL complet incloent protocol com http://.</string>
<string name="enter_filename_details_create_import">En el següent pas serà seleccionat fitxer que voleu importar.</string>
<string name="enable_quickunlock">Permetre QuickUnlock</string>
<string name="QuickUnlock_label">Introduir últims %1$d caràcters de la seva contrasenya:</string>
<string name="QuickUnlock_button">QuickUnlock!</string>
<string name="QuickUnlock_lockButton">Tancar base de dades</string>
<string name="QuickUnlockDefaultEnabled_title">Permetre QuickUnlock per defecte</string>
<string name="QuickUnlockDefaultEnabled_summary">Defineix si QuickUnlock està habilitada per defecte o no.</string>
<string name="ViewDatabaseSecure_title">Protegir l\'exhibició de base de dades</string>
<string name="ViewDatabaseSecure_summary">Si està activat, no s\'admeten cap captura de pantalla i cap miniatura de l\'aplicació es mostra a la llista d\'aplicacions recents.</string>
<string name="QuickUnlockIconHidden_title">Amagar icona de QuickUnlock</string>
<string name="QuickUnlockIconHidden_summary">Malauradament QuickUnlock no funciona sense mostrar una icona de notificació. Seleccioneu aquesta opció per utilitzar una icona transparent.</string>
<string name="QuickUnlockIconHidden16_title">Amagar icona de QuickUnlock</string>
<string name="QuickUnlockIconHidden16_summary">QuickUnlock requereix una notificació per treballar pròpiament. Seleccioneu aquesta opció per mostrar una notificació sense una icona.</string>
<string name="QuickUnlockLength_title">Longitud de clau QuickUnlock</string>
<string name="QuickUnlockLength_summary">Nombre màxim de caràcters utilitzats com a contrasenya de QuickUnlock.</string>
<string name="QuickUnlock_fail">QuickUnlock ha fallat: Contrasenya incorrecta!</string>
<string name="BinaryDirectory_title">Directori d\'arxius adjunts</string>
<string name="BinaryDirectory_summary">Directori on es guarden els fitxers adjunts.</string>
<string name="SaveAttachmentDialog_title">Deseu el fitxer adjunt</string>
<string name="SaveAttachmentDialog_text">Si us plau seleccioneu on voleu desar el fitxer adjunt.</string>
<string name="SaveAttachmentDialog_save">Desar a la targeta SD</string>
<string name="SaveAttachmentDialog_open">Desa a la memòria cau i obre</string>
<string name="SaveAttachment_doneMessage">Desat l\'arxiu a %1$s.</string>
<string name="SaveAttachment_Failed">No s\'ha pogut desar el fitxer adjunt a %1$s.</string>
<string name="AddUrlToEntryDialog_title">Recordeu el text de cerca?</string>
<string name="AddUrlToEntryDialog_text">Voleu emmagatzemar text de la cerca \"%1$s\" a l\'entrada seleccionada per tal de trobar-lo automàticament la propera vegada?</string>
<string name="error_invalid_expiry_date">Format de data/hora no vàlid per a la data de caducitat!</string>
<string name="error_string_key">Cal un nom de camp per a cada cadena.</string>
<string name="field_name">Nom del camp</string>
<string name="field_value">Valor del camp</string>
<string name="protection">Camp protegit</string>
<string name="add_binary">Afegir el fitxer adjunt...</string>
<string name="add_extra_string">Afegir la cadena addicional</string>
<string name="delete_extra_string">Suprimir la corda addicional</string>
<string name="database_loaded_quickunlock_enabled">%1$s: bloquejat. QuickUnlock activat.</string>
<string name="database_loaded_unlocked">%1$s: desbloquejat.</string>
<string name="credentials_dialog_title">Introduïu les credencials del servidor</string>
<string name="UseFileTransactions_title">Operacions d\'arxiu</string>
<string name="UseFileTransactions_summary">Utilitzar les operacions d\'arxiu per escriure les bases de dades</string>
<string name="LockWhenScreenOff_title">Bloqueja quan la pantalla s\'apagui</string>
<string name="LockWhenScreenOff_summary">Bloqueja la base de dades quan la pantalla s\'apagi.</string>
<string name="ClearPasswordOnLeave_title">Esborra la contrasenya mestra introduïda</string>
<string name="ClearPasswordOnLeave_summary">Esborra la contrasenya mestra introduïda en deixar la pantalla sense obrir la base de dades.</string>
<string name="LockWhenNavigateBack_title">Bloqueja quan surtis de l\'aplicació</string>
<string name="LockWhenNavigateBack_summary">Tancar la base de dades en deixar l\'aplicació prement el botó endarrere.</string>
<string name="NoDonateOption_title">Amagar l\'opció de donació</string>
<string name="NoDonateOption_summary">Aquesta configuració és pels donants. Està disponible després d\'utilitzar Keepass2Android durant un temps només.</string>
<string name="NoDonateOption_question">Sense les donacions, aquest aplicació no existiria i no milloraria contínuament! Si vostè encara no ha donat, si us plau consideri fer una donació ara.</string>
<string name="UseOfflineCache_title">Posant en memòria cau la base de dades</string>
<string name="UseOfflineCache_summary">Manté una còpia de la base de dades remota en el directori de memòria cau de l\'aplicació. Això permet utilitzar bases de dades remotes fins i tot quan esteu fora de línia.</string>
<string name="AcceptAllServerCertificates_title">Certificats SSL</string>
<string name="AcceptAllServerCertificates_summary">Defineix el comportament quan fracassa validació de certificat. Nota: podeu instal·lar certificats en el dispositiu si fracassa la validació!</string>
<string name="ClearOfflineCache_title">Neteja la memòria cau?</string>
<string name="ClearOfflineCache_question">Se suprimiran tots els arxius de base de dades en memòria cau. Els canvis que heu realitzat mentre sou fora de línia i que encara no han estat sincronitzat es perdran! Voleu continuar?</string>
<string name="CheckForFileChangesOnSave_title">Comprovar per modificacions</string>
<string name="CheckForFileChangesOnSave_summary">Comprovar si l\'arxiu va ser modificat externament abans de desar els canvis.</string>
<string name="CheckForDuplicateUuids_title">Comprovar per duplicats de UUIDs</string>
<string name="CheckForDuplicateUuids_summary">Comprova si l\'arxiu de base de dades és corrupte mirant si te diverses entrades amb el mateix identificador. Això podria provocar comportaments inesperats.</string>
<string name="ShowCopyToClipboardNotification_title">Notificacions de porta-retalls</string>
<string name="ShowCopyToClipboardNotification_summary">Fer l\'usuari i contrasenya accessible a través de la barra de notificació i porta-retalls. Compte amb sniffers de contrasenya!</string>
<string name="ShowSeparateNotifications_title">Notificacions independents</string>
<string name="ShowSeparateNotifications_summary">Mostrar les notificacions separades per copiar el nom d\'usuari i contrasenya al porta-retalls i activant el teclat.</string>
<string name="ShowKp2aKeyboardNotification_title">Notificació de teclat KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Fes entrada totalment accessible a través del teclat KP2A (recomanat).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Canvi de teclat</string>
<string name="OpenKp2aKeyboardAutomatically_summary">Diàleg de selecció de teclat obert quan l\'entrada està disponible a través de teclat KP2A després de cerca del navegador.</string>
<string name="kp2a_switch_rooted">Canvi automàtic en dispositius amb accés de superusuari (root)</string>
<string name="kp2a_switch_rooted_summary">Canvia automàticament a KP2A teclat quan s\'obre la entrada. Requereix accés superusuari (root) i l\'aplicació Secure Settings amb System+. </string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_title">Canvi automàtic només després de cerca</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_summary">Només canvia automàticament a KP2A teclat després d\'utilitzar la funció de compartir URL (però no en obrir una entrada d\'una altra manera)</string>
<string name="AutoSwitchBackKeyboard_title">Torna a canviar el teclat</string>
<string name="AutoSwitchBackKeyboard_summary">Canviar altra vegada a teclat previ quan no s\'obre cap entrada.</string>
<string name="ShowUnlockedNotification_title">Icona de notificació mentre estigui desbloquejat</string>
<string name="ShowUnlockedNotification_summary">Mostra una icona de notificació mentre la base de dades està desbloquejada.</string>
<string name="PreloadDatabaseEnabled_title">Pre-carregar el fitxer de base de dades</string>
<string name="PreloadDatabaseEnabled_summary">Comença carregant de fons o descàrrega de l\'arxiu de base de dades durant l\'entrada de contrasenya d\'inici.</string>
<string name="AskOverwriteBinary">Voleu sobreescriure el binari existent amb el mateix nom?</string>
<string name="AskOverwriteBinary_title">Voleu sobreescriure binari existent?</string>
<string name="AskOverwriteBinary_yes">Sobreescriure</string>
<string name="AskOverwriteBinary_no">Canvia el nom</string>
<string name="AttachFailed">No s\'ha pogut afegir el fitxer adjunt.</string>
<string name="RecycleBin">Paperera de reciclatge</string>
<string name="AskDeletePermanentlyEntry">Voleu suprimir permanentment aquesta entrada? Prem No per reciclar.</string>
<string name="AskDeletePermanentlyGroup">Voleu suprimir permanentment aquesta entrada? Prem No per reciclar.</string>
<string name="AskDeletePermanently_title">Suprimeix permanentment?</string>
<string name="AskReloadFile_title">Recarregar fitxer?</string>
<string name="AskReloadFile">L\'arxiu que és actualment obert es va canviar per un altre programa. Voleu actualitzar-lo?</string>
<string name="AskDiscardChanges">Voleu descartar els canvis fets realment? (El botó de salvar és a la part superior del formulari.)</string>
<string name="AskDiscardChanges_title">Descarta els canvis?</string>
<string name="suggest_improvements">Suggerir o votar per millores</string>
<string name="rate_app">Valora aquesta app</string>
<string name="translate_app">Traduir KP2A</string>
<string name="AddingEntry">Afegir entrada&#8230;</string>
<string name="AddingGroup">Afegir grup&#8230;</string>
<string name="DeletingEntry">Suprimint l\'entrada&#8230;</string>
<string name="DeletingGroup">Suprimint grup&#8230;</string>
<string name="SettingPassword">Fixar contrasenya&#8230;</string>
<string name="UndoingChanges">Desfer els canvis&#8230;</string>
<string name="TransformingKey">Transformant la clau mestra&#8230;</string>
<string name="DecodingDatabase">Descodificant la base de dades&#8230;</string>
<string name="ParsingDatabase">Anàlisi de base de dades&#8230;</string>
<string name="CheckingTargetFileForChanges">Comprovació fitxer de destinació per canvis&#8230;</string>
<string name="TitleSyncQuestion">Combina els canvis?</string>
<string name="MessageSyncQuestion">L\'arxiu de base de dades es va modificar externament. Voleu carregar i fusionar els canvis abans de desar? Seleccioneu No si voleu sobreescriure els canvis externs.</string>
<string name="SynchronizingDatabase">Fusionant canvis&#8230;</string>
<string name="YesSynchronize">Sí, fusionar</string>
<string name="NoOverwrite">No, sobreescriure</string>
<string name="SynchronizingCachedDatabase">Sincronitzar la base de dades en memòria cau&#8230;</string>
<string name="DownloadingRemoteFile">Descarregar fitxer remot&#8230;</string>
<string name="UploadingFile">Carregant arxiu&#8230;</string>
<string name="RestoringRemoteFile">Restaurant fitxer remot&#8230;</string>
<string name="FilesInSync">Els arxius estan sincronitzats.</string>
<string name="SynchronizedDatabaseSuccessfully">Base de dades se sincronitzada amb èxit!</string>
<string name="CheckingDatabaseForChanges">Comprovació de la base de dades per canvis&#8230;</string>
<string name="CouldNotSaveToRemote">No s\'ha pogut desar a remot: %1$s. Torneu a desar o utilitzeu el menú sincronitza quan la connexió remota estigui disponible una altra vegada.</string>
<string name="CouldNotLoadFromRemote">No es pot obrir remot: %1$s. Carregat el fitxer de memòria cau local. Encara podeu fer canvis a la base de dades i sincronitzar-los més tard.</string>
<string name="UpdatedRemoteFileOnLoad">Actualitzat fitxer remot.</string>
<string name="NotifyOpenFromLocalDueToConflict">Obert arxiu local degut al conflicte amb els canvis en el fitxer remot. Fes servir menú de Sincronitzar per fusionar.</string>
<string name="LoadedFromRemoteInSync">Fitxer remot i memòria cau estan sincronitzats.</string>
<string name="UpdatedCachedFileOnLoad">Actualitzat la còpia de la memòria cau local de %1$s.</string>
<string name="RemoteDatabaseUnchanged">No s\'han detectat canvis.</string>
<string name="ResolvedCacheConflictByUsingRemoteOtpAux">Actualitzada memòria cau del fitxer auxiliar OTP: Comptador remot era més alt.</string>
<string name="ResolvedCacheConflictByUsingLocalOtpAux">Actualitzada memòria cau del fitxer auxiliar OTP: Comptador local era més alt.</string>
<string name="SynchronizingOtpAuxFile">S\'estan sincronitzant els fitxers auxiliars OTP&#8230;</string>
<string name="database_file">l\'arxiu de base de dades</string>
<string name="otp_aux_file">Arxiu auxiliar OTP</string>
<string name="ErrorOcurred">Sha produït un error:</string>
<string name="DuplicateUuidsError">Base de dades és corrupte: identificadors duplicats trobats. (Vols guardar-ho amb Minikeepass?) Si us plau, torneu a importar a una nova base de dades amb Keepass 2 per a PC i seleccioneu \"Crea un nou ID\".</string>
<string name="DuplicateUuidsErrorAdditional">Podeu desactivar aquest missatge d\'error en Configuració/Configuració d\'aplicacions/Gestor d\'arxius/Comprova UUIDS duplicats. Tingueu en compte que vostè pot experimentar comportaments inesperats. Es recomana arreglar la base de dades.</string>
<string name="synchronize_database_menu">Sincronitzar la base de dades&#8230;</string>
<string name="CannotMoveGroupHere">No es pot desplaçar el grup a aquest grup.</string>
<string name="donate_question">Avui és Oktoberfest! Si t\'agrada Keepass2Android: no seria avui un bon dia per comprar-me una cervesa?</string>
<string name="donate_bday_question">10 de maig? És el meu aniversari! Si t\'agrada aquest aplicació, per què no enviar-me algunes salutacions d\'aniversari amb un petit regal d\'aniversari? Això realment em faria feliç! :-)</string>
<string name="donate_missedbday_question">Ah, et vas perdre el meu aniversari el 10 de maig! Si t\'agrada aquest aplicació, per què no enviar-me algunes salutacions d\'aniversari i un regal d\'aniversari poc? Encara no és massa tard per fer-me feliç! :-)</string>
<string name="ok_donate">Explica\'m més!</string>
<string name="no_thanks">No, no m\'agrada tant</string>
<string name="hint_sftp_host">amfitrió (ex: 192.168.0.1)</string>
<string name="hint_sftp_port">port</string>
<string name="initial_directory">Directori inicial (opcional):</string>
<string name="enter_sftp_login_title">Introduir dades de connexió SFTP:</string>
<string name="select_storage_type">Seleccioneu el tipus d\'emmagatzematge:</string>
<string name="filestoragename_file">Fitxer local</string>
<string name="filestoragename_androidget">Obtenir de l\'aplicació de tercers</string>
<string name="filestoragename_androidsend">Enviar a l\'aplicació de tercers</string>
<string name="filestoragename_ftp">FTP</string>
<string name="filestoragename_http">HTTP (WebDav)</string>
<string name="filestoragename_https">HTTP (WebDav)</string>
<string name="filestoragename_dropbox">Dropbox</string>
<string name="filestoragename_dropboxKP2A">Dropbox (carpeta de KP2A)</string>
<string name="filestoragehelp_dropboxKP2A">Si no voleu donar accés KP2A al seu Dropbox complet, podeu seleccionar aquesta opció. Es sol·licitarà només l\'accés a la carpeta Apps/Keepass2Android. Això és especialment adequat quan es crea una nova base de dades. Si ja teniu una base de dades, feu clic a aquesta opció per crear la carpeta, a continuació, posar el seu arxiu dins la carpeta (des del seu PC) i llavors seleccioni aquesta opció nou per obrir l\'arxiu.</string>
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_skydrive">OneDrive</string>
<string name="filestoragename_sftp">SFTP (SSH Transferència de fitxer)</string>
<string name="filestorage_setup_title">Inicialització d\'accés a arxiu</string>
<string name="database_location">Localització de la base de dades</string>
<string name="help_database_location">Pot emmagatzemar la base de dades local o al seu dispositu Android o en el núvol (només versió fora de línia). Keepass2Android fa la base de dades disponible fins i tot si vostè està fora de línia. La base de dades segura, encriptada amb AES de 256 bits, ningú no podrà accedir a les vostres contrasenyes excepte vostè. Es recomana seleccionar Dropbox: és accessible a tots els seus mecanismes i fins i tot proporciona còpies de seguretat de versions anteriors d\'arxiu.</string>
<string name="hint_database_location">Seleccioneu on voleu emmagatzemar la base de dades:</string>
<string name="button_change_location">Canvia la ubicació</string>
<string name="master_password">Contrasenya mestra</string>
<string name="help_master_password">La base de dades s\'encripta amb la contrasenya que introduïu aquí. Triar una contrasenya forta per tal de mantenir la base de dades segura! Consell: Forma una frase o dues i utilitzar les primeres lletres de les paraules com a contrasenya. Inclou signes de puntuació.</string>
<string name="hint_master_password">Seleccioni una contrasenya mestra per protegir la seva base de dades:</string>
<string name="key_file">Arxiu clau</string>
<string name="help_key_file">Un arxiu clau és bàsicament una contrasenya s\'emmagatzema en un arxiu. Els arxius clau són normalment més forts que les contrasenyes mestres, perquè la clau pot ser molt més complicada; però també és més difícil mantenir el secret. Si emmagatzema la base de dades en el núvol, no emmagatzemi l\'arxiu clau també! Això ho faria completament inútil! Important: No canvieu el contingut del fitxer clau després de crear la base de dades!</string>
<string name="hint_key_file">Trieu si voleu utilitzar un arxiu clau a més de la contrasenya mestra:</string>
<string name="use_key_file">Fes servir la clau</string>
<string name="error_adding_keyfile">Error en afegir l\'arxiu clau!</string>
<string name="init_otp">Càrrega arxiu OTP auxiliar&#8230;</string>
<string name="otp_explanation">Introduïu la següent Contrasenya-d\'un-sol-us (One-time-passwords OTPs). Llisca la teva Yubikey NEO al darrere el seu dispositiu per entrar mitjançant NFC.</string>
<string name="otp_hint">OTP %1$d</string>
<string name="YubiChallengeNotInstalled">No puc trobar un aplicació que pugui manegar el desafiament. Si us plau instal·la Yubichallenge del Google Play.</string>
<string name="CouldntLoadOtpAuxFile">No s\'ha pogut carregar el fitxer OTP auxiliar!</string>
<string name="CouldntLoadOtpAuxFile_Hint">Si us plau, utilitzeu el connector OtpKeyProv de KeePass 2. x (PC) per configurar la base de dades per usar amb OTPs!</string>
<string name="otp_discarded_because_no_db">Seleccioneu primer de base de dades. OTP es descarta per motius de seguretat.</string>
<string name="otp_discarded_no_space">OTP descartat: tots els OTPs ja entrats!</string>
<string name="otp_discarded_because_db_open">Si us plau, tanqueu primer la base de dades. Es descarta OTP.</string>
<string name="otps_pending">(Un o més OTPs ja disponibles)</string>
<string name="otpsecret_hint">OTP secret (p. ex. 01 23 ab cd...)</string>
<string name="CouldntParseOtpSecret">Error passant OTP secret!</string>
<string name="OtpKeyError">No ha pogut crear la clau OTP! Assegureu-vos que ha introduït els OTPs correctes.</string>
<string name="ErrorUpdatingOtpAuxFile">Error actualitzant fitxer OTP auxiliar!</string>
<string name="SavingOtpAuxFile">Salvant arxiu OTP auxiliar&#8230;</string>
<string name="bad_resp">La resposta de desafiament és incorrecte.</string>
<string name="CouldntLoadChalAuxFile">No s\'ha pogut carregar el fitxer de repte auxiliar!</string>
<string name="CouldntLoadChalAuxFile_Hint">Utilitzeu el connector KeeChallenge de KeePass 2. x (PC) per configurar la base de dades per al seu ús amb repte-resposta!</string>
<string name="ErrorUpdatingChalAuxFile">Error actualitzant fitxer OTP auxiliar!</string>
<string name="TrayTotp_SeedField_title">Nom del camp TOTP llavor</string>
<string name="TrayTotp_SeedField_summary">Si està utilitzant el connector de Keepass 2 \"TrayTotp\" amb la configuració de modificada introduïu el nom de camp per al camp llavor aquí segons la configuració en el PC.</string>
<string name="TrayTotp_SettingsField_title">Ajustaments del nom del camp TOTP</string>
<string name="TrayTotp_SettingsField_summary">Introduïu aquí el nom del camp dels ajustaments del camp TrayTotp.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="loading">Carregant&#8230;</string>
<string name="plugins">Connectors</string>
<string name="plugin_packagename">Nom del paquet:</string>
<string name="plugin_description">Descripció (no verificat):</string>
<string name="plugin_author">L\'autor (no verificat):</string>
<string name="plugin_enabled">activat</string>
<string name="plugin_disabled">desactivat</string>
<string name="plugin_web">Trobar connectors en línia</string>
<string name="plugin_scopes">Permisos de nivell</string>
<string name="query_credentials_for_url">%1$s sol·licita credencials per %2$s.</string>
<string name="query_credentials">%1$s sol·licita credencials. Si us plau seleccioni una entrada.</string>
<string name="plugin_enabled_checkbox">Activat</string>
<string name="SCOPE_DATABASE_ACTIONS_title">Notificacions d\'acció de base de dades</string>
<string name="SCOPE_DATABASE_ACTIONS_explanation">El connector avisaran quan una base de dades és oberta, tancada o salvada.</string>
<string name="SCOPE_CURRENT_ENTRY_title">Dades d\'entrada actual</string>
<string name="SCOPE_CURRENT_ENTRY_explanation">El connector rebrà totes les dades sobre l\'entrada de base de dades actual i se li permetrà oferir accions i modificacions de com es mosta aquesta.</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title">Consulta credencials pròpies</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation">El connector permetrà consultar les credencials associades amb el seu propi paquet d\'aplicació.</string>
<string name="SCOPE_QUERY_CREDENTIALS_title">Consulta les credencials</string>
<string name="SCOPE_QUERY_CREDENTIALS_explanation">El connector permetrà a les credencials consultes per a aplicacions o llocs web.</string>
<string name="get_regular_version">Aconseguir més tipus d\'emmagatzematge</string>
<string name="CertificateWarning">Advertència: Ha fallat la validació de certificat de servidor: %1$s. Instal·lar el certificat arrel adequat al vostre dispositiu o consulti els ajustaments!</string>
<string name="CertificateFailure">Error: Validació de certificat de servidor fracassat! Instal·li el certificat arrel adequat al vostre dispositiu o veure configuració!</string>
<string name="export_fileformats_title">Seleccioneu el format de fitxer</string>
<string name="killed_by_os">Em sap greu! Keepass2Android fou matat pel Sistema Operatiu d\'Android! Per motius de seguretat, Keepass2Android no persisteixen les vostres credencials seleccionade al disc, pel que cal tornar a obrir la base de dades. Nota: Això succeeix molt poques vegades. Si ho fa, si us plau envieu-me un missatge a crocoapps@gmail.com.</string>
<string name="FileIsTemporarilyAvailable">L\'arxiu només està disponible temporalment per Keepass2Android.</string>
<string name="FileIsReadOnly">El fitxer que heu seleccionat és només de lectura.</string>
<string name="FileIsReadOnlyOnKitkat">El fitxer que heu seleccionat és només de lectura per a Keepass2Android a causa de restriccions en Android 4.4 +.</string>
<string name="CopyFileRequired">Per utilitzar-lo, haureu de copiar-lo a una altra ubicació.</string>
<string name="CopyFileRequiredForEditing">Per editar-lo, haureu de copiar el fitxer a una altra ubicació.</string>
<string name="ClickOkToSelectLocation">Clic Acceptar per seleccionar una ubicació on cal copiar l\'arxiu.</string>
<string name="CancelReadOnly">Cancel·lar, obrir només de lectura.</string>
<string name="CopyingFile">Copiant el fitxer...</string>
<string name="KdbBetaWarning">Tingueu en compte: que heu carregat una base de dades de Keepass 1. Keepass2Android ha afegit recentment suport d\'escriptura per a aquest format de base de dades. A pesar de les proves, l\'autor no garanteix que totes les dades es guardin correctament. Si us plau sempre mantingueu una còpia de seguretat de la base de dades original (Dropbox automàticament emmagatzema versions recents) abans de fer canvis. Si us plau informeu de qualsevol incidència. Gràcies!</string>
<string name="ChangeLog_title">Registre de canvi</string>
<string name="PreviewWarning">Atenció! Això és un versió prèvia i pot arribar amb alguns defectes! Si vostè experimenta *qualsevol* comportament inesperat, si us plau, faci-m\'ho saber (a Codeplex o per correu electrònic).</string>
<string name="ChangeLog_0_9_7"> Versió 0.9.7\n
* suport per escriure a bases de dades Keepass 1 (kdb) (beta!) \n
* millor canviar a teclat anterior (també treballa en dispositius que no disposin d\'accés de superusuari - rootejats)\n
* suport per a KeeChallenge amb challenges\n de longitud variable\n
* evitar prendre captures de pantalla des de les pantalles de QuickUnlock i contrasenya\n
* ordenació inversa per Ordena per data de modificació (ara descendent) \n
* errors arreglats: vista de notes ara actualitzada correctament després de canvis, vistes de contrasenyes ara amaga contrasenya correctament en (esperançadorament) tots els dispositius, arreglat problema que li permetia afegir una entrada doble , solucionat el problema que mostrava avís de duplicat UUID fins i tot després d\'arreglar la base de dades\n
</string>
<string name="ChangeLog_0_9_6"> Version 0.9.6\n * allow to import key file and/or local database file to app internal directory (see settings)\n * allow different sorting options\n * improved preferences for automatic keyboard switching\n * updated application logo and notification design, design by Stefano Pignataro (http://www.spstudio.at)\n * password generator remembers last settings\n * set notification visibility for Android 5 lock screen\n * now clearing master password field when leaving the app without clicking OK\n * fixed issue with missing input languages in keyboard setting on some devices\n * fixed issue with automatic keyboard switching on rooted devices\n * added check for corrupt databases (duplicate UUIDs)\n * automatically reload database when change detected, solves security concern about revealing master password\n * improved polish small keyboard layout, fixed keyboard settings theme (thanks to Wiktor Ławski)\n </string>
<string name="ChangeLog_0_9_5">
<b>Versió 0.9.5</b> \n * Arreglat problemes amb arxiu de navegació (especialment en Android 4.4) \n * Solucionat el problema amb la càrrega d\'arxius .kdb (Keepass 1) amb el Nexus 5 amb Android Lollipop\n * afegit l\'opció per evitar prendre screenshots/mostrant app a la llista d\'aplicacions recents\n * Solucionat el problema amb Google Drive arxiu d\'emmagatzematge (edició regular) \n * Permeten arxius clau en emmagatzematge deliberada tipus (edició regular) \n * SDK de Dropbox actualitzat per incloure un pedaç de seguretat oficial (edició regular) \n * Actualitzades eines de construcció--&gt; mida dels apk augmentada:-(\ n He promès alguns canvis més. Vindran amb el pròxim llançament- Ho sentim. Volia publicar aquests destrets calents tan aviat com sigui possible.</string>
<string name="ChangeLog_keptDonate">Estesa possibilitat de donar una cervesa o una altra cosa</string>
<string-array name="clipboard_timeout_options">
<item>30 segons</item>
<item>1 minut</item>
<item>5 minuts</item>
<item>10 minutes</item>
<item>15 minutes</item>
<item>30 minutes</item>
<item>1 hour</item>
<item>Never</item>
<item>10 minuts</item>
<item>15 minuts</item>
<item>30 minuts</item>
<item>1hora</item>
<item>Mai</item>
</string-array>
<string-array name="export_fileformat_options">
<item>Base de dades KeePass 2 (.kdbx)</item>
<item>KeePass 2 XML (sense xifrar) (. xml)</item>
<item>KeePass CSV (sense xifrar) (. csv)</item>
</string-array>
<string-array name="list_size_options">
<item>Petita</item>
<item>Mitjana</item>
<item>Gran</item>
</string-array>
<string-array name="design_options">
<item>Holo Clar</item>
<item>Holo Fosc</item>
</string-array>
<string name="design_title">Disseny</string>
<string-array name="cred_remember_modes">
<item>No recordo l\'usuari i contrasenya</item>
<item>Recordar només nom d\'usuari</item>
<item>Recordar nom d\'usuari i contrasenya</item>
</string-array>
<string-array name="password_modes">
<item>Contrasenya només</item>
<item>Contrasenya + arxiu de clau</item>
<item>Contrasenya + OTP</item>
<item>Contrasenya + OTP secret (mode de recuperació)</item>
<item>Contrasenya + repte-resposta</item>
<item>Contrasenya + resposta repte secret (mode de recuperació)</item>
</string-array>
<string-array name="AcceptAllServerCertificates_options">
<item>Ignora els errors de validació de certificat</item>
<item>Avisa quan fracassi validació</item>
<item>No admetre els certificats no vàlids</item>
</string-array>
</resources>

View File

@ -65,6 +65,7 @@
<string name="digits">Číslice</string>
<string name="disclaimer_formal">Keepass2Android je dodáván BEZ JAKÉKOLIV ZÁRUKY; Toto je svobodný software, můžete jej šířit pod licencí GPL verze 2 nebo novější.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopírovat do schránky</string>
<string name="enter_filename">Zadejte název souboru databáze</string>
<string name="entry_accessed">Poslední přístup</string>
<string name="entry_cancel">Storno</string>

View File

@ -65,6 +65,7 @@
<string name="digits">Cifre</string>
<string name="disclaimer_formal">Keepass2Android leveres ABSOLUT UDEN GARANTI. Det er gratis software, og du er velkommen til at videredistribuere det under betingelserne i GPL version 2 eller senere.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopiér til upklipsholder</string>
<string name="enter_filename">Angiv navn på databasefil</string>
<string name="entry_accessed">Seneste åbnede</string>
<string name="entry_cancel">Annuller</string>
@ -172,6 +173,7 @@
<string name="remember_keyfile_title">Gem nøglefil</string>
<string name="remove_from_filelist">Fjern</string>
<string name="rijndael">Rijndael (AES)</string>
<string name="root">Rod</string>
<string name="rounds">Krypterings-gentagelser</string>
<string name="rounds_explaination">Højere krypterings-gentagelser giver øget beskyttelse imod brute-force angreb, men kan påvirke læsnings- og skrivehastigheden betydentligt.</string>
<string name="rounds_hint">gentagelser</string>
@ -183,8 +185,11 @@
<string name="space">Mellemrum</string>
<string name="search_label">Søg</string>
<string name="show_password">Vis adgangskode</string>
<string name="sort_menu">Sorter efter...</string>
<string name="sort_name">Sorter efter navn</string>
<string name="sort_db">DB sorteringsrækkefølge</string>
<string name="sort_moddate">Sorter efter ændringsdato</string>
<string name="sort_default">Behold standardrækkefølgen</string>
<string name="special">Speciel</string>
<string name="search_hint">Find hvad</string>
<string name="search_results">Søgeresultater</string>
@ -200,7 +205,9 @@
<string name="warning_unmounted">Dit sd-kort er ikke monteret i din enhed. Du vil ikke være i stand til at indlæse eller oprette din database.</string>
<string name="version_label">Version</string>
<string name="version_history">Versionshistorik</string>
<string name="author">Keepass2Android er udviklet af Philipp Crocoll.</string>
<string name="further_authors">Tak for kodebidrag af %1$s.</string>
<string name="designers">Tak til ikon- og layoutdesignbidrag af %1$s.</string>
<string name="credit_plugin1">Twofish Cipher-plugin\'et til KeePass blev udviklet af Scott Greenberg og er inkluderet i KP2A.</string>
<string name="credit_android_filechooser">android-file-chooser blev udviklet af Hai Bison</string>
<string name="credit_keyboard">KP2A-tastaturet er baseret på Gingerbread-tastaturet fra Android Open Source Project og bruger Plugin Manager-koden fra Hacker\'s Keyboard af Klaus Weidner.</string>
@ -229,6 +236,7 @@
<string name="QuickUnlock_lockButton">Luk database</string>
<string name="QuickUnlockDefaultEnabled_title">Aktiver Hurtigoplåsning som standard</string>
<string name="QuickUnlockDefaultEnabled_summary">Definerer, om Hurtigoplåsning er aktiveret som standard eller ej.</string>
<string name="ViewDatabaseSecure_title">Beskyt databasevisning</string>
<string name="QuickUnlockIconHidden_title">Skjul Hurtigoplåsning-ikon</string>
<string name="QuickUnlockIconHidden_summary">Hurtigoplåsning virker desværre ikke uden at vise et beskedikon. Vælg denne indstilling for at bruge et gennemsigtigt ikon.</string>
<string name="QuickUnlockIconHidden16_title">Skjul Hurtigoplåsning-ikon</string>
@ -236,6 +244,13 @@
<string name="QuickUnlockLength_title">Længde af nøgle til Hurtigoplåsning</string>
<string name="QuickUnlockLength_summary">Maksimalt antal tegn brugt som nøgle til Hurtigoplåsning.</string>
<string name="QuickUnlock_fail">Hurtigoplåsning mislykkedes: Forkert nøgle!</string>
<string name="SaveAttachmentDialog_title">Gem vedhæftet fil</string>
<string name="SaveAttachmentDialog_text">Vælg hvor du vil gemme den vedhæftede fil.</string>
<string name="SaveAttachmentDialog_save">Gem på SD-kort</string>
<string name="SaveAttachmentDialog_open">Gem til cache og åben</string>
<string name="SaveAttachment_doneMessage">Gemt fil som %1$s.</string>
<string name="SaveAttachment_Failed">Kunne ikke gemme den vedhæftet fil %1$s.</string>
<string name="AddUrlToEntryDialog_title">Husk søgetekst?</string>
<string name="database_loaded_quickunlock_enabled">%1$s: Låst. Hurtigoplåsning aktiveret.</string>
<string-array name="clipboard_timeout_options">
<item>30 sekunder</item>

View File

@ -385,6 +385,7 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_skydrive">OneDrive</string>
<string name="filestoragename_sftp">SFTP (SSH File Transfer)</string>
<string name="filestoragename_content">Android-Dateibrowser</string>
<string name="filestorage_setup_title">Dateizugriff initialisieren</string>
<string name="database_location">Speicherort der Datenbank</string>
<string name="help_database_location">Du kannst deine Datenbank lokal auf deinem Android-Gerät oder in der Cloud speichern (nur in der Nicht-Offline-Version). Keepass2Android macht die Datenbank dann auch verfügbar, wenn du offline bist. Da die Datenbank sicher mit der AES 256-Bit-Verschlüsselung geschützt ist, erhält auch dann niemand außer dir Zugriff auf deine Datenbank. Wir empfehlen die Benutzung von Dropbox: Es ist auf allen Geräten verfügbar und bietet automatisch Backups aller Dateiversionen.</string>
@ -458,6 +459,25 @@ Der Android Robot wird genutzt und wurde modifiziert basierend auf Arbeiten, die
<string name="KdbBetaWarning">Bitte beachten: Du hast eine Keepass-1-Datenbank geladen. Keepass2Android bietet seit kurzem die Möglichkeit, solche Dateien zu editieren. Trotz gründlicher Tests garantiert der Autor nicht, dass alle Daten korrekt gespeichert werden. Bitte lege immer eine Sicherheitskopie der ursprünglichen Datenbank an, bevor du mit Keepass2Android speicherst (Tipp: Dropbox speichert automatisch ältere Verionen). Sollte ein Problem auftreten, melde diese bitte an den Autor. Danke!</string>
<string name="ChangeLog_title">Neuigkeiten</string>
<string name="PreviewWarning">Bitte beachten! Dies ist eine Vorab-Version, die einige Fehler enthalten könnte! Wenn du *irgendetwas* unerwartetes feststellen solltest, lass es mich bitte wissen (auf Codeplex oder per E-Mail).</string>
<string name="Continue">Fortfahren</string>
<string name="NoFilenameWarning">Der eingegebene Pfad scheint kein gültiger Dateiname zu sein. Bist du sicher, dass es sich um eine gültige Datei handelt?</string>
<string name="NoFilenameWarning">The URI you have entered does not look like a filename. Are you sure this is a valid file?</string>
<string name="ChangeLog_0_9_8b">
Version 0.9.8b\n
* Bugs behoben: Speichern schlug bei manchen Datenbanken fehl, Exportieren mit lokalem Ziel funktionierte nicht, manche Einstellungsoptionen führten zum Absturz\n
</string>
<string name="ChangeLog_0_9_8"> Version 0.9.8\n
* Unterstützung für das Storage Access Framework (ermöglicht Schreiben auf SD-Karte und auf Google Drive mit KP2A Offline)\n
* Fehlerhafte Benutzereingaben bei WebDAV-URLs werden wenn möglich erkannt (Verzeichnis statt Datei)\n
* Passwort-Schriftart geändert\n
* Dropbox-Konto kann gewechselt werden\n
* Bug-Fix: Passwort-Art bei OTP wird gespeichert\n
* Hinweis: Ich hatte Material-Design für dieses Release versprochen. Es ist in Arbeit, braucht aber noch ein bisschen mehr Zeit. Sorry!</string>
<string name="ChangeLog_0_9_7b">
Version 0.9.7b\n
* Übersetzungen aktualisiert\n
* Bugs behoben: Passwort-Schriftart fehlte in 0.9.7, Gruppen wurden nicht sortiert, wenn \"Sortieren nach Namen\" ausgewählt war\n
</string>
<string name="ChangeLog_0_9_7">
Version 0.9.7\n
* Schreibunterstützung für Keepass 1 (kdb) Datenbanken (Beta!)\n

View File

@ -65,6 +65,7 @@
<string name="digits">Dígitos</string>
<string name="disclaimer_formal">Keepass2Android NO TIENE TOTAL GARANTÍA; Este es software libre, y puedes redristribuirlo bajo las condiciones de la licencia GPL version 2 o posterior.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copiar al portapapeles</string>
<string name="enter_filename">Introduzca el nombre del archivo de base de datos</string>
<string name="entry_accessed">Accedido</string>
<string name="entry_cancel">Cancelar</string>

View File

@ -2,15 +2,15 @@
<!--Generated by crowdin.com-->
<!--Generated by crowdin.net-->
<resources>
<string name="about_feedback">Anna palautetta</string>
<string name="about_feedback">Palaute</string>
<string name="about_homepage">Kotisivu</string>
<string name="AboutText">Keepass2Android on salasanojen hallintaohjelma, jolla voit lukea ja kirjoittaa KeePass 2.x versioiden tietokantoja Androidilla.</string>
<string name="CreditsText">Käyttöliittymä perustuu Brian Pellinin kehittämään KeepassDroid -porttaukseen. Tietokantatoimintojen lähdekoodi perustuu Dominik Reichlin KeepPass -sovellukseen. Android robotti on jäljennetty tai muokattu Googlen jakamista teoksista ja sitä käytetään Creative Commons 3.0 Attribution Licensensen kuvaamien ehtojen mukaisesti.</string>
<string name="CreditsTextSFTP">SFTP tuki toteutuu JSch Kirjaston BSD lisenssillä luomaa JCraft, Inc:a käyttämällä.</string>
<string name="CreditsText">Käyttöliittymä perustuu Brian Pellinin kehittämään KeepassDroid -porttaukseen. Tietokantatoimintojen lähdekoodi perustuu Dominik Reichlin KeePass -sovellukseen. Android Robot on kopioitu tai muokattu Googlen jakamista julkaisuista ja sitä käytetään Creative Commons 3.0 Attribution Licensen kuvaamien ehtojen mukaisesti.</string>
<string name="CreditsTextSFTP">SFTP tuki toteutetaan käyttämällä JSch Kirjastoa BSD lisenssillä, jonka on luonut JCraft, Inc.</string>
<string name="accept">Hyväksy</string>
<string name="deny">Estä</string>
<string name="deny">Älä hyväksy</string>
<string name="add_entry">Lisää merkintä</string>
<string name="add_url_entry">Luo merkintä URLi:sta</string>
<string name="add_url_entry">Luo tapahtuman URL</string>
<string name="add_group">Lisää ryhmä</string>
<string name="add_group_title">Lisää ryhmä</string>
<string name="edit_group_title">Muokkaa ryhmää</string>
@ -18,7 +18,7 @@
<string name="algorithm_colon">Algoritmi</string>
<string name="app_name">Keepass2Android</string>
<string name="short_app_name">KP2A</string>
<string name="app_name_nonet">Keepass2Android Offline</string>
<string name="app_name_nonet">Keepass2Android offline-tila</string>
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Aikakatkaisu</string>
<string name="app_timeout_summary">Aika jonka jälkeen tietokanta lukkiutuu automaattisesti jos ohjelmaa ei käytetä.</string>
@ -27,11 +27,11 @@
<string name="show_kill_app_summary">Näytä painike \"Tapa prosessi\" (vainoharhaisille käyttäjille)</string>
<string name="application">Sovellutus</string>
<string name="application_settings">Asetukset</string>
<string name="ShowGroupnameInSearchResult_title">Näytä ryhmänimen hakutulos</string>
<string name="ShowGroupnameInSearchResult_title">Ryhmänimet hakutuloksissa</string>
<string name="ShowGroupnameInSearchResult_resume">Näyttää ryhmänimien alla merkintöjen otsikot hakutuloksissa. Hyödyllinen, jos on useita saman nimisiä.</string>
<string name="NavigationToGroupCompleted_message">Nyt näytettävä ryhmä on: %1$s</string>
<string name="ShowGroupInEntry_title">Näytä ryhmän nimi merkinnässä</string>
<string name="unknown_uri_scheme">Anteeksi! Keepass2Android ei voi käsitellä palautettua URI-%1$s. Ota yhteyttä kehittäjään!</string>
<string name="ShowGroupInEntry_title">Ryhmien nimet merkinnöissä</string>
<string name="unknown_uri_scheme">Keepass2Android ei voi käsitellä palautettua URI-%1$s. Ota yhteyttä kehittäjään!</string>
<string name="security_prefs">Turvallisuus</string>
<string name="display_prefs">Näyttö</string>
<string name="password_access_prefs">Salasanavalinnat</string>
@ -39,7 +39,7 @@
<string name="FileHandling_prefs">Tiedostokäsittely</string>
<string name="keyboard_prefs">Näppäimistö</string>
<string name="export_prefs">Vie tietokanta...</string>
<string name="import_db_prefs">Tuo tietokanta sisäisen kansioon</string>
<string name="import_db_prefs">Tuo tietokanta sisäiseen kansioon</string>
<string name="import_keyfile_prefs">Tuo avaintiedosto sisäiseen kansioon</string>
<string name="keyboardswitch_prefs">Näppäimistön vaihtaminen</string>
<string name="OnlyAvailableForLocalFiles">Saatavilla vain paikallisia tiedostoja.</string>
@ -51,13 +51,13 @@
<string name="cancel">Peruuta</string>
<string name="ClearClipboard">Leikepöytä tyhjennetty.</string>
<string name="clipboard_timeout">Leikepöydän aikakatkaisu</string>
<string name="clipboard_timeout_summary">Aika ennen kuin leikepöytä tyhjennetään tunnuksista</string>
<string name="copy_username">Valitse kopioidaksesi käyttäjänimen leikepöydälle</string>
<string name="clipboard_timeout_summary">Aika ennen kuin leikepöytä tyhjennetään</string>
<string name="copy_username">Valitse ja kopioi käyttäjänimi leikepöydälle</string>
<string name="copy_password">Valitse ja kopioi salasana leikepöydälle</string>
<string name="available_through_keyboard">Merkintä saatavana KP2A näppäimistölle</string>
<string name="entry_is_available">on saatavilla</string>
<string name="not_possible_im_picker">Näppäimistön valinta-ikkunaa ei voitu avata. Aktivoi näppäimistö manuaalisesti.</string>
<string name="please_activate_keyboard">Ota käyttöön Keepass2Android-näppäimistö Järjestelmäasetuksissa.</string>
<string name="please_activate_keyboard">Ota käyttöön Keepass2Android-näppäimistö Sovellutus-asetuksissa.</string>
<string name="creating_db_key">Luodaan tietokanta-avain...</string>
<string name="current_group">Nykyinen ryhmä</string>
<string name="current_group_root">Nykyinen ryhmä: Root</string>
@ -65,6 +65,7 @@
<string name="digits">Numerot</string>
<string name="disclaimer_formal">Keepass2Androidissa ei ole mukana takuuta; Tämä on vapaa ohjelmisto ja sitä saa levittää GPL-version 2 tai uudemman mukaan.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopioi leikepöydälle</string>
<string name="enter_filename">Kirjoita tietokannan tiedostonimi</string>
<string name="entry_accessed">Käytetty</string>
<string name="entry_cancel">Peruuta</string>
@ -98,7 +99,7 @@
<string name="error_no_name">Nimi on pakollinen.</string>
<string name="error_nopass">Salasana tai avain pääavain on pakollinen.</string>
<string name="error_pass_gen_type">Täytyy valita ainakin yksi salasanan generointityyppi</string>
<string name="error_pass_match">Salasanat eivät täsmää.</string>
<string name="error_pass_match">Salasanat ei täsmää.</string>
<string name="error_rounds_not_number">Kierrokset täytyy olla numeroina.</string>
<string name="error_title_required">Otsikko on pakollinen.</string>
<string name="error_wrong_length">Kirjoita pituus-kenttään positiivinen kokonaisluku</string>
@ -160,11 +161,11 @@
<string name="no">Ei</string>
<string name="no_keys">Ei merkintöjä tietokannassa tai ryhmissä.</string>
<string name="no_results">Ei hakutuloksia</string>
<string name="no_url_handler">Ei URL-käsittelijää tälle osoitteelle.</string>
<string name="no_url_handler">Ei URL-käsittelyä tälle osoitteelle.</string>
<string name="open_recent">Avaa edellinen tietokanta (Klikkaa)</string>
<string name="omitbackup_title">Älä etsi varmuuskopioista ja roskakorista</string>
<string name="omitbackup_summary">Jätä \"Varmuuskopio\" ja roskakori pois hakutuloksista</string>
<string name="pass_filename">KeePass-tietokannan tiedostonimi</string>
<string name="pass_filename">KeePass-tietokannan nimi</string>
<string name="password_title">Syötä tietokannan salasana</string>
<string name="master_key_type">Valitse pääavaimen tyyppi:</string>
<string name="progress_create">Luodaan uutta tietokantaa...</string>
@ -186,10 +187,10 @@
<string name="space">Välilyönti</string>
<string name="search_label">Haku</string>
<string name="show_password">Näytä salasana</string>
<string name="sort_menu">Lajittele...</string>
<string name="sort_menu">Järjestä...</string>
<string name="sort_name">Järjestä nimen mukaan</string>
<string name="sort_db">Järjestä luontipäivän mukaan</string>
<string name="sort_moddate">Lajittele muokkauspäivämäärän mukaan</string>
<string name="sort_moddate">Järjestä muokkauspäivämäärän mukaan</string>
<string name="sort_default">Pidä oletusjärjestys</string>
<string name="special">Erikoismerkit</string>
<string name="search_hint">Kirjoita haku</string>
@ -208,14 +209,15 @@
<string name="version_history">Versiohistoria</string>
<string name="author">Keepass2Androidin on kehittänyt Philipp Crocoll.</string>
<string name="further_authors">Kiitä avustamalla koodilla %1$s.</string>
<string name="designers">Kiitos! Kuvakkeet ja sijoittelun suunnitteli %1$s.</string>
<string name="credit_plugin1">Keepass Twofish Cipher -lisäosan on kehittänyt Scott Greenberg ja se sisältyy KP2A:han.</string>
<string name="credit_android_filechooser">Android-tiedostonvalitsimen on kehittänyt Hai Bison</string>
<string name="credit_keyboard">KP2A Android -näppäimistö perustuu Gingerbread-näppäimistöön ja Android Open Source Projectin avoimeen lähdekoodiin ja käyttää Klaus Weidnerin kehittämästä Hacker\'s Keyboardista liitännäisten hallinnointikoodia.</string>
<string name="credit_keyboard">KP2A Android -näppäimistö perustuu Gingerbread-näppäimistöön ja Android Open Source Projectin avoimeen lähdekoodiin. Se käyttää Klaus Weidnerin kehittämästä Hacker\'s Keyboardista liitännäisten hallinnointikoodia.</string>
<string name="please_note">Huomaa</string>
<string name="contributors">Kehittäjät ja avustajat</string>
<string name="regular_expression">Säännöllinen lauseke</string>
<string name="TanExpiresOnUse_title">TAN käytön päättyminen</string>
<string name="TanExpiresOnUse_summary">Ilmoita vanhentuneiden TAN-merkintöjen käytöstä</string>
<string name="TanExpiresOnUse_summary">Ilmoita vanhentuneiden TAN-merkintöjen käyt</string>
<string name="ShowUsernameInList_title">Näytä käyttäjätunnus</string>
<string name="ShowUsernameInList_summary">Näytä käyttäjätunnukset otsikon alla merkinnöissä. Hyödyllinen tietueen arvoissa tai TAN-Merkinnöissä.</string>
<string name="RememberRecentFiles_title">Muista tietokannat</string>
@ -285,7 +287,7 @@
<string name="ClearOfflineCache_question">Tämä poistaa kaikki välimuistiin tallennetut tietokantatiedostot. Yhä synkronoimattomat offline-tilassa tehdyt muutokset menetetään! Haluatko jatkaa?</string>
<string name="CheckForFileChangesOnSave_title">Tarkista muutokset</string>
<string name="CheckForFileChangesOnSave_summary">Tarkista, onko tiedostoa muokattu ulkoisesti ennen sen tallentamista.</string>
<string name="CheckForDuplicateUuids_title">Tarkista UUID-kaksoiskappaleiden varalta</string>
<string name="CheckForDuplicateUuids_title">Tarkista UUID dublikaattien varalta</string>
<string name="CheckForDuplicateUuids_summary">Tarkista onko tietokantatiedosto korruptoitunut niin, että siinä on monta merkintää samalla tunnusnumerolla. Se saattaa aiheuttaa ohjelman odottamatonta toimintaa.</string>
<string name="ShowCopyToClipboardNotification_title">Leikepöydän ilmoitukset</string>
<string name="ShowCopyToClipboardNotification_summary">Käyttää käyttäjätunnusta ja salasanaa Ilmoituspalkin ja Leikepöydän kautta. Varo salasanan paljastumista!</string>
@ -299,13 +301,13 @@
<string name="kp2a_switch_rooted_summary">Vaihtaa automaattisesti KP2A-näppäimistöön, kun merkintä on avattu. Vaatii pääkäyttäjätilin ja Secure Settings -ohjelman System+:lla. </string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_title">Automaattivaihto vain haun jälkeen
</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_summary">Vaihtaa automaattisesti KP2A-näppäimistöön, kun käytetään Jaa URL -toimintoa (mutta ei avatessa merkintää muilla tavoin)</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_summary">Vaihtaa automaattisesti KP2A-näppäimistöön, kun käytetään URL -toimintoa (mutta ei avatessa merkintää muilla tavoin)</string>
<string name="AutoSwitchBackKeyboard_title">Näppäimistön vaihto takaisin</string>
<string name="AutoSwitchBackKeyboard_summary">Vaihda takaisin edelliseen näppäimistöön, kun merkintää ei ole avattu.</string>
<string name="ShowUnlockedNotification_title">Ilmoituskuvake kun on lukitsematon</string>
<string name="ShowUnlockedNotification_title">kun ilmoituskuvake on lukitsematon</string>
<string name="ShowUnlockedNotification_summary">Näytä ilmoituskuvake kun tietokanta on avattu.</string>
<string name="PreloadDatabaseEnabled_title">Esilataa tietokanta</string>
<string name="PreloadDatabaseEnabled_summary">Aloita tietokantatiedoston taustalataus salasanan syöttövaiheessa.</string>
<string name="PreloadDatabaseEnabled_summary">Aloita tietokannan lataus taustalla salasanan syöttövaiheessa.</string>
<string name="AskOverwriteBinary">Haluatko korvata nykyisen binääritiedoston samalla nimellä?</string>
<string name="AskOverwriteBinary_title">Haluatko korvata nykyisen binääritiedoston?</string>
<string name="AskOverwriteBinary_yes">Korvaa</string>
@ -358,11 +360,12 @@
<string name="otp_aux_file">OTP-lisätiedosto</string>
<string name="ErrorOcurred">Tapahtui virhe:</string>
<string name="DuplicateUuidsError">Tietokanta on korruptoitunut: siitä löytyi kahdentuneita tunnistenumeroita. (Tallensitko Minikeepass:lla?) Ole hyvä ja tuo tiedot uuteen tietokantaan KeePass 2:n PC-versiolla ja valitse \'Luo uudet ID-numerot\'.</string>
<string name="DuplicateUuidsErrorAdditional">Voit poistaa tämän virheilmoitukset valitsemalla Asetukset/Sovellutus/Tiedostokäsittely ja Tarkista kaksoiskappaleiden UUID. Huomioi että tämä voi aiheuttaa ongelmia. On suositeltavaa korjata tietokanta.</string>
<string name="DuplicateUuidsErrorAdditional">Voit poistaa tämän virheilmoitukset valitsemalla Asetukset/Sovellutus/Tiedostokäsittely ja Tarkista dublikaattien UUID. Huomioi että tämä voi aiheuttaa ongelmia. On suositeltavaa korjata tietokanta.</string>
<string name="synchronize_database_menu">Synkronoi tietokanta...</string>
<string name="CannotMoveGroupHere">Ryhmää ei voi siirtää tähän ryhmään.</string>
<string name="donate_question">Tänään on Oktoberfest! Jos pidät Keepass2Androidista: Tänään olisi hyvä päivä ostaa minulle olutta?</string>
<string name="donate_bday_question">10. maaliskuuta? Se on syntymäpäiväni! Jos pidät tästä ohjelmasta, miksipä et lähettäisi minulle syntymäpäiväonnitteluja pienen lahjan kera? Se tekisi minut todella onnelliseksi! :-)</string>
<string name="donate_missedbday_question">Voih! Unohdit syntymäpäiväni 10. Toukokuuta ! Jos pidät tästä sovellutuksesta niin etkö voisi lähettää minulle syntymäpäiväterveisiä ja pientä syntymäpäivälahjaa? Vielä ehdit tehdä minut onnelliseksi! :-)</string>
<string name="ok_donate">Kerro lisää!</string>
<string name="no_thanks">Ei, en pidä sitä niin paljon</string>
<string name="hint_sftp_host">isäntä (ex: 192.168.0.1)</string>
@ -402,21 +405,21 @@
<string name="CouldntLoadOtpAuxFile">OTP-lisätiedostoa ei voi ladata!</string>
<string name="CouldntLoadOtpAuxFile_Hint">Käytä OtpKeyProv-liitännäistä KeePass 2.x:ssa (PC) ja määritä tietokanta käytettäväksi OTP-kertakäyttösalasanoilla!</string>
<string name="otp_discarded_because_no_db">Valitse tietokanta ensin. OTP hylätään turvallisuussyistä.</string>
<string name="otp_discarded_no_space">Kertakäyttösalasana hylätty: Kaikki salasanat on jo käytetty!</string>
<string name="otp_discarded_no_space">Salasana hylätty: Kaikki salasanat on jo käytetty!</string>
<string name="otp_discarded_because_db_open">Sulje ensin tietokanta. OTP hylätään.</string>
<string name="otps_pending">(Yksi tai useampi OTPs on jo saatavilla)</string>
<string name="otpsecret_hint">OTP salaus (esimerkiksi 01 23 ab cd...)</string>
<string name="CouldntParseOtpSecret">Virhe OTP-salaisuuden jäsentämisessä!</string>
<string name="CouldntParseOtpSecret">Virhe OTP-salauksen jäsentämisessä!</string>
<string name="OtpKeyError">OTP-avaimen luominen epäonnistui! Varmista, että OTP:t on syötetty oikein.</string>
<string name="ErrorUpdatingOtpAuxFile">Virhe OTP-lisätiedoston päivityksessä!</string>
<string name="SavingOtpAuxFile">Tallennetaan OTP-lisätiedostoa&#8230;</string>
<string name="bad_resp">Haaste-vastaus on virheellinen.</string>
<string name="CouldntLoadChalAuxFile">Ei voitu ladata haastetiedostoa!</string>
<string name="CouldntLoadChalAuxFile_Hint">Käytä KeeChallenge-liitännäistä KeePass 2.x (PC) ja määritä tietokanta käyttämään haasteeseen vastaamista!</string>
<string name="bad_resp">Vaadittu vastaus on virheellinen.</string>
<string name="CouldntLoadChalAuxFile">Ei voitu ladata tiedostoa!</string>
<string name="CouldntLoadChalAuxFile_Hint">Käytä KeeChallenge-liitännäistä KeePass 2.x (PC) ja määritä tietokanta käyttämään vaadittua vastausta!</string>
<string name="ErrorUpdatingChalAuxFile">Virhe päivitettäessä OTP-lisätiedostoa!</string>
<string name="TrayTotp_SeedField_title">TOTP-siemenkentän nimi</string>
<string name="TrayTotp_SeedField_title">TOTP-Siemenkentän nimi</string>
<string name="TrayTotp_SeedField_summary">Jos et käytä Keepass 2 \"TrayTotp\" liitännäisen oletusasetuksia, kirjoita siemenkentän nimi PC-version asetusten mukaisesti.</string>
<string name="TrayTotp_SettingsField_title">TOTP-asetuksien kentän nimi</string>
<string name="TrayTotp_SettingsField_title">TOTP-Asetuksien kentän nimi</string>
<string name="TrayTotp_SettingsField_summary">Syötä TrayTotp:n asetukset sisältävän kentän nimi tähän.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="loading">Ladataan&#8230;</string>
@ -448,7 +451,7 @@
<string name="FileIsReadOnly">Valitsemallasi tiedostolla on vain lukuoikeudet.</string>
<string name="FileIsReadOnlyOnKitkat">Valitsemallasi tiedostolla Keepass2Android on vain lukuoikeudet , koska Android 4.4 +:ssa on rajoituksia.</string>
<string name="CopyFileRequired">Käyttääksesi sitä se pitää kopioida toiseen paikkaan.</string>
<string name="CopyFileRequiredForEditing">Jos muokkaat sitä niin kopioi Tiedosto toiseen hakemistöön.</string>
<string name="CopyFileRequiredForEditing">Jos muokkaat sitä niin kopioi Tiedosto toiseen hakemistoon.</string>
<string name="ClickOkToSelectLocation">Klikkaa OK valitaksesi sijainnin, johon tiedosto kopioidaan.</string>
<string name="CancelReadOnly">Peruuta, avaa vain luku-tilassa.</string>
<string name="CopyingFile">Kopioin tiedostoa...</string>
@ -512,9 +515,9 @@ Versio 0.9.6\n
<item>Vain salasana</item>
<item>Salasana + Avaintiedosto</item>
<item>Salasana + OTP</item>
<item>Salasana + OTP salaus (recovery mode)</item>
<item>Salasana + Challenge-Respons</item>
<item>Salasana + Challenge-Response salaus (recovery mode)</item>
<item>Salasana + OTP salaus (Palautustila)</item>
<item>Salasana + Vastausvaatimus</item>
<item>Salasana + Vastausvaatimus salaukseen (palautustila)</item>
</string-array>
<string-array name="AcceptAllServerCertificates_options">
<item>Ohita varmenteiden virheet</item>

View File

@ -65,6 +65,7 @@
<string name="digits">Chiffres</string>
<string name="disclaimer_formal">Keepass2Android n\'offre ABSOLUMENT AUCUNE GARANTIE ; il s\'agit d\'un logiciel gratuit, et vous pouvez le redistribuer sous les conditions de la licenceGPL v2 ou ultérieure.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copier dans le Presse-papier</string>
<string name="enter_filename">Entrez le nom de fichier de la base de données</string>
<string name="entry_accessed">Accédé</string>
<string name="entry_cancel">Annuler</string>

View File

@ -65,6 +65,7 @@
<string name="digits">Cifre</string>
<string name="disclaimer_formal">Keepass2Android viene distribuito ASSOLUTAMENTE SENZA ALCUNA GARANZIA; Si tratta di software libero e sei invitato a distribuirlo sotto le condizioni della licenza GPL versione 2 o superiore.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copia negli appunti</string>
<string name="enter_filename">Inserisci il nome del file del database</string>
<string name="entry_accessed">Ultimo accesso</string>
<string name="entry_cancel">Annulla</string>

View File

@ -65,6 +65,7 @@
<string name="digits">数字</string>
<string name="disclaimer_formal">Keepass2Android によって作られたフリーソフトウェアであり、無保証です。GPLバージョン2以上の条件下でこれを再頒布することができます。</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">クリップボードにコピー</string>
<string name="enter_filename">データベースファイル名の入力</string>
<string name="entry_accessed">最終アクセス日</string>
<string name="entry_cancel">キャンセル</string>

View File

@ -7,7 +7,7 @@
<string name="AboutText">Keepass2Android er en android-utgave av KeePass passordbestyrer.</string>
<string name="CreditsText">Brukergrensesnittet er basert på en port av KeepassDroid utviklet av Brian Pellin. Kildekode til databaseoperasjoner er basert på KeePass av Dominik Reichl. Android roboten, laget og delt av Google, er reprodusert og modifisert i henhold til Creative Commons 3.0 Navngivelse Lisensen.</string>
<string name="accept">Godta</string>
<string name="add_entry">Legg til post</string>
<string name="add_entry">Legg til oppføring</string>
<string name="add_url_entry">Lag oppføring for URL</string>
<string name="add_group">Legg til gruppe</string>
<string name="add_group_title">Legg til gruppe</string>

View File

@ -65,6 +65,7 @@
<string name="digits">Cijfers</string>
<string name="disclaimer_formal">Keepass2Android biedt GEEN ENKELE GARANTIE; Dit is gratis software, u mag deze software verspreiden onder de voorwaarden van de GPL versie 2 of recenter.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopieer_naar_klembord</string>
<string name="enter_filename">Voer databasebestandsnaam in</string>
<string name="entry_accessed">Benaderd</string>
<string name="entry_cancel">Annuleren</string>

View File

@ -65,6 +65,7 @@
<string name="digits">Cyfry</string>
<string name="disclaimer_formal">Keepass2Android jest udostępniany BEZ JAKIEJKOLWIEK GWARANCJI. Niniejszy program jest wolnym oprogramowaniem: możesz go swobodnie rozpowszechniać na warunkach licencji GNU General Public License w wersji 2 lub późniejszej.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopiuj do schowka</string>
<string name="enter_filename">Wprowadź nazwę pliku bazy danych</string>
<string name="entry_accessed">Ostatni dostęp</string>
<string name="entry_cancel">Anuluj</string>

View File

@ -46,6 +46,8 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="OnlyAvailableForLocalFiles">Apenas disponível para ficheiros locais.</string>
<string name="FileIsInInternalDirectory">Ficheiro guardado na pasta local.</string>
<string name="DatabaseFileMoved">A base de dados foi copiada para a pasta local. Prima OK para abrir a nova localização. Nota: Não se esqueça de exportar a sua base de dados para uma localização segura regularmente!</string>
<string name="KeyfileMoved">O ficheiro-chave foi copiado para a directoria interna. Verifique se tem uma cópia de seguranca válida antes de a eliminar da directoria actual!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Não é possível usar a directoria interna quando a localização do ficheiro-chave não é guardada. Altere as preferências de segurança.</string>
<string name="brackets">Parêntesis</string>
<string name="cancel">Cancelar</string>
<string name="ClearClipboard">Área de transferência limpa.</string>
@ -54,6 +56,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="copy_username">Copiar usuário para a área de transferência</string>
<string name="copy_password">Copiar senha para a área de transferência</string>
<string name="available_through_keyboard">Entrada está disponível através do teclado KP2A</string>
<string name="entry_is_available">está disponível</string>
<string name="not_possible_im_picker">Não foi possível abrir a caixa de diálogo para selecionar o método de entrada. Por favor, ative o teclado manualmente.</string>
<string name="please_activate_keyboard">Por favor habilite o teclado Keepass2Android nas configurações do sistema.</string>
<string name="creating_db_key">Criando a chave da base de dados&#8230;</string>
@ -63,6 +66,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="digits">Dígitos</string>
<string name="disclaimer_formal">O Keepass2Android vem ABSOLUTAMENTE SEM GARANTIA; Este software é gratuito, e todos podem distribuí-lo de acordo com as condições do GPL versão 2 ou mais recente.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copiar para a área de transferencia</string>
<string name="enter_filename">Introduza o nome do arquivo da base de dados</string>
<string name="entry_accessed">Acessado</string>
<string name="entry_cancel">Cancelar</string>
@ -74,6 +78,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="entry_expires">Expira</string>
<string name="entry_group_name">Nome do Grupo</string>
<string name="entry_keyfile">Arquivo de chave (opcional)</string>
<string name="keyfile_heading">Ficheiro-chave</string>
<string name="entry_modified">Modificado</string>
<string name="entry_password">Senha</string>
<string name="entry_save">Salvar</string>
@ -86,6 +91,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="error_could_not_create_group">Erro ao criar o grupo.</string>
<string name="error_could_not_create_parent">Não foi possível criar o diretório \'pai\'.</string>
<string name="error_database_exists">Este arquivo já existe.</string>
<string name="error_database_settinoverrgs">Falha ao determinar as configurações da base de dados.</string>
<string name="error_failed_to_launch_link">Falha ao executar link.</string>
<string name="error_filename_required">É necessário um nome de arquivo.</string>
<string name="error_file_not_create">Não foi possível criar o ficheiro</string>
@ -119,6 +125,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="invalid_algorithm">Algoritmo inválido.</string>
<string name="invalid_db_sig">Formato da base de dados não foi reconhecido.</string>
<string name="keyfile_does_not_exist">Ficheiro-chave não existe.</string>
<string name="no_keyfile_selected">Nenhum ficheiro-chave seleccionado.</string>
<string name="keyfile_is_empty">Ficheiro-chave está vazio.</string>
<string name="length">Tamanho</string>
<string name="list_size_title">Tamanho da lista de grupos</string>
@ -137,6 +144,8 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="menu_db_settings">Configurações da base de dados</string>
<string name="menu_delete">Apagar</string>
<string name="menu_move">Mover para outro grupo</string>
<string name="menu_move_light">Mover</string>
<string name="menu_navigate">Ir para grupo parente</string>
<string name="menu_donate">Doe uma cerveja...</string>
<string name="menu_edit">Editar</string>
<string name="menu_hide_password">Esconder palavra-passe</string>
@ -151,7 +160,11 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="never">Nunca</string>
<string name="yes">Sim</string>
<string name="no">Não</string>
<string name="no_keys">Não há registos na base de dados ou grupo.</string>
<string name="no_results">Não há resultados de pesquisa</string>
<string name="no_url_handler">Nenhum programa compativel com esta url.</string>
<string name="open_recent">Abrir a base de dados recente (clique para abrir)</string>
<string name="omitbackup_title">Não pesquisar registos nas cópias de segurança e na lixeira</string>
<string name="progress_title">A processar&#8230;</string>
<string name="remove_from_filelist">Remover</string>
<string name="rijndael">Rijndael (AES)</string>
@ -217,6 +230,10 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="field_name">Nome do Campo</string>
<string name="field_value">Valor do campo</string>
<string name="protection">Campo protegido</string>
<string name="add_binary">Anexar ficheiro...</string>
<string name="add_extra_string">Adicionar outro texto</string>
<string name="delete_extra_string">Eliminar texto adicional</string>
<string name="database_loaded_quickunlock_enabled">%1$s: Bloqueado. Desbloqueamento rápido activo.</string>
<string name="database_loaded_unlocked">%1$s: Desbloqueado.</string>
<string name="credentials_dialog_title">Introduza as credenciais do servidor</string>
<string name="LockWhenScreenOff_title">Bloquear quando o ecrã se desligar</string>
@ -232,6 +249,7 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="RecycleBin">Reciclagem</string>
<string name="AskDeletePermanentlyEntry">Deseja apagar esta entrada permanentemente? Pressione Não para reciclar.</string>
<string name="AskDeletePermanently_title">Apagar permanentemente?</string>
<string name="AskReloadFile_title">Recarregar ficheiro?</string>
<string name="AskDiscardChanges_title">Descartar alterações?</string>
<string name="suggest_improvements">Sugerir ou votar melhorias</string>
<string name="rate_app">Classifique esta aplicação</string>
@ -263,6 +281,21 @@ Muito útil se existirem muitos resultados iguais.</string>
<string name="hint_sftp_port">porta</string>
<string name="enter_sftp_login_title">Insira os dados de login SFTP:</string>
<string name="filestoragename_file">Ficheiro local</string>
<string name="filestoragename_dropbox">Dropbox</string>
<string name="key_file">Ficheiro-chave</string>
<string name="use_key_file">Utilizar ficheiro-chave</string>
<string name="TrayTotp_SettingsField_title">TOTP Configurações - Nome do campo</string>
<string name="TrayTotp_SettingsField_summary">Escreva o nome do campo de configuração da extensão TrayTotp aqui.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="loading">A Carregar&#8230;</string>
<string name="plugins">Extensões</string>
<string name="plugin_packagename">Nome do pacote:</string>
<string name="plugin_description">Descrição (não verificada):</string>
<string name="plugin_author">Autor (não verificado):</string>
<string name="plugin_enabled">activo</string>
<string name="plugin_disabled">inactivo</string>
<string name="plugin_web">Encontrar plug-ins on-line</string>
<string name="plugin_scopes">Contexto</string>
<string-array name="clipboard_timeout_options">
<item>30 segundos</item>
<item>1 minuto</item>

View File

@ -4,14 +4,16 @@
<resources>
<string name="about_feedback">Feedback</string>
<string name="about_homepage">Start</string>
<string name="AboutText">Keepass2Android este un manager de parole ce ofera acces citire/scriere la baze de date KeePass 2.x sub Android.</string>
<string name="AboutText">Keepass2Android este un manager de parole ce oferă citire/scriere la baze de date KeePass 2.x pe Android.</string>
<string name="CreditsText">Interfaţa cu utilizatorul este bazată pe un port al KeepassDroid dezvoltat de Brian Pellin. Codul pentru operaţiunile cu baza de date este bazat pe KeePass de Dominik Reichl. Robotul Android este reprodus sau modificate din materiale create şi împărtăşite de Google şi utilizate în conformitate cu condiţiile descrise de licenţa Creative Commons Attribution 3.0.</string>
<string name="CreditsTextSFTP">Suportul pentru SFTP este implementat folosind librăria JSch sub licență BDS, creată de JCraft, Inc.</string>
<string name="accept">Accepta</string>
<string name="add_entry">Adăugaţi o înregistrare</string>
<string name="add_url_entry">Creaţi intrarea pentru URL</string>
<string name="add_group">Adăugare grup</string>
<string name="deny">Interzice</string>
<string name="add_entry">Adăugă o înregistrare</string>
<string name="add_url_entry">Creaţi înregistrare pentru URL</string>
<string name="add_group">Adăugă un grup</string>
<string name="add_group_title">Adăugare grup</string>
<string name="edit_group_title">Editează Grup</string>
<string name="edit_group_title">Editează Grupul</string>
<string name="algorithm">Algoritm</string>
<string name="algorithm_colon">Algoritm</string>
<string name="app_name">Keepass2Android</string>
@ -20,13 +22,31 @@
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Expirare aplicație</string>
<string name="app_timeout_summary">Timp înainte de blocarea bazei de date atunci când aplicația este inactivă.</string>
<string name="kill_app_label">Oprește aplicația</string>
<string name="show_kill_app">Buton de închidere</string>
<string name="show_kill_app_summary">Afișează un buton pentru închiderea aplicației în ecranul cu parole (pentru useri paranoici)</string>
<string name="application">Aplicația</string>
<string name="application_settings">Setări aplicație</string>
<string name="ShowGroupnameInSearchResult_title">Arată numele grupului în rezultatele căutării</string>
<string name="ShowGroupnameInSearchResult_resume">Arată numele grupului sub titlul înregistrărilor în rezultatele căutării. Folositor dacă mai multe înregistrări au același nume.</string>
<string name="NavigationToGroupCompleted_message">Grupul afișat este acum: %1$s</string>
<string name="ShowGroupInEntry_title">Arată numele grupului în vizualizarea înregistrărilor</string>
<string name="unknown_uri_scheme">Scuze! Keepass2Android nu poate interpreta URI-ul returnat %1$s. Te rog să contactezi producătorul!</string>
<string name="security_prefs">Securitate</string>
<string name="display_prefs">Afişare</string>
<string name="password_access_prefs">Acces introducere parolă</string>
<string name="QuickUnlock_prefs">QuickUnlock</string>
<string name="FileHandling_prefs">Tratare fişiere</string>
<string name="FileHandling_prefs">Utilizare fişiere</string>
<string name="keyboard_prefs">Tastatură</string>
<string name="export_prefs">Exportă baza de date...</string>
<string name="import_db_prefs">Importă baza de date în folderul intern</string>
<string name="import_keyfile_prefs">Importă fișierul cheie în folderul intern</string>
<string name="keyboardswitch_prefs">Comutare tastaturi</string>
<string name="OnlyAvailableForLocalFiles">Valabil doar pentru fișiere locale.</string>
<string name="FileIsInInternalDirectory">Fișierul este stocat în folderul intern.</string>
<string name="DatabaseFileMoved">Baza de date a fost copiată în folderul intern. Apasă Ok pentru a o deschide din noua locație. Notă: Nu uita să exporți periodic baza de date pe un spațiu de stocare sigur!</string>
<string name="KeyfileMoved">Fișierul-cheie a fost copiat în folderul intern. Asigură-te că ai o copie de rezervă înainte de al șterge din locația curentă!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Imposibil de folosit folderul intern când locația fișierului cheie nu este memorară. Schimbă preferințele de securitate.</string>
<string name="brackets">Paranteze</string>
<string name="cancel">Anulează</string>
<string name="ClearClipboard">Clipboard golit.</string>
@ -35,15 +55,17 @@
<string name="copy_username">Selectați pentru a copia utilizatorul în clipboard</string>
<string name="copy_password">Selectați pentru a copia parola în clipboard</string>
<string name="available_through_keyboard">Înregistrarea este disponibilă folosind tastatura KP2A</string>
<string name="entry_is_available">este disponibil</string>
<string name="not_possible_im_picker">Nu s-a putut deschide dialogul de a selecta medoda de introducere. Activați tastatura manual.</string>
<string name="please_activate_keyboard">Activați tastatura Keepass2Android în setarile dvs. de sistem.</string>
<string name="creating_db_key">Se crează cheia bazei de date&#8230;</string>
<string name="please_activate_keyboard">Activați tastatura Keepass2Android în setările dvs. de sistem.</string>
<string name="creating_db_key">Se creează cheia bazei de date&#8230;</string>
<string name="current_group">Grup curent</string>
<string name="current_group_root">Grup curent: root</string>
<string name="current_group_root">Grup curent: Root</string>
<string name="database">Baza de date</string>
<string name="digits">Cifre</string>
<string name="disclaimer_formal">Keepass2Android este oferit FĂRĂ NICI O GARANȚIE; Acesta este software gratuit și sunteți bine venit să îl redistribuiți respectând condițiile GPL versiunea 2 sau mai nouă.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Copiază în clipboard</string>
<string name="enter_filename">Alegeți numele bazei de date</string>
<string name="entry_accessed">Accesat</string>
<string name="entry_cancel">Anulează</string>
@ -53,32 +75,35 @@
<string name="entry_confpassword">Confirmă parola</string>
<string name="entry_created">Creat</string>
<string name="entry_expires">Expiră</string>
<string name="entry_group_name">Nume Grup</string>
<string name="entry_keyfile">Fişierul cheie (opţional)</string>
<string name="keyfile_heading">Fișier cheie</string>
<string name="entry_modified">Modificat</string>
<string name="entry_password">Parola</string>
<string name="entry_save">Salvează</string>
<string name="entry_title">Nume</string>
<string name="entry_url">URL</string>
<string name="entry_user_name">Nume de utilizator</string>
<string name="entry_extra_strings">Cămpuri string suplimentare</string>
<string name="entry_extra_strings">Câmpuri text suplimentare</string>
<string name="entry_binaries">Fișiere atașate</string>
<string name="error_can_not_handle_uri">Keepass2Android nu poate utiliza acest uri.</string>
<string name="error_could_not_create_group">Eroare creare grup.</string>
<string name="error_could_not_create_parent">Imposibil de creat directorul părinte.</string>
<string name="error_could_not_create_parent">Imposibil de creat folder-ul părinte.</string>
<string name="error_database_exists">Acest fișier există deja.</string>
<string name="error_database_settinoverrgs">Nu s-au putut determina setările bazei de date.</string>
<string name="error_failed_to_launch_link">Nu s-a putut lansa link-ul.</string>
<string name="error_filename_required">Este necesar un nume fișier.</string>
<string name="error_file_not_create">Nu s-a putut crea fișierul</string>
<string name="error_invalid_db">Bază de date invalidă.</string>
<string name="error_invalid_path">Path invalid.</string>
<string name="error_invalid_path">Cale invalidă.</string>
<string name="error_no_name">Este necesar un nume.</string>
<string name="error_nopass">Este necesară o parolă sau un fișier cheie.</string>
<string name="error_pass_gen_type">Trebuie selectat cel puțin un timp de generare de parole</string>
<string name="error_pass_gen_type">Trebuie selectat cel puțin un tip de generare de parole</string>
<string name="error_pass_match">Parolele nu se potrivesc.</string>
<string name="error_rounds_not_number">Etapele trebuie să fie un număr.</string>
<string name="error_title_required">Este necesar un titlu.</string>
<string name="error_wrong_length">Introduceți un număr întreg pozitiv pentru lungimea câmpului</string>
<string name="FileNotFound">Fișierul s-a găsit.</string>
<string name="FileNotFound">Fișierul nu s-a găsit.</string>
<string name="file_browser">Browser fișiere</string>
<string name="generate_password">Generare parolă</string>
<string name="group">Grup</string>
@ -91,14 +116,15 @@
<string name="hint_pass">parola</string>
<string name="hint_login_pass">Parola</string>
<string name="hint_title">nume</string>
<string name="hint_url">URL</string>
<string name="hint_override_url">rescrie URL-ul</string>
<string name="hint_url">url</string>
<string name="hint_override_url">rescrie url-ul</string>
<string name="hint_tags">tag1, tag2</string>
<string name="hint_username">nume de utilizator</string>
<string name="InvalidPassword">Parolă sau fișier cheie invalide.</string>
<string name="invalid_algorithm">Algoritm invalid.</string>
<string name="invalid_db_sig">Formatul bazei de date nu este cunoscut.</string>
<string name="keyfile_does_not_exist">Fișierul cheie nu există.</string>
<string name="no_keyfile_selected">Nici un fișier cheie selectat.</string>
<string name="keyfile_is_empty">Fișierul cheie este gol.</string>
<string name="length">Lungime</string>
<string name="list_size_title">Dimensiune listă grupuri</string>
@ -106,7 +132,7 @@
<string name="loading_database">Se încarcă baza de date&#8230;</string>
<string name="lowercase">Litere mici</string>
<string name="MaskedPassword">*****</string>
<string name="maskpass_title">Mascare parolă</string>
<string name="maskpass_title">Maschează parola</string>
<string name="maskpass_summary">Ascunde parolele în mod implicit</string>
<string name="menu_about">Despre</string>
<string name="menu_change_key">Schimbă cheia principală</string>
@ -114,10 +140,12 @@
<string name="menu_copy_user">Copiază nume utilizator</string>
<string name="menu_create">Crează</string>
<string name="menu_app_settings">Setări</string>
<string name="menu_db_settings">Setări baze de date</string>
<string name="menu_db_settings">Setări bază de date</string>
<string name="menu_delete">Şterge</string>
<string name="menu_move">Muta într-un alt grup</string>
<string name="menu_donate">Doneaza o bere...</string>
<string name="menu_move_light">Mută</string>
<string name="menu_navigate">Navighează la grupul părinte</string>
<string name="menu_donate">Donează o bere...</string>
<string name="menu_edit">Editare</string>
<string name="menu_hide_password">Ascunde parola</string>
<string name="menu_lock">Blochează baza de date</string>
@ -135,31 +163,37 @@
<string name="no_results">Nici un rezultat de căutare</string>
<string name="no_url_handler">Nici o rutină de tratare a acestui url.</string>
<string name="open_recent">Deschideţi baza de date recentă (click pentru a deschide)</string>
<string name="omitbackup_title">Nu cauta înregistrări în backup şi coşul de gunoi</string>
<string name="omitbackup_title">Nu căuta înregistrări în backup şi coşul de gunoi</string>
<string name="omitbackup_summary">Omite grupurile \'Backup\' şi \'Coş de gunoi\' din toate căutările</string>
<string name="pass_filename">Nume fişier bază de date KeePass</string>
<string name="password_title">Introduceţi parola bazei de date</string>
<string name="master_key_type">Selectează tipul cheii principale:</string>
<string name="progress_create">Se creează baza de date nouă&#8230;</string>
<string name="create_database">Creare bază de date</string>
<string name="progress_title">Procesează&#8230;</string>
<string name="progress_title">Se procesează&#8230;</string>
<string name="remember_keyfile_summary">Reţine locaţia fişierului cheie</string>
<string name="remember_keyfile_title">Salvează fișierul cheie</string>
<string name="remove_from_filelist">Elimină</string>
<string name="rijndael">Rijndael (AES)</string>
<string name="root">Root</string>
<string name="rounds">Etape de criptare</string>
<string name="rounds_explaination">Mai multe etape de criptare oferă protecţie împotriva atacurilor brute, dar pot încetini semnificativ încărcarea şi salvarea.</string>
<string name="rounds_explaination">Mai multe etape de criptare oferă protecţie împotriva atacurilor prin forță brută, dar pot încetini semnificativ încărcarea şi salvarea.</string>
<string name="rounds_hint">etape</string>
<string name="database_name">Numele bazei de date</string>
<string name="default_username">Nume utilizator implicit pentru intrări noi</string>
<string name="saving_database">Salvez baza de date&#8230;</string>
<string name="saving_database">Se salvează baza de date&#8230;</string>
<string name="exporting_database">Se exportă baza de date&#8230;</string>
<string name="export_database_successful">Baza de date exportată cu succes!</string>
<string name="space">Spaţiu</string>
<string name="search_label">Căutare</string>
<string name="show_password">Arată parola</string>
<string name="sort_name">Sorteaza dupa nume</string>
<string name="sort_db">Sortează după data creeării</string>
<string name="sort_menu">Sortează după...</string>
<string name="sort_name">Sortează după nume</string>
<string name="sort_db">Sortează după data creării</string>
<string name="sort_moddate">Sortează după data modificării</string>
<string name="sort_default">Păstrează ordinea implicită</string>
<string name="special">Special</string>
<string name="search_hint">Găsește ce</string>
<string name="search_hint">Găsește</string>
<string name="search_results">Rezultate căutare</string>
<string name="search_in">Căutare în</string>
<string name="select_other_entry">Selectaţi o altă înregistrare</string>
@ -171,90 +205,122 @@
<string name="uppercase">Litere mari</string>
<string name="warning_read_only">Cardul sd este momentan read-only. Nu veți putea salva modificările la baza de date.</string>
<string name="warning_unmounted">Cardul sd nu este montat momentan. Nu veți putea încărca sau crea baza de date.</string>
<string name="version_label">Versiunea</string>
<string name="version_label">Versiune</string>
<string name="version_history">Istoric versiuni</string>
<string name="author">Keepass2Android este dezvoltat de către Philipp Crocoll.</string>
<string name="further_authors">Vă mulţumim pentru contribuţiile cod %1$s.</string>
<string name="credit_plugin1">Plugin-ul pentru cifrul Twofish a fost dezvoltat de Scott Greenberg şi este inclus în KP2A.</string>
<string name="credit_android_filechooser">Android-filechooser a fost dezvoltat de Hai Bison</string>
<string name="author">Keepass2Android este creat de către Philipp Crocoll.</string>
<string name="further_authors">Mulțumită contribuţiilor de cod de către %1$s.</string>
<string name="designers">Icoană și design mulțumită contribuțiilor făcute de %1$s.</string>
<string name="credit_plugin1">Plugin-ul pentru cifrul Twofish a fost creat de Scott Greenberg şi este inclus în KP2A.</string>
<string name="credit_android_filechooser">android-filechooser a fost creat de Hai Bison</string>
<string name="credit_keyboard">Tastatura KP2A este bazată pe tastatura Gingerbread din Android Open Source Project și folosește codul Plugin Manager din Hacker\'s Keyboard creat de Klaus Weidner.</string>
<string name="please_note">Vă rugăm să reţineţi</string>
<string name="contributors">Contribuitori</string>
<string name="regular_expression">Regular expression</string>
<string name="TanExpiresOnUse_title">Tan expiră la utilizare</string>
<string name="TanExpiresOnUse_summary">Marchează înregistrările TAN ca expirate la utilizarea lor</string>
<string name="ShowUsernameInList_title">Afişeayă numele utilizator în lista</string>
<string name="ShowUsernameInList_summary">Afişează numele utilizator sub înregistrări. Util pentru conturi sau TAN-uri multiple.</string>
<string name="RememberRecentFiles_title">Reţine baza de date</string>
<string name="ShowUsernameInList_title">Afişează numele utilizatorului în listă</string>
<string name="ShowUsernameInList_summary">Afişează numele utilizatorului sub înregistrări. Util pentru conturi sau TAN-uri multiple.</string>
<string name="RememberRecentFiles_title">Reţine bazele de date</string>
<string name="RememberRecentFiles_summary">Reţine baze de date deschise recent si afişează-le în ecranul de deschidere a bazelor de date.</string>
<string name="kp2a_findUrl">Keepass2Android: Cautare parolă</string>
<string name="kp2a_findUrl">Keepass2Android: Căutare parolă</string>
<string name="excludeExpiredEntries">Exclude înregistrările expirate</string>
<string name="search_options">Opţiuni</string>
<string name="caseSensitive">Diferenţiere între minuscule şi majuscule</string>
<string name="caseSensitive">Case sensitive</string>
<string name="start_open_file">Deschide fişier...</string>
<string name="start_create">Creează bază de date nouă...</string>
<string name="start_open_url">Deschide URL...</string>
<string name="start_create_import">Importă fişier în bază de date nouă...</string>
<string name="enter_filename_details_url">Trebuie specificat URL-ul complet inclusiv protocolul, de exemplu http://.</string>
<string name="enter_filename_details_create_import">Fişierul de importat trebuie selectat în la pasul următor.</string>
<string name="enter_filename_details_create_import">Fişierul de importat va fi selectat la pasul următor.</string>
<string name="enable_quickunlock">Activare QuickUnlock</string>
<string name="QuickUnlock_label">Introduceţi ultimele %1$d caractere ale parolei dvs.:
</string>
<string name="QuickUnlock_button">QuickUnlock!</string>
<string name="QuickUnlock_lockButton">Închide baza de date</string>
<string name="QuickUnlockDefaultEnabled_title">Permite QuickUnlock implicit</string>
<string name="QuickUnlockDefaultEnabled_title">Activează QuickUnlock implicit</string>
<string name="QuickUnlockDefaultEnabled_summary">Defineşte dacă QuickUnlock este activat implicit sau nu.</string>
<string name="ViewDatabaseSecure_title">Protejează afișajul bazei de date</string>
<string name="ViewDatabaseSecure_summary">Dacă este activat, captura ecranului nu este permisă și nici o pictogramă a aplicației nu va fi afișată în lista cu Aplicații Recente.</string>
<string name="QuickUnlockIconHidden_title">Ascunde icoana QuickUnlock</string>
<string name="QuickUnlockIconHidden_summary">QuickUnlock nu funcţionează din păcate fără a afişa o icoană de notificare. Selectaţi această opţiune pentru a utiliza o icoană transparentă.</string>
<string name="QuickUnlockIconHidden16_title">Ascunde icoana QuickUnlock</string>
<string name="QuickUnlockIconHidden16_summary">QuickUnlock necesită o notificare pentru a funcționa corect. Selectează această opțiune pentru a afișa o notificare fără icoană.</string>
<string name="QuickUnlockLength_title">Lungimea cheii QuickUnlock</string>
<string name="QuickUnlockLength_summary">Numărul maxim de caractere utilizate ca şi parolă QuickUnlock.</string>
<string name="QuickUnlock_fail">QuickUnlock a eşuat: parolă incorectă!</string>
<string name="BinaryDirectory_title">Director ataşamente</string>
<string name="BinaryDirectory_summary">Director unde se salvează ataşamentele.</string>
<string name="BinaryDirectory_title">Folder ataşamente</string>
<string name="BinaryDirectory_summary">Folder în care se salvează ataşamentele.</string>
<string name="SaveAttachmentDialog_title">Salvaţi ataşament</string>
<string name="SaveAttachmentDialog_text">Selectaţi unde se salvează ataşamentul.</string>
<string name="SaveAttachmentDialog_save">Salvaţi pe cardul SD</string>
<string name="SaveAttachmentDialog_open">Salvează în cache și deschide</string>
<string name="SaveAttachment_doneMessage">Fișierul salvat ca %1$s.</string>
<string name="SaveAttachment_Failed">Nu s-a putut salva atașamentul la %1$s.</string>
<string name="AddUrlToEntryDialog_title">Memorează textul căutat?</string>
<string name="AddUrlToEntryDialog_text">Doriți să adăugați textul căutat \"%1$s\" la înregistrarea selectată pentru a o găsi automat următoarea dată?</string>
<string name="error_invalid_expiry_date">Format dată/timp invalid pentru data expirării!</string>
<string name="error_string_key">Este necesar un nume câmp pentru fiecare string.</string>
<string name="field_name">Numele câmpului</string>
<string name="field_value">Valoarea câmpului</string>
<string name="protection">Câmp protejat</string>
<string name="add_binary">Ataşează fişier...</string>
<string name="add_extra_string">Adaugă string adiţional</string>
<string name="delete_extra_string">Şterge string adiţional</string>
<string name="database_loaded_quickunlock_enabled">%1$s: blocat. QuickUnlock activat.</string>
<string name="database_loaded_unlocked">%1$s: deblocat.</string>
<string name="credentials_dialog_title">Introduceți datele conectare la server</string>
<string name="add_extra_string">Adaugă câmp adiţional</string>
<string name="delete_extra_string">Şterge câmp adiţional</string>
<string name="database_loaded_quickunlock_enabled">%1$s: Blocat. QuickUnlock activat.</string>
<string name="database_loaded_unlocked">%1$s: Deblocat.</string>
<string name="credentials_dialog_title">Introduceți datele de conectare la server</string>
<string name="UseFileTransactions_title">Tranzacții fișier</string>
<string name="UseFileTransactions_summary">Foloseşte tranzacţii pentru a scrie bazele de date</string>
<string name="LockWhenScreenOff_title">Blochează când ecranul este stins</string>
<string name="LockWhenScreenOff_summary">Blochează baza de date atunci când ecranul este stins.</string>
<string name="ClearPasswordOnLeave_title">Șterge parola principală introdusă</string>
<string name="ClearPasswordOnLeave_summary">Șterge parola principală introdusă când părăsiți ecranul fără să deblocați baza de date.</string>
<string name="LockWhenNavigateBack_title">Blochează când părăsiți aplicația</string>
<string name="LockWhenNavigateBack_summary">Blochează baza de date când părăsiți aplicația apăsând butonul înapoi.</string>
<string name="NoDonateOption_title">Ascunde opțiunea de donație</string>
<string name="NoDonateOption_summary">Această setare este pentru donatori. Este valabilă doar după ce folosiți Keepass2Android o vreme.</string>
<string name="NoDonateOption_question">Fără donații, această aplicație nu ar exista și nu ar fi îmbunătățită continuu! Dacă nu ai donat încă, te invităm să faci o donație acum.</string>
<string name="UseOfflineCache_title">Caching bază de date</string>
<string name="UseOfflineCache_summary">Păstrează o copie a bazelor de date remote în directorul cache. Aceasta vă permite să le utilizaţi şi offline.</string>
<string name="ClearOfflineCache_title">Goliţi Cache-ul?</string>
<string name="UseOfflineCache_summary">Păstrează o copie a bazelor de date remote în folderul cache. Aceasta vă permite să le utilizaţi şi offline.</string>
<string name="AcceptAllServerCertificates_title">Certificate SSL</string>
<string name="AcceptAllServerCertificates_summary">Definește comportamentul atunci când validarea certificatului eșuează. Notă: puteţi instala certificate pe aparatul vostru dacă validarea eşuează!</string>
<string name="ClearOfflineCache_title">Goliţi cache-ul?</string>
<string name="ClearOfflineCache_question">Aceasta va şterge toate bazele de date din cache. Orice modificări făcute offline ce nu au fost sincronizate vor fi pierdute! Continuaţi?</string>
<string name="CheckForFileChangesOnSave_title">Verifică modificări</string>
<string name="CheckForFileChangesOnSave_summary">Verifică dacă nu s-a modificat extern fişierul înainte de a salva.</string>
<string name="CheckForDuplicateUuids_title">Verifică dubluri UUID</string>
<string name="CheckForDuplicateUuids_summary">Verifică dacă fişierul bazei de date este corupt având mai multe înregistrări cu acelaşi ID. Acest lucru poate cauza un comportament neaşteptat.</string>
<string name="ShowCopyToClipboardNotification_title">Notificări clipboard</string>
<string name="ShowCopyToClipboardNotification_summary">Oferă utilizatorul şi parolă folosind bara de notificări şi clipboard-ul. Atenţie la \"password sniffers\"!</string>
<string name="ShowCopyToClipboardNotification_summary">Oferă utilizatorul şi parolă prin bara de notificări şi clipboard. Atenţie la \"password sniffers\"!</string>
<string name="ShowSeparateNotifications_title">Separă notificările</string>
<string name="ShowSeparateNotifications_summary">Arată notificări separate pentru copierea numelui utilizatorului și a parolei în clipboard și activarea tastaturii.</string>
<string name="ShowKp2aKeyboardNotification_title">Notificare tastatură KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Oferă întreaga înregistrare folosind tastatura KP2A (recomandat).</string>
<string name="ShowUnlockedNotification_summary">Afişează o notificare \"în curs\" în timp ce baza de date este deblocată.</string>
<string name="PreloadDatabaseEnabled_title">Pre-încărca fişierul bază de date</string>
<string name="PreloadDatabaseEnabled_summary">Începe încărcarea în fundal sau descărcarea de la distanţă în timp ce se introduce parola.</string>
<string name="OpenKp2aKeyboardAutomatically_title">Comută tastatura</string>
<string name="OpenKp2aKeyboardAutomatically_summary">Deschide fereastra de selecție a tastaturii când o înregistrare este disponibilă prin tastatura KP2A după căutarea din browser.</string>
<string name="kp2a_switch_rooted">Comută automat dacă e rootat</string>
<string name="kp2a_switch_rooted_summary">Comută automat la tastatura KP2A când o înregistrare este disponibilă. Necesită un telefon rootat și aplicația Secure Settings cu System+.</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_title">Comută automat tastatura doar după căutare</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_summary">Comută automat la tastatura KP2A doar după utilizarea funcției Share URL (și nu când se deschide o înregistrare în alt fel)</string>
<string name="AutoSwitchBackKeyboard_title">Comutare înapoi la tastatură</string>
<string name="AutoSwitchBackKeyboard_summary">Comută la tastatura precedentă când nici o înregistrare este deschisă.</string>
<string name="ShowUnlockedNotification_title">Notificare cât timp e deblocat</string>
<string name="ShowUnlockedNotification_summary">Afişează o notificare în timp ce baza de date este deblocată.</string>
<string name="PreloadDatabaseEnabled_title">Pre-încarcă fişierul bază de date</string>
<string name="PreloadDatabaseEnabled_summary">Începe încărcarea sau descărcarea în fundal în timp ce se introduce parola.</string>
<string name="AskOverwriteBinary">Doriţi să suprascrieţi binarul existent folosind acelaşi nume?</string>
<string name="AskOverwriteBinary_title">Suprascrieţi binarul existent?</string>
<string name="AskOverwriteBinary_yes">Suprascrie</string>
<string name="AskOverwriteBinary_no">Redenumește</string>
<string name="AttachFailed">Eroare la adăugarea ataşamentului.</string>
<string name="RecycleBin">Recycle Bin</string>
<string name="RecycleBin">Coș de gunoi</string>
<string name="AskDeletePermanentlyEntry">Doriţi să ştergeţi permanent această înregistrare? Apăsaţi Nu pentru a muta în coş.</string>
<string name="AskDeletePermanentlyGroup">Doriţi să ştergeţi permanent acest grup? Apăsaţi Nu pentru a muta la coş.</string>
<string name="AskDeletePermanentlyGroup">Doriţi să ştergeţi permanent acest grup? Apăsaţi Nu pentru a muta în coş.</string>
<string name="AskDeletePermanently_title">Ștergeți definitiv?</string>
<string name="AskReloadFile_title">Reîncărcaţi fişierul?</string>
<string name="AskReloadFile">Fişierul deschis a fost modificat de alt program. Doriţi să îl reîncărcaţi?</string>
<string name="AskDiscardChanges">Doriţi să renunţaţi la modificările făcute? (Butonul save este în partea superioară a formularului.)</string>
<string name="AskDiscardChanges_title">Renunta la modificari?</string>
<string name="AskDiscardChanges">Doriţi să renunţaţi la modificările făcute? (Butonul de salvare este în partea superioară a formularului.)</string>
<string name="AskDiscardChanges_title">Renunță la modificări?</string>
<string name="suggest_improvements">Propuneți sau votați pentru îmbunătățiri</string>
<string name="rate_app">Evaluează această aplicație</string>
<string name="translate_app">Traduce KP2A</string>
@ -268,10 +334,10 @@
<string name="DecodingDatabase">Se decodează baza de date&#8230;</string>
<string name="ParsingDatabase">Se parsează baza de date&#8230;</string>
<string name="CheckingTargetFileForChanges">Se verifică fişierul ţintă pentru modificări&#8230;</string>
<string name="TitleSyncQuestion">Combinare modificări?</string>
<string name="MessageSyncQuestion">Fişierul bazei de date a fost modificat extern. Doriţi să încărcaţi şi să combinaţi modificările înainte de salvare. Selectaţi Nu dacă doriţi să suprascrieţi modificările externe.</string>
<string name="SynchronizingDatabase">Se combină modificările&#8230;</string>
<string name="YesSynchronize">Da, combină</string>
<string name="TitleSyncQuestion">Îmbinare modificări?</string>
<string name="MessageSyncQuestion">Fişierul bazei de date a fost modificat extern. Doriţi să încărcaţi şi să îmbinați modificările înainte de salvare. Selectaţi Nu dacă doriţi să suprascrieţi modificările externe.</string>
<string name="SynchronizingDatabase">Se îmbină modificările&#8230;</string>
<string name="YesSynchronize">Da, îmbină</string>
<string name="NoOverwrite">Nu, suprascrie</string>
<string name="SynchronizingCachedDatabase">Sincronizează baza de date din cache&#8230;</string>
<string name="DownloadingRemoteFile">Se descarcă fişierul de la distanţă&#8230;</string>
@ -279,19 +345,33 @@
<string name="RestoringRemoteFile">Se restaurează fişierul de la distanţă&#8230;</string>
<string name="FilesInSync">Fişierele sunt sincronizate.</string>
<string name="SynchronizedDatabaseSuccessfully">Baza de date s-a sincronizat cu succes!</string>
<string name="CheckingDatabaseForChanges">Verific baza de date pentru modificări&#8230;</string>
<string name="CheckingDatabaseForChanges">Se verifică baza de date pentru modificări&#8230;</string>
<string name="CouldNotSaveToRemote">Nu s-a putut salva la distanţă: %1$s. Salvaţi din nou sau folosiţi meniul Sincronizare atunci când conexiunea revine.</string>
<string name="CouldNotLoadFromRemote">Nu s-a putut deschide de la distanţă: %1$s. S-a încărcat versiunea locală. Totuşi puteţi face modificări în baza de date şi să le sincronizaţi ulterior.</string>
<string name="UpdatedRemoteFileOnLoad">S-a actualizat fişierul remote.</string>
<string name="NotifyOpenFromLocalDueToConflict">S-a deschis varianta locală din cauza unor conflicte cu varianta remote. Folosiţi meniul Sincronizare pentru a combina.</string>
<string name="LoadedFromRemoteInSync">Varianta remote şi din cache sun sincronizate.</string>
<string name="NotifyOpenFromLocalDueToConflict">S-a deschis varianta locală din cauza unor conflicte cu varianta remote. Folosiţi meniul Sincronizare pentru a îmbina.</string>
<string name="LoadedFromRemoteInSync">Varianta remote şi cache sunt sincronizate.</string>
<string name="UpdatedCachedFileOnLoad">S-a actualizat copia locală %1$s.</string>
<string name="RemoteDatabaseUnchanged">Nu s-au detectat modificări.</string>
<string name="ResolvedCacheConflictByUsingRemoteOtpAux">S-a actualizat fișierul auxiliar OTP din cache: Contorul remote era mai mare.</string>
<string name="ResolvedCacheConflictByUsingLocalOtpAux">S-a actualizat fișierul auxiliar OTP remote: Contorul local era mai mare.</string>
<string name="SynchronizingOtpAuxFile">Se sincronizează fișierul auxiliar OTP&#8230;</string>
<string name="database_file">fișier bază de date</string>
<string name="otp_aux_file">Fişier auxiliar OTP</string>
<string name="ErrorOcurred">A apărut o eroare:</string>
<string name="DuplicateUuidsError">Baza de date este coruptă: ID-uri duplicate au fost găsite. (Ai salvat cu Minikeepass?) Te rog să reimporți o bază de date nouă cu Keepass 2 pentru PC selectând \'Create new IDs\'.</string>
<string name="DuplicateUuidsErrorAdditional">Poți dezactiva acest mesaj în Setări/Setări aplicație/Utilizare fişiere/Verifică dubluri UUID. Reține că este posibil ca aplicația să se comporte neașteptat. Este recomandat pentru a repara baza de date.</string>
<string name="synchronize_database_menu">Sincronizează baza de date&#8230;</string>
<string name="CannotMoveGroupHere">Nu se poate muta grupul în acest grup.</string>
<string name="donate_question">Astăzi este Oktoberfest! Dacă vă place Keepass2Android: nu ar fi azi o zi potrivită să-mi cumpăraţi o bere?</string>
<string name="donate_bday_question">10 mai? Este ziua mea! Dacă îți place această aplicație, de ce să nu-mi trimiți niște felicitări împreună cu un mic cadou? Asta mă va face foarte fericit! :-)</string>
<string name="donate_missedbday_question">Oh, ai pierdut ziua mea de naștere pe 10 mai! Dacă îți place această aplicație, de ce să nu-mi trimiți niște felicitări împreună cu un mic cadou? Încă nu e prea târziu să fiu fericit! :-)</string>
<string name="ok_donate">Spune-mi mai multe!</string>
<string name="no_thanks">Nu, nu-mi place atât de mult</string>
<string name="hint_sftp_host">host (ex: 192.168.0.1)</string>
<string name="hint_sftp_port">port</string>
<string name="initial_directory">Folder inițial (opțional):</string>
<string name="enter_sftp_login_title">Introduceţi datele de conectare SFTP:</string>
<string name="select_storage_type">Selectaţi tipul de stocare:</string>
<string name="filestoragename_file">Fişier local</string>
<string name="filestoragename_androidget">Obţine de la aplicaţie externă</string>
@ -300,44 +380,184 @@
<string name="filestoragename_http">HTTP (WebDav)</string>
<string name="filestoragename_https">HTTPS (WebDav)</string>
<string name="filestoragename_dropbox">Dropbox</string>
<string name="filestoragename_dropboxKP2A">Dropbox (folder KP2A)</string>
<string name="filestoragehelp_dropboxKP2A">Dacă nu doriți să oferiți KP2A acces la tot Dropbox-ul, poți selecta această opțiune. Aceasta va solicita acces doar la folderul Apps/Keepass2Android. Acest lucru este ideal când creați o bază de date nouă. Dacă ai deja o bază de date, apasă această opțiune pentru a crea folderul, puneți baza de date în folder (de pe PC) apoi selectați opțiunea aceasta din nou pentru a deschide fișierul.</string>
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestorage_setup_title">Iniţializere access fişier</string>
<string name="filestoragename_skydrive">OneDrive</string>
<string name="filestoragename_sftp">SFTP (SSH File Transfer)</string>
<string name="filestorage_setup_title">Iniţializare acces fişier</string>
<string name="database_location">Locaţie bază de date</string>
<string name="help_database_location">Puteţi stoca baza de date local pe aparatul dvs. sau în cloud (versiunea non-Offline). Keepass2Android face baza de date disponibilă şi dacă sunteţi offline. Deoarece baza de date este criptată AES 256 bit nimeni nu va putea accesa parolele dvs. Vă recomandăm Dropbox: este accesibil pe toate aparatele dvs. şi oferă chiar copii de siguranţă a versiunilor anterioare ale unui fişier.</string>
<string name="hint_database_location">Selectaţi unde doriţi să stocaţi baza de date:</string>
<string name="button_change_location">Modifică locaţia</string>
<string name="master_password">Parola principală</string>
<string name="help_master_password">Baza de date este criptata cu parola ce o introduceţi aici. Alegeţi o parolă puternică pentru a păstra datele în siguranţă! Sfat: Inventaţi o propoziţie sau două si folosiţi prima literă a cuvintelor. Includeţi şi semnele de punctuaţie.</string>
<string name="hint_master_password">Alegeţi o parolă master pentru a proteja baza de date:</string>
<string name="hint_master_password">Alegeţi o parolă principală pentru a proteja baza de date:</string>
<string name="key_file">Fişier cheie</string>
<string name="help_key_file">Un fişier cheie este în esenţă o parolă stocate într-un fişier. Fişierele cheie sunt de obicei mai puternice decât parola master, deoarece cheia poate fi mult mai complicată; cu toate acestea este, de asemenea, mai greu să o ţineţi secretă. Dacă stocați bazei de date în cloud, nu păstraţi şi cheia tot acolo! Acest lucru ar fi complet inutil! Important: Nu modificaţi conţinutul fişierului cheie după crearea bazei de date!</string>
<string name="hint_key_file">Alegeţi dacă doriţi să utilizaţi un fişier cheie pe lângă parola de master:</string>
<string name="help_key_file">Un fişier cheie este în esenţă o parolă stocată într-un fişier. Fişierele cheie sunt de obicei mai puternice decât parola principală, deoarece cheia poate fi mult mai complicată; cu toate acestea este, de asemenea, mai greu să o ţineţi secretă. Dacă stocați baza de date în cloud, nu păstraţi şi cheia tot acolo! Acest lucru ar fi complet inutil! Important: Nu modificaţi conţinutul fişierului cheie după crearea bazei de date!</string>
<string name="hint_key_file">Alegeţi dacă doriţi să utilizaţi un fişier cheie pe lângă parola principală:</string>
<string name="use_key_file">Foloseşte fişier cheie</string>
<string name="error_adding_keyfile">Eroare la adăugarea fişierului cheie!</string>
<string name="ChangeLog_title">Change log</string>
<string name="init_otp">Se încarcă fișierul auxiliar OTP&#8230;</string>
<string name="otp_explanation">Introduceți următorul One-time-passwords (OTP). Puneți Youbikey NEO-ul vostru pe spatele aparatului pentru a introduce prin NFC.</string>
<string name="otp_hint">OTP %1$d</string>
<string name="YubiChallengeNotInstalled">Nu s-a găsit o aplicație care să se ocupe de această provocare. Te rog să instalezi Yubichallenge de pe Google Play.</string>
<string name="CouldntLoadOtpAuxFile">Nu se poate încărca fișierul auxiliar OTP!</string>
<string name="CouldntLoadOtpAuxFile_Hint">Te rugăm să folosești plugin-ul OtpKeyProv în KeePass 2.x (PC) pentru a configura baza de date pentru OTP-uri!</string>
<string name="otp_discarded_because_no_db">Te rugăm să selectezi baza de date întâi. OTP este ignorat pentru motive de securitate.</string>
<string name="otp_discarded_no_space">OTP ignorat: Toate OTP-urile au fost deja introduse!</string>
<string name="otp_discarded_because_db_open">Te rugăm să închizi baza de date întâi. OTP este ignorat.</string>
<string name="otps_pending">(Unul sau mai multe OTP -uri sunt deja disponibile)</string>
<string name="otpsecret_hint">Secret OTP (ex. 01 23 ab cd&#8230;)</string>
<string name="CouldntParseOtpSecret">Eroare în citire secret OTP!</string>
<string name="OtpKeyError">Imposibil de creat cheia OTP! Asigură-te că ai introdus OTP-urile corecte.</string>
<string name="ErrorUpdatingOtpAuxFile">Eroare în actualizare fișier auxiliar OTP!</string>
<string name="SavingOtpAuxFile">Se salvează fișierul auxiliar OTP&#8230;</string>
<string name="bad_resp">Răspunsul la provocare este incorect.</string>
<string name="CouldntLoadChalAuxFile">Nu se poate încărca fișierul auxiliar de provocare!</string>
<string name="CouldntLoadChalAuxFile_Hint">Vă rugăm să folosiți plugin-ul KeeChallenge în KeePass 2,x (PC) pentru a configura data de baze cu răspunsuri-provocare!</string>
<string name="ErrorUpdatingChalAuxFile">Eroare în actualizare fișier auxiliar OTP!</string>
<string name="TrayTotp_SeedField_title">Nume câmp seed TOTP</string>
<string name="TrayTotp_SeedField_summary">Dacă utilizaţi plugin-ul Keepass 2 \"TrayTotp\" cu setări non-implicite, introduceţi numele de câmp pentru câmpul de seed aici în funcţie de setările de pe PC.</string>
<string name="TrayTotp_SettingsField_title">Nume câmp setări TOTP</string>
<string name="TrayTotp_SettingsField_summary">Introduceţi aici numele de câmp al câmpului de setări pentru TrayTotp.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="loading">Se încarcă&#8230;</string>
<string name="plugins">Plugin-uri</string>
<string name="plugin_packagename">Numele pachetului:</string>
<string name="plugin_description">Descriere (neverificată):</string>
<string name="plugin_author">Autor (neverificat):</string>
<string name="plugin_enabled">activat</string>
<string name="plugin_disabled">dezactivat</string>
<string name="plugin_web">Caută plugin-uri online</string>
<string name="plugin_scopes">Domenii</string>
<string name="query_credentials_for_url">%1$s solicită date de login pentru %2$s.</string>
<string name="query_credentials">%1$s solicită date de login. Selectează o înregistrare.</string>
<string name="plugin_enabled_checkbox">Activat</string>
<string name="SCOPE_DATABASE_ACTIONS_title">Notificare acțiune bază de date</string>
<string name="SCOPE_DATABASE_ACTIONS_explanation">Plugin-ul va fi notificat când o bază de date este deschisă, închisă sau salvată.</string>
<string name="SCOPE_CURRENT_ENTRY_title">Date înregistrare curentă</string>
<string name="SCOPE_CURRENT_ENTRY_explanation">Plugin-ul va primi toate datele despre înregistrarea curentă din baza de date şi va putea oferii acţiuni şi modifica afişarea acesteia.</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title">Interoghează propriile date de login</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation">Plugin-ul va putea interoga datele de login asociate cu propriul său pachet de aplicație.</string>
<string name="SCOPE_QUERY_CREDENTIALS_title">Interoghează datele de login</string>
<string name="SCOPE_QUERY_CREDENTIALS_explanation">Plugin-ul va putea interoga datele de login pentru site-uri sau aplicații deliberate.</string>
<string name="get_regular_version">Obțineți mai multe tipuri de stocare</string>
<string name="CertificateWarning">Atenție: Validarea certificatului de server a eșuat: %1$s. Instalați pe aparat certificatul root corespunzător sau vedeți setările!</string>
<string name="CertificateFailure">Eroare: Validarea certificatului de server a eșuat! Instalați pe aparat certificatul root corespunzător sau vedeți setările!</string>
<string name="export_fileformats_title">Selectează formatul fișierului</string>
<string name="killed_by_os">Ne pare rău! Keepass2Android a fost oprit de Android OS! Din motive de securitate, Keepass2Android nu a menținut datele de login selectate pe disk, deci va trebui să redeschideți baza de date. Notă: Aceasta ar trebui să se întâmple foarte rar. În caz contrar, te rog să îmi lași un mesaj la crocoapps@gmail.com.</string>
<string name="FileIsTemporarilyAvailable">Fișierul este disponibil temporar pentru Keepass2Android.</string>
<string name="FileIsReadOnly">Fişierul selectat este read-only.</string>
<string name="FileIsReadOnlyOnKitkat">Fișierul selectat este read-only pentru Keepass2Android din cauza restricțiilor pe Android 4.4+.</string>
<string name="CopyFileRequired">Pentru a-l folosi, trebuie copiat într-o altă locație.</string>
<string name="CopyFileRequiredForEditing">Pentru a-l edita, trebuie copiat fișierul într-o altă locație.</string>
<string name="ClickOkToSelectLocation">Apasă pe OK pentru a selecta locația în care se va copia fișierul.</string>
<string name="CancelReadOnly">Anulați, deschideți read-only.</string>
<string name="CopyingFile">Se copiază fișierul...</string>
<string name="KdbBetaWarning">Vă rugăm să reţineţi: aţi încărcat o bază de date Keepass 1. Keepass2Android a adăugat recent suport pentru scrierea în acest format de bază de date. În ciuda testărilor riguroase, autorul nu garantează că toate datele vor fi salvate corect. Vă rugăm să păstraţi întotdeauna o copie de rezervă a bazei de date originale (Dropbox stochează automat versiunile recente) înainte de a face modificări. Vă rugăm să raportaţi orice probleme. Mulţumesc!</string>
<string name="ChangeLog_title">Jurnal modificări</string>
<string name="PreviewWarning">Rețineți! Aceasta este o versiune de examinare și poate avea unele defecte! Dacă vă confruntați cu *ceva* neașteptat, vă rog să îmi spuneți (pe Codeplex sau prin email).</string>
<string name="ChangeLog_0_9_7">
Versiunea 0.9.7\n
* suport pentru scrierea bazelor de date Keepass 1 (kdb) (beta)!\n
* trecerea la tastatura anterioară mai bună (de asemenea, funcţionează pe dispozitivele fără root)\n
* suport pentru KeeChallenge cu provocări de lungime variabilă\n
* împiedică screenshot-urile la QuickUnlock si parolă\n
* s-a inversat ordinea de sortare pentru Sortează după data modificării (acum descrescătoare)\n
* bug rezolvat: Notele se actualizează acum corect după modificări, parola se ascunde corect pe (sperăm) toate dispozitivele, rezolvat problema care a permis să se adauge o înregistrare de două ori, rezolvat problema cu afișarea avertizării pentru UUID-uri duplicate chiar după corectarea bazei de date\n</string>
<string name="ChangeLog_0_9_6">
Versiunea 0.9.6\n
* permite să se importe fișierul cheie și/sau fişierul bazei de date în folderul intern (a se vedea setările)\n
* permite diferite opțiuni de sortare\n
* îmbunătăţit preferinţele pentru comutarea automată a tastaturii\n
* actualizat logo-ul aplicației şi design-ul notificării, design de Stefano Pignataro (http://www.spstudio.at)\n
* generatorul de parola reține ultimele setări\n
* setaţi vizibilitatea notificării pentru ecranul de blocare Android 5\n
* acum se șterge câmpul cu parola principală când se părăsește aplicația fără a apăsa OK\n
* rezolvat problemă cu lipsa unor limbi în setările tastaturii pe unele aparate\n
* rezolvat problemă la comutarea automată a tastaturii pe aparate cu root\n
* adăugat verificare pentru baze de date corupte (UUID-uri duplicate)\n
* reîncarcă automat baza de date atunci când au fost detectate schimbări, rezolvă o problemă de securitate privind dezvăluirea parolei principale\n
* îmbunătăţit schema tastaturii mici, rezolvat tema setărilor tastaturii (mulțumită lui Wiktor Ławski)\n</string>
<string name="ChangeLog_0_9_5">
<b>Versiunea 0.9.5</b>\n
* Rezolvat probleme cu navigarea fisierelor (mai ales pe Android 4.4)\n
* Rezolvat problemă cu încărcarea fişierelor .kdb (Keepass 1) pe Nexus 5 cu Android Lollipop\n
* Adăugat opţiunea de a preveni screenshot-uri/afişarea în lista cu aplicații recente\n
* Rezolvat problemă cu stocarea Google Drive (ediția obișnuită)\n
* Permite fişierele cheie pe tipuri de stocare deliberate (ediția obișnuită)\n
* Actualizat Dropbox SDK pentru a include un patch oficial de securitate (ediția obișnuită)\n
* Actualizat utilitarele --&gt; dimensiunea apk-ului a crescut :-(\n
Am promis mai multe modificări. Vor veni cu următoarea versiune - scuze. Am vrut să public aceste remedieri cât mai repede posibil.</string>
<string name="ChangeLog_0_9_4">
<b>Versiunea 0.9.4</b>\n
* adăugat suport pentru plug-in: consultaţi setările pentru a obţine plug-in-uri!\n
* publicat plug-in QR (scanează parole, afişează parole ca un cod QR, transferă înregistrările la alte dispozitive cu KP2A)\n
* publicat plugin-ul InputStick (transferă date de login la PC prin bluetooth - necesită stick USB InputStick)\n
* Aplicaţiile terţe pot acum pur şi simplu pune în aplicare interogarea KP2A pentru date de conectare. Eşti un dezvoltator? Te rog să adaugi asta la aplicația ta dacă îți este necesar!\n
* adăugat suport TOTP (compatibil cu KeeOTP şi TrayTotp)\n
* aplicația nu mai trebuie să fie oprită de Android atunci când baza de date este deschisă\n
* baza de date nu mai este blocat atunci când se părăsește aplicația cu butonul înapoi (a se vedea setările)\n
* afişează numele grupului în rezultatele căutării (*)\n
* meniu adăugat în rezultatele căutării incluzând opțiunea \"Navighează la părinte\"(*)\n
* adăugat opţiunea de a afişa numele grupului la înregistrare(*)\n
* (*) mulțumită lui Matthieu pentru implementarea acestor caracteristici!\n
* suport KeeChallenge (cu Yubikey NEO). Mulțumită lui Ben Rush pentru implementarea conectorului!\n
* îmbunătăţit interfața utilizatorului\n
* rezolvat un bug în interfața Google Drive\n
* adăugat posibilitatea de a dezactiva opțiunea \"donează\"\n
* icoana de la QuickUnlock este acum ascunsă implicit pe dispozitive cu Android 4.2+\n</string>
<string name="ChangeLog_0_9_3_r5">
<b>Versiunea 0.9.3 r5</b>\n
* fixări încorporate de la Xamarin: Keepass2Android este acum compatibil cu ART pe Android 4.4.2. În sfârșit!\n
* Rezolvat bug-uri: bug-uri în sincronizare (reîmprospătează display-ul, verificări corecte pentru modificările la http), bug-uri pe dispozitive Android 2.x, bug-uri în implementări de stocare Google Drive şi OneDrive, golește clipboard la închiderea bazei de date, bug cu deschiderea ataşamentelor, probleme cu afișarea tastaturii\n</string>
<string name="ChangeLog_0_9_3">
<b>Versiunea 0.9.3</b>\n
* Tastatură nouă cu multe îmbunătățiri. Vedeți setările pentru a o personaliza.\n
* suport read-only pentru kdb (fișiere Keepass 1). Experimental!\n
* adăugat suport SFTP\n
* adăugată soluție pentru bug-ul în ART (Android 4.4.2)\n
* Bug-uri rezolvate\n</string>
<string name="ChangeLog_0_9_2">
<b>Versiunea 0.9.2</b>\n
* Adăugat suport OTP (compatibil cu plugin-ul OtpKeyProv)\n
* Integrat suport NFC pentru OTP-uri din YubiKey NEO \n
* Câteva îmbunătățiri interfață\n
* Integrat librărie Keepass 2.24\n
* Adăugat opţiunea de a opri procesul aplicației (a se vedea setările)\n
* Îmbunătăţit validarea certificatelor SSL\n
* Bug-uri rezolvate\n</string>
<string name="ChangeLog_0_9_1">
<b>Versiunea 0.9.1</b>\n
* Suport pentru SkyDrive (doar pentru ediția obișnuită Keepass2Android)\n
* probleme cu integrarea Google Drive rezolvate\n
* adăugat suport NTLM</string>
<string name="ChangeLog_0_9">
<b>Versiunea 0.9</b>\n
* Suport integrat pentru Dropbox şi Google Drive (citire/scriere baze de date; doar ediţia normală Keepass2Android)\n
* Browser fişiere integrat (bazat pe android-filechooser de HBA)\n
* Interfaţă îmbunătăţită pentru creearea de noi baze de date\n
* Interfaţă îmbunătăţită pentru crearea de noi baze de date\n
* Include font personalizat DejaVu Sans Mono pentru afişarea parolelor\n
* Bug fixes</string>
* Bug-uri rezolvate</string>
<string name="ChangeLog_0_8_6">
<b>Versiunea 0.8.6</b>\n
* Suport pentru cifrul Twofish\n
* Permite editarea de grupuri\n
* Permite mutarea de intrări şi grupuri\n
* Icoana QuickUnlock poate fi făcută transparentă (setări)\n
* Bug fixes</string>
<string name="ChangeLog_0_8_5"><b>Versiunea 0.8.5</b>\n
* Bug-uri rezolvate</string>
<string name="ChangeLog_0_8_5">
<b>Versiunea 0.8.5</b>\n
* Fişierele remote sunt stocate local în cache-ul aplicaţiei pentru a permite utilizare offline (inclusiv editare şi sincronizare ulterioară). Verificaţi setările.\n
* Icoană de notificare pentru a vizualiza starea de blocare a bazei de date (verificaţi setările)\n
* Determinare imbunătăţită a stării de blocare în unele situaţii\n
* Bazele de date sunt incărcate în memorie în timpul introducerii parolei pentru scurtarea timpului de incărcare (verificaţi setările)\n
* Se pot adăuga intrări în grupul rădăcină\n
* Bug fixes (rezolvă câmpurile referinţă, probleme cu tastatura pe aparatele italiene şi chineze)</string>
<string name="ChangeLog_0_8_4"><b>Versiunea 0.8.4</b>\n
* Modificările externe ale bazei de date sunt detectate şi combinate la salvare\n
* Determinare îmbunătăţită a stării de blocare în unele situaţii\n
* Bazele de date sunt încărcate în memorie în timpul introducerii parolei pentru scurtarea timpului de încărcare (verificaţi setările)\n
* Se pot adăuga înregistrări în grupul rădăcină\n
* Bug-uri rezolvate (se rezolvă câmpurile referinţă, probleme cu tastatura pe aparatele italiene şi chineze)</string>
<string name="ChangeLog_0_8_4">
<b>Versiunea 0.8.4</b>\n
* Modificările externe ale bazei de date sunt detectate şi îmbinate la salvare\n
* S-a îmbunătăţit performanţa la încărcare\n
* Bară de căutare îmbunătăţită cu sugestii\n
* Logo nou pentru aplicaţie!\n
@ -346,14 +566,14 @@
Mulţumiri lui Alex Vallat pentru contribuţiile sale la cod!\n
Mulţumiri lui Niki Hüttner (www.close-cut.de) pentru noul logo!\n</string>
<string name="ChangeLog_0_8_3"><b>Versiunea 0.8.3</b>\n
* index utilizator/TAN afişat în lista de înregistrări (vezi setări)\n
* Index utilizator/TAN afişat în lista de înregistrări (vezi setări)\n
* Înregistrările pot fi create dacă o căutare din browser nu găseşte rezultate\n
* Tastatura KP2A oferă posibilitatea de a căuta date de logare pentru aplicaţia curentă\n
* Aplicaţia se închide automat după selectarea unei înregistrări de folosit cu tastatura\n
* Dialogul de selecţie a tastaturii se deschide automat după căutarea după URL (vezi setări)\n
* Substituenţii din câmpuri sunt înlocuiţi înainte de copiere (majoritatea sunt suportaţi)\n
* fixuri pentru bug-uri minore
  </string>
* Bug-uri minore rezolvate
</string>
<string name="ChangeLog_0_8_2"><b>Versiunea 0.8.2</b>\n
* suport pentru autentificare Digest în WebDAV\n
* bugfix-uri (OI File manager, Deschide URL)
@ -363,48 +583,72 @@ Mulţumiri lui Niki Hüttner (www.close-cut.de) pentru noul logo!\n</string>
* Noi traduceri adăugate (mulţumiri contribuitorilor!)
</string>
<string name="ChangeLog_0_8"><b>Versiunea 0.8</b>\n
* îmbunătăţiri pentru interfaţa cu utilizatorul mai ales pentru Android 4.x\n
* permite folosirea unor managere de fişiere în mod deliberat pentru selectarea fişierelor\n
* adăugat un mod mai sigur pentru deschiderea de ataşamente (folosind un director cache)\n
* Îmbunătăţiri pentru interfaţa cu utilizatorul mai ales pentru Android 4.x\n
* Permite folosirea unor managere de fişiere în mod deliberat pentru selectarea fişierelor\n
* S-a adăugat un mod mai sigur pentru deschiderea de ataşamente (folosind un director cache)\n
* Reparat erori la Editare activitate\n
* probabil s-au introdus bug-uri noi :-)
</string>
<string name="ChangeLog_keptDonate">Posibilitate extinsă de a dona o bere sau altceva</string>
<string name="ChangeLog_0_7"><b>Versiunea 0,7</b>\n
* a crescut viteza de încărcare: transformarea cheii este acum de 10x mai rapidă!\n
* adăugat tastatura Keepass2Android: comută la aceasta tastatura pentru a introduce detaliile. Vă protejează de programe ce scanează clipboardul după parole (dezactivează vechile notificări clipboard din opţiuni)\n
* adăugat tastatura Keepass2Android: comută la aceasta tastatura pentru a introduce detaliile. Vă protejează de programe ce scanează clipboard-ul după parole (dezactivează vechile notificări clipboard din opţiuni)\n
* Adăugat opţiunea de a dona o bere sau altceva (vezi meniul)</string>
<string name="ChangeLog"><b>Versiunea 0.6.2</b>\n
* integrare Google Drive/Dropbox /...: utilizaţi aplicaţiile oficiale Google Drive sau Dropbox şi deschide orice fişier .kdbx. Acest lucru va deschide acum KP2A.\n
* Dialog căutare îmbunătăţit \n
* Integrare Google Drive/Dropbox /...: utilizaţi aplicaţiile oficiale Google Drive sau Dropbox şi deschide orice fişier .kdbx. Acest lucru va deschide acum KP2A.\n
* Dialog de căutare îmbunătăţit \n
* Îmbunătăţit rezultate căutare pentru URL-uri împreună cu subdomenii\n
* adăugat în meniu opţiuni pentru a da feedback, şi evalua sau traduce aplicaţia\n
* adăugat în meniu opţiuni pentru a da feedback, evalua sau traduce aplicaţia\n
\n
<b>versiunea 0.6.1</b>\n
* detectează dacă baza de date se modifică în fundal (i.e. datorită unei aplicaţii de sincronizare)\n
<b>Versiunea 0.6.1</b>\n
* Detectează dacă baza de date se modifică în fundal (i.e. datorită unei aplicaţii de sincronizare)\n
* S-a îmbunătăţit căutarea din URL-uri din navigator\n
* dialog de confirmare când se renunţă la modificări\n
* Dialog de confirmare când se renunţă la modificări\n
\n
<b>versiunea 0.6</b>\n
Versiunea publică iniţială</string>
<b>Versiunea 0.6</b>\n
Versiunea publică iniţială
</string>
<string-array name="clipboard_timeout_options">
<item>30 de secunde</item>
<item>1 minut</item>
<item>5 minute</item>
<item>10 minutes</item>
<item>15 minutes</item>
<item>30 minutes</item>
<item>1 hour</item>
<item>Never</item>
<item>10 minute</item>
<item>15 minute</item>
<item>30 de minute</item>
<item>o oră</item>
<item>Niciodată</item>
</string-array>
<string-array name="export_fileformat_options">
<item>Bază de date Keepass 2 (.kdbx)</item>
<item>KeePass 2 XML (necriptat) (.xml)</item>
<item>KeePass CSV (necriptat) (.csv)</item>
</string-array>
<string-array name="list_size_options">
<item>Mic</item>
<item>Mediu</item>
<item>Mare</item>
</string-array>
<string-array name="design_options">
<item>Holo Light</item>
<item>Holo Dark</item>
</string-array>
<string name="design_title">Design</string>
<string-array name="cred_remember_modes">
<item>Nu reține numele utilizator și parola</item>
<item>Reține numele de utilizator</item>
<item>Reține doar numele de utilizator</item>
<item>Reține numele de utilizator și parola</item>
</string-array>
<string-array name="password_modes">
<item>Doar parolă</item>
<item>Parolă + fișier cheie</item>
<item>Parolă + OTP</item>
<item>Parolă + OTP secret (modul de recuperare)</item>
<item>Parolă + Challenge-Response</item>
<item>Parolă + Challenge-Response secret (modul de recuperare)</item>
</string-array>
<string-array name="AcceptAllServerCertificates_options">
<item>Ignoră eșecuri de validare a certificatului</item>
<item>Avertizează când validarea eșuează</item>
<item>Nu accepta certificate invalide</item>
</string-array>
</resources>

View File

@ -65,6 +65,7 @@
<string name="digits">Цифры 0…9</string>
<string name="disclaimer_formal">Keepass2Android поставляется БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ. Это свободное ПО и Вы можете распространять его по лицензии GPL v2 или более поздней.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Скопировать в буфер</string>
<string name="enter_filename">Введите имя файла базы данных</string>
<string name="entry_accessed">Доступ</string>
<string name="entry_cancel">Отмена</string>

View File

@ -65,6 +65,7 @@
<string name="digits">Číslice</string>
<string name="disclaimer_formal">Keepass2Android je poskytovaný BEZ AKEJKOĽVEK ZÁRUKY; Toto je voľne dostupný softvér a môžete ho redistribuovať za podmienok licencie GPL verzie 2 alebo novšej.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopírovať do schránky</string>
<string name="enter_filename">Vložte názov databázy</string>
<string name="entry_accessed">Prístup</string>
<string name="entry_cancel">Zrušiť</string>

View File

@ -1,4 +1,662 @@
<?xml version="1.0" encoding="utf-8"?>
<!--Generated by crowdin.com-->
<!--Generated by crowdin.net-->
<resources/>
<resources>
<string name="about_feedback">Odziv</string>
<string name="about_homepage">Domača stran</string>
<string name="AboutText">Keepass2Android je upravitelj gesel, ki omogoča branje/pisanje podatkovnih zbirk KeePass 2.x na Androidu.</string>
<string name="CreditsText">Uporabniški vmesnik temelji na predelavi KeepassDroida, ki ga je razvil Brian Pellin. Koda za opravila podatkovnih zbirk temelji na KeePassu od Dominika Reickla. Robot Android je kopirano ali prirejeno delo izdelka, ki ga ustvarja in deli Google in je uporabljeno v skladu s pogoji opisanimi v licenci za priznanje avtorstva Creative Commons 3.0.</string>
<string name="CreditsTextSFTP">Podpora SFTP je vgrajena z uporabo knjižnice JSch pod licenco BSD, ki jo je ustvaril JCraft, Inc.</string>
<string name="accept">Sprejmi</string>
<string name="deny">Zavrni</string>
<string name="add_entry">Dodaj vnos</string>
<string name="add_url_entry">Ustvari vnos za URL</string>
<string name="add_group">Dodaj skupino</string>
<string name="add_group_title">Dodaj skupino</string>
<string name="edit_group_title">Uredi skupino</string>
<string name="algorithm">Algoritem</string>
<string name="algorithm_colon">Algoritem</string>
<string name="app_name">Keepass2Android</string>
<string name="short_app_name">KP2A</string>
<string name="app_name_nonet">Keepass2Android Offline</string>
<string name="short_app_name_nonet">KP2A Offline</string>
<string name="app_timeout">Časovna omejitev programa</string>
<string name="app_timeout_summary">Čas pred zaklenitvijo podatkovne zbirke, ko je program nedejaven.</string>
<string name="kill_app_label">Uniči opravilo programa</string>
<string name="show_kill_app">Gumb Zapri</string>
<string name="show_kill_app_summary">Prikaži gumb za uničenje opravila programa na zaslonu gesla (za uporabnike paranoida)</string>
<string name="application">Program</string>
<string name="application_settings">Nastavitve programa</string>
<string name="ShowGroupnameInSearchResult_title">Prikaži ime skupine v rezultatih iskanja</string>
<string name="ShowGroupnameInSearchResult_resume">Prikaži ime skupine pod nazivi vnosov v rezultatih iskanja. Uporabno, če ima več vnosov enako ime.</string>
<string name="NavigationToGroupCompleted_message">Skupina za prikaz je sedaj: %1$s</string>
<string name="ShowGroupInEntry_title">Prikaži ime skupine v pogledu vnosov</string>
<string name="unknown_uri_scheme">Žal Keepass2Android ne more obdelati vrnjenega URI-ja %1$s. Navežite stik z razvijalcem!</string>
<string name="security_prefs">Varnost</string>
<string name="display_prefs">Prikaz</string>
<string name="password_access_prefs">Dostop z vnosom gesla</string>
<string name="QuickUnlock_prefs">Hitro odklepanje</string>
<string name="FileHandling_prefs">Ravnanje z datotekami</string>
<string name="keyboard_prefs">Tipkovnica</string>
<string name="export_prefs">Izvozi podatkovno zbirko …</string>
<string name="import_db_prefs">Uvozi podatkovno zbirko v notranjo mapo</string>
<string name="import_keyfile_prefs">Uvozi datoteko ključa v notranjo mapo</string>
<string name="keyboardswitch_prefs">Preklapljanje tipkovnice</string>
<string name="OnlyAvailableForLocalFiles">Na voljo samo v krajevnih datotekah.</string>
<string name="FileIsInInternalDirectory">Datoteka je shranjena v notranji mapi.</string>
<string name="DatabaseFileMoved">Datoteka podatkovne zbirke kopirana v notranjo mapo. Pritisnite V redu, da odprete iz novega mesta. Opomba: ne pozabite redno izvoziti podatkovno zbirko na varno pomnilniško napravo!</string>
<string name="KeyfileMoved">Datoteka ključa je bila kopirana v notranjo mapo. Prepričajte se, da imate varno varnostno kopijo, preden izbrišete iz trenutnega mesta!</string>
<string name="KeyfileMoveRequiresRememberKeyfile">Notranje mape ni mogoče uporabiti, ko si program ne zapomni mesta datoteke ključa. Spremenite varnostne nastavitve.</string>
<string name="brackets">Oklepaji</string>
<string name="cancel">Prekliči</string>
<string name="ClearClipboard">Odložišče počiščeno.</string>
<string name="clipboard_timeout">Časovna omejitev odložišča</string>
<string name="clipboard_timeout_summary">Čas pred čiščenjem odložišča po kopiranju uporabniškega imena ali gesla</string>
<string name="copy_username">Izberite, da kopirate uporabniško ime na odložišče</string>
<string name="copy_password">Izberite, da kopirate geslo na odložišče</string>
<string name="available_through_keyboard">Vnos je na voljo preko tipkovnice K2PA</string>
<string name="entry_is_available">je na voljo</string>
<string name="not_possible_im_picker">Pogovornega okna za izbiranje metode vnosa ni bilo mogoče odpreti. Ročno omogočite tipkovnico.</string>
<string name="please_activate_keyboard">Omogočite tipkovnico Keepass2Android v svojih sistemskih nastavitvah.</string>
<string name="creating_db_key">Ustvarjanje ključa podatkovne zbirke &#8230;</string>
<string name="current_group">Trenutna skupina</string>
<string name="current_group_root">Trenutna skupina: Skrbniki</string>
<string name="database">Podatkovna zbirka</string>
<string name="digits">Številke</string>
<string name="disclaimer_formal">Keepass2Android je brez VSAKRŠNE GARANCIJE; to je brezplačna programska oprema in lahko jo razširjate pod pogoji GPL-a različice 2 ali kasnejše.</string>
<string name="ellipsis">\u2026</string>
<string name="copy_to_clipboard">Kopiraj na odložišče</string>
<string name="enter_filename">Vnesite ime datoteke podatkovne zbirke</string>
<string name="entry_accessed">Dostopano</string>
<string name="entry_cancel">Prekliči</string>
<string name="entry_comment">Pripombe</string>
<string name="entry_tags">Oznake</string>
<string name="entry_override_url">Preglasi URL</string>
<string name="entry_confpassword">Potrdite geslo</string>
<string name="entry_created">Ustvarjeno</string>
<string name="entry_expires">Poteče</string>
<string name="entry_group_name">Ime skupine</string>
<string name="entry_keyfile">Datoteka ključa (izbirno)</string>
<string name="keyfile_heading">Datoteka ključa</string>
<string name="entry_modified">Spremenjeno</string>
<string name="entry_password">Geslo</string>
<string name="entry_save">Shrani</string>
<string name="entry_title">Ime</string>
<string name="entry_url">URL</string>
<string name="entry_user_name">Uporabniško ime</string>
<string name="entry_extra_strings">Dodatna polja nizov</string>
<string name="entry_binaries">Datotečne priponke</string>
<string name="error_can_not_handle_uri">Keepass2Android ne more obdelati tega url-ja.</string>
<string name="error_could_not_create_group">Napaka pri ustvarjanju skupine.</string>
<string name="error_could_not_create_parent">Nadrejene mape ni bilo mogoče ustvariti.</string>
<string name="error_database_exists">Ta datoteka že obstaja.</string>
<string name="error_database_settinoverrgs">Določanje nastavitev podatkovne zbirke je spodletelo.</string>
<string name="error_failed_to_launch_link">Zagon povezave je spodletel.</string>
<string name="error_filename_required">Zahtevano je ime datoteke.</string>
<string name="error_file_not_create">Ustvarjanje datoteke ni bilo mogoče</string>
<string name="error_invalid_db">Neveljavna podatkovna zbirka.</string>
<string name="error_invalid_path">Neveljavna pot.</string>
<string name="error_no_name">Zahtevano je ime.</string>
<string name="error_nopass">Zahtevano je geslo ali datoteka ključa.</string>
<string name="error_pass_gen_type">Vsaj eno vrsto ustvarjanja gesla je treba izbrati</string>
<string name="error_pass_match">Gesli se ne ujemata.</string>
<string name="error_rounds_not_number">Ponovitve morajo biti številka.</string>
<string name="error_title_required">Zahtevan je naziv.</string>
<string name="error_wrong_length">Vnesite pozitivno številko v polju dolžine</string>
<string name="FileNotFound">Datoteke ni bilo mogoče najti.</string>
<string name="file_browser">Brskalnik datotek</string>
<string name="generate_password">Ustvari geslo</string>
<string name="group">Skupina</string>
<string name="hint_comment">pripomba</string>
<string name="hint_conf_pass">potrdi geslo</string>
<string name="hint_generated_password">ustvarjeno geslo</string>
<string name="hint_group_name">Ime skupine</string>
<string name="hint_keyfile">datoteka ključa</string>
<string name="hint_length">dolžina</string>
<string name="hint_pass">geslo</string>
<string name="hint_login_pass">Geslo</string>
<string name="hint_title">ime</string>
<string name="hint_url">url</string>
<string name="hint_override_url">preglasi url</string>
<string name="hint_tags">oznaka 1, oznaka 2</string>
<string name="hint_username">uporabniško ime</string>
<string name="InvalidPassword">Neveljavno geslo ali datoteka ključa.</string>
<string name="invalid_algorithm">Neveljaven algoritem.</string>
<string name="invalid_db_sig">Oblike podatkovne zbirke ni mogoče prepoznati.</string>
<string name="keyfile_does_not_exist">Datoteka ključa ne obstaja.</string>
<string name="no_keyfile_selected">Nobena datoteka ključa ni izbrana.</string>
<string name="keyfile_is_empty">Datoteka ključa je prazna.</string>
<string name="length">Dolžina</string>
<string name="list_size_title">Velikost seznama skupin</string>
<string name="list_size_summary">Velikost besedila na seznamu skupin</string>
<string name="loading_database">Nakladanje podatkovne zbirke &#8230;</string>
<string name="lowercase">Male črke</string>
<string name="MaskedPassword">*****</string>
<string name="maskpass_title">Zakrij geslo</string>
<string name="maskpass_summary">Privzeto skrij gesla</string>
<string name="menu_about">O programu</string>
<string name="menu_change_key">Spremeni glavni ključ</string>
<string name="menu_copy_pass">Kopiraj geslo</string>
<string name="menu_copy_user">Kopiraj uporabnika</string>
<string name="menu_create">Ustavri</string>
<string name="menu_app_settings">Nastavitve</string>
<string name="menu_db_settings">Nastavitve podatkovne zbirke</string>
<string name="menu_delete">Izbriši</string>
<string name="menu_move">Premakni v drugo skupino</string>
<string name="menu_move_light">Premakni</string>
<string name="menu_navigate">Pomakni se v nadrejeno skupino</string>
<string name="menu_donate">Darujte pivo …</string>
<string name="menu_edit">Uredi</string>
<string name="menu_hide_password">Skrij geslo</string>
<string name="menu_lock">Zakleni podatkovno zbirko</string>
<string name="menu_open">Odpri</string>
<string name="menu_rename">Preimenuj</string>
<string name="menu_search">Išči</string>
<string name="menu_search_advanced">Napredno iskanje</string>
<string name="menu_url">Pojdi na URL</string>
<string name="menu_change_db">Spremeni podatkovno zbirko &#8230;</string>
<string name="minus">Minus</string>
<string name="never">Nikoli</string>
<string name="yes">Da</string>
<string name="no">Ne</string>
<string name="no_keys">Ni vnosov v podatkovni zbirki ali skupini.</string>
<string name="no_results">Ni rezultatov iskanja</string>
<string name="no_url_handler">Ni ročnika za ta url.</string>
<string name="open_recent">Odpri nedavno podatkovno zbirko (kliknite za odpiranje)</string>
<string name="omitbackup_title">Ne išči po vnosih varnostne kopije in Koša</string>
<string name="omitbackup_summary">Izpusti skupini \'Varnostna kopija\' in Koš iz rezultatov iskanja</string>
<string name="pass_filename">Ime datoteke podatkovne zbirke KeePass</string>
<string name="password_title">Vnesite geslo podatkovne zbirke</string>
<string name="master_key_type">Izberite vrsto glavnega ključa:</string>
<string name="progress_create">Ustvarjanje nove podatkovne zbirke &#8230;</string>
<string name="create_database">Ustvari podatkovno zbirko</string>
<string name="progress_title">V teku &#8230;</string>
<string name="remember_keyfile_summary">Si zapomni mesto datotek ključa</string>
<string name="remember_keyfile_title">Shrani datoteko ključa</string>
<string name="remove_from_filelist">Odstrani</string>
<string name="rijndael">Rijndael (AES)</string>
<string name="root">Korenska mapa</string>
<string name="rounds">Ponovitve šifriranja</string>
<string name="rounds_explaination">Večje št. ponovitev šifriranja zagotovi dodatno zaščito pred vdori z grobo silo, vendar lahko zelo upočasnijo nalaganje in shranjevanje.</string>
<string name="rounds_hint">ponovitve</string>
<string name="database_name">Ime podatkovne zbirke</string>
<string name="default_username">Privzeto uporabniško ime za nove vnose</string>
<string name="saving_database">Shranjevanje podatkovne zbirke &#8230;</string>
<string name="exporting_database">Izvažanje podatkovne zbirke &#8230;</string>
<string name="export_database_successful">Podatkovna zbirka uspešno izvožena!</string>
<string name="space">Prostor</string>
<string name="search_label">Išči</string>
<string name="show_password">Prikaži geslo</string>
<string name="sort_menu">Razvrsti po …</string>
<string name="sort_name">Razvrsti po imenu</string>
<string name="sort_db">Razvrsti po datumu nastanka</string>
<string name="sort_moddate">Razvrsti po datumu spremembe</string>
<string name="sort_default">Ohrani privzeti vrtni red</string>
<string name="special">Poseben</string>
<string name="search_hint">Najdite, kar</string>
<string name="search_results">Rezultati iskanja</string>
<string name="search_in">Išči v</string>
<string name="select_other_entry">Izberite drug vnos</string>
<string name="select_group_then_add">Odprite želeno skupino in potem pritisnite \"%1$s\"!</string>
<string name="insert_element_here">Vstavi tu</string>
<string name="twofish">Twofish</string>
<string name="underline">Podčrtaj</string>
<string name="unsupported_db_version">Nepodprta različica podatkovne zbirke</string>
<string name="uppercase">Velike črke</string>
<string name="warning_read_only">Vaša kartica SD je trenutno v načinu samo za branje. Shranjevanje sprememb podatkovne zbirke morda ni mogoče.</string>
<string name="warning_unmounted">Vaša kartica SD trenutno ni priklopljena na vaši napravi. Podatkovne zbirke morda ne bo mogoče naložiti ali ustvariti.</string>
<string name="version_label">Različica</string>
<string name="version_history">Zgodovina različic</string>
<string name="author">Keepass2Android razvija Philipp Crocoll.</string>
<string name="further_authors">Hvala %1$s za prispevke kode.</string>
<string name="designers">Hvala %1$s za prispevke pri oblikovanju ikon in razporeditve.</string>
<string name="credit_plugin1">Vtičnik Twofish Cipher za KeePass je razvil Scott Greenberg in je vključen v KP2A.</string>
<string name="credit_android_filechooser">Izbirnik datotek za Android je razvil Hai Bison</string>
<string name="credit_keyboard">Tipkovnica KP2A temelji na tipkovnici Gingerbread odprtokodnega projekta Android in uporablja kodo Upravitelja vtičnikov Tipkovnice za hekerje Klausa Weidnerja.</string>
<string name="please_note">Upoštevajte</string>
<string name="contributors">Prispevali so</string>
<string name="regular_expression">Običajni izraz</string>
<string name="TanExpiresOnUse_title">TAN ob uporabi poteče</string>
<string name="TanExpiresOnUse_summary">Ob uporabi označi vnose TAN kot potekle</string>
<string name="ShowUsernameInList_title">Prikaži uporabniško ime na seznamu</string>
<string name="ShowUsernameInList_summary">Prikaži uporniška imena pod nazivi vnosov. Uporabno za več računov ali TAN-e.</string>
<string name="RememberRecentFiles_title">Zapomni si podatkovne zbirke</string>
<string name="RememberRecentFiles_summary">Zapomni si nedavno odprte podatkovne zbirke in jih prikaži na zaslonu Odpri podatkovno zbirko.</string>
<string name="kp2a_findUrl">Keepass2Android: Najdi geslo</string>
<string name="excludeExpiredEntries">Izključi potekle vnose</string>
<string name="search_options">Možnosti</string>
<string name="caseSensitive">Razlikovanje velikosti črk</string>
<string name="start_open_file">Odpri datoteko …</string>
<string name="start_create">Ustvari novo podatkovno zbirko …</string>
<string name="start_open_url">Odpri URL …</string>
<string name="start_create_import">Uvozi datoteko v novo podatkovno zbirko …</string>
<string name="enter_filename_details_url">Določen mora biti celoten URL, vključno s protokolom, kot je http://.</string>
<string name="enter_filename_details_create_import">Datoteka za uvoz bo zbrana v naslednjem koraku.</string>
<string name="enable_quickunlock">Omogoči Hitro odklepanje</string>
<string name="QuickUnlock_label">Vnesite zadnje %1$d znake svojega gesla.</string>
<string name="QuickUnlock_button">Hitro odklepanje!</string>
<string name="QuickUnlock_lockButton">Zapri podatkovno zbirko</string>
<string name="QuickUnlockDefaultEnabled_title">Privzeto omogoči Hitro odklepanje</string>
<string name="QuickUnlockDefaultEnabled_summary">Določi, ali je Hitro odklepanje privzeto omogočeno.</string>
<string name="ViewDatabaseSecure_title">Zaščiti prikaz podatkovne zbirke</string>
<string name="ViewDatabaseSecure_summary">Če je omogočeno, zaslonske slike niso dovoljene in na seznamu nedavnih programov ni prikazana sličica.</string>
<string name="QuickUnlockIconHidden_title">Skrij ikono Hitrega odklepanja</string>
<string name="QuickUnlockIconHidden_summary">Hitro odklepanje na žalost ne deluje brez prikaza obvestilne ikone. Izberite to možnost, da uporabite prosojno ikono.</string>
<string name="QuickUnlockIconHidden16_title">Skrij ikono Hitrega odklepanja</string>
<string name="QuickUnlockIconHidden16_summary">Hitro odklepanje za pravilno delovanje zahteva obvestilo. Izberite to možnost, da prikažete obvestila brez ikone.</string>
<string name="QuickUnlockLength_title">Dolžina ključa Hitrega odklepanja</string>
<string name="QuickUnlockLength_summary">Največje število znakov, ki naj se uporabi v geslu Hitrega odklepanja.</string>
<string name="QuickUnlock_fail">Hitro odklepanje je spodletelo: nepravilno geslo!</string>
<string name="BinaryDirectory_title">Mapa datotečnih priponk</string>
<string name="BinaryDirectory_summary">Mapa, kamor se shranjujejo datotečne priponke.</string>
<string name="SaveAttachmentDialog_title">Shrani priponko</string>
<string name="SaveAttachmentDialog_text">Izberite, kam naj se shranjujejo priponke.</string>
<string name="SaveAttachmentDialog_save">Shrani na kartico SD</string>
<string name="SaveAttachmentDialog_open">Shrani v predpomnilnik in odpri</string>
<string name="SaveAttachment_doneMessage">Datoteka shranjena v %1$s.</string>
<string name="SaveAttachment_Failed">Datoteke ni bilo mogoče shraniti v %1$s.</string>
<string name="AddUrlToEntryDialog_title">Zapomni si iskalno besedilo?</string>
<string name="AddUrlToEntryDialog_text">Ali bi radi shranili iskalno besedilo \"%1$s\" v izbranem vnosu, da ga naslednjič samodejno najdete?</string>
<string name="error_invalid_expiry_date">Neveljavna oblika datuma/časa datuma poteka!</string>
<string name="error_string_key">Za vsak niz je zahtevano ime polja.</string>
<string name="field_name">Ime polja</string>
<string name="field_value">Vrednost polja</string>
<string name="protection">Zaščiteno polje</string>
<string name="add_binary">Dodaj datotečno priponko …</string>
<string name="add_extra_string">Dodaj dodaten niz</string>
<string name="delete_extra_string">Izbriši dodaten niz</string>
<string name="database_loaded_quickunlock_enabled">%1$s: zaklenjena. Hitro odklepanje omogočeno.</string>
<string name="database_loaded_unlocked">%1$s: odklenjena.</string>
<string name="credentials_dialog_title">Vnesite poverila strežnika</string>
<string name="UseFileTransactions_title">Prenosi datotek</string>
<string name="UseFileTransactions_summary">Uporabi prenose datotek za zapisovanje podatkovnih zbirk</string>
<string name="LockWhenScreenOff_title">Zakleni, ko je zaslon izklopljen</string>
<string name="LockWhenScreenOff_summary">Zakleni podatkovno zbirko, ko je zaslon izklopljen.</string>
<string name="ClearPasswordOnLeave_title">Počisti vneseno glavno geslo</string>
<string name="ClearPasswordOnLeave_summary">Počisti vneseno glavno geslo ob zapuščanju zaslona brez odklepanja podatkovne zbirke.</string>
<string name="LockWhenNavigateBack_title">Zakleni ob končanju programa</string>
<string name="LockWhenNavigateBack_summary">Zakleni podatkovno zbirko ob končanju programa s pritiskom na gumb Nazaj.</string>
<string name="NoDonateOption_title">Skrij možnost za darovanje</string>
<string name="NoDonateOption_summary">Ta nastavitev je za darovalce. Na voljo je samo, ko uporabite Keepass2Android za nekaj časa.</string>
<string name="NoDonateOption_question">Brez darovanj ta program ni bi obstajal in ne bi prejel neprestanih izboljšav! Če še niste darovali, razmislite o tem sedaj!</string>
<string name="UseOfflineCache_title">Predpomnenje podatkovne zbirke</string>
<string name="UseOfflineCache_summary">Ohrani kopijo oddaljenih datotek podatkovnih zbirk v mapi predpomnilnika programa. To omogoča uporabo oddaljenih podatkovnih zbirk tudi v nepovezanem načinu.</string>
<string name="AcceptAllServerCertificates_title">Potrdila SSL</string>
<string name="AcceptAllServerCertificates_summary">Določite vedenje, ko preverjanje veljavnosti potrdila spodleti. Opomba: na svojo napravo lahko namestite potrdila, če preverjanje veljavnosti spodleti!</string>
<string name="ClearOfflineCache_title">Počisti predpomnilnik?</string>
<string name="ClearOfflineCache_question">To bo izbrisalo vse predpomnjene datoteke podatkovnih zbirk. Vse spremembe, ki ste jih naredili v nepovezanem načinu in niso bile usklajene, bodo izgubljene! Nadaljuj?</string>
<string name="CheckForFileChangesOnSave_title">Preveri za spremembe</string>
<string name="CheckForFileChangesOnSave_summary">Pred shranjevanjem sprememb preveri, ali je bila datoteka spremenjena od zunaj.</string>
<string name="CheckForDuplicateUuids_title">Preveri za podvojene UUID-je</string>
<string name="CheckForDuplicateUuids_summary">Preveri, ali je datoteka podatkovne zbirke pokvarjena z večkratnimi vnosi z istim ID-jem. To lahko povzroči nepričakovano vedenje.</string>
<string name="ShowCopyToClipboardNotification_title">Obvestila odložišča</string>
<string name="ShowCopyToClipboardNotification_summary">Naredi uporabniško ime in geslo dostopno preko vrstice za obvestila in odložišča. Pazite se vohljačev gesel!</string>
<string name="ShowSeparateNotifications_title">Loči obvestila</string>
<string name="ShowSeparateNotifications_summary">Prikaži ločena obvestila za kopiranje uporabniškega imena in gesla na odložišče in omogočanje tipkovnice.</string>
<string name="ShowKp2aKeyboardNotification_title">Obvestilo tipkovnice KP2A</string>
<string name="ShowKp2aKeyboardNotification_summary">Naredi poln vnos dostopen preko tipkovnice KP2A (priporočljivo).</string>
<string name="OpenKp2aKeyboardAutomatically_title">Preklopi tipkovnico</string>
<string name="OpenKp2aKeyboardAutomatically_summary">Odpri pogovorno okno za izbiro tipkovnice, ko je vnos na voljo preko tipkovnice KP2A po iskanju iz brskalnika.</string>
<string name="kp2a_switch_rooted">Samodejno preklopi na napravah s skrbniškim dostopom</string>
<string name="kp2a_switch_rooted_summary">Samodejno prekopi na tipkovnico KP2A, ko je vnos odprt. Zahteva skrbniški dostop in program Secure Settings z modulom System+. </string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_title">Samodejno preklopi samo po iskanju</string>
<string name="OpenKp2aKeyboardAutomaticallyOnlyAfterSearch_summary">Samodejno preklopi samo na tipkovnico KP2A po uporabi zmožnosti Deli URL (vendar ne ob odpiranju vnosa na drug način)</string>
<string name="AutoSwitchBackKeyboard_title">Preklapljanje tipkovnice nazaj</string>
<string name="AutoSwitchBackKeyboard_summary">Preklopi nazaj na prejšnjo tipkovnico, ko ni odprt noben vnos.</string>
<string name="ShowUnlockedNotification_title">Ikona obvestila, ko je odklenjena</string>
<string name="ShowUnlockedNotification_summary">Prikaži ikono obvestila, ko je podatkovna zbirka odklenjena.</string>
<string name="PreloadDatabaseEnabled_title">Prednaloži datoteko podatkovne zbirke</string>
<string name="PreloadDatabaseEnabled_summary">Začni z nalaganjem v ozadju ali prejemanjem datoteke podatkovne zbirke med vnosom gesla.</string>
<string name="AskOverwriteBinary">Ali želite prepisati obstoječo dvojiško datoteko z enakim imenom?</string>
<string name="AskOverwriteBinary_title">Prepiši obstoječi dvojiško datoteko?</string>
<string name="AskOverwriteBinary_yes">Prepiši</string>
<string name="AskOverwriteBinary_no">Preimenuj</string>
<string name="AttachFailed">Dodajanje datotečne priponke je spodletelo.</string>
<string name="RecycleBin">Koš</string>
<string name="AskDeletePermanentlyEntry">Ali želite ta vnos trajno izbrisati? Pritisnite Ne, da ga premaknete v Koš.</string>
<string name="AskDeletePermanentlyGroup">Ali želite to skupino trajno izbrisati? Pritisnite Ne, da jo premaknete v Koš.</string>
<string name="AskDeletePermanently_title">Trajno izbriši?</string>
<string name="AskReloadFile_title">Ponovno naloži datoteko?</string>
<string name="AskReloadFile">Trenutno odprto datoteko je drug program spremenil. Ali jo želite ponovno naložiti?</string>
<string name="AskDiscardChanges">Ali res želite zavreči narejene spremembe? (Gumb Shrani je na vrhu obrazca.)</string>
<string name="AskDiscardChanges_title">Zavrzi spremembe?</string>
<string name="suggest_improvements">Predlagajte ali glasuje za izboljšave</string>
<string name="rate_app">Ocenite ta program</string>
<string name="translate_app">Prevedite KP2A</string>
<string name="AddingEntry">Dodajanje vnosa &#8230;</string>
<string name="AddingGroup">Dodajanje skupine &#8230;</string>
<string name="DeletingEntry">Brisanje vnosa &#8230;</string>
<string name="DeletingGroup">Brisanje skupine &#8230;</string>
<string name="SettingPassword">Nastavljanje gesla &#8230;</string>
<string name="UndoingChanges">Razveljavljanje sprememb &#8230;</string>
<string name="TransformingKey">Preoblikovanje glavnega ključa &#8230;</string>
<string name="DecodingDatabase">Odkodiranje podatkovne zbirke &#8230;</string>
<string name="ParsingDatabase">Razčlenjevanje podatkovne zbirke &#8230;</string>
<string name="CheckingTargetFileForChanges">Preverjanje ciljne datoteke za spremembe &#8230;</string>
<string name="TitleSyncQuestion">Združi spremembe</string>
<string name="MessageSyncQuestion">Datoteka podatkovne zbirke je bila spremenjena od zunaj. Ali želite pred shranjevanjem naložiti in združiti spremembe? Izberite Ne, če želite prepisati zunanje spremembe.</string>
<string name="SynchronizingDatabase">Združevanje sprememb &#8230;</string>
<string name="YesSynchronize">Da, združi</string>
<string name="NoOverwrite">Ne, prepiši</string>
<string name="SynchronizingCachedDatabase">Usklajevanje predpomnjene podatkovne zbirke &#8230;</string>
<string name="DownloadingRemoteFile">Prejemanje oddaljene datoteke &#8230;</string>
<string name="UploadingFile">Pošiljanje datoteke &#8230;</string>
<string name="RestoringRemoteFile">Obnavljanje oddaljene datoteke &#8230;</string>
<string name="FilesInSync">Datoteke so usklajene.</string>
<string name="SynchronizedDatabaseSuccessfully">Podatkovna zbirka uspešno usklajena!</string>
<string name="CheckingDatabaseForChanges">Preverjanje podatkovne zbirke za spremembe &#8230;</string>
<string name="CouldNotSaveToRemote">Shranjevanje na oddaljeno %1$s ni bilo mogoče. Ponovno shranite ali uporabite meni Uskladi, ko je oddaljena povezava spet na voljo.</string>
<string name="CouldNotLoadFromRemote">Odpiranje iz oddaljene %1$s ni mogoče. Naložena je bila datoteka iz krajevnega predpomnilnika. V podatkovni zbirki lahko še vedno naredite spremembe in jih uskladite kasneje.</string>
<string name="UpdatedRemoteFileOnLoad">Oddaljena datoteka posodobljena.</string>
<string name="NotifyOpenFromLocalDueToConflict">Odprta je bila krajevna datoteka zaradi spora s spremembami v oddaljeni datoteki. Uporabite meni Uskladi, da jih združite.</string>
<string name="LoadedFromRemoteInSync">Oddaljena datoteka in predpomnilnik sta usklajena.</string>
<string name="UpdatedCachedFileOnLoad">Krajevna predpomnjena kopija %1$s posodobljena.</string>
<string name="RemoteDatabaseUnchanged">Ni zaznanih sprememb.</string>
<string name="ResolvedCacheConflictByUsingRemoteOtpAux">Posodobljena predpomnjena pomožna datoteka OTP: oddaljeni števec je bil višji.</string>
<string name="ResolvedCacheConflictByUsingLocalOtpAux">Posodobljena predpomnjena pomožna datoteka OTP: krajevni števec je bil višji.</string>
<string name="SynchronizingOtpAuxFile">Usklajevanje pomožne datoteke OTP &#8230;</string>
<string name="database_file">datoteka podatkovne zbirke</string>
<string name="otp_aux_file">pomožna datoteka OTP</string>
<string name="ErrorOcurred">Pojavila se je napaka:</string>
<string name="DuplicateUuidsError">Podatkovna zbirka je pokvarjena: najdeni podvojeni ID-ji. (Ali ste shranili z Minikeepassom?) Ponovno uvozite v novo podatkovno zbirko s KeePassom 2 za PC in izberite \'Ustvari nove ID-je\'.</string>
<string name="DuplicateUuidsErrorAdditional">To sporočilo o napaki lahko onemogočite v Nastavitve/Nastavitve programa/Ravnanje z datotekami/Preveri za podvojene UUID-je. Upoštevajte, da lahko naletite na nepričakovano vedenje. Priporočljivo je popraviti podatkovno zbirko.</string>
<string name="synchronize_database_menu">Uskladi podatkovno zbirko &#8230;</string>
<string name="CannotMoveGroupHere">Skupine ni mogoče premakniti v to skupino.</string>
<string name="donate_question">Danes je Oktoberfest! Če vam je Keepass2Android všeč: ali ne bi bil današnji dan pravi dan, da mi kupite pivo?</string>
<string name="donate_bday_question">10. maj? To je moj rojstni dan! Če vam je ta program všeč, zakaj mi ne pošljete voščilnice za rojstni dan skupaj z majhnim darilom? To bi me zelo osrečilo! :-)</string>
<string name="donate_missedbday_question">Zamudili ste moj rojstni dan 10. maja! Če vam je ta program všeč, zakaj mi ne pošljete voščilnico za rojstni dan skupaj z majhnim darilom? Ni še prepozno, da me osrečite! :-)</string>
<string name="ok_donate">Povejte mi več!</string>
<string name="no_thanks">Ne, ni mi toliko všeč</string>
<string name="hint_sftp_host">gostitelj (npr.: 192.168.0.1)</string>
<string name="hint_sftp_port">vrata</string>
<string name="initial_directory">Začetna mapa (izbirno):</string>
<string name="enter_sftp_login_title">Vnesite podatke za prijavo SFTP:</string>
<string name="select_storage_type">Izberite vrsto pomnilniške naprave:</string>
<string name="filestoragename_file">Krajevna datoteka</string>
<string name="filestoragename_androidget">Dobi iz programa tretje osebe</string>
<string name="filestoragename_androidsend">Pošlji v program tretje osebe</string>
<string name="filestoragename_ftp">FTP</string>
<string name="filestoragename_http">HTTP (WebDav)</string>
<string name="filestoragename_https">HTTPS (WebDav)</string>
<string name="filestoragename_dropbox">Dropbox</string>
<string name="filestoragename_dropboxKP2A">Dropbox (mapa KP2A)</string>
<string name="filestoragehelp_dropboxKP2A">Če dostopa KP2A ne želite dati celemu Dropboxu, lahko izberete to možnost. Zahtevala bo samo dostop do mape Apps/Keepass2Android. To je posebej primerno ob ustvarjanju nove podatkovne zbirke. Če jo že imate, kliknite na to možnost, da ustvarite mapo, v njo vstavite svojo datoteko (iz računalnika) in ponovno izberete to možnost, da datoteko odprete.</string>
<string name="filestoragename_gdrive">Google Drive</string>
<string name="filestoragename_skydrive">OneDrive</string>
<string name="filestoragename_sftp">SFTP (prenos datotek SSH)</string>
<string name="filestorage_setup_title">Začenjanje dostopa do datoteke</string>
<string name="database_location">Mesto podatkovne zbirke</string>
<string name="help_database_location">Svojo podatkovno zbirko lahko krajevno shranite na svoji napravi Android ali v oblak (samo povezana različica). Keepass2Android da podatkovno zbirko na razpolago tudi, če niste povezani. Ker je podatkovna zbirka varno šifrirana s 256-bitnim šifriranjem AES, ne bo nihče mogel dostopati do vaših gesel razen vas. Priporočamo Dropbox: na voljo je na vseh vaših napravah in ponuja tudi varnostne kopije prejšnjih različic.</string>
<string name="hint_database_location">Izberite mesto za shranjevanje podatkovne zbirke:</string>
<string name="button_change_location">Spremeni mesto</string>
<string name="master_password">Glavno geslo</string>
<string name="help_master_password">Vaša podatkovna zbirka je šifrirana z geslom, ki ga vnesete tu. izberite močno geslo, da zagotovite varnost svoje podatkovne zbirke! Nasvet: sestavite stavek ali dva in za geslo uporabite prve črke besed. Vključite ločila.</string>
<string name="hint_master_password">Izberite glavno geslo, da zaščitite sojo podatkovno zbirko:</string>
<string name="key_file">Datoteka ključa</string>
<string name="help_key_file">Datoteka ključa je v bistvu geslo shranjeno v datoteki. Datoteke ključa so značilno močnejše od glavnih gesel, ker so lahko veliko bolj zapletene; vendar jih je težje ohraniti skrivne. če svojo podatkovno zbirko shranite v oblak, tam ne shranite tudi datoteko ključa! To bi jo naredilo popolnoma neuporabno! Pomembno: ne spremenite vsebine datoteke ključa po ustvarjanju podatkovne zbirke!</string>
<string name="hint_key_file">Izberite, ali želite poleg glavnega gesla uporabiti datoteko ključa:</string>
<string name="use_key_file">Uporabi datoteko ključa</string>
<string name="error_adding_keyfile">Napaka pri dodajanju datoteke ključa!</string>
<string name="init_otp">Naloži pomožno datoteko OTP &#8230;</string>
<string name="otp_explanation">Vnesite naslednja gesla za enkratno uporabo (OTP-je). Potegnite svoj ključ Yubikey NEO na zadnji strani svoje naprave, da vnesete preko NFC-ja.</string>
<string name="otp_hint">OTP %1$d</string>
<string name="YubiChallengeNotInstalled">Programa, ki lahko opravi preizkus, ni bilo mogoče najti. Namestite Yubichallenge iz trgovine Google Play.</string>
<string name="CouldntLoadOtpAuxFile">Pomožne datoteke OTP ni mogoče naložiti!</string>
<string name="CouldntLoadOtpAuxFile_Hint">Uporabite vtičnik OtpKeyProv v KeePassu 2.x (PC), da nastavite svojo podatkovno zbirko za uporabo z OTP-ji!</string>
<string name="otp_discarded_because_no_db">Najprej izberite podatkovno zbirko. OTP je zavržen zaradi varnostnih razlogov.</string>
<string name="otp_discarded_no_space">OTP zavržen: vsi OTP-ji že vneseni!</string>
<string name="otp_discarded_because_db_open">Najprej zaprite podatkovno zbirko. OTP je zavržen.</string>
<string name="otps_pending">(En ali več OTP-jev je že na voljo)</string>
<string name="otpsecret_hint">Skrivnost OTP (npr. 01 23 ab cd &#8230;)</string>
<string name="CouldntParseOtpSecret">Napaka pri razčlenjevanju skrivnosti OTP!</string>
<string name="OtpKeyError">Ustvarjanje ključa OTP je spodletelo! Prepričajte se, da ste vnesli pravilne OTP-je.</string>
<string name="ErrorUpdatingOtpAuxFile">Napaka pri posodabljanju pomožne datoteke OTP!</string>
<string name="SavingOtpAuxFile">Shranjevanje pomožne datoteke OTP &#8230;</string>
<string name="bad_resp">Odgovor izziva je nepravilen.</string>
<string name="CouldntLoadChalAuxFile">Nalaganje pomožne datoteke izziva ni bilo mogoče!</string>
<string name="CouldntLoadChalAuxFile_Hint">Uporabite vtičnik KeeChallenge v KeePassu 2.x (PC), da nastavite svojo podatkovno zbirko za uporabo z odgovorom izziva!</string>
<string name="ErrorUpdatingChalAuxFile">Napaka pri posodabljanju pomožne datoteke OTP!</string>
<string name="TrayTotp_SeedField_title">Ime polja semena TOTP</string>
<string name="TrayTotp_SeedField_summary">Če uporabljate vtičnik KeePassa 2 \"TrayTotp\" s samo privzetimi nastavitvami, tu vnesite ime polja semena glede na nastavitve na računalniku.</string>
<string name="TrayTotp_SettingsField_title">Ime polja nastavitev TOTP</string>
<string name="TrayTotp_SettingsField_summary">Tu vnesite ime polja nastavitev za TraxyTotp.</string>
<string name="TrayTotp_prefs">TrayTotp</string>
<string name="loading">Nalaganje &#8230;</string>
<string name="plugins">Vtičniki</string>
<string name="plugin_packagename">Ime paketa:</string>
<string name="plugin_description">Opis (ni preverjen):</string>
<string name="plugin_author">Avtor (ni preverjen):</string>
<string name="plugin_enabled">omogočen</string>
<string name="plugin_disabled">onemogočen</string>
<string name="plugin_web">Najdi vtičnike na spletu</string>
<string name="plugin_scopes">Področja</string>
<string name="query_credentials_for_url">%1$s zahteva poverila za %2$s.</string>
<string name="query_credentials">%1$s zahteva poverila. Izberite vnos.</string>
<string name="plugin_enabled_checkbox">Omogočen</string>
<string name="SCOPE_DATABASE_ACTIONS_title">Obvestila dejanj podatkovne zbirke</string>
<string name="SCOPE_DATABASE_ACTIONS_explanation">Vtičnik bo obveščen, ko je podatkovna zbirka odprta, zaprta ali shranjena.</string>
<string name="SCOPE_CURRENT_ENTRY_title">Trenutni podatki vnosa</string>
<string name="SCOPE_CURRENT_ENTRY_explanation">Vtičnik bo prejel vse podatke o trenutnem vnosu podatkovne zbirke in mu bo omogočeno ponujanje dejanj in spreminjanje svojega prikaza.</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_title">Poizvedi po svojih poverilih</string>
<string name="SCOPE_QUERY_CREDENTIALS_FOR_OWN_PACKAGE_explanation">Vtičniku bo dovoljena poizvedba za poverila, ki so povezana s njegovim lastnim programskim paketom.</string>
<string name="SCOPE_QUERY_CREDENTIALS_title">Poizvedi za poverila</string>
<string name="SCOPE_QUERY_CREDENTIALS_explanation">Vtičniku bo dovoljena poizvedba za poverila za namerne spletne strani ali programe.</string>
<string name="get_regular_version">Dobi več vrst pomnilniških naprav</string>
<string name="CertificateWarning">Opozorilo: preverjanje veljavnosti potrdila strežnika je spodletelo: %1$s. Namestite ustrezno korensko potrdilo na svoji napravi ali glejte nastavitve!</string>
<string name="CertificateFailure">Napaka: preverjanje veljavnosti potrdila strežnika je spodletelo: Namestite ustrezno korensko potrdilo na svoji napravi ali glejte nastavitve!</string>
<string name="export_fileformats_title">Izberite obliko datoteke</string>
<string name="killed_by_os">Žal je OS Android uničil Keepass2Android. Zaradi varnostnih razlogov Keepass2Android ni shranil vaših poveril na disk, tako da morate podatkovno zbirko ponovno odpreti. Opomba: to se redkokdaj zgodi. Če se, mi to sporočite na crocoapps@gmail.com.</string>
<string name="FileIsTemporarilyAvailable">Datoteka je samo začasno na voljo za Keepass2Android.</string>
<string name="FileIsReadOnly">Izbrana datoteka je samo za branje.</string>
<string name="FileIsReadOnlyOnKitkat">Izbrana datoteka za Keepass2Android je samo za branje zaradi omejitev na Androidu 4.4+.</string>
<string name="CopyFileRequired">Da jo uporabite, jo morate kopirati na drugo mesto.</string>
<string name="CopyFileRequiredForEditing">Daj jo uredite, jo morate kopirati na drugo mesto.</string>
<string name="ClickOkToSelectLocation">Kliknite V redu, da izberete mesto, kamor je treba kopirati datoteko.</string>
<string name="CancelReadOnly">Prekliči, odpri samo za branje.</string>
<string name="CopyingFile">Kopiranje datoteke …</string>
<string name="KdbBetaWarning">Upoštevajte: naložili ste podatkovno zbirko Keepass 1. Keepass2Android je nedavno dodal podporo za pisanje za to obliko podatkovne zbirke. Čeprav je prestala temeljiti preizkus avtor ne poda nobene garancije, da bodo podatki pravilno shranjeni. Vedno shranite varnostno kopijo izvirne podatkovne zbirke (Dropbox samodejno shrani nedavne različice), preden naredite spremembe. Prijavite katerokoli težavo. Hvala!</string>
<string name="ChangeLog_title">Dnevnik sprememb</string>
<string name="PreviewWarning">Upoštevajte! To je predogledna različica in lahko vsebuje nekaj napak! Če izkusite *karkoli* nepričakovanega, me o tem obvestite (na Codeplexu ali po e-pošti).</string>
<string name="ChangeLog_0_9_7">
Različica 0.9.7\n
*podpora za pisanje za podatkovne zbirke Keepass 1 (kdb) (beta!)\n
* boljše nazaj na prejšnjo tipkovnico (deluje tudi na napravah brez skrbniškega dostopa)\n
* podpora za KeeChallenge z izzivi spremenljive dolžine\n
* preprečitev zajema zaslonskih slik iz zaslonov Hitrega odklepanja in gesel\n
* obratni vrstni red razvrščanja za razvrščanje po datumu spremembe (sedaj padajoče)\n
* popravki hroščev: pogled opomb se sedaj pravilno posodobi po spremembah, pogledi gesel sedaj pravilno skrijejo gesla na vseh napravah, popravljena težava, ki je dovoljevala dvakratno dodajanja vnosa, popravljena težava s prikazovanjem opozorila Podvojeni UUID-ji tudi po popravljanju podatkovne zbirke\n</string>
<string name="ChangeLog_0_9_6">
Različica 0.9.6\n
* omogoči uvažanje datoteke ključa in/ali krajevne podatkovne zbirke v notranjo mapo programa (glejte nastavitve)\n
*omogoči različne možnosti razvrščanja\n
* izboljšane nastavitve za samodejno preklapljanje tipkovnice\n
* posodobljena logotip programa in oblika obvestil, oblikoval Stefano Pignataro (http://www.spstudio.at)\n
* ustvarjalnik gesel si zapomni zadnje nastavitve\n
* nastavitev vidnosti obvestil zaslona za zaklepanje za Android 5\n
* sedaj se polja glavnega gesla počistijo, ko končate program brez klika V redu\n
* popravljena težava z manjkajočimi vnosnimi jeziki v nastavitvi tipkovnice na nekaterih napravah\n
* popravljena težava s samodejnim preklapljanjem tipkovnice na napravah s skrbniškim\n
* dodano preverjanje za pokvarjene podatkovne zbirke (podvojeni UUID-ji)\n
* samodejno ponovno naloži podatkovno zbirko, ko je sprememba, reši skrb za varnost glede razkritja glavnega gesla\n
* izboljšana razporeditev poljske majhne tipkovnice, popravljena tema nastavitev tipkovnice (zahvale Wiktorju Ławskiju)\n</string>
<string name="ChangeLog_0_9_5">
<b>Različica 0.9.5</b>\n
* Popravljene težave z brskanjem po datotekah (posebno na Androidu 4.4)\n
* Popravljena težava z nalaganjem datotek .kdb (Keepass 1) na Nexusu 5 z Androidom Lollipop\n
* Dodana možnost preprečitve zajemanja zaslonskih slik/prikazovanja programa na seznamu nedavnih programov\n
* Popravljena težava s shranjevanjem datotek na Google Drive (običajna izdaja)\n
* Omogoči datoteke ključa na namernih vrstah pomnilniških naprav (običajna izdaja)\n
* Posodobljen SDK Dropbox za vključitev uradnega varnostnega popravka (običajna izdaja)\n
* Posodobljena orodja za izgradnjo --&gt; velikost apk povečana :-(\n
Obljubil sem več sprememb. Žal se bodo pojavila v naslednji izdaji. Te hitre popravke sem hotel objaviti v najkrajšem možnem času.
</string>
<string name="ChangeLog_0_9_4">
<b>Različica 0.9.4</b>\n
* dodana podpora za vtičnike: glejte nastavitve o tem, kako dobiti vtičnike!\n
* objavljen vtičnik QR (preišči gesla, prikaži gesla kot kodo QR, prenesi vnose na druge naprave KP2A)\n
* objavljen vtičnik InputStick (prenesi poverila na vaš PC preko Bluetootha - zahteva ključek USB InputStick)\n
* programi tretjih oseb lahko sedaj preprosto vgradijo poizvedbo KP2A za poverila. Ste razvijalec? Dodajte to v vaš program, če je primerno!\n
* dodana podpora za TOTP (združljivo z vtičnikoma KeeOTP in TrayTotp)\n
* Android naj ne bi več uničil programa, ko je podatkovna zbirka odprta\n
* podatkovna zbirka ni več zaklenjena, ko končate program z gumbom Nazaj (glejte nastavitve)\n
* prikaži imena skupin v pogledu rezultatov iskanja (*)\n
* dodan vsebinski meni v pogled rezultatov iskanja, vključno z možnostjo \"Premakni se v nadrejeno mapo\" (*)\n
* dodana možnost za prikaz imena skupine v pogledu vnosov (*)\n
* (*) Hvala Matthieu za teh lastnosti!\n
* podpora za KeeChallenge (z Yubikeyem NEO). Hvala Benu Rushu za vgradnjo priključka!\n
* izboljšan uporabniški vmesnik\n
* popravljen hrošč v vmesniku Google Drive\n
* dodana možnost za onemogočanje možnosti \"daruj\"\n
* ikona Hitrega odklepanja sedaj privzeto skrita na napravah z Androidom 4.2+\n vgradnjo</string>
<string name="ChangeLog_0_9_3_r5">
<b>Različica 0.9.3 r5</b>\n
* Vgrajeni popravki od Xamarina: Keepass2Android je sedaj združljiv z ART-om na Androidu 4.4.2. Končno!\n
* Popravki hroščev: hrošči v usklajevanju (osvežitev zaslona, popravljeno preverjanje za spremembe na http-ju), hrošči na napravah z Androidom 2.x, hrošči v vgradnjah shranjevanja na Google Drive in OneDrive, čiščenje odložišča ob zapiranju podatkovne zbirke, hrošči ob odpiranju priponk, težave s prikazom tipkovnice\n
</string>
<string name="ChangeLog_0_9_3">
<b>Različica 0.9.3</b>\n
* Nova tipkovnica z veliko izboljšavami. Glejte nastavitve za prilagajanje.\n
* Podpora samo za branje za kdb (datoteke Keepass 1). Preizkusno!\n
* Dodana podpora za SFTP\n
* Dodano zaobidenje hrošča v ART-ju (Android 4.4.2)\n
* Popravki hroščev\n</string>
<string name="ChangeLog_0_9_2">
<b>Različica 0.9.2</b>\n
* Dodana podpora za OTP (združljivo z vtičnikom OtpKeyProv)\n
* Vgrajena podpora NFC za OTP-je iz YubiKeya NEO \n
* Več izboljšav UI-ja\n
* Vgrajena knjižnica Keepass 2.24\n
* Dodana možnost uničenja opravila programa (glejte nastavitve)\n
* Izboljšano preverjanje veljavnosti potrdil SSL\n
* Popravki hroščev\n
</string>
<string name="ChangeLog_0_9_1">
<b>Različica 0.9.1</b>\n
* Vgrajena podpora za SkyDrive (samo običajna izdaja programa Keepass2Android)\n
* popravljene težave z vgradnjo storitve Google Drive\n
* Dodana podpora za NTLM
</string>
<string name="ChangeLog_0_9">
<b>Različica 0.9</b>\n
* Vgrajena podpora za Dropbox in Google Drive (podatkovne zbirke za branje/pisanje; samo redna izdaja programa Keepass2Android)\n
* Vgrajen brskalnik datotek po meri (osnovan na izbirniku datotek od HBA-ja)\n
* Izboljšan uporabniški vmesnik za ustvarjanje novih podatkovnih zbirk\n
* Vključena pisava po meri DejaVu Sans Mono za prikazovanje gesel\n
* Popravki hroščev
</string>
<string name="ChangeLog_0_8_6">
<b>Različica 0.8.6</b>\n
* Podpora za šifro Twofish\n
* Omogoča urejanje skupin\n
* omogoča premikanje vnosov in skupin\n
* Ikona Hitrega oklepanja je lahko prosojna (glejte nastavitve)\n
* Popravki hroščev
</string>
<string name="ChangeLog_0_8_5">
<b>Različica 0.8.5</b>\n
* Oddaljene datoteke so shranjene v krajevnem predpomnilniku programa, da omogočijo nepovezano uporabo (vključno z urejanjem in kasnejšim usklajevanjem). Glejte nastavitve. \n
* Ikona obvestila za predočenje stanje zaklepanja podatkovne zbirke (glejte nastavitve)\n
* Izboljšano določanje stanja zaklepanja v nekaterih razmerah\n
* Datoteke podatkovne zbirke se naložijo v pomnilnik, ko tipkate svoje geslo za povečanje hitrosti nalaganja (glejte nastavitve)\n
* Vnose lahko dodate v skrbniško skupino\n
* Popravki hroščev (razrešitev sklicnih polj, težav s tipkovnico na italijanskih in kitajskih napravah)
</string>
<string name="ChangeLog_0_8_4">
<b>Različica 0.8.4</b>\n
* Spremembe zunanjih podatkovnih zbirk se zaznajo in združijo ob shranjevanju\n
* Izboljšana zmogljivost nalaganja\n
* Izboljšana orodna vrstica za iskanje s predlogi\n
* Nov logotip programa!\n
* Dodana podpora za obliko .kdbp za hitrejše nalaganje/shranjevanje\n
* Izboljšana urejanje dodatnih nizov in skrit zaslon, ko je zaščiten\n
Hvala Alexu Vallatu za prispevke kode!\n
Hvala Nikiju Hüttnerju (www.close-cut.de) za nov logotip!\n
</string>
<string name="ChangeLog_0_8_3"><b>Različica 0.8.3</b>\n
* Kazalo uporabniških imen/TAN-ov prikazano na seznamu vnosov (glejte nastavitve)\n
* Vnose lahko ustvarite, če iskanje v brskalniku ne vrne rezultatov\n
* Tipkovnica KP2A ponuja možnost iskanja poveril za trenutni program\n
* Program se samodejno zapre po izbiri vnosa za uporabo na tipkovnici\n
* Pogovorno okno izbire tipkovnice se samodejno odpre po iskanju URL-ja (glejte nastavitve)\n
* Ograde v poljih vnosov se nadomestilo pred kopiranjem (podprta je večina ograd)\n
* Manjši popravki hroščev
</string>
<string name="ChangeLog_0_8_2"><b>Različica 0.8.2</b>\n
* Podpora za overitev Digest v protokolu WebDAV\n
* popravki hroščev (Upravitelj datotek OI, Odprt URL)
</string>
<string name="ChangeLog_0_8_1"><b>Različica 0.8.1</b>\n
* KP2A Offline in \"Povezana\" različica se lahko ponovno hkrati namestita\n
* Dodani novi prevodi (hvala vsem, ki ste prispevali!)
</string>
<string name="ChangeLog_0_8"><b>Različica 0.8</b>\n
* Izboljšan uporabniški vmesnik, posebno za naprave z Androidom 4.x\n
* Omogoči uporabo namernih upraviteljev datotek za izbiranje obstoječih datotek\n
* Dodan varnejši način za odpiranje priponk (preko mape predpomnilnika)\n
* popravljeni hrošči v dejavnosti urejanja\n
* verjetno uvedeni novi hrošči :-)
</string>
<string name="ChangeLog_keptDonate">Razširjena možnost darovanja piva ali kaj drugega</string>
<string name="ChangeLog_0_7"><b>Različica 0.7</b>\n
* Povečan čas nalaganja: ključne preobrazbe sedaj 10-krat hitrejše!\n
* Dodana zaslonska tipkovnica Keepass2Android: preklopite na to tipkovnico za vnos poveril. Ščiti vas pred vohljači gesel na odložišču (v možnostih onemogočite stara obvestila odložišča)\n
* Dodana možnost darovanja piva ali kaj drugega (glejte meni)</string>
<string name="ChangeLog"><b>Različica 0.6.2</b>\n
* Vgradnja storitve Google Drive/Dropbox/ ...: uporabite uradno storitev Google Drive ali program Dropbox in odprite katerokoli datoteko .kdbx. To bo sedaj prikazalo KP2A.\n
* Izboljšano pogovorno okno za iskanje\n
* Izboljšani rezultati iskanja za Deli URL s poddomenami\n
* Dodane možnosti za odziv, oceno in prevod programa v meniju\n
\n
<b>Različica 0.6.1</b>\n
* Zaznavanje sprememb podatkovnih zbirk v ozadju (zaradi nedejavnosti programa za usklajevanje)\n
* Izboljšano iskanje URL-jev iz brskalnika\n
* Pogovorno okno za potrditev ob opustitvi sprememb\n
\n
<b>Različica 0.6</b>\n
Začetna javna izdaja
</string>
<string-array name="clipboard_timeout_options">
<item>30 sekund</item>
<item>1 minuta</item>
<item>5 minut</item>
<item>10 minut</item>
<item>15 minut</item>
<item>30 minut</item>
<item>1 ura</item>
<item>Nikoli</item>
</string-array>
<string-array name="export_fileformat_options">
<item>Podatkovna zbirka KeePass 2 (.kdbx)</item>
<item>Keepass 2 XML (nešifriran) (.xml)</item>
<item>Keepass CSV (negšifriran) (.csv)</item>
</string-array>
<string-array name="list_size_options">
<item>Majhna</item>
<item>Srednja</item>
<item>Velika</item>
</string-array>
<string-array name="design_options">
<item>Holo svetla</item>
<item>Holo temna</item>
</string-array>
<string name="design_title">Oblika</string>
<string-array name="cred_remember_modes">
<item>Ne zapomni si uporabniškega imena in gesla</item>
<item>Zapomni si samo uporabniško ime</item>
<item>Zapomni si uporabniško ime in geslo</item>
</string-array>
<string-array name="password_modes">
<item>Samo geslo</item>
<item>Geslo in datoteko ključa</item>
<item>Geslo in OTP</item>
<item>Geslo in skrivnost OTP (način obnovitve)</item>
<item>Geslo in odgovor izziva</item>
<item>Geslo in skrivnost odgovora izziva (način obnovitve)</item>
</string-array>
<string-array name="AcceptAllServerCertificates_options">
<item>Prezri spodletela preverjanja veljavnosti potrdil</item>
<item>Opozori, ko preverjanje veljavnosti spodleti</item>
<item>Ne sprejmi neveljavnih potrdil</item>
</string-array>
</resources>

View File

@ -418,6 +418,8 @@
<string name="CertificateFailure">Помилка: не вдалося перевірити сертифікат сервера! Встановіть відповідний кореневий сертифікат на ваш пристрій або перегляньте налаштування!</string>
<string name="export_fileformats_title">Виберіть формат файлу</string>
<string name="killed_by_os">Вибачте! Keepass2Android був убитий ОС Android! З міркувань безпеки Keepass2Android не зберігає вибрані облікові дані на диску, тому потрібно повторно відкрити базу даних. Примітка: Це має відбуватися дуже рідко. Якщо це так, будь ласка, напишіть мені повідомлення на crocoapps@gmail.com.</string>
<string name="ClickOkToSelectLocation">Натисніть OK, щоб обрати місце, куди слід скопіювати файл.</string>
<string name="CopyingFile">Копіювання файлу...</string>
<string name="ChangeLog_title">Журнал змін</string>
<string name="PreviewWarning">Будь ласка, зверніть увагу! Це попередній реліз і може мати деякі недоліки! Якщо у вас виникли *будь-які* несподіванки, будь ласка, дайте мені знати (на Codeplex або електронною поштою).</string>
<string name="ChangeLog_0_9_4">

View File

@ -538,6 +538,10 @@
<string name="Continue">Continue</string>
<string name="NoFilenameWarning">The URI you have entered does not look like a filename. Are you sure this is a valid file?</string>
<string name="ChangeLog_0_9_8b">
Version 0.9.8b\n
* Bug fixes (Saving failed for some databases, exporting to local device not working, selecting some preference options crashed the app)\n
</string>
<string name="ChangeLog_0_9_8">
Version 0.9.8 preview 2 (alpha)\n
@ -548,7 +552,7 @@
* Changed password font\n
* Allow to change Dropbox account\n
* Fixed bug: Now remembering OTP password\n
* more to come\n
* Note: I have promised Material Design for this release. I am constantly working on it, but it needs a bit more time. Sorry! \n
</string>
<string name="ChangeLog_0_9_7b">

View File

@ -56,7 +56,7 @@
android:key="export_prefs"
android:title="@string/export_prefs"
>
<intent android:action="keepass2android.ExportDatabaseActivity"/>
<intent android:action="kp2a.action.ExportDatabaseActivity"/>
</PreferenceScreen>
<Preference
@ -433,14 +433,14 @@
</PreferenceScreen>
<PreferenceScreen android:key="plugin_key" android:title="@string/plugins">
<intent android:action="keepass2android.PluginListActivity"/>
<intent android:action="kp2a.action.PluginListActivity"/>
</PreferenceScreen>
<PreferenceScreen
android:key="@string/about_prefs_key"
android:title="@string/menu_about"
>
<intent android:action="keepass2android.AboutActivity"/>
<intent android:action="kp2a.action.AboutActivity"/>
</PreferenceScreen>

View File

@ -42,14 +42,14 @@
<DevInstrumentationEnabled>True</DevInstrumentationEnabled>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<DebugType>none</DebugType>
<DebugType>full</DebugType>
<Optimize>True</Optimize>
<OutputPath>bin\Release</OutputPath>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
<AndroidUseSharedRuntime>False</AndroidUseSharedRuntime>
<ConsolePause>False</ConsolePause>
<AndroidSupportedAbis>armeabi,armeabi-v7a</AndroidSupportedAbis>
<AndroidSupportedAbis>armeabi;armeabi-v7a</AndroidSupportedAbis>
<CustomCommands>
<CustomCommands>
<Command type="BeforeBuild" command="UseManifestNet.bat" />
@ -148,7 +148,6 @@
<Compile Include="app\App.cs" />
<Compile Include="fileselect\FileSelectActivity.cs" />
<Compile Include="fileselect\FileDbHelper.cs" />
<Compile Include="SearchProvider.cs" />
<Compile Include="search\SearchProvider.cs" />
<Compile Include="SelectStorageLocationActivity.cs" />
<Compile Include="services\OngoingNotificationsService.cs" />
@ -772,9 +771,9 @@
<AndroidResource Include="Resources\drawable\ic_launcher_gray_bday.png" />
</ItemGroup>
<ItemGroup>
<TransformFile Include="Properties\AndroidManifest.xml">
<None Include="Properties\AndroidManifest.xml">
<SubType>Designer</SubType>
</TransformFile>
</None>
</ItemGroup>
<ItemGroup>
<AndroidResource Include="Resources\drawable\collections_new_label_holodark.png" />

View File

@ -10,7 +10,7 @@ using Keepass2android.Pluginsdk;
namespace keepass2android
{
[Activity(Label = "@string/plugins", ConfigurationChanges = ConfigChanges.Orientation | ConfigChanges.KeyboardHidden)]
[IntentFilter(new[] { "keepass2android.PluginListActivity" }, Categories = new[] { Intent.CategoryDefault })]
[IntentFilter(new[] { "kp2a.action.PluginListActivity" }, Categories = new[] { Intent.CategoryDefault })]
public class PluginListActivity : ListActivity
{
private PluginArrayAdapter _pluginArrayAdapter;

View File

@ -33,7 +33,7 @@ using System.Collections.Generic;
namespace keepass2android.search
{
[ContentProvider(new [] { SearchProvider.Authority }, Exported=false)]
[ContentProvider(new [] { SearchProvider.Authority}, Exported=false )]
public class SearchProvider : ContentProvider
{
private enum UriMatches