Compare commits

...

116 Commits

Author SHA1 Message Date
cketti 39026ec3a5 Bumped manifest to 4.804 2014-06-21 14:57:01 +02:00
cketti c578fcae6f Update changelog for 4.804 2014-06-21 01:47:24 +02:00
cketti 4ece2bb428 Add missing import 2014-06-21 01:47:24 +02:00
cketti 3b17aa0496 Fix potential ClassCastException
Implemented the fix suggested by zjw in pull request #463
https://github.com/k9mail/k-9/pull/463

Fixes issue 5928
2014-06-20 22:38:05 +02:00
cketti 19b180a3b6 Avoid NullPointerException reported via Google Play 2014-06-20 22:37:43 +02:00
cketti 0c37a28754 Exclude error folder from unread/starred count 2014-06-20 22:37:22 +02:00
Dominik Heidler dcd1e63812 Fix sendCommand line splitup for some imap proxys
When sending a command it would be sent like this:
PKG1: 1 STARTTLS
PKG2: \r\n

Some imap proxys (maybe from Fortinet?) don't accept commands across packets:
PKG1: 1 STARTTLS\r\n
2014-06-20 22:36:47 +02:00
cketti ca16f36db9 Avoid adding the same recipient twice when using "reply to all"
Fixes issue 6056
2014-06-20 22:36:30 +02:00
cketti d3a5395d2c Add mailbox.org to list of providers 2014-06-20 22:36:26 +02:00
cketti e8f7f6ef38 Fix 'endless' loop in ImapFolderPusher
Under certain circumstances it's possible that the 'push state' isn't
updated to contain the most recent 'UIDNEXT' value. In that case
ImapFolderPusher.start() would execute the same code path through its
main loop over and over again, preventing the device from going to
sleep.
Rather than changing the code to update the 'push state' in the corner
case that triggers the behavior described above, this commit introduces
another mechanism to track the 'UIDNEXT' value. This should also catch
as of yet unknown cases where the 'push state' isn't properly updated.

At some point in the future I hope we get to a point where we only
persist the 'push state' when we manually stop/restart the service.
During normal operation there's no need to read from/write to storage
all the time.

Fixes issue 4907
2014-06-20 22:36:13 +02:00
Koji Arai 25c3c635fc Should disable COMPOSE menu item
When message viewing and tap the next icon, menu icons (previous, next, delete and replys) disappears for an instant.
But a compose icon remains, then tap it accidentally.
2014-06-20 22:36:08 +02:00
cketti 5d130b2de1 Don't crash when startActivity() fails
Fixes issue 6201
2014-06-20 22:36:01 +02:00
Troy Rollo aef6321ecd Alternative fix for issue 5697 - ASUS display bug 2014-06-20 22:35:58 +02:00
cketti 5437dc39e1 Support extras for ACTION_VIEW + mailto: URI
Support the extras documented for ACTION_SEND to be used with
ACTION_VIEW to support another app that doesn't care, namely Twitter.
2014-06-20 22:35:55 +02:00
cketti 0910e0bedb Restore instance state in correct order
Fixes issue 5968
2014-06-20 22:35:53 +02:00
cketti 06f31dd872 Disable pull-to-refresh when remote search is not allowed
Fixed issue 6151
2014-06-20 22:35:49 +02:00
Jesse Vincent 99dbe6b666 Bumped manifest to 4.803 2014-01-27 13:34:32 -05:00
cketti cfbe6c2446 Prepare changelog for 4.803 2014-01-27 15:59:22 +01:00
cketti 85317af6ff Fix issue 6064: Inline images don't display on KitKat
Backported Joe's fix.
See commit 094156cc2a
2014-01-27 15:56:17 +01:00
nysatrok 301527417d Update providers.xml for German providers
Sources:
http://kundenservice.freenet.de/hilfe/mail4/email-programme/einstellungen-generell/generelle-einstellungen/index.html
http://hilfe.telekom.de/hsp/cms/content/HSP/de/3378/FAQ/theme-45858870/Internet/theme-45858718/Dienste/theme-45858716/E-Mail/theme-305642824/Allgemein/theme-57360865/IMAP/faq-45858521
https://hilfe.web.de/e-mail/imap.html
https://hilfe.gmx.net/mailprogramme/imap.html
2014-01-14 05:51:13 +01:00
pyler 2655132c87 Add provider Outlook.sk
..and fix settings for Azet.sk
2014-01-14 05:51:11 +01:00
cketti 0582432166 Merge pull request #437 from zjw/misc_clean_up 2014-01-14 05:46:01 +01:00
Joe Steele d1fc587772 Fix POP3 STLS command
The server response needed to be retrieved.

Thanks to Paul Durrant:
https://groups.google.com/d/msg/k-9-mail/0XHNNMR1TQ4/yExsr7nvJQwJ
2014-01-14 05:46:01 +01:00
Joe Steele b392603ae0 Use a locale-specific date in the header of a quoted message
Also, include the sent-date in the header when using
the "prefix" quote style.  "Be like mutt" (and gmail,
and thunderbird)

Also, the quoteOriginalHtmlMessage method was using the mSourceMessage
field in various places when it should be using its originalMessage
parameter.

Related issues:  2249, 3456
2014-01-14 05:46:01 +01:00
Joe Steele d6b6bf6254 Account preferences clean-up
There were a number of preferences that were not being removed
from the preferences DB when an account was deleted, so they
would remain there forever.

There were a few attempts to remove preference keys from the DB where
the keys were obsolete and not in use for some time.

Certain obsolete preferences were not modified:
mUuid + ".name"
mUuid + ".email"
mUuid + ".signature"
mUuid + ".signatureUse"
These were in use before implementing multiple identities, and are still used
as a fallback for old accounts without multiple identities configured.
2014-01-14 05:46:01 +01:00
cketti dc0c567007 Revert "Add work-around for Asus Transformer WebView display bug"
This reverts commit 78428e287b.
2014-01-14 05:46:00 +01:00
Joe Steele c47777b821 Remove ant.properties
The properties currently therein are duplicates of those in
project.properties.

The build.xml file first loads properties from ant.properties, then from
project.properties, so ant.properties is redundant.

The file's existance was a maintenance issue.  The past couple times
when the property "target" was updated in project.properties, the
property was overlooked in ant.properties, so ant builds would fail when
Eclipse builds would succeed.
2014-01-14 05:46:00 +01:00
cketti c5d3e4e814 Fix Danish translation 2014-01-14 05:46:00 +01:00
Joe Steele f38659d30e Update .gitignore
Ignore auto-generated files that result from
"android update lib-project" (which is invoked within "ant debug").

Some of the plugins (library projects) already have their own
.gitignore file which includes the exclusions made here.  This
commit assures that the exclusions are applied to *all* plugins,
regardless.

This, of course, has no effect on files that have already been
intentionally checked into the git repository (such as the main
build.xml).
2014-01-14 05:46:00 +01:00
cketti f336dc1959 Merge branch 'translations' 2014-01-14 05:45:59 +01:00
cketti 0ecfb5e45c Add Transifex config 2014-01-14 05:45:59 +01:00
Igor Nedoboy e7ebb8621e Update Russian translation 2014-01-14 05:45:59 +01:00
Mittaa ff302e7890 Update Danish translations 2014-01-14 05:45:59 +01:00
pyler 329dca1491 Update Slovak translation 2014-01-14 05:45:59 +01:00
Andrew Chen b14c5a7222 Merge pull request #432 from Mittaa/patch-1
Update da strings.xml
2014-01-14 05:45:58 +01:00
cketti 6c9d84b9fa Rename plurals to make Transifex happy 2014-01-14 05:45:58 +01:00
Andrew Chen 7333d94973 Merge pull request #431 from miplopez/patch-1
Update es strings.xml
2014-01-14 05:45:58 +01:00
Mittaa 25236e7085 Update strings.xml
Danish translation added. New to Github so hopefully I did the right thing :)
2014-01-14 05:45:58 +01:00
cketti 27743681b4 Update build.gradle to work with latest Android Studio 2014-01-14 05:45:58 +01:00
Joe Steele f6d08fe852 Fix typo 2014-01-14 05:45:58 +01:00
dzan 1d4b84c266 Merge pull request #435 from raboof/patch-2
Consistent Dutch translation for 'attachment'
2014-01-14 05:45:57 +01:00
miplopez 3a502f4471 Update strings.xml
Translation error (ES): L856 "inificada" --> "unificada"
2014-01-14 05:45:57 +01:00
dzan 86e15bd888 Merge pull request #433 from raboof/patch-1
Dutch translation update.
2014-01-14 05:45:57 +01:00
Arnout Engelen 12d886e144 Consistent Dutch translation for 'attachment' 2014-01-14 05:45:57 +01:00
Arnout Engelen e1c9916eb2 Add missing translations
colorizing missing contacts, visible refile actions, attachment dialog
2014-01-14 05:45:57 +01:00
Arnout Engelen a9fac2af3c Spelling mistakes
bezittelijk voornaamwoord en d/t-fout voltooid deelwoord 'verversen'
2014-01-14 05:45:57 +01:00
cketti 2e398c8f79 Fix ClassCastException 2014-01-14 05:45:56 +01:00
cketti cfaa36403c Revert "Make IMAP autoconfig recognize "Draft" as drafts folder"
This reverts commit df0f6f3a8e.
See https://github.com/k9mail/k-9/pull/429
2013-12-17 18:47:38 +01:00
Jesse Vincent 38d58a68ae Bumped manifest to 4.802 2013-12-16 21:59:16 -05:00
cketti 089a5474fd Revert "Temporarily bump ourselves up only install on KitKat for a market hack"
This reverts commit 4134685c65.
2013-12-17 03:29:31 +01:00
cketti 4499ebf7e8 Add changelog for 4.802 2013-12-17 03:10:36 +01:00
cketti 6633cfb872 Add Gradle wrapper 2013-12-17 02:50:50 +01:00
cketti cca983fe99 Upgrade Gradle build files 2013-12-17 02:50:46 +01:00
erlendorf df0f6f3a8e Make IMAP autoconfig recognize "Draft" as drafts folder
Yahoo names it "Draft" instead of the more common "Drafts".
2013-12-17 02:37:41 +01:00
Jasper Klein c1bcdf5dbe Add work-around for Asus Transformer WebView display bug 2013-12-17 02:37:41 +01:00
cketti 3947f05d6a Merge branch 'providers' 2013-12-17 02:37:41 +01:00
cketti d518d47d09 Merge branch 'translations' 2013-12-17 02:37:40 +01:00
pyler faac8670f5 Add Azet.sk to providers.xml 2013-12-17 02:37:40 +01:00
Erkan d78d43f7e9 Update French translation 2013-12-17 02:37:40 +01:00
ascob 74b7a7a069 Add posteo.de to providers.xml
Add Posteo.de to providers.xml (according to https://autoconfig.thunderbird.net/v1.1/posteo.de and https://autoconfig.posteo.de/mail/config-v1.1.xml)
2013-12-17 02:37:40 +01:00
Marcio Zomb13 ca8d4a08d7 Update Brazilian Portuguese translation 2013-12-17 02:37:40 +01:00
cketti a275e913bc Fix Ukrainian translation
Fixes issue 6101
2013-12-17 02:37:40 +01:00
cketti 624a16b900 Ignore all errors in initialization of TrustedSocketFactory
On Android 2.2 getEnabledProtocols() throws an
ArrayIndexOutOfBoundsException
2013-12-17 02:37:39 +01:00
cketti 181ce28413 Fix dutch translation
Fixes issue 6103
2013-12-17 02:37:39 +01:00
cketti 513f28e69a Switch to a certificate that can be verified on the Cloudbees emulator 2013-12-17 02:37:39 +01:00
cketti 2fac2d6e0e Return proper error message when certificate couldn't be verified against global key store 2013-12-17 02:37:39 +01:00
cketti 26a25b8df0 Merge branch 'fix_strings' 2013-12-17 02:37:39 +01:00
cketti e54cba22fd Add support for bitcoin URIs 2013-12-17 02:37:38 +01:00
cketti 956972b8d0 Remove problematic linebreaks from strings files 2013-12-17 02:37:38 +01:00
Joe Steele 927950b16c Change LocalKeyStore error reporting
The error reporting assures an exception is thrown if
setKeyStoreFile(null) is called without a prior call to
setKeyStoreLocation(String directory).

Also, fix TrustManagerFactoryTest indentation.
2013-12-17 02:37:38 +01:00
cketti 957dc2af5b Replace no-break spaces with regular space characters 2013-12-17 02:37:38 +01:00
cketti f7f6a0e9f3 Change the way we harden SSL/TLS sockets
Blacklist a couple of weak ciphers, bring known ones in a defined order and sort unknown
ciphers at the end. Also re-enable SSLv3 because it's still used a lot.
2013-12-17 02:37:38 +01:00
cketti 12742d9df2 Add script to fix problematic linebreak/whitespace combinations in strings.xml 2013-12-17 02:37:38 +01:00
cketti 182c9dd95f Merge branch 'cert_validation' 2013-12-17 02:37:37 +01:00
Joe Steele 8099aff8e7 Eliminate the need to pass a context to LocalKeyStore.getInstance
Instead, have K9.onCreate initialize the location of the key
store file (similar to what is done with
BinaryTempFileBody.setTempDirectory).

Also, LocalKeyStore.getInstance has been changed so that it
no longer needs to be synchronized.
2013-12-17 02:37:37 +01:00
Joe Steele 255bf1fb36 Don't delete certs. on account creation, & assure that only one instance of LocalKeyStore is created. 2013-12-17 02:37:37 +01:00
cketti 8d85fe7e9e Remove LocalKeyStore's dependency on K9.app 2013-12-17 02:37:37 +01:00
cketti 16aa119d65 Remove LocalKeyStore's dependency on Account to reduce coupling 2013-12-17 02:37:37 +01:00
Joe Steele 9727cd6bca Move unit test class to match changes in commit 40404c3 2013-12-17 02:37:37 +01:00
cketti dc5afd4b67 Merge branch 'cert_validation' of git://github.com/k9mail/k-9.git into cert_validation
Conflicts:
	tests/src/com/fsck/k9/mail/store/TrustManagerFactoryTest.java
2013-12-17 02:37:27 +01:00
Joe Steele 7296b67126 "upgrade" the LocalKeyStore
Implement an "upgrade" capability for the key store file,
and then use it to delete the old file.

The existing certs in the old file are not a security
risk, but they are now useless because the format of
their aliases was changed in commit a4440b4.  They now are
just taking up storage space and memory.

Users will need to re-accept *ALL* certificates that they had
previously accepted and are still using.  (Actually, this requirement
was effective with commit 4b57d79a.  Before that, certificates whose
Subject matched did not require re-accepting.)
2013-12-17 02:35:27 +01:00
cketti ee69bd0845 Add more unit tests for TrustManagerFactory 2013-12-17 02:35:27 +01:00
Joe Steele 7a9663c4f9 Implement pruning of old certificates from LocalKeyStore
Certificates are deleted whenever server settings are changed
or an account is deleted.
2013-12-17 02:35:27 +01:00
cketti 0c96c799eb Only check against the certificate stored for a server, not all of them 2013-12-17 02:35:26 +01:00
Joe Steele fd9eb78aa3 Move some classes out of com.fsck.k9.mail.store
The classes are just as much related to com.fsck.k9.mail.transport
as com.fsck.k9.mail.store, so having them in
com.fsck.k9.mail.store doesn't seem appropriate.

Move LocalKeyStore to com.fsck.k9.security

Move TrustManagerFactory and TrustedSocketFactory to com.fsck.k9.net.ssl
2013-12-17 02:35:26 +01:00
cketti 07e4eb9042 Add test to make sure we don't check the wrong certificates
Right now we happily accept every certificate in our local key store as long as
the hostname matches the certificate DN. So this test fails.
It's not a huge deal since the user accepted the certificate at one point. But we
want to do this right.
2013-12-17 02:35:26 +01:00
Joe Steele a2162e4c37 Extract code into new LocalKeyStore class
Also, implement the ability to configure an alternate key store
file location. This permits the running of unit tests without
clobbering the live key store file.

Also, add a test to confirm that the key store file is being written
out and reread correctly.
2013-12-17 02:35:26 +01:00
cketti 9cc98bcd33 Add unit tests for TrustManagerFactory 2013-12-17 02:35:26 +01:00
Joe Steele 8a6e8de56d Eliminate the need for reflection to access hidden API 2013-12-17 02:35:26 +01:00
cketti 5282fe482f Properly save and restore instance state in AccountSetupBasics 2013-12-17 02:35:26 +01:00
Danny Baumann f95ab8f6a8 Fix contact picture color generation.
Make sure to return different colors for senders with different name,
but the same mail address (e.g. mails sent by certain issue tracking
systems).
2013-12-17 02:35:25 +01:00
Joe Steele 583d1d403f Fix inadequate certificate validation
Proper host name validation was not being performed for certificates
kept in the local keystore.  If an attacker could convince a user to
accept and store an attacker's certificate, then that certificate
could be used for MITM attacks, giving the attacker access to all
connections to all servers in all accounts in K-9.

This commit changes how the certificates are stored.  Previously, an
entire certificate chain was stored for a server (and any of those
certificates in the chain were available for validating signatures on
certificates received when connecting).  Now just the single
certificate for the server is stored.

This commit changes how locally stored certificates are retrieved.
They can only be retrieved using the host:port that the user
configured for the server.

This also fixes issue 1326.  Users can now use different certificates
for different servers on the same host (listening to different ports).

The above changes mean that users might have to re-accept certificates
that they had previously accepted and are still using (but only if the
certificate's Subject doesn't match the host that they are connecting
to).

This commit modifies AccountSetupBasics so that it now calls
AccountSetupCheckSettings twice -- once for checking the incoming
settings and once for the outgoing settings.  Otherwise, an exception
could occur while checking incoming settings, the user could say
continue (or the user could accept a certificate key), and the
outgoing settings would not be checked.  This also helps with
determining if a certificate exception was for the incoming or
outgoing server, which is needed if the user decides to add the
certificate to the keystore.
2013-12-17 02:35:25 +01:00
cketti 6ebec69383 Recreate app icon from SVG file
Add higher resolution icons so K-9 looks snazzy on newer devices.
2013-12-16 18:59:43 +01:00
brian m. carlson 266a715138 Use TrustedSocketFactory for STARTTLS.
The TrustedSocketFactory, which provides goodies like better cipher suites and
TLSv1.2, was only being used for tunnelled connections.  Use it for STARTTLS
connections as well.
2013-12-16 18:59:37 +01:00
cketti 7ab9d5c3e8 Merge branch 'translations' 2013-11-10 23:19:20 +01:00
cketti 3170de4229 Clean up Hungarian translation 2013-11-10 23:18:41 +01:00
RootRulez c4b44bb6e3 Update Hungarian translation 2013-11-10 23:18:40 +01:00
igavio 14b291a4de Update Greek translation 2013-11-10 23:18:39 +01:00
Igor Nedoboy b8786d27bf Update Russian translation 2013-11-10 23:18:38 +01:00
Jan Urbánek 45a725b51b Update Czech translation 2013-11-10 23:18:37 +01:00
Jacek Sowiński ee98624a41 Update Polish translation
new strings + one typo
2013-11-10 23:18:36 +01:00
Koji Arai ad2fdbdc00 Updated Japanese translation of the changelog. 2013-11-10 17:24:16 +09:00
Jesse Vincent bc144d684b Bumped manifest to 4.801 2013-11-07 10:43:16 -08:00
Jesse Vincent 9469a433bd release notes for 4.801 2013-11-07 10:42:58 -08:00
Jesse Vincent 68d0a5823b Revert "Revert "Temporarily bump ourselves up only install on KitKat for a market hack""
This reverts commit 3a0dcd70b8.
2013-11-07 10:41:23 -08:00
Jesse Vincent be14a88103 With the new webview scrollview combo we've got loadinoverviewmode seems to behave better. 2013-11-07 10:40:01 -08:00
cketti ed3a160403 Fix file selection for import
Using FLAG_ACTIVITY_NO_HISTORY will cause the file selection
to fail when KitKat's "Open from" activity opens a third-party activity.
2013-11-07 09:31:21 -08:00
Koji Arai d97176e6c7 Fixed typo. 2013-11-06 23:47:28 +09:00
Koji Arai 4ac1b6328b Updated Japanese translation of the changelog. 2013-11-06 23:34:11 +09:00
Jesse Vincent 3a0dcd70b8 Revert "Temporarily bump ourselves up only install on KitKat for a market hack"
This reverts commit 4134685c65.
2013-11-05 21:12:23 -05:00
Jesse Vincent c0b6793053 changelog version bump 2013-11-05 20:58:24 -05:00
Jesse Vincent 99193195f9 Bumped manifest to 4.800 2013-11-05 20:57:53 -05:00
Jesse Vincent e8bbd01cd5 4.800 release version 2013-11-05 20:57:23 -05:00
Jesse Vincent 4134685c65 Temporarily bump ourselves up only install on KitKat for a market hack 2013-11-05 20:56:56 -05:00
Jesse Vincent bc10b8d965 turn off developer mode for release 2013-11-05 20:55:44 -05:00
Jesse Vincent 20ce31146a changelog for 4.800 2013-11-05 20:55:16 -05:00
82 changed files with 2170 additions and 1203 deletions

2
.gitignore vendored
View File

@ -22,3 +22,5 @@ target
build
.gradle
out
build.xml
proguard-project.txt

8
.tx/config Normal file
View File

@ -0,0 +1,8 @@
[main]
host = https://www.transifex.com
lang_map = af_ZA: af-rZA, am_ET: am-rET, ar_AE: ar-rAE, ar_BH: ar-rBH, ar_DZ: ar-rDZ, ar_EG: ar-rEG, ar_IQ: ar-rIQ, ar_JO: ar-rJO, ar_KW: ar-rKW, ar_LB: ar-rLB, ar_LY: ar-rLY, ar_MA: ar-rMA, ar_OM: ar-rOM, ar_QA: ar-rQA, ar_SA: ar-rSA, ar_SY: ar-rSY, ar_TN: ar-rTN, ar_YE: ar-rYE, arn_CL: arn-rCL, as_IN: as-rIN, az_AZ: az-rAZ, ba_RU: ba-rRU, be_BY: be-rBY, bg_BG: bg-rBG, bn_BD: bn-rBD, bn_IN: bn-rIN, bo_CN: bo-rCN, br_FR: br-rFR, bs_BA: bs-rBA, ca_ES: ca-rES, co_FR: co-rFR, cs_CZ: cs-rCZ, cy_GB: cy-rGB, da_DK: da-rDK, de_AT: de-rAT, de_CH: de-rCH, de_DE: de-rDE, de_LI: de-rLI, de_LU: de-rLU, dsb_DE: dsb-rDE, dv_MV: dv-rMV, el_GR: el-rGR, en_AU: en-rAU, en_BZ: en-rBZ, en_CA: en-rCA, en_GB: en-rGB, en_IE: en-rIE, en_IN: en-rIN, en_JM: en-rJM, en_MY: en-rMY, en_NZ: en-rNZ, en_PH: en-rPH, en_SG: en-rSG, en_TT: en-rTT, en_US: en-rUS, en_ZA: en-rZA, en_ZW: en-rZW, es_AR: es-rAR, es_BO: es-rBO, es_CL: es-rCL, es_CO: es-rCO, es_CR: es-rCR, es_DO: es-rDO, es_EC: es-rEC, es_ES: es-rES, es_GT: es-rGT, es_HN: es-rHN, es_MX: es-rMX, es_NI: es-rNI, es_PA: es-rPA, es_PE: es-rPE, es_PR: es-rPR, es_PY: es-rPY, es_SV: es-rSV, es_US: es-rUS, es_UY: es-rUY, es_VE: es-rVE, et_EE: et-rEE, eu_ES: eu-rES, fa_IR: fa-rIR, fi_FI: fi-rFI, fil_PH: fil-rPH, fo_FO: fo-rFO, fr_BE: fr-rBE, fr_CA: fr-rCA, fr_CH: fr-rCH, fr_FR: fr-rFR, fr_LU: fr-rLU, fr_MC: fr-rMC, fy_NL: fy-rNL, ga_IE: ga-rIE, gd_GB: gd-rGB, gl_ES: gl-rES, gsw_FR: gsw-rFR, gu_IN: gu-rIN, ha_NG: ha-rNG, hi_IN: hi-rIN, hr_BA: hr-rBA, hr_HR: hr-rHR, hsb_DE: hsb-rDE, hu_HU: hu-rHU, hy_AM: hy-rAM, id_ID: id-rID, ig_NG: ig-rNG, ii_CN: ii-rCN, is_IS: is-rIS, it_CH: it-rCH, it_IT: it-rIT, iu_CA: iu-rCA, ja_JP: ja-rJP, ka_GE: ka-rGE, kk_KZ: kk-rKZ, kl_GL: kl-rGL, km_KH: km-rKH, kn_IN: kn-rIN, ko_KR: ko-rKR, kok_IN: kok-rIN, ky_KG: ky-rKG, lb_LU: lb-rLU, lo_LA: lo-rLA, lt_LT: lt-rLT, lv_LV: lv-rLV, mi_NZ: mi-rNZ, mk_MK: mk-rMK, ml_IN: ml-rIN, mn_CN: mn-rCN, mn_MN: mn-rMN, moh_CA: moh-rCA, mr_IN: mr-rIN, ms_BN: ms-rBN, ms_MY: ms-rMY, mt_MT: mt-rMT, nb_NO: nb-rNO, ne_NP: ne-rNP, nl_BE: nl-rBE, nl_NL: nl-rNL, nn_NO: nn-rNO, nso_ZA: nso-rZA, oc_FR: oc-rFR, or_IN: or-rIN, pa_IN: pa-rIN, pl_PL: pl-rPL, prs_AF: prs-rAF, ps_AF: ps-rAF, pt_BR: pt-rBR, pt_PT: pt-rPT, qut_GT: qut-rGT, quz_BO: quz-rBO, quz_EC: quz-rEC, quz_PE: quz-rPE, rm_CH: rm-rCH, ro_RO: ro-rRO, ru_RU: ru-rRU, rw_RW: rw-rRW, sa_IN: sa-rIN, sah_RU: sah-rRU, se_FI: se-rFI, se_NO: se-rNO, se_SE: se-rSE, si_LK: si-rLK, sk_SK: sk-rSK, sl_SI: sl-rSI, sma_NO: sma-rNO, sma_SE: sma-rSE, smj_NO: smj-rNO, smj_SE: smj-rSE, smn_FI: smn-rFI, sms_FI: sms-rFI, sq_AL: sq-rAL, sr_BA: sr-rBA, sr_CS: sr-rCS, sr_ME: sr-rME, sr_RS: sr-rRS, sv_FI: sv-rFI, sv_SE: sv-rSE, sw_KE: sw-rKE, syr_SY: syr-rSY, ta_IN: ta-rIN, te_IN: te-rIN, tg_TJ: tg-rTJ, th_TH: th-rTH, tk_TM: tk-rTM, tn_ZA: tn-rZA, tr_TR: tr-rTR, tt_RU: tt-rRU, tzm_DZ: tzm-rDZ, ug_CN: ug-rCN, uk_UA: uk-rUA, ur_PK: ur-rPK, uz_UZ: uz-rUZ, vi_VN: vi-rVN, wo_SN: wo-rSN, xh_ZA: xh-rZA, yo_NG: yo-rNG, zh_CN: zh-rCN, zh_HK: zh-rHK, zh_MO: zh-rMO, zh_SG: zh-rSG, zh_TW: zh-rTW, zu_ZA: zu-rZA, no_NO: no-rNO, he_IL: iw-rIL, he: iw
[k9mail.strings]
file_filter = res/values-<lang>/strings.xml
source_file = res/values/strings.xml
source_lang = en

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
android:versionCode="19002"
android:versionName="4.701" package="com.fsck.k9"
android:versionCode="20005"
android:versionName="4.804" package="com.fsck.k9"
>
<uses-sdk
android:minSdkVersion="8"

View File

@ -1,23 +0,0 @@
# This file is used to override default values used by the Ant build system.
#
# This file must be checked in Version Control Systems, as it is
# integral to the build system of your project.
# This file is only used by the Ant script.
# You can use this to override default values such as
# 'source.dir' for the location of your java source folder and
# 'out.dir' for the location of your output folder.
# You can also use it define how the release builds are signed by declaring
# the following properties:
# 'key.store' for the location of your keystore and
# 'key.alias' for the name of the key to use.
# The password will be asked during the build when you use the 'release' target.
# Indicates whether an apk should be generated for each density.
split.density=false
java.encoding=utf8
# Project target.
target=android-17
extensible.libs.classpath=compile-only-libs

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

View File

@ -4,7 +4,7 @@ buildscript {
}
dependencies {
classpath 'com.android.tools.build:gradle:0.5.+'
classpath 'com.android.tools.build:gradle:0.7.+'
}
}
@ -20,18 +20,26 @@ dependencies {
android {
compileSdkVersion 17
buildToolsVersion '17'
buildToolsVersion '18.1.1'
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
instrumentTest {
manifest.srcFile 'tests/AndroidManifest.xml'
java.srcDirs = ['tests/src']
assets.srcDirs = ['tests/assets']
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/LICENSE'
exclude 'META-INF/NOTICE'
}
}

BIN
gradle/wrapper/gradle-wrapper.jar vendored Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
#Mon Nov 04 16:58:06 CET 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=http\://services.gradle.org/distributions/gradle-1.9-bin.zip

164
gradlew vendored Executable file
View File

@ -0,0 +1,164 @@
#!/usr/bin/env bash
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn ( ) {
echo "$*"
}
die ( ) {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
esac
# For Cygwin, ensure paths are in UNIX format before anything is touched.
if $cygwin ; then
[ -n "$JAVA_HOME" ] && JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
fi
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >&-
APP_HOME="`pwd -P`"
cd "$SAVED" >&-
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"

90
gradlew.bat vendored Normal file
View File

@ -0,0 +1,90 @@
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS=
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windowz variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@ -6,7 +6,7 @@ dependencies {
android {
compileSdkVersion 17
buildToolsVersion '17'
buildToolsVersion '18.1.1'
sourceSets {
main {

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion '17'
buildToolsVersion '18.1.1'
sourceSets {
main {

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion '17'
buildToolsVersion '18.1.1'
sourceSets {
main {

View File

@ -2,7 +2,7 @@ apply plugin: 'android-library'
android {
compileSdkVersion 17
buildToolsVersion '17'
buildToolsVersion '18.1.1'
sourceSets {
main {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
res/drawable-mdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
res/drawable-xhdpi/icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

View File

@ -196,12 +196,7 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Compte \"<xliff:g id="account">%s</xliff:g>\" comprimida des de
<xliff:g id="oldSize">%s</xliff:g>
a
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Compte \"<xliff:g id="account">%s</xliff:g>\" comprimida des de <xliff:g id="oldSize">%s</xliff:g> a <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">S\'està compactant el compte \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">S\'està netejant el compte \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -986,7 +981,7 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Voleu eliminar aquest missatge?</item>
<item quantity="other">Voleu eliminar <xliff:g id="message_count">%1$d</xliff:g> missatges?</item>
</plurals>
@ -1023,7 +1018,7 @@ Si us plau, envia\'ns els errors, contribueix a millorar-lo a
<string name="settings_export_success">S\'han exportat els paràmetres globals a <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">S\'han importat els paràmetres globals de <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">S\'ha importat <xliff:g id="accounts">%s</xliff:g> des de <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">un compte</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> comptes</item>
</plurals>

View File

@ -200,12 +200,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte
<string name="abbrev_kilobytes">KiB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Účet \"<xliff:g id="account">%s</xliff:g>\" byl stlačen z
<xliff:g id="oldSize">%s</xliff:g>
na
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Účet \"<xliff:g id="account">%s</xliff:g>\" byl stlačen z <xliff:g id="oldSize">%s</xliff:g> na <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Stlačuji účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Čistím účet \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -989,7 +984,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Opravdu si přejete smazat tuto zprávu?</item>
<item quantity="few">Opravdu si přejete smazat <xliff:g id="message_count">%1$d</xliff:g> zprávy?</item>
<item quantity="other">Opravdu si přejete smazat <xliff:g id="message_count">%1$d</xliff:g> zpráv?</item>
@ -1028,7 +1023,7 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte
<string name="settings_export_success">Export nastavení uložen do <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Importovano globální nastaveni z <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importováno <xliff:g id="accounts">%s</xliff:g> z <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one"><xliff:g id="numAccounts">%s</xliff:g> účet</item><!-- added var in place of 1 účet -->
<item quantity="few"><xliff:g id="numAccounts">%s</xliff:g> účty</item><!-- 2-4 need to be this and 5- other -->
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> účtů</item>
@ -1151,13 +1146,13 @@ Posílejte prosím chybová hlášení, přispívejte novými funkcemi a ptejte
<string name="mark_all_as_read">Označ vše jako přečtené</string>
<string name="global_settings_colorize_missing_contact_pictures_label">Zabarvit chybějcí obrázky kontaktů</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_summary">Zabarví chybějcí obrázky u kontaktů</string>
<string name="global_settings_messageview_visible_refile_actions_title">Zobrazení funkcí zpráv</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Zobrazí vybrané funkce v dolním menu u zpráv</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Nahrávám přílohu…</string>
<string name="fetching_attachment_dialog_title_send">Odesílám zprávu</string>
<string name="fetching_attachment_dialog_title_save">Ukládám koncept</string>
<string name="fetching_attachment_dialog_message">Stahuji přílohu…</string>
</resources>

View File

@ -68,8 +68,8 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<!-- === App Store-specific strings ======================================================= -->
<!-- NEW: <string name="import_dialog_error_message">Please install a file manager to continue with this import.</string>-->
<!-- NEW: <string name="open_market">Open Play Store</string>-->
<string name="import_dialog_error_message">Du skal have en filemanager installeret for at kunne importere.</string>
<string name="open_market">Åben Play Store</string>
@ -89,15 +89,15 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="about_title_fmt">Om <xliff:g id="app_name">%s</xliff:g></string>
<string name="accounts_title">Konti</string>
<!-- NEW: <string name="folders_title">Folders</string>-->
<string name="folders_title">Mapper</string>
<string name="advanced">Avanceret</string>
<string name="message_list_title"><xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g> </string>
<string name="compose_title_compose">Skriv</string>
<!-- NEW: <string name="compose_title_reply">Reply</string>-->
<!-- NEW: <string name="compose_title_reply_all">Reply all</string>-->
<!-- NEW: <string name="compose_title_forward">Forward</string>-->
<string name="compose_title_reply">Svar</string>
<string name="compose_title_reply_all">Svar alle</string>
<string name="compose_title_forward">Vidersend</string>
<string name="choose_folder_title">Vælg en mappe</string>
@ -110,7 +110,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="status_next_poll">Næste synkronisering <xliff:g id="nexttime">%s</xliff:g></string>
<string name="status_syncing_off">synkronisering deaktiveret</string>
<!-- NEW: <string name="actionbar_selected"><xliff:g id="selection_count">%d</xliff:g> selected</string>-->
<string name="actionbar_selected"><xliff:g id="selection_count">%d</xliff:g> valgt</string>
<!-- Actions will be used as buttons and in menu items -->
<string name="next_action">Næste</string> <!-- Used as part of a multi-step process -->
<string name="previous_action">Forrige</string> <!-- Used as part of a multi-step process -->
@ -127,17 +127,17 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="spam_action">Spam</string>
<string name="forward_action">Videresend</string>
<string name="move_action">Flyt</string>
<!-- NEW: <string name="single_message_options_action">Send…</string>-->
<string name="single_message_options_action">Send…</string>
<!-- NEW: <string name="refile_action">Refile…</string>-->
<string name="continue_action">Fortsæt</string>
<!-- NEW: <string name="back_action">Back</string>-->
<string name="back_action">Tilbage</string>
<string name="done_action">Afslut</string> <!-- Used to complete a multi-step process -->
<string name="discard_action">Slet</string>
<string name="save_draft_action">Gem som kladde</string>
<string name="check_mail_action">Synkroniser mails</string>
<string name="send_messages_action">Send mails</string>
<string name="refresh_folders_action">Genindlæs mapper</string>
<!-- NEW: <string name="filter_folders_action">Find folder</string>-->
<string name="filter_folders_action">Find mappe</string>
<string name="add_account_action">Tilføj konto</string>
<string name="compose_action">Skriv</string>
<string name="search_action">Søg</string>
@ -157,12 +157,12 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="unflag_action">Fjern stjernemarkering</string>
<string name="copy_action">Kopier</string>
<string name="select_text_action">Vælg tekst</string>
<!-- NEW: <string name="show_headers_action">Show headers</string>-->
<!-- NEW: <string name="hide_headers_action">Hide headers</string>-->
<!-- NEW: <string name="message_view_theme_action_dark">Switch to dark theme</string>-->
<!-- NEW: <string name="message_view_theme_action_light">Switch to light theme</string>-->
<string name="show_headers_action">Vis headers</string>
<string name="hide_headers_action">Skjul headers</string>
<string name="message_view_theme_action_dark">Skift til mørkt theme</string>
<string name="message_view_theme_action_light">Skift til lyst theme</string>
<string name="mark_as_unread_action">Marker som ulæst</string>
<string name="add_cc_bcc_action">Tilføj Cc/Bcc</string>
<string name="read_receipt">Kvittering for modtagelse</string>
@ -196,27 +196,22 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Konto \"<xliff:g id="account">%s</xliff:g>\" nedbragt fra
<xliff:g id="oldSize">%s</xliff:g>
til
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Konto \"<xliff:g id="account">%s</xliff:g>\" nedbragt fra <xliff:g id="oldSize">%s</xliff:g> til <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Komprimerer konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Renser konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">Genskaber konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="notification_new_title">Ny mail</string>
<!-- NEW: <string name="notification_new_messages_title"><xliff:g id="new_message_count">%d</xliff:g> new messages</string>-->
<string name="notification_new_messages_title"><xliff:g id="new_message_count">%d</xliff:g> nye meddelelser</string>
<string name="notification_new_one_account_fmt"><xliff:g id="unread_message_count">%d</xliff:g> ulæst(e) (<xliff:g id="account">%s</xliff:g>)</string> <!-- 279 Unread (someone@google.com) -->
<!-- NEW: <string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> more on <xliff:g id="account">%s</xliff:g></string>-->
<string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> yderligere på <xliff:g id="account">%s</xliff:g></string>
<!-- NEW: <string name="notification_action_reply">Reply</string>-->
<!-- NEW: <string name="notification_action_mark_as_read">Mark Read</string>-->
<!-- NEW: <string name="notification_action_delete">Delete</string>-->
<!-- NEW: <string name="notification_certificate_error_title">Certificate error for <xliff:g id="account">%s</xliff:g></string>-->
<!-- NEW: <string name="notification_certificate_error_text">Check your server settings</string>-->
<string name="notification_action_reply">Svar</string>
<string name="notification_action_mark_as_read">Marker som læst</string>
<string name="notification_action_delete">Slet</string>
<string name="notification_certificate_error_title">Certifikat fejl for <xliff:g id="account">%s</xliff:g></string>
<string name="notification_certificate_error_text">Check indstillinger for server</string>
<string name="notification_bg_sync_ticker">Synkroniserer mail: <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
<string name="notification_bg_sync_title">Synkroniserer mail</string>
@ -256,7 +251,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="message_compose_bcc_hint">Bcc</string>
<string name="message_compose_subject_hint">Emne</string>
<string name="message_compose_content_hint">Meddelelsestekst</string>
<!-- NEW: <string name="message_compose_signature_hint">Signature</string>-->
<string name="message_compose_signature_hint">Signatur</string>
<string name="message_compose_quote_header_separator">-------- Original meddelelse --------</string>
<string name="message_compose_quote_header_subject">Emne:</string>
<string name="message_compose_quote_header_send_date">Sendt:</string>
@ -268,11 +263,11 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="error_contact_address_not_found">Mail addresse ikke fundet.</string>
<string name="message_compose_attachments_skipped_toast">Nogle vedhæftninger kunne ikke videresendes fordi de ikke er blevet hentet fra server.</string>
<string name="message_compose_show_quoted_text_action">Citer meddelelse</string>
<!-- NEW: <string name="message_compose_description_add_to">Add recipient (To)</string>-->
<!-- NEW: <string name="message_compose_description_add_cc">Add recipient (CC)</string>-->
<!-- NEW: <string name="message_compose_description_add_bcc">Add recipient (BCC)</string>-->
<!-- NEW: <string name="message_compose_description_delete_quoted_text">Remove quoted text</string>-->
<!-- NEW: <string name="message_compose_description_edit_quoted_text">Edit quoted text</string>-->
<string name="message_compose_description_add_to">Tilføj modtager (Til)</string>
<string name="message_compose_description_add_cc">ATilføj modtager (CC)</string>
<string name="message_compose_description_add_bcc">Tilføj modtager (BCC)</string>
<string name="message_compose_description_delete_quoted_text">Fjern citeret tekst</string>
<string name="message_compose_description_edit_quoted_text">Rediger citeret tekst</string>
<string name="message_view_from_format">Fra: <xliff:g id="name">%s</xliff:g> &lt;<xliff:g id="email">%s</xliff:g>&gt;</string>
<string name="message_to_label">Til:</string>
@ -282,13 +277,13 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="message_view_status_attachment_saved">Vedhæftning gemt på SD kort som <xliff:g id="filename">%s</xliff:g>.</string>
<string name="message_view_status_attachment_not_saved">Kan ikke gemme vedhæftning på SD kort.</string>
<string name="message_view_show_pictures_action">Vis billeder</string>
<!-- NEW: <string name="message_view_show_message_action">Show message</string>-->
<!-- NEW: <string name="message_view_show_attachments_action">Show attachments</string>-->
<!-- NEW: <string name="message_view_show_more_attachments_action">More…</string>-->
<string name="message_view_show_message_action">Vis meddelelse</string>
<string name="message_view_show_attachments_action">Vis vedhæftning</string>
<string name="message_view_show_more_attachments_action">Mere…</string>
<string name="message_view_fetching_attachment_toast">Henter vedhæftede filer.</string>
<string name="message_view_no_viewer">Kan ikke finde program som kan vise <xliff:g id="mimetype">%s</xliff:g>.</string>
<string name="message_view_download_remainder">Hent hele meddelelsen</string>
<!-- NEW: <string name="message_view_downloading">Downloading…</string>-->
<string name="message_view_downloading">Henter…</string>
<!-- NOTE: The following message refers to strings with id 'account_setup_incoming_save_all_headers_label' and 'account_setup_incoming_title' -->
<string name="message_additional_headers_not_downloaded">Ikke alle mail headers blev hentet eller gemt. Vælg \"Gem alle headers lokalt\" under kontoens indstillinger for indgående server, for at aktivere denne funktion fremover.</string>
@ -316,13 +311,13 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="global_settings_registered_name_color_label">Farvelæg kontakter</string>
<string name="global_settings_registered_name_color_default">Benyt ikke farvelægning af navne i kontaktlisten</string>
<string name="global_settings_registered_name_color_changed">Farvelæg navne i kontaklisten</string>
<!-- NEW: <string name="global_settings_folderlist_wrap_folder_names_label">Wrap long folder names</string>-->
<!-- NEW: <string name="global_settings_folderlist_wrap_folder_names_summary">Use multiple lines to show long folder names</string>-->
<string name="global_settings_folderlist_wrap_folder_names_label">Wrap lange mappenavne</string>
<string name="global_settings_folderlist_wrap_folder_names_summary">Benyt flere linier til visning af lange mappenavne</string>
<string name="global_settings_messageview_fixedwidth_label">Tegnsæt med fast bredde</string>
<string name="global_settings_messageview_fixedwidth_summary">Benyt tegnsæt med fast bredde til visning af mails med ren tekst</string>
<!-- NEW: <string name="global_settings_messageview_autofit_width_label">Auto-fit messages</string>-->
<!-- NEW: <string name="global_settings_messageview_autofit_width_summary">Shrink messages to fit the screen</string>-->
<string name="global_settings_messageview_autofit_width_label">Auto tilpas størrelse på meddelser</string>
<string name="global_settings_messageview_autofit_width_summary">Afkort meddelser så de passer til skærm</string>
<string name="global_settings_messageview_return_to_list_label">Retur til liste efter sletning</string>
<string name="global_settings_messageview_return_to_list_summary">Returner til mailliste efter sletning af mail</string>
<string name="global_settings_messageview_show_next_label">Vis næste mail efter sletning</string>
@ -333,28 +328,28 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="global_settings_confirm_action_delete">Slet mail (kun i forb. med visning af mails)</string>
<string name="global_settings_confirm_action_delete_starred">Slet stjernemarkeringer (kun i forb. med visning af mails)</string>
<string name="global_settings_confirm_action_spam">Spam</string>
<!-- NEW: <string name="global_settings_confirm_action_delete_notif">Delete (from notification)</string>-->
<string name="global_settings_confirm_action_delete_notif">Slet (fra notifikation)</string>
<!-- NEW: <string name="global_settings_notification_hide_subject_title">Hide subject in notifications</string>-->
<!-- NEW: <string name="global_settings_notification_hide_subject_never">Never</string>-->
<!-- NEW: <string name="global_settings_notification_hide_subject_when_locked">When device is locked</string>-->
<!-- NEW: <string name="global_settings_notification_hide_subject_always">Always</string>-->
<string name="global_settings_notification_hide_subject_title">Skjul emne i notifikations bjælke</string>
<string name="global_settings_notification_hide_subject_never">Aldrig</string>
<string name="global_settings_notification_hide_subject_when_locked">Når enhed er låst</string>
<string name="global_settings_notification_hide_subject_always">Altid</string>
<!-- NEW: <string name="global_settings_notification_quick_delete_title">Show \'Delete\' button</string>-->
<!-- NEW: <string name="global_settings_notification_quick_delete_never">Never</string>-->
<!-- NEW: <string name="global_settings_notification_quick_delete_when_single_msg">For single message notification</string>-->
<!-- NEW: <string name="global_settings_notification_quick_delete_always">Always</string>-->
<!-- NEW: <string name="global_settings_notification_quick_delete_description">Show a button in the notification that allows quick message deletion</string>-->
<string name="global_settings_notification_quick_delete_title">Vis \'Slet\' knap</string>
<string name="global_settings_notification_quick_delete_never">Aldrig</string>
<string name="global_settings_notification_quick_delete_when_single_msg">For single meddelelse notifikation</string>
<string name="global_settings_notification_quick_delete_always">Altid</string>
<string name="global_settings_notification_quick_delete_description">Vis knap i notifikation bjælke som tillader sletning af meddelese</string>
<!-- NEW: <string name="global_settings_batch_buttons">Batch buttons</string>-->
<!-- NEW: <string name="global_settings_batch_buttons_summary">Configure message list batch buttons</string>-->
<!-- NEW: <string name="global_settings_mark_read">Mark read/unread</string>-->
<!-- NEW: <string name="global_settings_delete">Delete</string>-->
<!-- NEW: <string name="global_settings_archive">Move to archive</string>-->
<!-- NEW: <string name="global_settings_archive_disabled_reason">No archive folders.</string>-->
<!-- NEW: <string name="global_settings_move">Move</string>-->
<!-- NEW: <string name="global_settings_flag">Flag</string>-->
<!-- NEW: <string name="global_settings_unselect">Unselect</string>-->
<string name="global_settings_batch_buttons">Batch håndterings knapper</string>
<string name="global_settings_batch_buttons_summary">Konfigurer meddelelses liste batch håndterings knapper</string>
<string name="global_settings_mark_read">Marker som læst/ulæst</string>
<string name="global_settings_delete">Slet</string>
<string name="global_settings_archive">Flyt til arkiv</string>
<string name="global_settings_archive_disabled_reason">Ingen arkivmapper.</string>
<string name="global_settings_move">Flyt</string>
<string name="global_settings_flag">Marker</string>
<string name="global_settings_unselect">Fravælg</string>
<string name="quiet_time">Tidsrum med stilhed</string>
<string name="quiet_time_description">Undlad at ringe, vibrere og blinke i tidsrummet</string>
@ -419,7 +414,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_setup_expunge_policy_on_poll">I forbindelse med hentning af mails</string>
<string name="account_setup_expunge_policy_manual">Kun manuelt</string>
<!-- NEW: <string name="account_setup_incoming_autodetect_namespace_label">Auto-detect IMAP namespace</string>-->
<string name="account_setup_incoming_autodetect_namespace_label">Auto detekter IMAP namespace</string>
<string name="account_setup_incoming_imap_path_prefix_label">IMAP søge prefix</string>
<string name="drafts_folder_label">Navn på Kladde mappe</string>
@ -523,8 +518,8 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_settings_notification_opens_unread_summary">Søger efter ulæste mails når besked vises</string>
<string name="account_settings_notification_unread_count_label">Vis antal ulæste mails</string>
<string name="account_settings_notification_unread_count_summary">Vis antallet af ulæste mails i statusbar.</string>
<!-- NEW: <string name="account_settings_mark_message_as_read_on_view_label">Mark as read when opened</string>-->
<!-- NEW: <string name="account_settings_mark_message_as_read_on_view_summary">Mark a message as read when it is opened for viewing</string>-->
<string name="account_settings_mark_message_as_read_on_view_label">Marker som læst ved åbning</string>
<string name="account_settings_mark_message_as_read_on_view_summary">Marker som læst når meddelses åbnes for læsning</string>
<string name="account_settings_show_pictures_label">Vis altid billeder</string>
<string name="account_settings_show_pictures_never">Aldrig</string>
@ -547,7 +542,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_settings_message_format_html">HTML (billeder og formattering bevares)</string>
<string name="account_settings_message_format_auto">Automatisk (ren tekst med mindre mail som besvares er i HTML format)</string>
<!-- NEW: <string name="account_settings_always_show_cc_bcc_label">Always show Cc/Bcc</string>-->
<string name="account_settings_always_show_cc_bcc_label">Vis altid Cc/Bcc</string>
<string name="account_settings_message_read_receipt_label">Kvittering for modtagelse</string>
<string name="account_settings_message_read_receipt_summary">Anmod altid om kvittering for modtagelse</string>
@ -557,7 +552,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_settings_quote_style_header">Header (som Outlook, Yahoo!, Hotmail)</string>
<string name="account_settings_general_title">Generelt</string>
<!-- NEW: <string name="account_settings_reading_mail">Reading mail</string>-->
<string name="account_settings_reading_mail">Læsning af mail</string>
<string name="account_settings_sync">Hentning af mail</string>
<string name="account_settings_folders">Mapper</string>
<string name="account_settings_quote_prefix_label">Citeret tekst prefix</string>
@ -566,9 +561,9 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_settings_crypto_app_none">Ingen</string>
<string name="account_settings_crypto_auto_signature">Auto signering</string>
<string name="account_settings_crypto_auto_signature_summary">Benyt kontoens mail addresse til at gætte signaturnøgle.</string>
<!-- NEW: <string name="account_settings_crypto_auto_encrypt">Auto-encrypt</string>-->
<!-- NEW: <string name="account_settings_crypto_auto_encrypt_summary">Automatically set encrypt if a public key matches a recipient.</string>-->
<!-- NEW: <string name="account_settings_crypto_apg_not_installed">APG not installed</string>-->
<string name="account_settings_crypto_auto_encrypt">Auto kryptering</string>
<string name="account_settings_crypto_auto_encrypt_summary">Automatisk kryptering hvis offentlig nøgle matcher en modtager.</string>
<string name="account_settings_crypto_apg_not_installed">APG ikke installeret</string>
<string name="account_settings_mail_check_frequency_label">Frekvens for hentning af mails</string>
@ -732,8 +727,8 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="sort_latest_first">Nyeste mails først</string>
<string name="sort_subject_alpha">Sorter efter emne</string>
<string name="sort_subject_re_alpha">Sorter efter emne omvendt alfabetisk</string>
<!-- NEW: <string name="sort_sender_alpha">Sender alphabetical</string>-->
<!-- NEW: <string name="sort_sender_re_alpha">Sender reverse alphabetical</string>-->
<string name="sort_sender_alpha">Afsender alfabetisk</string>
<string name="sort_sender_re_alpha">Afsender omvendt alfabetisk</string>
<string name="sort_flagged_first">Stjernemarkerede mails først</string>
<string name="sort_flagged_last">Ikke stjernemarkerede mails først</string>
<string name="sort_unread_first">Ulæste mails først</string>
@ -743,9 +738,9 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="sort_by">Sorter efter…</string>
<string name="sort_by_date">Dato</string>
<!-- NEW: <string name="sort_by_arrival">Arrival</string>-->
<string name="sort_by_arrival">Modtagelsestidspunkt</string>
<string name="sort_by_subject">Emne</string>
<!-- NEW: <string name="sort_by_sender">Sender</string>-->
<string name="sort_by_sender">Afsender</string>
<string name="sort_by_flag">Stjernemarkering</string>
<string name="sort_by_unread">Læst/ulæst</string>
<string name="sort_by_attach">Vedhæftning</string>
@ -757,7 +752,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_clear_dlg_title">Rens konto</string>
<string name="provider_note_yahoojp">Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade POP3 i Yahoo\'s indstillinger for mail.</string>
<!-- NEW: <string name="provider_note_auonejp">Be sure to enable IMAP or POP3 on the au one mail settings page.</string>-->
<string name="provider_note_auonejp">Husk at aktiver IMAP eller POP3 i \"au one mail\" indstillings siden.</string>
<string name="provider_note_naver">Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Naver\'s indstillinger for mail.</string>
<string name="provider_note_hanmail">Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Hanmail\'s(Daum)indstillinger for mail.</string>
<string name="provider_note_paran">Hvis du ønsker at benytte POP3 med denne leverandør, skal du vælge at tillade IMAP eller POP3 i Paran\'s indstillinger for mail.</string>
@ -805,7 +800,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="account_settings_signature__location_label">Signatur position</string>
<string name="account_settings_signature__location_before_quoted_text">Før citeret tekst</string>
<string name="account_settings_signature__location_after_quoted_text">Efter citeret tekst</string>
<!-- NEW: <string name="setting_theme_global">Use app theme</string>-->
<string name="setting_theme_global">Benyt app theme</string>
<string name="setting_theme_dark">Mørk</string>
<string name="setting_theme_light">Lys</string>
<string name="display_preferences">Visning</string>
@ -817,15 +812,15 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="accountlist_preferences">Kontoliste</string>
<string name="messagelist_preferences">Mailliste</string>
<string name="messageview_preferences">Mails</string>
<!-- NEW: <string name="folderlist_preferences">Folder lists</string>-->
<string name="folderlist_preferences">Mappe lister</string>
<string name="settings_theme_label">Tema</string>
<!-- NEW: <string name="settings_message_theme_label">Message view theme</string>-->
<!-- NEW: <string name="settings_compose_theme_label">Composer theme</string>-->
<string name="settings_message_theme_label">Meddelelsesvisnings theme</string>
<string name="settings_compose_theme_label">Editor theme</string>
<string name="settings_language_label">Sprog</string>
<!-- NEW: <string name="settings_message_theme_selection_label">Fixed message theme</string>-->
<!-- NEW: <string name="settings_message_theme_selection_summary_off">Select the message view theme while viewing the message</string>-->
<!-- NEW: <string name="settings_message_theme_selection_summary_on">Use a fixed message view theme</string>-->
<string name="settings_message_theme_selection_label">Fixed meddelelses theme</string>
<string name="settings_message_theme_selection_summary_off">Benyt meddelelsesvisnings theme når meddelelser læses</string>
<string name="settings_message_theme_selection_summary_on">Benyt et fixed meddelelsesvisnings theme</string>
<string name="settings_messageview_mobile_layout_label">Enkelkolonne layout</string>
<string name="settings_messageview_mobile_layout_summary">Reformater HTML meddelelser til visning på små skærme</string>
@ -837,7 +832,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="background_ops_always">Altid</string>
<string name="background_ops_enabled">Når \"Baggrundsdata\" er aktiveret</string>
<string name="background_ops_auto_sync">Når \"Baggrundsdata\" &amp; \"Auto-sync\" er aktiveret</string>
<!-- NEW: <string name="background_ops_auto_sync_only">When \'Auto-sync\' is checked</string>-->
<string name="background_ops_auto_sync_only">Når \"Auto-sync\" er valgt</string>
<string name="batch_select_all">Vælg alle</string>
@ -916,10 +911,10 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="font_size_message_view_date">Tid og dato</string>
<string name="font_size_message_view_content">Indhold</string>
<!-- NEW: <string name="font_size_message_compose">Message composition</string>-->
<!-- NEW: <string name="font_size_message_compose_input">Text input fields</string>-->
<string name="font_size_message_compose">Meddelelses redigering</string>
<string name="font_size_message_compose_input">Tekst input felter</string>
<!-- NEW: <string name="font_size_default">Default</string>-->
<string name="font_size_default">Forudvalgt</string>
<string name="font_size_tiniest">Mindst</string>
<string name="font_size_tiny">Mindre</string>
<string name="font_size_smaller">Lille</string>
@ -960,14 +955,14 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="save_or_discard_draft_message_dlg_title">Gem kladde?</string>
<string name="save_or_discard_draft_message_instructions_fmt">Gem eller fortryd denne meddelelse?</string>
<!-- NEW: <string name="confirm_discard_draft_message_title">Discard message?</string>-->
<!-- NEW: <string name="confirm_discard_draft_message">Are you sure you want to discard this message?</string>-->
<string name="confirm_discard_draft_message_title">Annuler meddelelse?</string>
<string name="confirm_discard_draft_message">Er du sikker på at du ønsker at annulere denne meddelelse?</string>
<!-- NEW: <string name="refuse_to_save_draft_marked_encrypted_dlg_title">Refuse to save draft message.</string>-->
<!-- NEW: <string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Refuse to save draft message marked encrypted.</string>-->
<!-- NEW: <string name="continue_without_public_key_dlg_title">Continue without public key?</string>-->
<!-- NEW: <string name="continue_without_public_key_instructions_fmt">One or more recipients do not have a saved public key. Continue?</string>-->
<string name="continue_without_public_key_dlg_title">Fortsæt uden offentlig nøgle?</string>
<string name="continue_without_public_key_instructions_fmt">En eller flere modtagere har ikke en offentlig nøgle. Fortsæt?</string>
<string name="select_text_now">Vælg tekst som skal kopieres.</string>
@ -985,12 +980,11 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<!-- NEW:
<plurals name="dialog_confirm_delete_message">
<item quantity="one">Do you really want to delete this message?</item>
<item quantity="other">Do you really want to delete <xliff:g id="message_count">%1$d</xliff:g> messages?</item>
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Ønsker du virkelig at slette denne meddelelse?</item>
<item quantity="other">Ønsker du virkelig at slette <xliff:g id="message_count">%1$d</xliff:g> meddelelser?</item>
</plurals>
-->
<string name="dialog_confirm_delete_confirm_button">Slet</string>
<string name="dialog_confirm_delete_cancel_button">Slet ikke</string>
@ -1024,7 +1018,7 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="settings_export_success">Indstillinger gemt som <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Importerede globale indstillinger fra <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importerede <xliff:g id="accounts">%s</xliff:g> fra <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 konto</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> konti</item>
</plurals>
@ -1059,99 +1053,96 @@ Vær venlig at sende fejlrapporter, anmodning om nye funktioner, og spørgsmål
<string name="manage_accounts_move_down_action">Flyt ned</string>
<string name="manage_accounts_moving_message">Flytter konto…</string>
<!-- NEW: <string name="unread_widget_select_account">Show unread count for…</string>-->
<!-- NEW: <string name="import_dialog_error_title">Missing File Manager Application</string>-->
<!-- NEW: <string name="close">Close</string>-->
<!-- NEW: Danish translation added-->
<string name="unread_widget_select_account">Vis antal ulæste for…</string>
<string name="import_dialog_error_title">Manglende File Manager program</string>
<string name="close">Luk</string>
<string name="webview_empty_message">Ingen tekst</string>
<string name="webview_contextmenu_link_view_action">Åben link</string>
<string name="webview_contextmenu_link_share_action">Del link</string>
<string name="webview_contextmenu_link_copy_action">Kopier link til clipboard</string>
<string name="webview_contextmenu_link_clipboard_label">Link</string>
<string name="webview_contextmenu_image_title">Bilelde</string>
<string name="webview_contextmenu_image_view_action">Vis billede</string>
<string name="webview_contextmenu_image_save_action">Gem billede</string>
<string name="webview_contextmenu_image_download_action">Download billede</string>
<string name="webview_contextmenu_image_copy_action">Kopier billed URL til clipboard</string>
<string name="webview_contextmenu_image_clipboard_label">Billed URL</string>
<!-- NEW: <string name="webview_empty_message">No text</string>-->
<string name="webview_contextmenu_phone_call_action">Opkald til nummer</string>
<string name="webview_contextmenu_phone_save_action">Gem i Kontakter</string>
<string name="webview_contextmenu_phone_copy_action">Kopier nummer til clipboard</string>
<string name="webview_contextmenu_phone_clipboard_label">Telefonnummer</string>
<!-- NEW: <string name="webview_contextmenu_link_view_action">Open link</string>-->
<!-- NEW: <string name="webview_contextmenu_link_share_action">Share link</string>-->
<!-- NEW: <string name="webview_contextmenu_link_copy_action">Copy link to clipboard</string>-->
<!-- NEW: <string name="webview_contextmenu_link_clipboard_label">Link</string>-->
<string name="webview_contextmenu_email_send_action">Send mail</string>
<string name="webview_contextmenu_email_save_action">Gem i Kontakter</string>
<string name="webview_contextmenu_email_copy_action">Kopier addresse til clipboard</string>
<string name="webview_contextmenu_email_clipboard_label">Mail addresse</string>
<!-- NEW: <string name="webview_contextmenu_image_title">Image</string>-->
<!-- NEW: <string name="webview_contextmenu_image_view_action">View image</string>-->
<!-- NEW: <string name="webview_contextmenu_image_save_action">Save image</string>-->
<!-- NEW: <string name="webview_contextmenu_image_download_action">Download image</string>-->
<!-- NEW: <string name="webview_contextmenu_image_copy_action">Copy image URL to clipboard</string>-->
<!-- NEW: <string name="webview_contextmenu_image_clipboard_label">Image URL</string>-->
<string name="image_saved_as">Billed gemt som \"<xliff:g id="filename">%s</xliff:g>\"</string>
<string name="image_saving_failed">Fejl iforb. med at gemme billede.</string>
<string name="account_settings_remote_search_num_results_entries_all">Alle</string>
<string name="account_settings_remote_search_num_results_entries_10">10</string>
<string name="account_settings_remote_search_num_results_entries_25">25</string>
<string name="account_settings_remote_search_num_results_entries_50">50</string>
<string name="account_settings_remote_search_num_results_entries_100">100</string>
<string name="account_settings_remote_search_num_results_entries_250">250</string>
<string name="account_settings_remote_search_num_results_entries_500">500</string>
<string name="account_settings_remote_search_num_results_entries_1000">1000</string>
<string name="account_settings_remote_search_num_label">Server søge begrænsning</string>
<string name="account_settings_remote_search_num_summary">Søgning vil stoppe når der er fundet <xliff:g id="num_results">%s</xliff:g> resultater</string>
<string name="account_settings_remote_search_full_text">Medtag meddelelsestekst i server søgning</string>
<string name="account_settings_remote_search_full_text_summary">Fuldtekstsøgning kan være langsom.</string>
<string name="remote_search_sending_query">Sender forspørgsel til server</string>
<string name="remote_search_downloading">Henter %d resultater</string>
<string name="remote_search_downloading_limited">Henter %1$d ud af %2$d resultater</string>
<string name="remote_search_error">Fjernsøgning fejlede</string>
<!-- NEW: <string name="webview_contextmenu_phone_call_action">Call number</string>-->
<!-- NEW: <string name="webview_contextmenu_phone_save_action">Save to Contacts</string>-->
<!-- NEW: <string name="webview_contextmenu_phone_copy_action">Copy number to clipboard</string>-->
<!-- NEW: <string name="webview_contextmenu_phone_clipboard_label">Phone number</string>-->
<string name="account_settings_search">Søg</string>
<string name="account_settings_remote_search_enabled">Aktiver søgning på server</string>
<string name="account_settings_remote_search_enabled_summary">Søg meddelelser på både enhed og server</string>
<string name="action_remote_search">Søg i meddelelser på server</string>
<string name="pull_to_refresh_remote_search_from_local_search_pull">Træ for at søge på server…</string>
<string name="pull_to_refresh_remote_search_from_local_search_release">Slip for at søge på server…</string>
<string name="remote_search_unavailable_no_network">En netværksforbindelse er nødvendig når der søges på server.</string>
<!-- NEW: <string name="webview_contextmenu_email_send_action">Send mail</string>-->
<!-- NEW: <string name="webview_contextmenu_email_save_action">Save to Contacts</string>-->
<!-- NEW: <string name="webview_contextmenu_email_copy_action">Copy address to clipboard</string>-->
<!-- NEW: <string name="webview_contextmenu_email_clipboard_label">Email address</string>-->
<string name="global_settings_background_as_unread_indicator_label">Nedton meddelelser efter læsning</string>
<string name="global_settings_background_as_unread_indicator_summary">En grå baggrund vil angive at meddelelse er læst</string>
<!-- NEW: <string name="image_saved_as">Saved image as \"<xliff:g id="filename">%s</xliff:g>\"</string>-->
<!-- NEW: <string name="image_saving_failed">Saving the image failed.</string>-->
<string name="global_settings_threaded_view_label">Visning i tråd</string>
<string name="global_settings_threaded_view_summary">Grupper meddelelser i tråde</string>
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_all">All</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_10">10</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_25">25</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_50">50</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_100">100</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_250">250</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_500">500</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_1000">1000</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_label">Server search limit</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_summary">Search will stop after finding <xliff:g id="num_results">%s</xliff:g> results.</string>-->
<!-- NEW: <string name="account_settings_remote_search_full_text">Include messages text in server search</string>-->
<!-- NEW: <string name="account_settings_remote_search_full_text_summary">Full text searches can be slow.</string>-->
<!-- NEW: <string name="remote_search_sending_query">Sending query to server</string>-->
<!-- NEW: <string name="remote_search_downloading">Fetching %d results</string>-->
<!-- NEW: <string name="remote_search_downloading_limited">Fetching %1$d of %2$d results</string>-->
<!-- NEW: <string name="remote_search_error">Remote search failed</string>-->
<string name="upgrade_databases_title">Opdaterer databaser</string>
<string name="upgrade_databases_unspecified">Opdaterer databaser…</string>
<string name="upgrade_database_format">Opdaterer databaser for konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<!-- NEW: <string name="account_settings_search">Search</string>-->
<!-- NEW: <string name="account_settings_remote_search_enabled">Enable server search</string>-->
<!-- NEW: <string name="account_settings_remote_search_enabled_summary">Search messages on the server in addition to those on your device</string>-->
<!-- NEW: <string name="action_remote_search">Search messages on server</string>-->
<!-- NEW: <string name="pull_to_refresh_remote_search_from_local_search_pull">Pull to search server…</string>-->
<!-- NEW: <string name="pull_to_refresh_remote_search_from_local_search_release">Release to search server…</string>-->
<!-- NEW: <string name="remote_search_unavailable_no_network">A network connection is required for server search.</string>-->
<string name="message_list_loading">Indlæser…</string>
<!-- NEW: <string name="global_settings_background_as_unread_indicator_label">Dim messages after reading</string>-->
<!-- NEW: <string name="global_settings_background_as_unread_indicator_summary">A grey background will show that a message has been read</string>-->
<string name="global_settings_splitview_mode_label">Vis delt skærm</string>
<string name="global_settings_splitview_always">Altid</string>
<string name="global_settings_splitview_never">Aldrig</string>
<string name="global_settings_splitview_when_in_landscape">Når skærm er i Landscape mode</string>
<!-- NEW: <string name="global_settings_threaded_view_label">Threaded view</string>-->
<!-- NEW: <string name="global_settings_threaded_view_summary">Group messages by conversation</string>-->
<string name="message_view_empty">Vær venlig og vælg en meddelelse fra venstre side</string>
<!-- NEW: <string name="upgrade_databases_title">Upgrading databases</string>-->
<!-- NEW: <string name="upgrade_databases_unspecified">Upgrading databases…</string>-->
<!-- NEW: <string name="upgrade_database_format">Upgrading database of account \"<xliff:g id="account">%s</xliff:g>\"</string>-->
<string name="global_settings_show_contact_picture_label">Vis kontaktbilleder</string>
<string name="global_settings_show_contact_picture_summary">Vis kontaktbilleder i meddelelsesliste</string>
<!-- NEW: <string name="message_list_loading">Loading…</string>-->
<string name="last_refresh_time_format">Opdateret <xliff:g id="formatted_time">%s</xliff:g></string>
<string name="last_refresh_time_format_with_push">Opdateret <xliff:g id="time_with_preposition">%s</xliff:g> (Push aktiveret)</string>
<string name="preposition_for_date">den <xliff:g id="date">%s</xliff:g></string>
<!-- NEW: <string name="global_settings_splitview_mode_label">Show split-screen</string>-->
<!-- NEW: <string name="global_settings_splitview_always">Always</string>-->
<!-- NEW: <string name="global_settings_splitview_never">Never</string>-->
<!-- NEW: <string name="global_settings_splitview_when_in_landscape">When in Landscape orientation</string>-->
<string name="mark_all_as_read">Marker alle som læst</string>
<!-- NEW: <string name="message_view_empty">Please select a message on the left</string>-->
<string name="global_settings_colorize_missing_contact_pictures_label">Farvelægning af kontakter</string>
<string name="global_settings_colorize_missing_contact_pictures_summary">Benyt farver hvis der ikke findes billede af kontakter</string>
<!-- NEW: <string name="global_settings_show_contact_picture_label">Show contact pictures</string>-->
<!-- NEW: <string name="global_settings_show_contact_picture_summary">Show contact pictures in the message list</string>-->
<string name="global_settings_messageview_visible_refile_actions_title">Visning af handlinger for valgte meddelelses</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Vis handlinger for valgte meddelelser i Visnings menu</string>
<!-- NEW: <string name="last_refresh_time_format">Refreshed <xliff:g id="formatted_time">%s</xliff:g></string>-->
<!-- NEW: <string name="last_refresh_time_format_with_push">Refreshed <xliff:g id="time_with_preposition">%s</xliff:g> (Push active)</string>-->
<!-- NEW: <string name="preposition_for_date">on <xliff:g id="date">%s</xliff:g></string>-->
<!-- NEW: <string name="mark_all_as_read">Mark all as read</string>-->
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_label">Colorize contact pictures</string>-->
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_title">Visible message actions</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_summary">Show selected actions in the message view menu</string>-->
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Henter vedhæftning…</string>
<string name="fetching_attachment_dialog_title_send">Sender meddelelse</string>
<string name="fetching_attachment_dialog_title_save">Gemmer kladde</string>
<string name="fetching_attachment_dialog_message">Henter vedhæftning…</string>
</resources>

View File

@ -187,21 +187,14 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc
<string name="status_loading_more_failed">Ladevorgang erneut starten</string>
<string name="load_more_messages_fmt">Bis zu
<xliff:g id="messages_to_load">%d</xliff:g> weitere abrufen</string>
<string name="load_more_messages_fmt">Bis zu <xliff:g id="messages_to_load">%d</xliff:g> weitere abrufen</string>
<string name="abbrev_gigabytes">GB</string>
<string name="abbrev_megabytes">MB</string>
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Konto \'<xliff:g id="account">%s</xliff:g>\' von
<xliff:g id="oldSize">%s</xliff:g>
auf
<xliff:g id="newSize">%s</xliff:g>
komprimiert
</string>
<string name="account_size_changed">Konto \'<xliff:g id="account">%s</xliff:g>\' von <xliff:g id="oldSize">%s</xliff:g> auf <xliff:g id="newSize">%s</xliff:g> komprimiert</string>
<string name="compacting_account">Konto \'<xliff:g id="account">%s</xliff:g>\' wird komprimiert</string>
<string name="clearing_account">Konto \'<xliff:g id="account">%s</xliff:g>\' wird bereinigt</string>
@ -985,7 +978,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Möchten Sie diese Nachricht wirklich löschen?</item>
<item quantity="other">Möchten Sie wirklich <xliff:g id="message_count">%1$d</xliff:g> Nachrichten löschen?</item>
</plurals>
@ -1022,7 +1015,7 @@ Um Fehler zu melden, neue Funktionen vorzuschlagen oder Fragen zu stellen, besuc
<string name="settings_export_success">Exportierte Einstellungen wurden erfolgreich nach <xliff:g id="filename">%s</xliff:g> gespeichert</string>
<string name="settings_import_global_settings_success">Globale Einstellungen erfolgreich aus <xliff:g id="filename">%s</xliff:g> importiert</string>
<string name="settings_import_success">\'<xliff:g id="accounts">%s</xliff:g>\' erfolgreich aus <xliff:g id="filename">%s</xliff:g> importiert</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 Konto</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> Konten</item>
</plurals>

View File

@ -195,8 +195,7 @@
<string name="abbrev_kilobytes">Kb</string>
<string name="abbrev_bytes">b</string>
<string name="account_size_changed">Ο λογαριασμός \'<xliff:g id="account">%s</xliff:g>\' συμπυκνώθηκε από
<xliff:g id="oldSize">%s</xliff:g> σε <xliff:g id="newSize">%s</xliff:g></string>
<string name="account_size_changed">Ο λογαριασμός \'<xliff:g id="account">%s</xliff:g>\' συμπυκνώθηκε από <xliff:g id="oldSize">%s</xliff:g> σε <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Συμπύκνωση λογαριασμού \'<xliff:g id="account">%s</xliff:g>\'</string>
<string name="clearing_account">Καθαρισμός λογαριασμού \'<xliff:g id="account">%s</xliff:g>\'</string>
@ -980,7 +979,7 @@
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Θέλετε πράγματι να διαγράψετε αυτό το μήνυμα;</item>
<item quantity="other">Θέλετε πράγματι να διαγράψετε <xliff:g id="message_count">%1$d</xliff:g> μηνύματα;</item>
</plurals>
@ -1017,7 +1016,7 @@
<string name="settings_export_success">Οι εξαγόμενες ρυθμίσεις αποθηκεύτηκαν στο <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Ρυθμίσεις εισήχθηκαν από το <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Εισήχθηκαν <xliff:g id="accounts">%s</xliff:g> λογαριασμοί από το <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 λογαριασμός</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> λογαριασμοί</item>
</plurals>
@ -1138,13 +1137,13 @@
<string name="mark_all_as_read">Μαρκάρισμα όλων ως αναγνωσμένων</string>
<string name="global_settings_colorize_missing_contact_pictures_label">Χρωματισμός επαφών χωρίς εικόνα</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_summary">Χρωματισμός επαφών χωρίς εικόνα</string>
<string name="global_settings_messageview_visible_refile_actions_title">Ορατές ενέργειες μηνυμάτων</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Προβολή των επιλεγμένων ενεργειών στο μενού προβολής μηνύματος</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Φόρτωση συνημμένων…</string>
<string name="fetching_attachment_dialog_title_send">Αποστολή μηνύματος</string>
<string name="fetching_attachment_dialog_title_save">Αποθήκευση πρόχειρου</string>
<string name="fetching_attachment_dialog_message">Ανάκληση συνημμένων…</string>
</resources>

View File

@ -195,12 +195,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Cuenta \"<xliff:g id="account">%s</xliff:g>\" reducida desde
<xliff:g id="oldSize">%s</xliff:g>
a
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Cuenta \"<xliff:g id="account">%s</xliff:g>\" reducida desde <xliff:g id="oldSize">%s</xliff:g> a <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compactando cuenta \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Limpiando cuenta \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -858,7 +853,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades
<string name="volume_navigation_message">Vista de mensaje</string>
<string name="volume_navigation_list">Listas de mensajes</string>
<string name="start_integrated_inbox_title">Usar Bandeja inificada</string>
<string name="start_integrated_inbox_title">Usar Bandeja unificada</string>
<string name="measure_accounts_title">Tamaño cuenta</string>
<string name="measure_accounts_summary">Desactivar para mejorar rendimiento</string>
@ -1023,7 +1018,7 @@ Por favor, envía los errores detectados, contribuye con nuevas funcionalidades
<string name="settings_export_success">Ajustes guardados en <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Ajustes globales importados desde <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importado <xliff:g id="accounts">%s</xliff:g> desde <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 cuenta</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> cuentas</item>
</plurals>

View File

@ -189,20 +189,14 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen
<string name="status_loading_more_failed">Yritetään ladata uudelleen lisää viestejä</string>
<string name="load_more_messages_fmt">Lataa
     <xliff:g id="messages_to_load">%d</xliff:g> lisää</string>
<string name="load_more_messages_fmt">Lataa <xliff:g id="messages_to_load">%d</xliff:g> lisää</string>
<string name="abbrev_gigabytes">Gt</string>
<string name="abbrev_megabytes">Mt</string>
<string name="abbrev_kilobytes">kt</string>
<string name="abbrev_bytes">t</string>
<string name="account_size_changed">
Tilin \"<xliff:g id="account">%s</xliff:g>\" vanha koko
    <xliff:g id="oldSize">%s</xliff:g>
    on nyt
    <xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Tilin \"<xliff:g id="account">%s</xliff:g>\" vanha koko <xliff:g id="oldSize">%s</xliff:g> on nyt <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Tiivistetään tiliä \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Tyhjennetään tiliä \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -788,12 +782,12 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen
</string>
<string name="folder_list_help_key">
      1 - Näytä vain 1. luokan kansiot\u000A
      2 - Näytä 1. ja 2. luokan kansiot\u000A
      3 - Näytä kaikki paitsi 2. luokan kansiot\u000A
      4 - Näytä kaikki kansiot\u000A
      Q - Palaa tileihin\u000A
      S - Muokkaa tilin asetuksia</string>
1 - Näytä vain 1. luokan kansiot\u000A
2 - Näytä 1. ja 2. luokan kansiot\u000A
3 - Näytä kaikki paitsi 2. luokan kansiot\u000A
4 - Näytä kaikki kansiot\u000A
Q - Palaa tileihin\u000A
S - Muokkaa tilin asetuksia</string>
<string name="folder_list_filter_hint">kansionimi sisältää</string>
@ -986,7 +980,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Haluatko varmasti poistaa tämän viestin?</item>
<item quantity="other">Haluatko varmasti poistaa <xliff:g id="message_count">%1$d</xliff:g> viestiä?</item>
</plurals>
@ -1023,7 +1017,7 @@ Virheraportit, osallistuminen projektiin ja kysymykset: Mene osoitteeseen
<string name="settings_export_success">Viedyt asetukset tallennettu tiedostoon <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Yleiset asetukset tuotu tiedostosta <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Tuotu <xliff:g id="accounts">%s</xliff:g> tiedostosta <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 tili</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> tiliä</item>
</plurals>

View File

@ -221,12 +221,7 @@ de plus</string>
<string name="abbrev_kilobytes">ko</string>
<string name="abbrev_bytes">oct.</string>
<string name="account_size_changed">
Espace sur «\u00A0<xliff:g id="account">%s</xliff:g>\u00A0» passé de
<xliff:g id="oldSize">%s</xliff:g>
à
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Espace sur «\u00A0<xliff:g id="account">%s</xliff:g>\u00A0» passé de <xliff:g id="oldSize">%s</xliff:g> à <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compactage du compte «\u00A0<xliff:g id="account">%s</xliff:g>\u00A0»</string>
<string name="clearing_account">Effacement du compte «\u00A0<xliff:g id="account">%s</xliff:g>\u00A0»</string>
@ -1010,7 +1005,7 @@ de plus</string>
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Voulez-vous vraiment supprimer ce message?</item>
<item quantity="other">Voulez-vous vraiment supprimer les <xliff:g id="message_count">%1$d</xliff:g> messages?</item>
</plurals>
@ -1047,7 +1042,7 @@ de plus</string>
<string name="settings_export_success">Paramètres exportés vers <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Paramètres globaux importés depuis <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importés <xliff:g id="accounts">%s</xliff:g> depuis <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 compte</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> comptes</item>
</plurals>
@ -1168,13 +1163,13 @@ de plus</string>
<string name="mark_all_as_read">Marquer tous comme lus</string>
<string name="global_settings_colorize_missing_contact_pictures_label">Colorier les images de contact manquantes</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_summary">Coloriser les images de contact manquantes</string>
<string name="global_settings_messageview_visible_refile_actions_title">Actions disponibles dans les messages</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Afficher les actions séléctionnées dans le menu des messages</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Chargement pièce jointe…</string>
<string name="fetching_attachment_dialog_title_send">Envoi du message</string>
<string name="fetching_attachment_dialog_title_save">Enregistrement du brouillon</string>
<string name="fetching_attachment_dialog_message">Récupération pièce jointe…</string>
</resources>

View File

@ -195,12 +195,7 @@ Por favor, envía os erros detectados, contribúe con novas funcionalidas e preg
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Conta \"<xliff:g id="account">%s</xliff:g>\" reducida dende
<xliff:g id="oldSize">%s</xliff:g>
a
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Conta \"<xliff:g id="account">%s</xliff:g>\" reducida dende <xliff:g id="oldSize">%s</xliff:g> a <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compactando conta \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Limpando conta \"<xliff:g id="account">%s</xliff:g>\"</string>

View File

@ -23,7 +23,7 @@
<!-- Welcome message -->
<!-- NEW: <string name="welcome_message_title">Welcome to K-9 Mail</string>-->
<string name="welcome_message_title">Üdvözli a K-9 Mail</string>
<string name="accounts_welcome"><![CDATA[
<p>
A K-9 egy nyílt forráskódú levelezőprogram Androidra, a sima mail kliens alapjaira helyezve.
@ -69,7 +69,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<!-- === App Store-specific strings ======================================================= -->
<!-- NEW: <string name="import_dialog_error_message">Please install a file manager to continue with this import.</string>-->
<string name="import_dialog_error_message">Az importálás folytatásához, telepítsen egy fájlkezelőt.</string>
<string name="open_market">Play áruház megnyitása</string>
@ -90,15 +90,15 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="about_title_fmt">A <xliff:g id="app_name">%s</xliff:g> névjegye</string>
<string name="accounts_title">Fióklista</string>
<!-- NEW: <string name="folders_title">Folders</string>-->
<string name="folders_title">Mappák</string>
<string name="advanced">Haladó beállítások</string>
<string name="message_list_title"><xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g> </string>
<string name="compose_title_compose">Levélírás</string>
<!-- NEW: <string name="compose_title_reply">Reply</string>-->
<!-- NEW: <string name="compose_title_reply_all">Reply all</string>-->
<!-- NEW: <string name="compose_title_forward">Forward</string>-->
<string name="compose_title_reply">Válasz</string>
<string name="compose_title_reply_all">Válasz mindnekinek</string>
<string name="compose_title_forward">Továbbít</string>
<string name="choose_folder_title">Válasszon mappát</string>
@ -111,7 +111,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="status_next_poll">Frissítés <xliff:g id="nexttime">%s</xliff:g></string>
<string name="status_syncing_off">Nincs frissítve</string>
<!-- NEW: <string name="actionbar_selected"><xliff:g id="selection_count">%d</xliff:g> selected</string>-->
<string name="actionbar_selected"><xliff:g id="selection_count">%d</xliff:g> kiválasztva</string>
<!-- Actions will be used as buttons and in menu items -->
<string name="next_action">Tovább</string> <!-- Used as part of a multi-step process -->
<string name="previous_action">Vissza</string> <!-- Used as part of a multi-step process -->
@ -128,7 +128,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="spam_action">Levélszemét</string>
<string name="forward_action">Továbbítás</string>
<string name="move_action">Áthelyez</string>
<!-- NEW: <string name="single_message_options_action">Send…</string>-->
<string name="single_message_options_action">Küldés…</string>
<!-- NEW: <string name="refile_action">Refile…</string>-->
<string name="continue_action">Folytatás</string>
<string name="back_action">Vissza</string>
@ -158,11 +158,11 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="unflag_action">Csillag törlése</string>
<string name="copy_action">Másolás</string>
<string name="select_text_action">Szöveg kijelölése</string>
<!-- NEW: <string name="show_headers_action">Show headers</string>-->
<!-- NEW: <string name="hide_headers_action">Hide headers</string>-->
<string name="show_headers_action">Fejlécek megjelenítése</string>
<string name="hide_headers_action">Fejlécek elrejtése</string>
<!-- NEW: <string name="message_view_theme_action_dark">Switch to dark theme</string>-->
<!-- NEW: <string name="message_view_theme_action_light">Switch to light theme</string>-->
<string name="message_view_theme_action_dark">Váltás sötét témára</string>
<string name="message_view_theme_action_light">Váltás világos témára</string>
<string name="mark_as_unread_action">Olvasatlannak jelöl</string>
<string name="add_cc_bcc_action">Másolatot kap</string>
@ -196,27 +196,22 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
\"<xliff:g id="account">%s</xliff:g>\" fiók tömörítése
<xliff:g id="oldSize">%s</xliff:g>
helyett
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">\"<xliff:g id="account">%s</xliff:g>\" fiók tömörítése <xliff:g id="oldSize">%s</xliff:g> helyett <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Fiók tömörítése \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Fiók takarítása \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">A \"<xliff:g id="account">%s</xliff:g>\" újbóli létrehozása</string>
<string name="notification_new_title">Új levél</string>
<!-- NEW: <string name="notification_new_messages_title"><xliff:g id="new_message_count">%d</xliff:g> new messages</string>-->
<string name="notification_new_messages_title"><xliff:g id="new_message_count">%d</xliff:g> új üzenet</string>
<string name="notification_new_one_account_fmt"><xliff:g id="unread_message_count">%d</xliff:g> Olvasatlan (<xliff:g id="account">%s</xliff:g>)</string> <!-- 279 Unread (someone@google.com) -->
<!-- NEW: <string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> more on <xliff:g id="account">%s</xliff:g></string>-->
<string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> érkezett ide: <xliff:g id="account">%s</xliff:g></string>
<!-- NEW: <string name="notification_action_reply">Reply</string>-->
<!-- NEW: <string name="notification_action_mark_as_read">Mark Read</string>-->
<!-- NEW: <string name="notification_action_delete">Delete</string>-->
<!-- NEW: <string name="notification_certificate_error_title">Certificate error for <xliff:g id="account">%s</xliff:g></string>-->
<!-- NEW: <string name="notification_certificate_error_text">Check your server settings</string>-->
<string name="notification_action_reply">Válasz</string>
<string name="notification_action_mark_as_read">Olvasottnak jelöl</string>
<string name="notification_action_delete">Töröl</string>
<string name="notification_certificate_error_title">Hitelesítései hiba: <xliff:g id="account">%s</xliff:g></string>
<string name="notification_certificate_error_text">Ellenőrizze a kiszolgáló beállításait</string>
<string name="notification_bg_sync_ticker">Levelek ellenőrzése: <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
<string name="notification_bg_sync_title">Levelek ellenőrzése</string>
@ -316,13 +311,13 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="global_settings_registered_name_color_label">Névjegyek színe</string>
<string name="global_settings_registered_name_color_default">Ne használjon színeket a névjegyzékben</string>
<string name="global_settings_registered_name_color_changed">Színek használata a névjegyzékben</string>
<!-- NEW: <string name="global_settings_folderlist_wrap_folder_names_label">Wrap long folder names</string>-->
<!-- NEW: <string name="global_settings_folderlist_wrap_folder_names_summary">Use multiple lines to show long folder names</string>-->
<string name="global_settings_folderlist_wrap_folder_names_label">Hosszú mappa neveinek levágása</string>
<string name="global_settings_folderlist_wrap_folder_names_summary">Több sor használata a hosszú mappanevek megjelenítéséhez</string>
<string name="global_settings_messageview_fixedwidth_label">Fix szélességű betűk</string>
<string name="global_settings_messageview_fixedwidth_summary">Fix szélességű betűtípus használata a sima szöveges üzeneteknél</string>
<!-- NEW: <string name="global_settings_messageview_autofit_width_label">Auto-fit messages</string>-->
<!-- NEW: <string name="global_settings_messageview_autofit_width_summary">Shrink messages to fit the screen</string>-->
<string name="global_settings_messageview_autofit_width_label">Üzenetek automatikus kitöltése</string>
<string name="global_settings_messageview_autofit_width_summary">Üzenetek összehúzása, egy képernyőre</string>
<string name="global_settings_messageview_return_to_list_label">Visszalépés törlés után</string>
<string name="global_settings_messageview_return_to_list_summary">Törlés után visszalép a levelek listájára</string>
<string name="global_settings_messageview_show_next_label">Mutassa a következő üzenetet törlés után</string>
@ -333,14 +328,14 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="global_settings_confirm_action_delete">Törlés (csak üzenetek nézet)</string>
<string name="global_settings_confirm_action_delete_starred">Csillagozott törlése (csak olvasható üzenet)</string>
<string name="global_settings_confirm_action_spam">Levélszemét</string>
<!-- NEW: <string name="global_settings_confirm_action_delete_notif">Delete (from notification)</string>-->
<string name="global_settings_confirm_action_delete_notif">Törlés (az értesítések közül)</string>
<string name="global_settings_notification_hide_subject_title">Tárgy elrejtése az értesítésekben</string>
<string name="global_settings_notification_hide_subject_never">Soha</string>
<string name="global_settings_notification_hide_subject_when_locked">Ha a készülék le van zárva</string>
<string name="global_settings_notification_hide_subject_always">Mindig</string>
<!-- NEW: <string name="global_settings_notification_quick_delete_title">Show \'Delete\' button</string>-->
<string name="global_settings_notification_quick_delete_title">\'Törlés\' gomb megjelenítése</string>
<string name="global_settings_notification_quick_delete_never">Soha</string>
<!-- NEW: <string name="global_settings_notification_quick_delete_when_single_msg">For single message notification</string>-->
<string name="global_settings_notification_quick_delete_always">Mindig</string>
@ -353,7 +348,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="global_settings_archive">Áthelyezés az archívumba</string>
<string name="global_settings_archive_disabled_reason">Nincs archívum mappa.</string>
<string name="global_settings_move">Áthelyezés</string>
<!-- NEW: <string name="global_settings_flag">Flag</string>-->
<string name="global_settings_flag">Zászló</string>
<string name="global_settings_unselect">Kijelölés megszüntetése</string>
<string name="quiet_time">Csendes mód</string>
@ -367,7 +362,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_setup_basics_manual_setup_action">Kézi beállítás</string>
<string name="account_setup_check_settings_title"/>
<string name="account_setup_check_settings_retr_info_msg">Fiók adatainak ellenörzése…</string>
<string name="account_setup_check_settings_retr_info_msg">Fiók adatainak ellenőrzése…</string>
<string name="account_setup_check_settings_check_incoming_msg">Bejövő szerver tesztelése…</string>
<string name="account_setup_check_settings_check_outgoing_msg">Kimenő szerver tesztelése…</string>
<string name="account_setup_check_settings_authenticate">Hitelesítés…</string>
@ -420,7 +415,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_setup_expunge_policy_manual">Kézileg</string>
<string name="account_setup_incoming_autodetect_namespace_label">IMAP névtér automatikus felismerése</string>
<string name="account_setup_incoming_imap_path_prefix_label">IMAP útvonal prefix</string>
<string name="account_setup_incoming_imap_path_prefix_label">IMAP útvonal előtag</string>
<string name="drafts_folder_label">Piszkozatok mappája</string>
<string name="sent_folder_label">Elküldöttek mappája</string>
@ -436,7 +431,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_setup_incoming_webdav_auth_path_label">Hitelesítési útvonal</string>
<string name="account_setup_incoming_webdav_auth_path_hint">Választható</string>
<string name="account_setup_incoming_webdav_mailbox_path_label">Mailbox álnév</string>
<string name="account_setup_incoming_webdav_mailbox_path_label">Postafiók álnév</string>
<string name="account_setup_incoming_webdav_mailbox_path_hint">Választható</string>
<string name="account_setup_outgoing_title">Kimenő szerver beállításai</string>
@ -539,15 +534,15 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_settings_reply_after_quote_label">Válasz az idézet után</string>
<string name="account_settings_reply_after_quote_summary">Válaszlevélnél az eredeti üzenet fent jelenik meg</string>
<!-- NEW: <string name="account_settings_strip_signature_label">Strip signatures on reply</string>-->
<!-- NEW: <string name="account_settings_strip_signature_summary">Signatures will be removed from quoted messages</string>-->
<string name="account_settings_strip_signature_label">Aláírás elhagyása a válaszban</string>
<string name="account_settings_strip_signature_summary">Az aláírás el lesz távolítva az idézett üzenetből</string>
<string name="account_settings_message_format_label">Levél formátuma</string>
<string name="account_settings_message_format_text">Sima szöveg (képek és formázás nélkül)</string>
<string name="account_settings_message_format_html">HTML (képekkel és formázással)</string>
<string name="account_settings_message_format_auto">Automatikus</string>
<!-- NEW: <string name="account_settings_always_show_cc_bcc_label">Always show Cc/Bcc</string>-->
<string name="account_settings_always_show_cc_bcc_label">A Cc/Bcc mindig jelenjen meg</string>
<!-- NEW: <string name="account_settings_message_read_receipt_label">Read receipt</string>-->
<!-- NEW: <string name="account_settings_message_read_receipt_summary">Always request a read receipt</string>-->
@ -557,18 +552,18 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_settings_quote_style_header">Fejléc (pl. Outlook, Yahoo!, Hotmail)</string>
<string name="account_settings_general_title">Általános beállítások</string>
<!-- NEW: <string name="account_settings_reading_mail">Reading mail</string>-->
<string name="account_settings_reading_mail">Levél olvasása</string>
<string name="account_settings_sync">Levelek letöltése</string>
<string name="account_settings_folders">Mappák</string>
<string name="account_settings_quote_prefix_label">Idézett szöveg előtagja</string>
<string name="account_settings_crypto">Titkosítás</string>
<string name="account_settings_crypto_app">OpenPGP Provider</string>
<string name="account_settings_crypto_app_none">None</string>
<string name="account_settings_crypto_auto_signature">Auto aláírás</string>
<string name="account_settings_crypto_app_none">Nincs</string>
<string name="account_settings_crypto_auto_signature">Automatikus aláírás</string>
<string name="account_settings_crypto_auto_signature_summary">Használja az email címet a titkosítási kulcshoz</string>
<!-- NEW: <string name="account_settings_crypto_auto_encrypt">Auto-encrypt</string>-->
<string name="account_settings_crypto_auto_encrypt">Automatikusan titkosított</string>
<!-- NEW: <string name="account_settings_crypto_auto_encrypt_summary">Automatically set encrypt if a public key matches a recipient.</string>-->
<!-- NEW: <string name="account_settings_crypto_apg_not_installed">APG not installed</string>-->
<string name="account_settings_crypto_apg_not_installed">Az APG nincs telepítve</string>
<string name="account_settings_mail_check_frequency_label">Frissítés gyakorisága</string>
@ -610,7 +605,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_settings_message_age_1_month">elmúlt hónap</string>
<string name="account_settings_message_age_2_months">elmúlt 2 hónap</string>
<string name="account_settings_message_age_3_months">elmúlt 3 hónap</string>
<string name="account_settings_message_age_6_months">elműlt 6 hónap</string>
<string name="account_settings_message_age_6_months">elmúlt 6 hónap</string>
<string name="account_settings_message_age_1_year">az elmúlt év</string>
<string name="account_settings_folder_display_mode_label">Megjelenítendő mappák</string>
@ -645,7 +640,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="folder_settings_title">Mappa beállításai</string>
<string name="folder_settings_in_top_group_label">Megjelenítés a fenti csoportban</string>
<string name="folder_settings_in_top_group_summary">Mutassa a mappa lista tetjén</string>
<string name="folder_settings_in_top_group_summary">Mutassa a mappa lista tetején</string>
<string name="folder_settings_folder_display_mode_label">Osztályozott mappanézet</string>
<string name="folder_settings_folder_display_mode_normal">Nincs</string>
@ -729,11 +724,11 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="identity_has_no_email">Nem tudja használni az azonosítót email cím nélkül</string>
<string name="sort_earliest_first">Korábbi leveleket előre</string>
<string name="sort_latest_first">Későbbi levelket előre</string>
<string name="sort_latest_first">Későbbi leveleket előre</string>
<string name="sort_subject_alpha">Tárgy szerint sorban</string>
<string name="sort_subject_re_alpha">Tárgy szerint fordítva</string>
<!-- NEW: <string name="sort_sender_alpha">Sender alphabetical</string>-->
<!-- NEW: <string name="sort_sender_re_alpha">Sender reverse alphabetical</string>-->
<string name="sort_sender_alpha">Feladó szerint ABC rendben</string>
<string name="sort_sender_re_alpha">Feladó szerint fordított ABC rendben</string>
<string name="sort_flagged_first">Csillagos levelek előre</string>
<string name="sort_flagged_last">Csillag nélküliek előre</string>
<string name="sort_unread_first">Olvasatlanok előre</string>
@ -745,7 +740,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="sort_by_date">Dátum</string>
<string name="sort_by_arrival">Érkezés</string>
<string name="sort_by_subject">Tárgy</string>
<!-- NEW: <string name="sort_by_sender">Sender</string>-->
<string name="sort_by_sender">Feladó</string>
<string name="sort_by_flag">Csillag</string>
<string name="sort_by_unread">Olvasott</string>
<string name="sort_by_attach">Melléklet</string>
@ -757,7 +752,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_clear_dlg_title">Fiók tisztítása</string>
<string name="provider_note_yahoojp">Ha POP3-at szeretne használni ehhez a szolgáltatóhoz, akkor engedélyezze a Yahoo mail beállításai oldalon.</string>
<!-- NEW: <string name="provider_note_auonejp">Be sure to enable IMAP or POP3 on the au one mail settings page.</string>-->
<string name="provider_note_auonejp">Ügylejen az IMAP vagy POP3 engedélyezésére az au mail beállítások oldalán.</string>
<string name="provider_note_naver">Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Naver oldalán.</string>
<string name="provider_note_hanmail">Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Hanmail(Daum) oldalán.</string>
<string name="provider_note_paran">Ha POP3-at vagy IMAP-ot szeretne használni ehhez a szolgáltatóhoz, akkor engedélyeznie kell az IMAP vagy POP3 beállításokat a Paran oldalán.</string>
@ -767,32 +762,32 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_setup_failed_dlg_invalid_certificate_accept">Kulcs elfogadva</string>
<string name="account_setup_failed_dlg_invalid_certificate_reject">Kulcs elutasítva</string>
<string name="message_list_help_key"><!-- NEW: V, Z untranslated -->
Del (or D) - Törlés\n
<string name="message_list_help_key">
Del (vagy D) - Törlés\n
R - Válasz\n
A - Válasz mindenkinek\n
C - Írás\n
F - Továbbít\n
M - Áthelyezés\n
V - Archive\n
Y - Násolás\n
Z - Mark (Un)read\n
V - Archívum\n
Y - Másolás\n
Z - Olvasottnak vagy olvasatlannak jelöl\n
G - Csillagoz\n
O - Rendezési típus\n
I - Rendezési sorrend\n
Q - Vissza a mappákba\n
S - Select/deselect\n
S - Kijelölés/Kijelölés megszüntetése\n
J, P - Előző üzenet\n
K, N - Kövtkető üzenet
K, N - Következő üzenet
</string>
<!-- NEW: <string name="folder_list_help_key">
1 - Display only 1st Class folders\u000A
2 - Display 1st and 2nd Class folders\u000A
3 - Display all except 2nd Class folders\u000A
4 - Display all folders\u000A
Q - Return to Accounts\u000A
S - Edit Account Settings</string>-->
<string name="folder_list_help_key">
1 - Csak az elsődleges mappák megjelenítése\u000A
2 - Elsődleges és másodlagos mappák megjelenítése\u000A
3 - Mindet megjeleníti, kivéve a másodlagos mappákat\u000A
4 - Minden mappa megjelenítése\u000A
Q - Vissza fiókokhoz\u000A
S - Fiókbeállítások módosítása</string>
<string name="folder_list_filter_hint">mappa neve</string>
@ -805,7 +800,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_settings_signature__location_label">Aláírás helyzete</string>
<string name="account_settings_signature__location_before_quoted_text">Idézett szöveg elé</string>
<string name="account_settings_signature__location_after_quoted_text">Idézett szöveg után</string>
<!-- NEW: <string name="setting_theme_global">Use app theme</string>-->
<string name="setting_theme_global">Alkalmazás téma használata</string>
<string name="setting_theme_dark">Sötét</string>
<string name="setting_theme_light">Világos</string>
<string name="display_preferences">Megjelenés beállításai</string>
@ -817,10 +812,10 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="accountlist_preferences">Fiókok listája</string>
<string name="messagelist_preferences">Levelek listája</string>
<string name="messageview_preferences">Levélírás</string>
<!-- NEW: <string name="folderlist_preferences">Folder lists</string>-->
<string name="folderlist_preferences">Mappalisták</string>
<string name="settings_theme_label">Téma</string>
<!-- NEW: <string name="settings_message_theme_label">Message view theme</string>-->
<!-- NEW: <string name="settings_compose_theme_label">Composer theme</string>-->
<string name="settings_message_theme_label">Üzenetmegjelenítés témája</string>
<string name="settings_compose_theme_label">Üzenetírás témája</string>
<string name="settings_language_label">Nyelv</string>
<!-- NEW: <string name="settings_message_theme_selection_label">Fixed message theme</string>-->
@ -837,11 +832,11 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="background_ops_always">Mindig</string>
<string name="background_ops_enabled">"Ha a 'Háttéradatok' bekapcsolva"</string>
<string name="background_ops_auto_sync">"Ha a 'Háttéradatok' és 'Auto-szink' bekapcsolva"</string>
<string name="background_ops_auto_sync_only">AMikor az \'Automatikus szinkronizáció\' be van kapcsolva</string>
<string name="background_ops_auto_sync_only">Amikor az \'Automatikus szinkronizáció\' be van kapcsolva</string>
<string name="batch_select_all">Mindent kijelöl</string>
<string name="account_setup_push_limit_label">Ellenőrízhető mappák száma</string>
<string name="account_setup_push_limit_label">Ellenőrizhető mappák száma</string>
<string name="account_setup_push_limit_10">10 mappa</string>
<string name="account_setup_push_limit_25">25 mappa</string>
<string name="account_setup_push_limit_50">50 mappa</string>
@ -851,9 +846,9 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="account_setup_push_limit_1000">1000 mappa</string>
<string name="animations_title">Animációk</string>
<string name="animations_summary">Áttünési effektusok használata.</string>
<string name="animations_summary">Áttűnési effektusok használata.</string>
<string name="gestures_title">Kézmozdulatok</string>
<string name="gestures_summary">Engedélyezi a kézmozdulakkal való vezérlést.</string>
<string name="gestures_summary">Engedélyezi a kézmozdulatokkal való vezérlést.</string>
<string name="volume_navigation_title">Hangerő gomb vezérlés</string>
<string name="volume_navigation_message">Leveleknél</string>
@ -865,7 +860,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="measure_accounts_summary">Kikapcsolva gyorsabb működés</string>
<string name="count_search_title">Számolja a keresés eredményét</string>
<string name="count_search_summary">Kikcsapcsolva gyorsabb műkodés</string>
<string name="count_search_summary">Kikapcsolva gyorsabb működés</string>
<string name="hide_special_accounts_title">Különleges fiókok elrejtése</string>
<string name="hide_special_accounts_summary">Egységesen elrejti a fiókok bejövő mappáit</string>
@ -899,7 +894,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="font_size_folder_list">Mappák listája</string>
<string name="font_size_folder_name">Mappa neve</string>
<string name="font_size_folder_status">Mappa státuszta</string>
<string name="font_size_folder_status">Mappa állapota</string>
<string name="font_size_message_list">Levelek listája</string>
<string name="font_size_message_list_subject">Tárgy</string>
@ -919,7 +914,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="font_size_message_compose">Üzenet írása</string>
<string name="font_size_message_compose_input">Szöveg beviteli mezők</string>
<!-- NEW: <string name="font_size_default">Default</string>-->
<string name="font_size_default">Alapértelmezett</string>
<string name="font_size_tiniest">Mini</string>
<string name="font_size_tiny">Pici</string>
<string name="font_size_smaller">Kisebb</string>
@ -963,11 +958,11 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="confirm_discard_draft_message_title">Üzenet elvetése?</string>
<string name="confirm_discard_draft_message">Valóban elveti az üzenetet?</string>
<!-- NEW: <string name="refuse_to_save_draft_marked_encrypted_dlg_title">Refuse to save draft message.</string>-->
<!-- NEW: <string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Refuse to save draft message marked encrypted.</string>-->
<string name="refuse_to_save_draft_marked_encrypted_dlg_title">Piszkozat mentésének elutasítása.</string>
<string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Titkosított piszkozatok mentésének elutasítása.</string>
<!-- NEW: <string name="continue_without_public_key_dlg_title">Continue without public key?</string>-->
<!-- NEW: <string name="continue_without_public_key_instructions_fmt">One or more recipients do not have a saved public key. Continue?</string>-->
<string name="continue_without_public_key_dlg_title">Folytatás nyilvános kulcs nélkül?</string>
<string name="continue_without_public_key_instructions_fmt">Egy vagy több címzettnek nincs elmentett nyilvános kulcsa. Folytatás?</string>
<string name="select_text_now">Szöveg kijelölése.</string>
@ -985,22 +980,18 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<!-- NEW:
<plurals name="dialog_confirm_delete_message">
<item quantity="one">Do you really want to delete this message?</item>
<item quantity="other">Do you really want to delete <xliff:g id="message_count">%1$d</xliff:g> messages?</item>
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Biztos hogy törli ezt a levelet?</item>
<item quantity="other">Biztos hogy törli ezt: <xliff:g id="message_count">%1$d</xliff:g> ?</item>
</plurals>
-->
<string name="dialog_confirm_delete_confirm_button">Törlés</string>
<string name="dialog_confirm_delete_cancel_button">Nem törlöm</string>
<string name="dialog_confirm_spam_title">Levélszemét mappa áthelyzésének jóváhagyása</string>
<!-- NEW:
<string name="dialog_confirm_spam_title">Levélszemét mappa áthelyezésének jóváhagyása</string>
<plurals name="dialog_confirm_spam_message">
<item quantity="one">Do you really want to move this message to the spam folder?</item>
<item quantity="other">Do you really want to move <xliff:g id="message_count">%1$d</xliff:g> messages to the spam folder?</item>
<item quantity="one">Valóban át akarja helyezni ezt a levelet a spam mappába?</item>
<item quantity="other">Valóban át akarja helyezni ezt a levelet a spam mappába: <xliff:g id="message_count">%1$d</xliff:g> ?</item>
</plurals>
-->
<string name="dialog_confirm_spam_confirm_button">Igen</string>
<string name="dialog_confirm_spam_cancel_button">Nem</string>
@ -1018,7 +1009,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="settings_import_dialog_title">Importálás</string>
<string name="settings_export_dialog_title">Exportálás</string>
<string name="settings_import">Beállítások importálása</string>
<!-- NEW: <string name="settings_import_selection">Import selection</string>-->
<string name="settings_import_selection">Kijelöltek importálása</string>
<string name="settings_import_global_settings">Általános beállítások</string>
<string name="settings_exporting">Beállítások exportálása…</string>
<string name="settings_importing">Beállítások importálása…</string>
@ -1026,7 +1017,7 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="settings_export_success">Exportált beállítások mentve ide: <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Az általános beállítások importálva innen: <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">A(z) <xliff:g id="accounts">%s</xliff:g> importálva innen: <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 fiók</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> fiók</item>
</plurals>
@ -1037,35 +1028,33 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="settings_import_success_header">Importálás sikeresen befejezve</string>
<string name="settings_import_failed_header">Importálás sikertelen</string>
<string name="settings_import_activate_account_header">Fiók aktiválása</string>
<!-- NEW: <string name="settings_import_activate_account_intro">To be able to use the account \"<xliff:g id="account">%s</xliff:g>\" you need to provide the <xliff:g id="server_passwords">%s</xliff:g>.</string>-->
<string name="settings_import_activate_account_intro">Ahhoz, hogy használja ezt a fiókot: \"<xliff:g id="account">%s</xliff:g>\", meg kell adnia ezt: <xliff:g id="server_passwords">%s</xliff:g>.</string>
<plurals name="settings_import_server_passwords">
<item quantity="one">szerver jelszava</item>
<item quantity="other">szerver jelszavai</item>
</plurals>
<string name="settings_import_incoming_server">Bwjövő szerver (<xliff:g id="hostname">%s</xliff:g>):</string>
<string name="settings_import_outgoing_server">Kimenü szerver (<xliff:g id="hostname">%s</xliff:g>):</string>
<!-- NEW:
<string name="settings_import_incoming_server">Bejövő szerver (<xliff:g id="hostname">%s</xliff:g>):</string>
<string name="settings_import_outgoing_server">Kimenő szerver (<xliff:g id="hostname">%s</xliff:g>):</string>
<plurals name="settings_import_setting_passwords">
<item quantity="one">Setting password</item>
<item quantity="other">Setting passwords</item>
<item quantity="one">Jelszó beállítása</item>
<item quantity="other">Jelszavak beállítása</item>
</plurals>
-->
<!-- NEW: <string name="settings_import_use_incoming_server_password">Use the incoming server password</string>-->
<!-- NEW: <string name="activate_account_action">Activate</string>-->
<string name="settings_import_use_incoming_server_password">Bejövő kiszolgáló jelszavának használata</string>
<string name="activate_account_action">Aktiválás</string>
<string name="account_unavailable">\"<xliff:g id="account">%s</xliff:g>\" fiók nem elérhető ellenőríze a tárhelyet</string>
<string name="settings_attachment_default_path">Csatolményok mentése ide:</string>
<string name="attachment_save_title">Csatolményok mentése</string>
<string name="attachment_save_desc">Nincs fájlkezelő. Hova szeretné mentni a csatolmányt?</string>
<string name="settings_attachment_default_path">Csatolmányok mentése ide:</string>
<string name="attachment_save_title">Csatolmányok mentése</string>
<string name="attachment_save_desc">Nincs fájlkezelő. Hova szeretné menteni a csatolmányt?</string>
<string name="manage_accounts_move_up_action">Mozgatás fel</string>
<string name="manage_accounts_move_down_action">Mozgatás le</string>
<string name="manage_accounts_moving_message">Fiók mozgatása…</string>
<!-- NEW: <string name="unread_widget_select_account">Show unread count for…</string>-->
<string name="unread_widget_select_account">Olvasatlan üzenetek számának megjelenítése…</string>
<string name="import_dialog_error_title">Nincs fájlkezleő alkalmazás</string>
<string name="import_dialog_error_title">Nincs fájlkezelő alkalmazás</string>
<string name="close">Bezárás</string>
<string name="webview_empty_message">Nincs szöveg</string>
@ -1088,74 +1077,74 @@ Hibajelentéseivel hozzájárul az újabb verziók tökéletesítéséhez, kérd
<string name="webview_contextmenu_phone_clipboard_label">Telefonszám</string>
<string name="webview_contextmenu_email_send_action">Levél küldése</string>
<string name="webview_contextmenu_email_save_action">Mentés a névjegyekzeh</string>
<string name="webview_contextmenu_email_save_action">Mentés a névjegyekhez</string>
<string name="webview_contextmenu_email_copy_action">E-mail cím másolása a vágólapra</string>
<string name="webview_contextmenu_email_clipboard_label">E-mail cím</string>
<string name="image_saved_as">Kép mentése: \"<xliff:g id="filename">%s</xliff:g>\"</string>
<string name="image_saving_failed">A kép mentése sikertelen.</string>
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_all">All</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_10">10</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_25">25</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_50">50</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_100">100</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_250">250</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_500">500</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_results_entries_1000">1000</string>-->
<!-- NEW: <string name="account_settings_remote_search_num_label">Server search limit</string>-->
<string name="account_settings_remote_search_num_results_entries_all">Mind</string>
<string name="account_settings_remote_search_num_results_entries_10">10</string>
<string name="account_settings_remote_search_num_results_entries_25">25</string>
<string name="account_settings_remote_search_num_results_entries_50">50</string>
<string name="account_settings_remote_search_num_results_entries_100">100</string>
<string name="account_settings_remote_search_num_results_entries_250">250</string>
<string name="account_settings_remote_search_num_results_entries_500">500</string>
<string name="account_settings_remote_search_num_results_entries_1000">1000</string>
<string name="account_settings_remote_search_num_label">Kiszolgáló keresési határa</string>
<!-- NEW: <string name="account_settings_remote_search_num_summary">Search will stop after finding <xliff:g id="num_results">%s</xliff:g> results.</string>-->
<!-- NEW: <string name="account_settings_remote_search_full_text">Include messages text in server search</string>-->
<!-- NEW: <string name="account_settings_remote_search_full_text_summary">Full text searches can be slow.</string>-->
<!-- NEW: <string name="remote_search_sending_query">Sending query to server</string>-->
<!-- NEW: <string name="remote_search_downloading">Fetching %d results</string>-->
<!-- NEW: <string name="remote_search_downloading_limited">Fetching %1$d of %2$d results</string>-->
<!-- NEW: <string name="remote_search_error">Remote search failed</string>-->
<string name="remote_search_downloading">%d letöltési eredmény</string>
<string name="remote_search_downloading_limited">%1$d letöltése a(z) %2$d eredményből</string>
<string name="remote_search_error">A távoli keresés sikertelen</string>
<!-- NEW: <string name="account_settings_search">Search</string>-->
<!-- NEW: <string name="account_settings_remote_search_enabled">Enable server search</string>-->
<!-- NEW: <string name="account_settings_remote_search_enabled_summary">Search messages on the server in addition to those on your device</string>-->
<!-- NEW: <string name="action_remote_search">Search messages on server</string>-->
<!-- NEW: <string name="pull_to_refresh_remote_search_from_local_search_pull">Pull to search server…</string>-->
<!-- NEW: <string name="pull_to_refresh_remote_search_from_local_search_release">Release to search server…</string>-->
<!-- NEW: <string name="remote_search_unavailable_no_network">A network connection is required for server search.</string>-->
<string name="account_settings_search">Keresés</string>
<string name="account_settings_remote_search_enabled">Keresés a kiszolgálón engedélyezése</string>
<string name="account_settings_remote_search_enabled_summary">Üzenetek keresése a kiszolgálón, a készüléken kívül</string>
<string name="action_remote_search">Üzenetek keresése a kiszolgálón</string>
<string name="pull_to_refresh_remote_search_from_local_search_pull">Húzza el a kereséshez…</string>
<string name="pull_to_refresh_remote_search_from_local_search_release">Engedje a keresést a kiszolgálón…</string>
<string name="remote_search_unavailable_no_network">Hálózati kapcsolatra van szükség a kereséshez.</string>
<!-- NEW: <string name="global_settings_background_as_unread_indicator_label">Dim messages after reading</string>-->
<!-- NEW: <string name="global_settings_background_as_unread_indicator_summary">A grey background will show that a message has been read</string>-->
<string name="global_settings_background_as_unread_indicator_label">Üzenet elhalványítása olvasás után</string>
<string name="global_settings_background_as_unread_indicator_summary">Szürke háttere lesz az elolvasott üzenetnek</string>
<!-- NEW: <string name="global_settings_threaded_view_label">Threaded view</string>-->
<!-- NEW: <string name="global_settings_threaded_view_summary">Group messages by conversation</string>-->
<string name="global_settings_threaded_view_label">Beszélgetés nézet</string>
<string name="global_settings_threaded_view_summary">Üzenetek beszélgetésbe csoportosítása</string>
<!-- NEW: <string name="upgrade_databases_title">Upgrading databases</string>-->
<!-- NEW: <string name="upgrade_databases_unspecified">Upgrading databases…</string>-->
<!-- NEW: <string name="upgrade_database_format">Upgrading database of account \"<xliff:g id="account">%s</xliff:g>\"</string>-->
<string name="upgrade_databases_title">Adatbázisok frissítése</string>
<string name="upgrade_databases_unspecified">Adatbázisok frissítése…</string>
<string name="upgrade_database_format">A(z) \"<xliff:g id="account">%s</xliff:g>\ fiók adatbázisának frissítése"</string>
<!-- NEW: <string name="message_list_loading">Loading…</string>-->
<string name="message_list_loading">Töltés…</string>
<!-- NEW: <string name="global_settings_splitview_mode_label">Show split-screen</string>-->
<!-- NEW: <string name="global_settings_splitview_always">Always</string>-->
<!-- NEW: <string name="global_settings_splitview_never">Never</string>-->
<!-- NEW: <string name="global_settings_splitview_when_in_landscape">When in Landscape orientation</string>-->
<string name="global_settings_splitview_mode_label">Osztott képernyő megjelenítése</string>
<string name="global_settings_splitview_always">Mindig</string>
<string name="global_settings_splitview_never">Soha</string>
<string name="global_settings_splitview_when_in_landscape">Amikor fekvő módban van</string>
<!-- NEW: <string name="message_view_empty">Please select a message on the left</string>-->
<string name="message_view_empty">Kérjük, válasszon ki egy üzenetet a bal oldalon</string>
<!-- NEW: <string name="global_settings_show_contact_picture_label">Show contact pictures</string>-->
<!-- NEW: <string name="global_settings_show_contact_picture_summary">Show contact pictures in the message list</string>-->
<string name="global_settings_show_contact_picture_label">Kapcsolatok képeinek megjelenítése</string>
<string name="global_settings_show_contact_picture_summary">Kapcsolatok képeinek megjelenítése az üzenetlistában</string>
<!-- NEW: <string name="last_refresh_time_format">Refreshed <xliff:g id="formatted_time">%s</xliff:g></string>-->
<!-- NEW: <string name="last_refresh_time_format_with_push">Refreshed <xliff:g id="time_with_preposition">%s</xliff:g> (Push active)</string>-->
<!-- NEW: <string name="preposition_for_date">on <xliff:g id="date">%s</xliff:g></string>-->
<string name="last_refresh_time_format"><xliff:g id="formatted_time">%s</xliff:g> frissítve</string>
<string name="last_refresh_time_format_with_push"><xliff:g id="time_with_preposition">%s</xliff:g> frissítve (Push active)</string>
<string name="preposition_for_date">on <xliff:g id="date">%s</xliff:g></string>
<!-- NEW: <string name="mark_all_as_read">Mark all as read</string>-->
<string name="mark_all_as_read">Összes megjelölése olvasottként</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_label">Colorize contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_label">Partnerek képeinek színezése</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_title">Visible message actions</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_summary">Show selected actions in the message view menu</string>-->
<string name="global_settings_messageview_visible_refile_actions_title">Üzenetműveletek megjelenítése</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Kiválasztott művelet megjelenítése az üzenetnézet menüben</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Melléklet betöltése…</string>
<string name="fetching_attachment_dialog_title_send">Üzenet küldése</string>
<string name="fetching_attachment_dialog_title_save">Piszkozat mentése</string>
<string name="fetching_attachment_dialog_message">Melléklet letöltése…</string>
</resources>

View File

@ -188,20 +188,14 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni
<string name="status_loading_more_failed">Riprova a caricare altri messaggi</string>
<string name="load_more_messages_fmt">Scarica altri
<xliff:g id="messages_to_load">%d</xliff:g> messaggi</string>
<string name="load_more_messages_fmt">Scarica altri <xliff:g id="messages_to_load">%d</xliff:g> messaggi</string>
<string name="abbrev_gigabytes">GB</string>
<string name="abbrev_megabytes">MB</string>
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Account \"<xliff:g id="account">%s</xliff:g>\" ridimensionato da
<xliff:g id="oldSize">%s</xliff:g>
a
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Account \"<xliff:g id="account">%s</xliff:g>\" ridimensionato da <xliff:g id="oldSize">%s</xliff:g> a <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compattazione account \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Rimozione account \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -985,7 +979,7 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Vuoi davvero eliminare questo messaggio?</item>
<item quantity="other">Vuoi davvero eliminare i <xliff:g id="message_count">%1$d</xliff:g> messaggi selezionati?</item>
</plurals>
@ -1022,7 +1016,7 @@ Invia le tue segnalazioni, suggerisci nuove funzionalità e chiedi informazioni
<string name="settings_export_success">Salvata esportazione impostazioni in <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Impostazioni globali importate da <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importato <xliff:g id="accounts">%s</xliff:g> da <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 account</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> account</item>
</plurals>

View File

@ -197,11 +197,7 @@
<string name="abbrev_bytes">B</string>
<string name="account_size_changed"><!-- NEW: Note: part of 'account_size_changed' is untranslated -->
חשבון \"<xliff:g id="account">%s</xliff:g>\" נדחס ל
<xliff:g id="oldSize">%s</xliff:g>
to
<xliff:g id="newSize">%s</xliff:g>
</string>
חשבון \"<xliff:g id="account">%s</xliff:g>\" נדחס ל <xliff:g id="oldSize">%s</xliff:g> to <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">דחיסת חשבון</string>
<string name="clearing_account">מנקה חשבון \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -1022,7 +1018,7 @@
<string name="settings_export_success">יצוא הגדרות נשמרו ל <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">יבא הגדרות כלליות מ <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">יבא <xliff:g id="accounts">%s</xliff:g> מ <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">חשבון 1</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> חשבונות</item>
</plurals>

View File

@ -195,12 +195,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
アカウント \"<xliff:g id="account">%s</xliff:g>\" 現在
<xliff:g id="oldSize">%s</xliff:g>
から
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">アカウント \"<xliff:g id="account">%s</xliff:g>\" 現在 <xliff:g id="oldSize">%s</xliff:g> から <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">アカウント \"<xliff:g id="account">%s</xliff:g>\" を最適化しています</string>
<string name="clearing_account">アカウント \"<xliff:g id="account">%s</xliff:g>\" をクリアしています</string>
@ -983,7 +978,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">本当にこのメッセージを削除しますか?</item>
<item quantity="other">本当に<xliff:g id="message_count">%1$d</xliff:g>件のメッセージを削除しますか?</item>
</plurals>
@ -1020,7 +1015,7 @@ K-9 は大多数のメールクライアントと同様に、ほとんどのフ
<string name="settings_export_success">設定を <xliff:g id="filename">%s</xliff:g> に保存しました。</string>
<string name="settings_import_global_settings_success">グローバル設定を <xliff:g id="filename">%s</xliff:g> からインポートしました。</string>
<string name="settings_import_success"><xliff:g id="accounts">%s</xliff:g> の設定を <xliff:g id="filename">%s</xliff:g> からインポートしました。</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 アカウント</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> アカウント</item>
</plurals>

View File

@ -194,12 +194,7 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
\"<xliff:g id="account">%s</xliff:g>\" 계정이 차지하는 용량이
<xliff:g id="oldSize">%s</xliff:g>
에서
<xliff:g id="newSize">%s</xliff:g> 로 줄었습니다
</string>
<string name="account_size_changed">\"<xliff:g id="account">%s</xliff:g>\" 계정이 차지하는 용량이 <xliff:g id="oldSize">%s</xliff:g> 에서 <xliff:g id="newSize">%s</xliff:g> 로 줄었습니다</string>
<string name="compacting_account">계정 최적화 \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">계정 비우기 \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -983,7 +978,7 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">정말 이 메시지를 삭제하겠습니까?</item>
<item quantity="other">정말 <xliff:g id="message_count">%1$d</xliff:g> 통의 메시지를 삭제하겠습니까?</item>
</plurals>
@ -1020,7 +1015,7 @@ K-9 메일은 대부분의 무료 hotmail 계정을 지원하지 않으며, 다
<string name="settings_export_success">설정을 파일 <xliff:g id="filename">%s</xliff:g>로 내보냄</string>
<string name="settings_import_global_settings_success">설정을 <xliff:g id="filename">%s</xliff:g>로부터 가져옴</string>
<string name="settings_import_success"><xliff:g id="filename">%s</xliff:g>에서 <xliff:g id="accounts">%s</xliff:g>를 가져옴</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">계정 하나</item>
<item quantity="other">계정 <xliff:g id="numAccounts">%s</xliff:g></item>
</plurals>

View File

@ -195,12 +195,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Account \"<xliff:g id="account">%s</xliff:g>\" shrunk van
<xliff:g id="oldSize">%s</xliff:g>
naar
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Account \"<xliff:g id="account">%s</xliff:g>\" shrunk van <xliff:g id="oldSize">%s</xliff:g> naar <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Account \"<xliff:g id="account">%s</xliff:g>\" comprimeren</string>
<string name="clearing_account">Account \"<xliff:g id="account">%s</xliff:g>\" wissen</string>
@ -282,9 +277,9 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="message_view_status_attachment_not_saved">Opslaan bijlage op SD-kaart mislukt.</string>
<string name="message_view_show_pictures_action">Laat afbeeldingen zien</string>
<string name="message_view_show_message_action">Bericht laten zien</string>
<string name="message_view_show_attachments_action">Bijvoegsel laten zien</string>
<string name="message_view_show_attachments_action">Bijlage laten zien</string>
<string name="message_view_show_more_attachments_action">Meer…</string>
<string name="message_view_fetching_attachment_toast">bijlage ophalen.</string>
<string name="message_view_fetching_attachment_toast">Bijlage ophalen.</string>
<string name="message_view_no_viewer">Niet in staat viewer te vinden voor <xliff:g id="mimetype">%s</xliff:g>.</string>
<string name="message_view_download_remainder">Download compleet bericht</string>
<string name="message_view_downloading">Downloaden…</string>
@ -328,7 +323,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="global_settings_messageview_show_next_summary">Standaard volgend bericht laten zien na verwijderen</string>
<string name="global_settings_confirm_actions_title">Bevestig acties</string>
<string name="global_settings_confirm_actions_summary">Toon een dialoogvenster altijd wanneer u de geselecteerde acties uitvoerd</string>
<string name="global_settings_confirm_actions_summary">Toon een dialoogvenster altijd wanneer u de geselecteerde acties uitvoert</string>
<string name="global_settings_confirm_action_delete">Verwijder (alleen berichten bekijken)</string>
<string name="global_settings_confirm_action_delete_starred">Gemarkeerd verwijderen (in bericht-view)</string>
<string name="global_settings_confirm_action_spam">Spam</string>
@ -668,7 +663,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="account_settings_outgoing_label">Uitgaande server</string>
<string name="account_settings_outgoing_summary">Configureren van de uitgaande (SMTP) server</string>
<string name="account_settings_description_label">Account naam</string>
<string name="account_settings_name_label">Jou naam</string>
<string name="account_settings_name_label">Jouw naam</string>
<string name="notifications_title">Waarschuwingen</string>
<string name="account_settings_vibrate_enable">Trillen</string>
<string name="account_settings_vibrate_summary">Trillen wanneer nieuwe mail binnenkomt</string>
@ -860,7 +855,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="start_integrated_inbox_title">Geïntegreerde Inbox bij start</string>
<string name="measure_accounts_title">Laat account grootte zien</string>
<string name="measure_accounts_title">Laat accountgrootte zien</string>
<string name="measure_accounts_summary">Zet uit voor sneller beeldscherm</string>
<string name="count_search_title">Tel zoek resultaten</string>
@ -984,7 +979,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Wil je dit bericht echt verwijderen?</item>
<item quantity="other">Wil je echt <xliff:g id="message_count">%1$d</xliff:g> berichten verwijderen?</item>
</plurals>
@ -1021,7 +1016,7 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="settings_export_success">Geexporteerde instellingen opgeslagen in <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Globale instellingen geimporteerd van <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success"><xliff:g id="accounts">%s</xliff:g> geimporteerd vanuit <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 account</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> accounts</item>
</plurals>
@ -1132,23 +1127,23 @@ Graag foutrapporten, bijdrage nieuwe functies en vragen stellen op
<string name="message_view_empty">Selecteer een bericht aan de linker kant</string>
<string name="global_settings_show_contact_picture_label">Laat contact afbeeldingen zien</string>
<string name="global_settings_show_contact_picture_summary">Laat contact afbeeldingen in de berichtenlijst zien</string>
<string name="global_settings_show_contact_picture_label">Laat contactafbeeldingen zien</string>
<string name="global_settings_show_contact_picture_summary">Laat contactafbeeldingen in de berichtenlijst zien</string>
<string name="last_refresh_time_format">Verversd <xliff:g id="formatted_time">%s</xliff:g></string>
<string name="last_refresh_time_format_with_push">Verversd <xliff:g id="time_with_preposition">%s</xliff:g> (Push actief)</string>
<string name="last_refresh_time_format">Ververst <xliff:g id="formatted_time">%s</xliff:g></string>
<string name="last_refresh_time_format_with_push">Ververst <xliff:g id="time_with_preposition">%s</xliff:g> (Push actief)</string>
<string name="preposition_for_date">op <xliff:g id="date">%s</xliff:g></string>
<string name="mark_all_as_read">Markeer alles als gelezen</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_label">Colorize contact pictures</string>-->
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_label">Contactafbeeldingen kleuren</string>
<string name="global_settings_colorize_missing_contact_pictures_summary">Voorzie afwezige contactafbeeldingen van een kleur</string>
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_title">Visible message actions</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_summary">Show selected actions in the message view menu</string>-->
<string name="global_settings_messageview_visible_refile_actions_title">Zichtbare berichtacties</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Toon de geselecteerde acties in het Berichten-menu</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Bijlage laden…</string>
<string name="fetching_attachment_dialog_title_send">Bericht wordt verstuurd</string>
<string name="fetching_attachment_dialog_title_save">Concept wordt opgeslagen</string>
<string name="fetching_attachment_dialog_message">Bijlage ophalen…</string>
</resources>

View File

@ -3,10 +3,11 @@
<!-- ## ## -->
<!-- ## Polska wersja jezykowa: Marcin Orlowski <carlos@wfmh.org.pl> ## -->
<!-- ## ## -->
<!-- ## Latest update: (YYYY-MM-DD): 2013.07.15 ## -->
<!-- ## Latest update: (YYYY-MM-DD): 2013.10.30 ## -->
<!-- ## Modified by rabbbit, 2011.03.03 ## -->
<!-- ## Updated by Błażej Jeżewski, 2012.04.10 ## -->
<!-- ## Updated by Mirosław Lach, 2013.07.15 ## -->
<!-- ## Updated by Jacek Sowiński, 2013.10.30 ## -->
<!-- ## ## -->
<!-- #################################################################################### -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
@ -205,8 +206,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Objętość konta \"<xliff:g id="account">%s</xliff:g>\" zmniejszyła się z <xliff:g id="oldSize">%s</xliff:g> do <xliff:g id="newSize">%s</xliff:g></string>
<string name="account_size_changed">Objętość konta \"<xliff:g id="account">%s</xliff:g>\" zmniejszyła się z <xliff:g id="oldSize">%s</xliff:g> do <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Kompaktuję konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Czyszczę konto \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -955,7 +955,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z
<string name="btn_crypto_sign">Podpisz</string>
<string name="btn_encrypt">Szyfruj</string>
<string name="btn_decrypt">Deszyfruj</string>
<string name="btn_verify">Potwiedź</string>
<string name="btn_verify">Potwier</string>
<string name="unknown_crypto_signature_user_id">&lt;nieznany&gt;</string>
<string name="key_id">id: %s</string>
<string name="pgp_mime_unsupported">Wiadomości PGP/MIME nie są jeszcze wspierane.</string>
@ -990,7 +990,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Na pewno chcesz usunąć wiadomość?</item>
<item quantity="other">Na pewno chcesz usunąć <xliff:g id="message_count">%1$d</xliff:g> wiadomości?</item>
</plurals>
@ -1027,7 +1027,7 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z
<string name="settings_export_success">Zapisano ustawienia do <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Importowano ustawienia z <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importowano <xliff:g id="accounts">%s</xliff:g> z <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 konto</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> kont</item>
</plurals>
@ -1147,14 +1147,14 @@ Wszelkie zgłoszenia usterek, zapytania oraz nowe pomysły prosimy przesyłać z
<string name="mark_all_as_read">Oznacz wszystkie jako przeczytane</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_label">Colorize contact pictures</string>-->
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_label">Pokoloruj zdjęcia kontaktów</string>
<string name="global_settings_colorize_missing_contact_pictures_summary">Używa kolorów gdy brakuje zdjęć kontaktów</string>
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_title">Visible message actions</string>-->
<!-- NEW: <string name="global_settings_messageview_visible_refile_actions_summary">Show selected actions in the message view menu</string>-->
<string name="global_settings_messageview_visible_refile_actions_title">Widoczne operacje wiadomości</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Pokaż wybrane operacje w menu widoku wiadomości</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Ładowanie załącznika…</string>
<string name="fetching_attachment_dialog_title_send">Wysyłanie wiadomości</string>
<string name="fetching_attachment_dialog_title_save">Zapisywanie szkicu</string>
<string name="fetching_attachment_dialog_message">Pobieranie załącznika…</string>
</resources>

View File

@ -195,9 +195,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Conta \"<xliff:g id="account">%s</xliff:g>\" reduziu-se de <xliff:g id="oldSize">%s</xliff:g> para <xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Conta \"<xliff:g id="account">%s</xliff:g>\" reduziu-se de <xliff:g id="oldSize">%s</xliff:g> para <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compactando conta \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Limpando conta \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -870,7 +868,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
<string name="flagged_modifier"> - Favorito</string>
<string name="unread_modifier"> - Não lido</string>
<string name="search_all_messages_title">Todas as mensagens</string>
<string name="search_all_messages_title">Todas as Mensagens</string>
<string name="search_all_messages_detail">Todas as mensagens em pastas pesquisáveis</string>
<string name="integrated_inbox_title">Entrada Unificada</string>
@ -981,7 +979,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Deseja mesmo excluir esta mensagem?</item>
<item quantity="other">Deseja mesmo excluir estas <xliff:g id="message_count">%1$d</xliff:g> mensagens?</item>
</plurals>
@ -1018,7 +1016,7 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
<string name="settings_export_success">Configurações salvas para <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Configurações importadas de <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importação concluída para <xliff:g id="accounts">%s</xliff:g> de <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 conta</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> contas</item>
</plurals>
@ -1034,18 +1032,16 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
<item quantity="one">senha do servidor</item>
<item quantity="other">senhas do servidor</item>
</plurals>
<!-- NEW: <string name="settings_import_incoming_server">Incoming server (<xliff:g id="hostname">%s</xliff:g>):</string>-->
<!-- NEW: <string name="settings_import_outgoing_server">Outgoing server (<xliff:g id="hostname">%s</xliff:g>):</string>-->
<!-- NEW:
<string name="settings_import_incoming_server">Servidor de entrada (<xliff:g id="hostname">%s</xliff:g>):</string>
<string name="settings_import_outgoing_server">Servidor de saída (<xliff:g id="hostname">%s</xliff:g>):</string>
<plurals name="settings_import_setting_passwords">
<item quantity="one">Setting password</item>
<item quantity="other">Setting passwords…</item>
<item quantity="one">Definindo senha</item>
<item quantity="other">Definindo senhas…</item>
</plurals>
-->
<!-- NEW: <string name="settings_import_use_incoming_server_password">Use the incoming server password</string>-->
<!-- NEW: <string name="activate_account_action">Activate</string>-->
<string name="settings_import_use_incoming_server_password">Usar a senha do servidor de entrada</string>
<string name="activate_account_action">Ativar</string>
<!-- NEW: <string name="account_unavailable">Account \"<xliff:g id="account">%s</xliff:g>\" is unavailable; check storage</string>-->
<string name="account_unavailable">A conta \"<xliff:g id="account">%s</xliff:g>\" está indisponível; verifique o armazenamento</string>
<string name="settings_attachment_default_path">Salvar anexos para…</string>
<string name="attachment_save_title">Salvar anexo</string>
@ -1141,13 +1137,13 @@ Por favor, nos envie relatórios de bugs, contribua para novas melhorias e faça
<string name="mark_all_as_read">Marcar todas como lidas</string>
<string name="global_settings_colorize_missing_contact_pictures_label">Colorir contatos sem foto</string>
<!-- NEW: <string name="global_settings_colorize_missing_contact_pictures_summary">Colorize missing contact pictures</string>-->
<string name="global_settings_colorize_missing_contact_pictures_summary">Usar cores em contatos que não tiverem foto</string>
<string name="global_settings_messageview_visible_refile_actions_title">Ações de mensagens visíveis</string>
<string name="global_settings_messageview_visible_refile_actions_summary">Exibir as ações selecionadas na tela de mensagem</string>
<!-- NEW: <string name="loading_attachment">Loading attachment…</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_send">Sending message</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_title_save">Saving draft</string>-->
<!-- NEW: <string name="fetching_attachment_dialog_message">Fetching attachment…</string>-->
<string name="loading_attachment">Carregando anexo…</string>
<string name="fetching_attachment_dialog_title_send">Enviando mensagem</string>
<string name="fetching_attachment_dialog_title_save">Salvando rascunho</string>
<string name="fetching_attachment_dialog_message">Buscando anexo…</string>
</resources>

View File

@ -1,5 +1,4 @@
<?xml version='1.0' encoding='UTF-8'?>
<!-- Translation of RU version (06.07.2013): Igor Nedoboy (k9russian<AT>gmail<DOT>com) -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- === App-specific strings ============================================================= -->
@ -200,7 +199,7 @@ K-9 Mail — почтовый клиент для Android.
<string name="compacting_account">Сжатие ящика \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Очистка ящика \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">Пересоздание ящика\"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">Пересоздание ящика \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="notification_new_title">Новая почта</string>
<string name="notification_new_messages_title"><xliff:g id="new_message_count">%d</xliff:g> новых</string>
@ -213,9 +212,9 @@ K-9 Mail — почтовый клиент для Android.
<string name="notification_certificate_error_title">Ошибка сертификата <xliff:g id="account">%s</xliff:g></string>
<string name="notification_certificate_error_text">Проверьте настройки сервера</string>
<string name="notification_bg_sync_ticker">Проверка: <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
<string name="notification_bg_sync_ticker">Проверка <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
<string name="notification_bg_sync_title">Проверка почты</string>
<string name="notification_bg_send_ticker">Отправка: <xliff:g id="account">%s</xliff:g></string>
<string name="notification_bg_send_ticker">Отправка <xliff:g id="account">%s</xliff:g></string>
<string name="notification_bg_send_title">Отправка почты</string>
<string name="notification_bg_title_separator">:</string>
@ -259,6 +258,7 @@ K-9 Mail — почтовый клиент для Android.
<string name="message_compose_quote_header_to">Кому:</string>
<string name="message_compose_quote_header_cc">Копия:</string>
<string name="message_compose_reply_header_fmt"><xliff:g id="sender">%s</xliff:g> пишет:</string>
<string name="message_compose_reply_header_fmt_with_date"><xliff:g id="sent_date">%1$s</xliff:g>, <xliff:g id="sender">%2$s</xliff:g> пишет:</string>
<string name="message_compose_error_no_recipients">Укажите адресата</string>
<string name="error_contact_address_not_found">Контакт не содержит сведений о email</string>
<string name="message_compose_attachments_skipped_toast">Некоторые вложения не были загружены и не могут быть отправлены</string>
@ -980,7 +980,7 @@ K-9 Mail — почтовый клиент для Android.
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Сообщение будет удалено. Продолжить?</item>
<item quantity="other">Сообщения (<xliff:g id="message_count">%1$d</xliff:g> шт.) будут удалены. Продолжить?</item>
</plurals>
@ -1017,7 +1017,7 @@ K-9 Mail — почтовый клиент для Android.
<string name="settings_export_success">Настройки сохранены в <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Настройки K-9 импортированы из <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Импортировано: <xliff:g id="accounts">%s</xliff:g> из <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 ящик</item>
<item quantity="few"><xliff:g id="numAccounts">%s</xliff:g> ящика</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> ящиков</item>

View File

@ -12,13 +12,13 @@
<string name="unread_widget_label">K-9 Neprečítaná</string>
<string name="remote_control_label">Diaľkové ovládanie aplikácie K-9 Mail</string>
<string name="remote_control_desc">Povolí tejto aplikácii ovládať aktivity a nastavenia aplikácie K-9 Mail.</string>
<string name="remote_control_desc">Umožní tejto aplikácii ovládať aktivity a nastavenia aplikácie K-9 Mail.</string>
<!-- Used in the about dialog -->
<string name="app_authors">Google, The K-9 Dog Walkers.</string>
<string name="app_copyright_fmt">Autorské práva 2008-<xliff:g>%s</xliff:g> The K-9 Dog Walkers. Portions Copyright 2006-<xliff:g>%s</xliff:g> the Android Open Source Project.</string>
<string name="app_license">Licencované pod Apache licenciou vo verzii 2.0.</string>
<string name="app_license">Licencované pod licenciou Apache 2.0.</string>
<!-- Welcome message -->
@ -30,7 +30,7 @@ K-9 Mail je výkonný e-mailový klient pre Android a navyše je zadarmo.
Jeho vylepšené funkcie zahŕňajú:
</p>
<ul>
<li>Push mail pri použití IMAP IDLE</li>
<li>Push pošta pri použití IMAP IDLE</li>
<li>Lepší výkon</li>
<li>Doplňovanie správ</li>
<li>Podpisy správ</li>
@ -40,7 +40,7 @@ Jeho vylepšené funkcie zahŕňajú:
<li>Nastavenie spiatočnej adresy</li>
<li>Klávesové skratky</li>
<li>Lepšia podpora pre IMAP</li>
<li>Ukladanie príloh na SD</li>
<li>Ukladanie príloh na kartu SD</li>
<li>Vyprázdňovanie koša</li>
<li>Triedenie správ</li>
<li>…a ďalšie</li>
@ -48,7 +48,7 @@ Jeho vylepšené funkcie zahŕňajú:
<p>
Vezmite prosím na vedomie, že K-9 nepodporuje väčšinu Hotmail účtov a ako mnoho ďalších e-mailových klientov vykazuje zvláštnosti pri komunikácii s Microsoft Exchange.
</p><p>
Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte sa na
Prosím, nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte sa na
<a href="http://k9mail.googlecode.com/">http://k9mail.googlecode.com/</a>.
</p>
]]></string>
@ -62,13 +62,13 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_delete_dlg_instructions_fmt">Účet \"<xliff:g id="account">%s</xliff:g>\" bude odstránený z K-9 Mail.</string>
<string name="account_recreate_dlg_instructions_fmt">Všetky dáta pre účet \"<xliff:g id="account">%s</xliff:g>\" budú odstránené. Nastavenia účtu budú však zachované.</string>
<string name="account_clear_dlg_instructions_fmt">Všetky správy pre účet \"<xliff:g id="account">%s</xliff:g>\" budú odstránené. Nastavenia účtu budú však zachované.</string>
<string name="insufficient_apg_permissions">K-9 nemá povolenia k plnému prístupu k APG, pre opravu prosím preinštalujte K-9 Mail.</string>
<string name="insufficient_apg_permissions">K-9 nemá povolenia k plnému prístupu k APG, pre opravu prosím, preinštalujte K-9 Mail.</string>
<!-- === App Store-specific strings ======================================================= -->
<string name="import_dialog_error_message">Prosím nainštalujte správcu súborov pre pokračovanie v tomto importe.</string>
<string name="import_dialog_error_message">Prosím, nainštalujte správcu súborov pre pokračovanie v tomto importovaní.</string>
<string name="open_market">Otvoriť Obchod Play</string>
@ -78,14 +78,14 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="app_authors_fmt">Autori: <xliff:g id="app_authors">%s</xliff:g></string>
<string name="app_revision_fmt">Informácie o revízii: <xliff:g id="app_revision_url">%s</xliff:g></string>
<string name="app_libraries">Používame tieto knižnice tretích strán: <xliff:g id="app_libraries_list">%s</xliff:g></string>
<string name="app_emoji_icons">Emoji ikony: <xliff:g id="app_emoji_icons_link">%s</xliff:g></string>
<string name="app_emoji_icons">Ikony Emoji: <xliff:g id="app_emoji_icons_link">%s</xliff:g></string>
<string name="read_attachment_label">čítať prílohy e-mailov</string>
<string name="read_attachment_desc">Povolí tejto aplikácii čítať prílohy Vašich e-mailov.</string>
<string name="read_messages_label">čítať e-maily</string>
<string name="read_messages_desc">Povolí tejto aplikácii čítať Vaše e-maily.</string>
<string name="delete_messages_label">mazať e-maily</string>
<string name="delete_messages_desc">Povolí tejto aplikácii mazať Vaše e-maily.</string>
<string name="read_attachment_label">čítať prílohy správ</string>
<string name="read_attachment_desc">Povolí tejto aplikácii čítať prílohy Vašich správ.</string>
<string name="read_messages_label">čítať správy</string>
<string name="read_messages_desc">Povolí tejto aplikácii čítať Vaše správy.</string>
<string name="delete_messages_label">mazať správy</string>
<string name="delete_messages_desc">Povolí tejto aplikácii mazať Vaše správy.</string>
<string name="about_title_fmt">O aplikácii <xliff:g id="app_name">%s</xliff:g></string>
<string name="accounts_title">Účty</string>
@ -94,7 +94,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="message_list_title"><xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g> </string>
<string name="compose_title_compose">Vytvoriť</string>
<string name="compose_title_compose">Napísať</string>
<string name="compose_title_reply">Odpovedať</string>
<string name="compose_title_reply_all">Odpovedať všetkým</string>
<string name="compose_title_forward">Preposlať</string>
@ -132,22 +132,22 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="continue_action">Pokračovať</string>
<string name="back_action">Späť</string>
<string name="done_action">Hotovo</string> <!-- Used to complete a multi-step process -->
<string name="discard_action">Neukladať</string>
<string name="discard_action">Zahodiť</string>
<string name="save_draft_action">Uložiť ako koncept</string>
<string name="check_mail_action">Skontrolovať poštu</string>
<string name="send_messages_action">Odoslať správy</string>
<string name="refresh_folders_action">Obnoviť zoznam priečinkov</string>
<string name="filter_folders_action">Nájsť priečinok</string>
<string name="add_account_action">Pridať účet</string>
<string name="compose_action">Vytvoriť</string>
<string name="search_action">Hľadať</string>
<string name="search_results">Výsledky hľadania</string>
<string name="compose_action">Napísať</string>
<string name="search_action">Vyhľadať</string>
<string name="search_results">Výsledky vyhľadávania</string>
<string name="preferences_action">Nastavenia</string>
<string name="account_settings_action">Nastavenia účtu</string>
<string name="folder_settings_action">Nastavenia priečinku</string>
<string name="global_settings_action">Všeobecné nastavenia</string>
<string name="remove_account_action">Odstrániť účet</string>
<string name="clear_pending_action">Zrušiť čakajúce akcie (nebezpečné!)</string>
<string name="clear_pending_action">Zrušiť čakajúce akcie (nebezpečné)</string>
<string name="mark_as_read_action">Označiť ako prečítané</string>
<string name="send_alternate_action">Zdieľať</string>
@ -188,35 +188,29 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="status_loading_more_failed">Opakujte načítanie ďalších správ</string>
<string name="load_more_messages_fmt">Načítať až
o <xliff:g id="messages_to_load">%d</xliff:g> viac</string>
<string name="load_more_messages_fmt">Načítať ďalších <xliff:g id="messages_to_load">%d</xliff:g></string>
<string name="abbrev_gigabytes">GB</string>
<string name="abbrev_megabytes">MB</string>
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Účet \"<xliff:g id="account">%s</xliff:g>\" bol zmenšený z
<xliff:g id="oldSize">%s</xliff:g>
na
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Účet \"<xliff:g id="account">%s</xliff:g>\" bol zmenšený z <xliff:g id="oldSize">%s</xliff:g> na <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Zmenšujem účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Čistím účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">Obnovujem účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="compacting_account">Zmenšovanie účtu \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Čistenie účtu \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="recreating_account">Obnovovanie účtu \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="notification_new_title">Nová správa</string>
<string name="notification_new_messages_title">Počet nových správ: <xliff:g id="new_message_count">%d</xliff:g></string>
<string name="notification_new_one_account_fmt">Počet neprečítaných správ: <xliff:g id="unread_message_count">%d</xliff:g> v <xliff:g id="account">%s</xliff:g></string> <!-- 279 Unread (someone@google.com) -->
<string name="notification_additional_messages">+ <xliff:g id="additional_messages">%d</xliff:g> viac v <xliff:g id="account">%s</xliff:g></string>
<string name="notification_additional_messages">+ ďalších <xliff:g id="additional_messages">%d</xliff:g> v <xliff:g id="account">%s</xliff:g></string>
<string name="notification_action_reply">Odpovedať</string>
<string name="notification_action_mark_as_read">Ozn. ako prečítané</string>
<string name="notification_action_delete">Zmazať</string>
<string name="notification_action_mark_as_read">Označiť ako prečítané</string>
<string name="notification_action_delete">Vymazať</string>
<string name="notification_certificate_error_title">Chyba certifikátu pre <xliff:g id="account">%s</xliff:g></string>
<string name="notification_certificate_error_text">Skontrolujte nastavenia serveru</string>
<string name="notification_certificate_error_text">Skontrolujte nastavenia servera</string>
<string name="notification_bg_sync_ticker">Kontrolovanie pošty: <xliff:g id="account">%s</xliff:g>:<xliff:g id="folder">%s</xliff:g></string>
<string name="notification_bg_sync_title">Kontrolovanie pošty</string>
@ -263,7 +257,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="message_compose_quote_header_from">Od:</string>
<string name="message_compose_quote_header_to">Komu:</string>
<string name="message_compose_quote_header_cc">Kópia:</string>
<string name="message_compose_reply_header_fmt"><xliff:g id="sender">%s</xliff:g> napísal(-a):</string>
<string name="message_compose_reply_header_fmt">Používateľ <xliff:g id="sender">%s</xliff:g> napísal:</string>
<string name="message_compose_error_no_recipients">Musíte pridať aspoň jedného príjemcu.</string>
<string name="error_contact_address_not_found">Nebola nájdená žiadna e-mailová adresa pre tento kontakt.</string>
<string name="message_compose_attachments_skipped_toast">Niektoré prílohy nemožno preposlať, pretože neboli stiahnuté.</string>
@ -284,7 +278,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="message_view_show_pictures_action">Zobraziť obrázky</string>
<string name="message_view_show_message_action">Zobraziť správy</string>
<string name="message_view_show_attachments_action">Zobraziť prílohy</string>
<string name="message_view_show_more_attachments_action">Viac</string>
<string name="message_view_show_more_attachments_action">Ďalšie</string>
<string name="message_view_fetching_attachment_toast">Načítavanie prílohy.</string>
<string name="message_view_no_viewer">Nemožno nájsť prehliadač pre <xliff:g id="mimetype">%s</xliff:g>.</string>
<string name="message_view_download_remainder">Stiahnuť kompletnú správu</string>
@ -297,7 +291,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="from_same_sender">Viac od tohto odosielateľa</string>
<string name="message_discarded_toast">Správa nebola uložená</string>
<string name="message_discarded_toast">Správa bola zahodená</string>
<string name="message_saved_toast">Správa bola uložená ako koncept</string>
<string name="global_settings_flag_label">Zobraziť hviezdičky</string>
@ -329,22 +323,22 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="global_settings_messageview_show_next_summary">Zobraziť ďalšiu správu automaticky po zmazaní správy</string>
<string name="global_settings_confirm_actions_title">Potvrdzovanie akcií</string>
<string name="global_settings_confirm_actions_summary">Zobraziť dialógové okno vždy, keď budete vykonávať vybrané akcie</string>
<string name="global_settings_confirm_action_delete">Mazanie (v zobrazení správ)</string>
<string name="global_settings_confirm_action_delete_starred">Mazanie správ s hviezdičkou (v zobrazení správ)</string>
<string name="global_settings_confirm_actions_summary">Zobraziť dialógové okno pri vykonávaní vybraných akcií</string>
<string name="global_settings_confirm_action_delete">Vymazať (v zobrazení správ)</string>
<string name="global_settings_confirm_action_delete_starred">Vymazať správy s hviezdičkou (v zobrazení správ)</string>
<string name="global_settings_confirm_action_spam">Nevyžiadaná pošta</string>
<string name="global_settings_confirm_action_delete_notif">Mazanie (z oznámenia)</string>
<string name="global_settings_confirm_action_delete_notif">Vymazať (z oznámenia)</string>
<string name="global_settings_notification_hide_subject_title">Skryť predmet v oznámeniach</string>
<string name="global_settings_notification_hide_subject_title">Skryť predmet v oznámení</string>
<string name="global_settings_notification_hide_subject_never">Nikdy</string>
<string name="global_settings_notification_hide_subject_when_locked">Pri uzamknutom zariadení</string>
<string name="global_settings_notification_hide_subject_always">Vždy</string>
<string name="global_settings_notification_quick_delete_title">Zobraziť tlačidlo \'Vymazať\'</string>
<string name="global_settings_notification_quick_delete_never">Nikdy</string>
<string name="global_settings_notification_quick_delete_when_single_msg">Pre zmazanie jednej správy</string>
<string name="global_settings_notification_quick_delete_when_single_msg">Pre vymazanie jednej správy</string>
<string name="global_settings_notification_quick_delete_always">Vždy</string>
<string name="global_settings_notification_quick_delete_description">Zobrazí tlačidlo v oznámení, ktoré umožní rýchle zmazanie správy</string>
<string name="global_settings_notification_quick_delete_description">Zobraziť tlačidlo v oznámení pre rýchle vymazanie správy</string>
<string name="global_settings_batch_buttons">Skupina tlačidiel</string>
<string name="global_settings_batch_buttons_summary">Nastavenie skupiny tlačidiel v zozname správ</string>
@ -356,10 +350,10 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="global_settings_flag">Značka</string>
<string name="global_settings_unselect">Odznačiť</string>
<string name="quiet_time">Doba pokoja</string>
<string name="quiet_time_description">Zakázať zvonenie, bzučanie a blikanie v noci</string>
<string name="quiet_time_starts">Doba pokoja začína o</string>
<string name="quiet_time_ends">Doba pokoja končí o</string>
<string name="quiet_time">Čas ticha</string>
<string name="quiet_time_description">Zakázať vyzváňanie, bzučanie a blikanie v noci</string>
<string name="quiet_time_starts">Čas ticha začína o</string>
<string name="quiet_time_ends">Čas ticha končí o</string>
<string name="account_setup_basics_title">Nastaviť nový účet</string>
<string name="account_setup_basics_email_hint">E-mailová adresa</string>
@ -368,40 +362,40 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_setup_check_settings_title"/>
<string name="account_setup_check_settings_retr_info_msg">Načítavanie informácií o účte\u2026</string>
<string name="account_setup_check_settings_check_incoming_msg">Kontrola nastavení serveru prichádzajúcej pošty\u2026</string>
<string name="account_setup_check_settings_check_outgoing_msg">Kontrola nastavení serveru odchádzajúcej pošty\u2026</string>
<string name="account_setup_check_settings_check_incoming_msg">Kontrola nastavení servera prichádzajúcej pošty\u2026</string>
<string name="account_setup_check_settings_check_outgoing_msg">Kontrola nastavení servera odchádzajúcej pošty\u2026</string>
<string name="account_setup_check_settings_authenticate">Overovanie\u2026</string>
<string name="account_setup_check_settings_fetch">Načítavanie nastavení účtu\u2026</string>
<string name="account_setup_check_settings_canceling_msg">Rušenie\u2026</string>
<string name="account_setup_names_title">Takmer hotovo!</string>
<string name="account_setup_names_account_name_label">Pomenovať tento účet (nepovinné):</string>
<string name="account_setup_names_account_name_label">Pomenovať tento účet (voliteľné):</string>
<string name="account_setup_names_user_name_label">Zadajte Vaše meno (zobrazí sa v odchádzajúcich správach):</string>
<string name="account_setup_account_type_title">Typ účtu</string>
<string name="account_setup_account_type_instructions">Aký je druh tohto účtu?</string>
<string name="account_setup_account_type_instructions">Typ účtu</string>
<string name="account_setup_account_type_pop_action">POP3</string>
<string name="account_setup_account_type_imap_action">IMAP</string>
<string name="account_setup_account_type_webdav_action">Exchange (WebDAV)</string>
<string name="account_setup_incoming_title">Nastavenia serveru prichádzajúcej pošty</string>
<string name="account_setup_incoming_username_label">Užívateľské meno</string>
<string name="account_setup_incoming_title">Nastavenia servera prichádzajúcej pošty</string>
<string name="account_setup_incoming_username_label">Používateľské meno</string>
<string name="account_setup_incoming_password_label">Heslo</string>
<string name="account_setup_incoming_pop_server_label">Server POP3</string>
<string name="account_setup_incoming_imap_server_label">Server IMAP</string>
<string name="account_setup_incoming_webdav_server_label">Server Exchange</string>
<string name="account_setup_incoming_port_label">Port</string>
<string name="account_setup_incoming_security_label">Zabezpečenie</string>
<string name="account_setup_incoming_auth_type_label">Overovanie</string>
<string name="account_setup_incoming_auth_type_label">Overenie</string>
<string name="account_setup_incoming_security_none_label">Žiadne</string>
<string name="account_setup_incoming_security_ssl_optional_label">SSL/TLS (ak je k dispozícii)</string>
<string name="account_setup_incoming_security_ssl_label">SSL/TLS (vždy)</string>
<string name="account_setup_incoming_security_tls_optional_label">STARTTLS (ak je k dispozícii)</string>
<string name="account_setup_incoming_security_tls_label">STARTTLS (vždy)</string>
<string name="account_setup_incoming_delete_policy_label">Keď zmažem správu</string>
<string name="account_setup_incoming_delete_policy_never_label">Nemazať na serveri</string>
<string name="account_setup_incoming_delete_policy_delete_label">Zmazať na serveri</string>
<string name="account_setup_incoming_delete_policy_label">Akcia po vymazaní správy</string>
<string name="account_setup_incoming_delete_policy_never_label">Ponechať na serveri</string>
<string name="account_setup_incoming_delete_policy_delete_label">Vymazať na serveri</string>
<string name="account_setup_incoming_delete_policy_markread_label">Označiť ako prečítanú na serveri</string>
<string name="account_setup_incoming_compression_label">Použiť kompresiu na sieti:</string>
@ -409,12 +403,12 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_setup_incoming_wifi_label">Wi-Fi</string>
<string name="account_setup_incoming_other_label">Iná</string>
<string name="local_storage_provider_external_label">Externé úložisko (SD karta)</string>
<string name="local_storage_provider_external_label">Externé úložisko (Karta SD)</string>
<string name="local_storage_provider_internal_label">Interné úložisko</string>
<string name="local_storage_provider_samsunggalaxy_label">%1$s prídavné vnútorné úložisko</string>
<string name="local_storage_provider_samsunggalaxy_label">%1$s prídavné interné úložisko</string>
<string name="local_storage_provider_label">Umiestnenie úložiska</string>
<string name="account_setup_expunge_policy_label">Odstrániť vymazané správy zo serveru</string>
<string name="account_setup_expunge_policy_label">Odstrániť vymazané správy zo servera</string>
<string name="account_setup_expunge_policy_immediately">Ihneď</string>
<string name="account_setup_expunge_policy_on_poll">Pri synchronizovaní</string>
<string name="account_setup_expunge_policy_manual">Ručne</string>
@ -432,29 +426,29 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_setup_auto_expand_folder">Automaticky rozbaliť priečinok</string>
<string name="account_setup_incoming_webdav_path_prefix_label">Cesta OWA</string>
<string name="account_setup_incoming_webdav_path_prefix_hint">Nepovin</string>
<string name="account_setup_incoming_webdav_path_prefix_hint">Voliteľ</string>
<string name="account_setup_incoming_webdav_auth_path_label">Overovacia cesta</string>
<string name="account_setup_incoming_webdav_auth_path_hint">Nepovin</string>
<string name="account_setup_incoming_webdav_auth_path_hint">Voliteľ</string>
<string name="account_setup_incoming_webdav_mailbox_path_label">Identita schránky</string>
<string name="account_setup_incoming_webdav_mailbox_path_hint">Nepovin</string>
<string name="account_setup_incoming_webdav_mailbox_path_hint">Voliteľ</string>
<string name="account_setup_outgoing_title">Nastavenia serveru odchádzajúcej pošty</string>
<string name="account_setup_outgoing_title">Nastavenia servera odchádzajúcej pošty</string>
<string name="account_setup_outgoing_smtp_server_label">Server SMTP</string>
<string name="account_setup_outgoing_port_label">Port</string>
<string name="account_setup_outgoing_security_label">Zabezpečenie</string>
<string name="account_setup_outgoing_require_login_label">Vyžadovať prihlásenie</string>
<string name="account_setup_outgoing_username_label">Užívateľské meno</string>
<string name="account_setup_outgoing_username_label">Používateľské meno</string>
<string name="account_setup_outgoing_password_label">Heslo</string>
<string name="account_setup_outgoing_authentication_label">Overovanie</string>
<string name="account_setup_outgoing_authentication_label">Overenie</string>
<string name="account_setup_bad_uri">Neplatné nastavenie: <xliff:g id="err_mess">%s</xliff:g></string>
<string name="account_setup_options_title">Možnosti účtu</string>
<string name="compact_action">Zmenšiť účet</string>
<string name="clear_action">Vyčistiť správy (nebezpečné!)</string>
<string name="recreate_action">Obnoviť dáta (posledná možnosť!)</string>
<string name="clear_action">Vyčistiť správy (nebezpečné)</string>
<string name="recreate_action">Obnoviť dáta (posledná možnosť)</string>
<string name="account_setup_options_mail_check_frequency_label">Frekvencia synchronizácie priečinkov</string>
<!-- Frequency also used in account_settings_* -->
@ -472,8 +466,8 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_setup_options_mail_check_frequency_24hour">Každých 24 hodín</string>
<string name="push_poll_on_connect_label">Synchronizácia pri pripojení pre push</string>
<string name="account_setup_options_enable_push_label">Povoliť Push mail pre tento účet</string>
<string name="account_setup_options_enable_push_summary">Ak server podporuje Push mail, nové správy sa objavia okamžite. Táto možnosť môže dramaticky zlepšiť alebo poškodiť výkon.</string>
<string name="account_setup_options_enable_push_label">Povoliť push poštu pre tento účet</string>
<string name="account_setup_options_enable_push_summary">Ak server podporuje push poštu, nové správy sa objavia okamžite. Táto možnosť môže dramaticky zlepšiť alebo poškodiť výkon.</string>
<string name="idle_refresh_period_label">Obnoviť pripojenie IDLE</string>
<string name="idle_refresh_period_1min">Každú minútu</string>
<string name="idle_refresh_period_2min">Každé 2 minúty</string>
@ -502,7 +496,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="move_copy_cannot_copy_unsynced_message">Nemožno skopírovať alebo presunúť správu, ktorá nie je synchronizovaná so serverom</string>
<string name="account_setup_failed_dlg_title">Nastavenie nemohlo byť dokončené</string>
<string name="account_setup_failed_dlg_auth_message_fmt">Užívateľské meno alebo heslo je nesprávne.\n(<xliff:g id="error">%s</xliff:g>)</string> <!-- Username or password incorrect\n(ERR01 Account does not exist) -->
<string name="account_setup_failed_dlg_auth_message_fmt">Používateľské meno alebo heslo je nesprávne.\n(<xliff:g id="error">%s</xliff:g>)</string> <!-- Username or password incorrect\n(ERR01 Account does not exist) -->
<string name="account_setup_failed_dlg_certificate_message_fmt">Nemožno sa bezpečne pripojiť k serveru.\n(<xliff:g id="error">%s</xliff:g>)</string> <!-- Cannot safely connect to server\n(Invalid certificate) -->
<string name="account_setup_failed_dlg_server_message_fmt">Nemožno sa pripojiť k serveru.\n(<xliff:g id="error">%s</xliff:g>)</string> <!-- Cannot connect to server\n(Connection timed out) -->
<string name="account_setup_failed_dlg_edit_details_action">Upraviť podrobnosti</string>
@ -512,15 +506,15 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_settings_title_fmt">Nastavenia účtu</string>
<string name="account_settings_default_label">Predvolený účet</string>
<string name="account_settings_default_summary">Odosielať e-maily z tohto účtu</string>
<string name="account_settings_notify_label">Oznámenia o nových správach</string>
<string name="account_settings_notify_sync_label">Synchronizovať oznámenia</string>
<string name="account_settings_notify_label">Oznámenie o nových správach</string>
<string name="account_settings_notify_sync_label">Oznámenie o synchronizácii</string>
<string name="account_settings_email_label">Vaša e-mailová adresa</string>
<string name="account_settings_notify_summary">Oznamovať v stavovej lište, keď príde nová pošta</string>
<string name="account_settings_notify_sync_summary">Oznamovať v stavovej lište, keď je pošta kontrolovaná</string>
<string name="account_settings_notify_self_label">Zahrnúť odchádzajúcu poštu</string>
<string name="account_settings_notify_self_summary">Zobraziť oznámenie pre odoslané správy</string>
<string name="account_settings_notification_opens_unread_label">Oznámenie otvorí neprečítané správy</string>
<string name="account_settings_notification_opens_unread_summary">Zobraziť neprečítané správy, keď je oznámenie otvorené</string>
<string name="account_settings_notification_opens_unread_summary">Po otvorení oznámenia zobraziť neprečítané správy</string>
<string name="account_settings_notification_unread_count_label">Zobraziť počet neprečítaných</string>
<string name="account_settings_notification_unread_count_summary">Zobraziť počet neprečítaných správ v notifikačnej lište</string>
<string name="account_settings_mark_message_as_read_on_view_label">Po otvorení označiť ako prečítané</string>
@ -545,7 +539,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_settings_message_format_label">Formát správy</string>
<string name="account_settings_message_format_text">Jednoduchý text (odstrániť obrázky a formátovanie)</string>
<string name="account_settings_message_format_html">HTML (ponechať obrázky a formátovanie)</string>
<string name="account_settings_message_format_auto">Automaticky</string>
<string name="account_settings_message_format_auto">Automatický</string>
<string name="account_settings_always_show_cc_bcc_label">Vždy zobraziť kópiu/skrytú kópiu</string>
@ -599,19 +593,19 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_settings_autodownload_message_size_10240">10Mb</string>
<string name="account_settings_autodownload_message_size_any">akákoľvek veľkosť (bez obmedzenia)</string>
<string name="account_settings_message_age_label">Synchronizovať správy za</string>
<string name="account_settings_message_age_any">akýkoľvek čas (bez obmedzenia)</string>
<string name="account_settings_message_age_0">dnes</string>
<string name="account_settings_message_age_1">posledné 2 dni</string>
<string name="account_settings_message_age_2">posledné 3 dni</string>
<string name="account_settings_message_age_7">posledný týždeň</string>
<string name="account_settings_message_age_14">posledné 2 týždne</string>
<string name="account_settings_message_age_21">posledné 3 týždne</string>
<string name="account_settings_message_age_1_month">posledný mesiac</string>
<string name="account_settings_message_age_2_months">posledné 2 mesiace</string>
<string name="account_settings_message_age_3_months">posledné 3 mesiace</string>
<string name="account_settings_message_age_6_months">posledných 6 mesiacov</string>
<string name="account_settings_message_age_1_year">posledný rok</string>
<string name="account_settings_message_age_label">Synchronizácia správ</string>
<string name="account_settings_message_age_any">Akýkoľvek čas (bez obmedzenia)</string>
<string name="account_settings_message_age_0">Dnes</string>
<string name="account_settings_message_age_1">Posledné 2 dni</string>
<string name="account_settings_message_age_2">Posledné 3 dni</string>
<string name="account_settings_message_age_7">Posledný týždeň</string>
<string name="account_settings_message_age_14">Posledné 2 týždne</string>
<string name="account_settings_message_age_21">Posledné 3 týždne</string>
<string name="account_settings_message_age_1_month">Posledný mesiac</string>
<string name="account_settings_message_age_2_months">Posledné 2 mesiace</string>
<string name="account_settings_message_age_3_months">Posledné 3 mesiace</string>
<string name="account_settings_message_age_6_months">Posledných 6 mesiacov</string>
<string name="account_settings_message_age_1_year">Posledný rok</string>
<string name="account_settings_folder_display_mode_label">Priečinky na zobrazenie</string>
<string name="account_settings_folder_display_mode_all">Všetky</string>
@ -670,7 +664,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_settings_outgoing_summary">Nastaviť (SMTP) server odchádzajúcej pošty</string>
<string name="account_settings_description_label">Názov účtu</string>
<string name="account_settings_name_label">Vaše meno</string>
<string name="notifications_title">Oznámenia</string>
<string name="notifications_title">Upozornenia</string>
<string name="account_settings_vibrate_enable">Vibrovanie</string>
<string name="account_settings_vibrate_summary">Vibrovať pri doručení nového e-mailu</string>
<string name="account_settings_vibrate_pattern_label">Vzory vibrovania</string>
@ -681,9 +675,9 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="account_settings_vibrate_pattern_4">Vzor 4</string>
<string name="account_settings_vibrate_pattern_5">Vzor 5</string>
<string name="account_settings_vibrate_times">Opakovať vibrovanie</string>
<string name="account_settings_ringtone">Zvonenie pre nový email</string>
<string name="account_settings_led_label">LED blikanie</string>
<string name="account_settings_led_summary">Blikať LED diódou pri doručení nového e-mailu</string>
<string name="account_settings_ringtone">Vyzváňanie pre novä správu</string>
<string name="account_settings_led_label">Blikanie LED</string>
<string name="account_settings_led_summary">Blikať diódou LED pri doručení novej správy</string>
<string name="account_settings_composition_title">Možnosti vytvárania správ</string>
<string name="account_settings_composition_label">Predvolené vytváranie</string>
@ -938,7 +932,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="message_compose_buggy_gallery">Skontrolujte \"Nastavenia\" -&gt; \"Používať riešenie chyby pre Galériu\", aby ste boli schopný pripojiť obrázky alebo videá pomocou Galérie 3D.</string>
<!-- Note: Contains references to add_attachment_action_image and add_attachment_action_video -->
<string name="message_compose_use_workaround">Použite \"Pridať prílohu (obrázok)\" or \"Pridať prílohu (video)\" pre pridanie obrázkov a videí pomocou Galérie 3D.</string>
<string name="message_compose_use_workaround">Použite \"Pridať prílohu (obrázok)\" alebo \"Pridať prílohu (video)\" pre pridanie obrázkov a videí pomocou Galérie 3D.</string>
<string name="miscellaneous_preferences">Rôzne</string>
<string name="misc_preferences_attachment_title">Používať riešenie chyby pre Galériu</string>
@ -960,8 +954,8 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="save_or_discard_draft_message_dlg_title">Uložiť koncept správy?</string>
<string name="save_or_discard_draft_message_instructions_fmt">Ste si istí, že chcete uložiť túto správu?</string>
<string name="confirm_discard_draft_message_title">Neukladať správu?</string>
<string name="confirm_discard_draft_message">Ste si istí, že nechcete uložiť túto správu?</string>
<string name="confirm_discard_draft_message_title">Zahodiť správu?</string>
<string name="confirm_discard_draft_message">Ste si istí, že chcete zahodiť túto správu?</string>
<string name="refuse_to_save_draft_marked_encrypted_dlg_title">Odmietnuť uloženie konceptu správy.</string>
<string name="refuse_to_save_draft_marked_encrypted_instructions_fmt">Odmietnuť uloženie konceptu zašifrovanej správy.</string>
@ -969,10 +963,10 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="continue_without_public_key_dlg_title">Pokračovať bez verejného kľúča?</string>
<string name="continue_without_public_key_instructions_fmt">Jeden alebo viacerí príjemcovia nemajú uložený verejný kľúč. Pokračovať?</string>
<string name="select_text_now">Vyberte text pre skopírovanie.</string>
<string name="select_text_now">Vyberte text na kopírovanie.</string>
<string name="dialog_confirm_delete_title">Potvrdiť zmazanie</string>
<string name="dialog_confirm_delete_message">Chcete odstrániť túto správu?</string>
<string name="dialog_confirm_delete_title">Potvrdiť vymazanie</string>
<string name="dialog_confirm_delete_message">Chcete vymazať túto správu?</string>
<!--
Translators:
@ -985,7 +979,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Vymazať túto správu?</item>
<item quantity="few">Vymmazať <xliff:g id="message_count">%1$d</xliff:g> správy?</item>
<item quantity="other">Vymazať <xliff:g id="message_count">%1$d</xliff:g> správ?</item>
@ -1024,7 +1018,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="settings_export_success">Exportované nastavenia boli uložené do <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Importované všeobecné nastavenia z <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importované: <xliff:g id="accounts">%s</xliff:g> z <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 účet</item>
<item quantity="few"><xliff:g id="numAccounts">%s</xliff:g> účty</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> účtov</item>
@ -1036,7 +1030,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="settings_import_success_header">Import bol úspešný</string>
<string name="settings_import_failed_header">Import sa nepodaril</string>
<string name="settings_import_activate_account_header">Aktivovať účet</string>
<string name="settings_import_activate_account_intro">Pre používanie účtu \"<xliff:g id="account">%s</xliff:g>" je potrebné poskytnúť <xliff:g id="server_passwords">%s</xliff:g>.</string>
<string name="settings_import_activate_account_intro">Pre používanie účtu \"<xliff:g id="account">%s</xliff:g>\" je potrebné poskytnúť <xliff:g id="server_passwords">%s</xliff:g>.</string>
<plurals name="settings_import_server_passwords">
<item quantity="one">heslo</item>
<item quantity="few">heslá</item>
@ -1080,10 +1074,10 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="webview_contextmenu_image_copy_action">Skopírovať URL do schránky</string>
<string name="webview_contextmenu_image_clipboard_label">URL adresa obrázka</string>
<string name="webview_contextmenu_phone_call_action">Volať číslo</string>
<string name="webview_contextmenu_phone_call_action">Vytočiť číslo</string>
<string name="webview_contextmenu_phone_save_action">Uložiť do kontaktov</string>
<string name="webview_contextmenu_phone_copy_action">Skopírovať číslo do schránky</string>
<string name="webview_contextmenu_phone_clipboard_label">Telefónne čáslo</string>
<string name="webview_contextmenu_phone_clipboard_label">Telefónne číslo</string>
<string name="webview_contextmenu_email_send_action">Odoslať správu</string>
<string name="webview_contextmenu_email_save_action">Uložiť do kontaktov</string>
@ -1110,10 +1104,10 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="remote_search_downloading_limited">Načítavanie %1$d z %2$d výsledkov</string>
<string name="remote_search_error">Vzdialené vyhľadávanie sa nepodarilo</string>
<string name="account_settings_search">Hľadanie</string>
<string name="account_settings_search">Vyhľadávanie</string>
<string name="account_settings_remote_search_enabled">Povoliť vyhľadávanie na serveri</string>
<string name="account_settings_remote_search_enabled_summary">Hľadať správy na serveri, okrem tých na Vašom zariadení</string>
<string name="action_remote_search">Hľadať správy na serveri</string>
<string name="action_remote_search">Vyhľadávať správy na serveri</string>
<string name="pull_to_refresh_remote_search_from_local_search_pull">Potiahnite pre vyhľadávanie na serveri…</string>
<string name="pull_to_refresh_remote_search_from_local_search_release">Uvoľnite pre vyhľadávanie na serveri…</string>
<string name="remote_search_unavailable_no_network">Pripojenie k sieti je nevyhnutné pre vzdialené vyhľadávanie.</string>
@ -1125,8 +1119,8 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="global_settings_threaded_view_summary">Zoskupiť správy podľa konverzácie</string>
<string name="upgrade_databases_title">Aktualizácia databáz</string>
<string name="upgrade_databases_unspecified">Aktualizovanie databáz…</string>
<string name="upgrade_database_format">Aktualizujem databázu pre účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="upgrade_databases_unspecified">Aktualizácia databáz…</string>
<string name="upgrade_database_format">Aktualizácia databázy pre účet \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="message_list_loading">Načítavanie…</string>
@ -1135,7 +1129,7 @@ Prosím nahlasujte prípadné chyby, prispievajte novými funkciami a pýtajte s
<string name="global_settings_splitview_never">Nikdy</string>
<string name="global_settings_splitview_when_in_landscape">Iba v orientácii obrazovky na šírku</string>
<string name="message_view_empty">Prosím vyberte správu vľavo</string>
<string name="message_view_empty">Prosím, vyberte správu vľavo</string>
<string name="global_settings_show_contact_picture_label">Zobraziť obrázky kontaktov</string>
<string name="global_settings_show_contact_picture_summary">Zobraziť obrázky kontaktov v zozname správ</string>

View File

@ -196,12 +196,7 @@ Vänligen skicka felrapporter, hjälp till med nya funktioner och ställ frågor
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Kontot \"<xliff:g id="account">%s</xliff:g>\" har krympt från
<xliff:g id="oldSize">%s</xliff:g>
till
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Kontot \"<xliff:g id="account">%s</xliff:g>\" har krympt från <xliff:g id="oldSize">%s</xliff:g> till <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Komprimerar konto \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Rensar konto \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -985,7 +980,7 @@ Vänligen skicka felrapporter, hjälp till med nya funktioner och ställ frågor
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Vill du verkligen radera detta meddelande?</item>
<item quantity="other">Vill du verkligen radera <xliff:g id="message_count">%1$d</xliff:g> meddelanden?</item>
</plurals>
@ -1022,7 +1017,7 @@ Vänligen skicka felrapporter, hjälp till med nya funktioner och ställ frågor
<string name="settings_export_success">Sparade exporterade inställningar till <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Importerade globala inställningar från <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Importerade <xliff:g id="accounts">%s</xliff:g> från <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 konto</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> konton</item>
</plurals>

View File

@ -188,20 +188,14 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı
<string name="status_loading_more_failed">Birden fazla mesaj yüklemeyi deniyor</string>
<string name="load_more_messages_fmt">Boyuta kadar yükle
<xliff:g id="messages_to_load">%d</xliff:g> daha fazla</string>
<string name="load_more_messages_fmt">Boyuta kadar yükle <xliff:g id="messages_to_load">%d</xliff:g> daha fazla</string>
<string name="abbrev_gigabytes">GB</string>
<string name="abbrev_megabytes">MB</string>
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
\"<xliff:g id="account">%s</xliff:g>\" hesabı
<xliff:g id="oldSize">%s</xliff:g>
den
<xliff:g id="newSize">%s</xliff:g>\'e küçüldü
</string>
<string name="account_size_changed">\"<xliff:g id="account">%s</xliff:g>\" hesabı <xliff:g id="oldSize">%s</xliff:g> den <xliff:g id="newSize">%s</xliff:g>\'e küçüldü</string>
<string name="compacting_account">Hesap sıkıştırma \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Hesap temizleme \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -1024,7 +1018,7 @@ Lütfen hata raporlarınızı, istediğiniz yeni özellikleri ve sorularınızı
<string name="settings_export_success">Dışarı aktarılan ayarlar <xliff:g id="filename">%s</xliff:g> olarak kaydedildi.</string>
<string name="settings_import_global_settings_success">Genel ayarlar <xliff:g id="filename">%s</xliff:g> dosyasından alındı</string>
<string name="settings_import_success"><xliff:g id="accounts">%s</xliff:g>, <xliff:g id="filename">%s</xliff:g> dosyasından alındı</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 hesap</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> hesap</item>
</plurals>

View File

@ -163,7 +163,7 @@ K-9 Mail це поштовий клієнт з відкритим вихідни
<!-- NEW: <string name="message_view_theme_action_dark">Switch to dark theme</string>-->
<!-- NEW: <string name="message_view_theme_action_light">Switch to light theme</string>-->
<string name="mark_as_unread_action">Відмітити як прочитаний</string>
<string name="mark_as_unread_action">Відмітити як непрочитаний</string>
<string name="add_cc_bcc_action">Додати копію/приховану</string>
<string name="read_receipt">Повідомлення про прочитання</string>
<string name="read_receipt_enabled">Включити запит повідомлень про прочитання</string>
@ -188,20 +188,14 @@ K-9 Mail це поштовий клієнт з відкритим вихідни
<string name="status_loading_more_failed">Спробуйте ще раз завантажити повідомлення</string>
<string name="load_more_messages_fmt">Завантажити ще
<xliff:g id="messages_to_load">%d</xliff:g> </string>
<string name="load_more_messages_fmt">Завантажити ще <xliff:g id="messages_to_load">%d</xliff:g> </string>
<string name="abbrev_gigabytes">ГБ</string>
<string name="abbrev_megabytes">МБ</string>
<string name="abbrev_kilobytes">кБ</string>
<string name="abbrev_bytes">Б</string>
<string name="account_size_changed">
Розмір \"<xliff:g id="account">%s</xliff:g>\" зменшився від
<xliff:g id="oldSize">%s</xliff:g>
до
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Розмір \"<xliff:g id="account">%s</xliff:g>\" зменшився від <xliff:g id="oldSize">%s</xliff:g> до <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Стискання скриньки \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Очищення скриньки \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -1024,7 +1018,7 @@ K-9 Mail це поштовий клієнт з відкритим вихідни
<string name="settings_export_success">Налаштування були експортовані у <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Глобальні налаштування були імпортовані з <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Імпортовано <xliff:g id="accounts">%s</xliff:g> з <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 обліковий запис</item>
<item quantity="few"><xliff:g id="numAccounts">%s</xliff:g> облікові записи</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> облікових записів</item>

View File

@ -1017,7 +1017,7 @@ K-9改进的功能包括
<string name="settings_export_success">设置已导出到<xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">全局设置已自<xliff:g id="filename">%s</xliff:g>导入</string>
<string name="settings_import_success">账户<xliff:g id="accounts">%s</xliff:g>已自<xliff:g id="filename">%s</xliff:g>导入</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">单个账户</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> 账户</item>
</plurals>

View File

@ -948,7 +948,7 @@
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="other">確定要刪除 %1$d 則訊息?</item>
<item quantity="one">確定要刪除此訊息?</item>
</plurals>
@ -985,7 +985,7 @@
<string name="settings_export_success">匯出的設定檔案已經儲存到 %s</string>
<string name="settings_import_global_settings_success">從 %s 匯入全域設定檔案</string>
<string name="settings_import_success" formatted="false">成功匯入 %s 從 %s</string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="other">%s 帳號</item>
<item quantity="one">1 帳號</item>
</plurals>

View File

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<?xml version='1.0' encoding='UTF-8'?>
<!--
When removing strings from the main file, please cleanup the translations.
The script tools/sync_translation.py will get rid of any surplus strings.
@ -201,12 +201,7 @@ Please submit bug reports, contribute new features and ask questions at
<string name="abbrev_kilobytes">KB</string>
<string name="abbrev_bytes">B</string>
<string name="account_size_changed">
Account \"<xliff:g id="account">%s</xliff:g>\" shrunk from
<xliff:g id="oldSize">%s</xliff:g>
to
<xliff:g id="newSize">%s</xliff:g>
</string>
<string name="account_size_changed">Account \"<xliff:g id="account">%s</xliff:g>\" shrunk from <xliff:g id="oldSize">%s</xliff:g> to <xliff:g id="newSize">%s</xliff:g></string>
<string name="compacting_account">Compacting account \"<xliff:g id="account">%s</xliff:g>\"</string>
<string name="clearing_account">Clearing account \"<xliff:g id="account">%s</xliff:g>\"</string>
@ -269,6 +264,7 @@ Please submit bug reports, contribute new features and ask questions at
<string name="message_compose_quote_header_to">To:</string>
<string name="message_compose_quote_header_cc">Cc:</string>
<string name="message_compose_reply_header_fmt"><xliff:g id="sender">%s</xliff:g> wrote:</string>
<string name="message_compose_reply_header_fmt_with_date">On <xliff:g id="sent_date">%1$s</xliff:g>, <xliff:g id="sender">%2$s</xliff:g> wrote:</string>
<string name="message_compose_error_no_recipients">You must add at least one recipient.</string>
<string name="error_contact_address_not_found">No email address could be found for this contact.</string>
<string name="message_compose_attachments_skipped_toast">Some attachments cannot be forwarded because they have not been downloaded.</string>
@ -289,7 +285,7 @@ Please submit bug reports, contribute new features and ask questions at
<string name="message_view_show_pictures_action">Show pictures</string>
<string name="message_view_show_message_action">Show message</string>
<string name="message_view_show_attachments_action">Show attachments</string>
<string name="message_view_show_more_attachments_action">More&#8230;</string>
<string name="message_view_show_more_attachments_action">More</string>
<string name="message_view_fetching_attachment_toast">Fetching attachment.</string>
<string name="message_view_no_viewer">Unable to find viewer for <xliff:g id="mimetype">%s</xliff:g>.</string>
<string name="message_view_download_remainder">Download complete message</string>
@ -371,7 +367,7 @@ Please submit bug reports, contribute new features and ask questions at
<string name="account_setup_basics_password_hint">Password</string>
<string name="account_setup_basics_manual_setup_action">Manual setup</string>
<string name="account_setup_check_settings_title"></string>
<string name="account_setup_check_settings_title"/>
<string name="account_setup_check_settings_retr_info_msg">Retrieving account information\u2026</string>
<string name="account_setup_check_settings_check_incoming_msg">Checking incoming server settings\u2026</string>
<string name="account_setup_check_settings_check_outgoing_msg">Checking outgoing server settings\u2026</string>
@ -990,7 +986,7 @@ Please submit bug reports, contribute new features and ask questions at
(1) http://developer.android.com/guide/topics/resources/string-resource.html#Plurals
-->
<plurals name="dialog_confirm_delete_message">
<plurals name="dialog_confirm_delete_messages">
<item quantity="one">Do you really want to delete this message?</item>
<item quantity="other">Do you really want to delete <xliff:g id="message_count">%1$d</xliff:g> messages?</item>
</plurals>
@ -1027,7 +1023,7 @@ Please submit bug reports, contribute new features and ask questions at
<string name="settings_export_success">Saved exported settings to <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_global_settings_success">Imported global settings from <xliff:g id="filename">%s</xliff:g></string>
<string name="settings_import_success">Imported <xliff:g id="accounts">%s</xliff:g> from <xliff:g id="filename">%s</xliff:g></string>
<plurals name="settings_import_success">
<plurals name="settings_import_accounts">
<item quantity="one">1 account</item>
<item quantity="other"><xliff:g id="numAccounts">%s</xliff:g> accounts</item>
</plurals>

View File

@ -1,5 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<changelog>
<release version="4.801" versioncode="20002" >
<change>KitKatでの設定をインポートする際のバグを修正しました</change>
<change>'メッセージサイズ自動調整'オプションをチェックした時に空のメッセージが表示される問題を修正しました</change>
</release>
<release version="4.800" versioncode="20001" >
<change>これはKitKatデバイスでよりよく振る舞うべくリリースされました。古いデバイスで動く4.8のバージョンはすぐに現れなければなりません</change>
</release>
<release version="4.701" versioncode="19002" >
<change>KitKatでの問題を修正するためにメッセージビューのスクロールの仕方を見直しました。ありがとう Joe Steele!</change>
<change>TLS暗号スイートとバージョンを堅牢にしました</change>
<change>引用テキストがない場合に不要な空行を追加しないようにしました</change>
<change>メッセージの下書きに関連するいくつかの問題を修正しました</change>
<change>アカウントを削除した時に古いデータの削除を改善しました</change>
<change>KitKatのバグを一時的に回避するため設定のインポートを停止しました</change>
<change>ドイツ語、ギリシャ語、日本語、韓国語、リトアニア語、ポルトガル語、ロシア語そしてスロバキア語の翻訳を更新しました</change>
</release>
<release version="4.700" versioncode="19001" >
<change>コードをきれいにしました</change>
<change>ドラフトメッセージが送信されてしまうバグを修正しました</change>

View File

@ -8,6 +8,44 @@
They are automatically updated with "ant bump-version".
-->
<changelog>
<release version="4.804" versioncode="20005" >
<change>Fixed a bug with IMAP Push that could cause excessive battery drain</change>
<change>Exclude error folder from unread/starred count</change>
<change>Avoid adding the same recipient twice when using "reply to all"</change>
<change>Improved compatibility with IMAP (proxy) servers</change>
<change>Improved support for non-standard conform "share" functionality used by some apps</change>
<change>Another attempt at working around the display bug on Asus Transformer devices</change>
<change>Added mailbox.org to the list of providers</change>
<change>More bug fixes</change>
</release>
<release version="4.803" versioncode="20004" >
<change>Removed the work-around for the display bug on Asus Transformer devices introduced in v4.802 because it was causing problems</change>
<change>K-9 Mail now uses a locale-specific date in the header of a quoted message</change>
<change>Fixed bug where inline images where not showing in KitKat</change>
<change>Fixed POP3 STLS command</change>
<change>Added auto-configuration settings for some providers</change>
<change>Updated Dutch, Spanish, Danish, Slovak, Russian translation</change>
<change>More bug fixes</change>
</release>
<release version="4.802" versioncode="20003" >
<change>Added work-around for a display bug on Asus Transformer devices</change>
<change>Improved certificate validation. If you had to manually accept a certificate before you will have to do it again after this update.</change>
<change>Re-added support for SSLv3; fixed SSL-related problems with Android 2.2</change>
<change>Also use SSL/TLS hardening for STARTTLS connections</change>
<change>Added support for Bitcoin-URIs</change>
<change>Added higher resolution app icon</change>
<change>Added support for non-standard conforming servers when looking for "Drafts" folder</change>
<change>Added auto-configuration settings for some providers</change>
<change>Fixed color generation for contact picture placeholders</change>
<change>Updated Japanese, Polish, Czech, Russian, Greek, Hungarian, Dutch, Ukrainian, Brazilian Portuguese, French translations</change>
</release>
<release version="4.801" versioncode="20002" >
<change>Further bugfixes for importing settings on KitKat</change>
<change>First pass at a fix for blank messages showing up when the 'Auto-fit messages' option is checked</change>
</release>
<release version="4.800" versioncode="20001" >
<change>This release should behave better on KitKat devices. A version of 4.8 that runs on older devices should appear shortly.</change>
</release>
<release version="4.701" versioncode="19002" >
<change>Overhauled how we do message view scrolling to fix a KitKat issue. Thanks to Joe Steele!</change>
<change>Hardened TLS cipher suites and versions</change>

View File

@ -215,38 +215,46 @@
</provider>
<!-- Germany -->
<provider id="mailbox.org" label="mailbox.org" domain="mailbox.org">
<incoming uri="imap+tls+://imap.mailbox.org" username="$email" />
<outgoing uri="smtp+tls+://smtp.mailbox.org" username="$email" />
</provider>
<provider id="freenet" label="Freenet" domain="freenet.de">
<incoming uri="pop3://mx.freenet.de" username="$user" />
<outgoing uri="smtp+ssl://mx.freenet.de" username="$email" />
<incoming uri="imap+tls+://mx.freenet.de" username="$email" />
<outgoing uri="smtp+tls+://mx.freenet.de" username="$email" />
</provider>
<provider id="T-Online" label="T-Online" domain="t-online.de">
<incoming uri="pop3://popmail.t-online.de" username="$email" />
<outgoing uri="smtp://smtpmail.t-online.de" username="$email" />
<incoming uri="imap+ssl+://secureimap.t-online.de" username="$email" />
<outgoing uri="smtp+tls+://securesmtp.t-online.de" username="$email" />
</provider>
<provider id="web.de" label="Web.de" domain="web.de">
<incoming uri="imap+ssl://imap.web.de" username="$user" />
<outgoing uri="smtp://smtp.web.de" username="$user" />
<incoming uri="imap+ssl+://imap.web.de" username="$user" />
<outgoing uri="smtp+tls+://smtp.web.de" username="$user" />
</provider>
<provider id="posteo" label="Posteo" domain="posteo.de">
<incoming uri="imap+tls+://posteo.de" username="$email" />
<outgoing uri="smtp+tls+://posteo.de" username="$email" />
</provider>
<!-- GMX variants -->
<provider id="gmx.net" label="GMX.net" domain="gmx.net">
<incoming uri="imap+ssl+://imap.gmx.net" username="$email" />
<outgoing uri="smtp+ssl+://mail.gmx.net" username="$email" />
<outgoing uri="smtp+tls+://mail.gmx.net" username="$email" />
</provider>
<provider id="gmx.de" label="GMX.de" domain="gmx.de">
<incoming uri="imap+ssl+://imap.gmx.net" username="$email" />
<outgoing uri="smtp+ssl+://mail.gmx.net" username="$email" />
<outgoing uri="smtp+tls+://mail.gmx.net" username="$email" />
</provider>
<provider id="gmx.at" label="GMX.at" domain="gmx.at">
<incoming uri="imap+ssl+://imap.gmx.net" username="$email" />
<outgoing uri="smtp+ssl+://mail.gmx.net" username="$email" />
<outgoing uri="smtp+tls+://mail.gmx.net" username="$email" />
</provider>
<provider id="gmx.ch" label="GMX.ch" domain="gmx.ch">
<incoming uri="imap+ssl+://imap.gmx.net" username="$email" />
<outgoing uri="smtp+ssl+://mail.gmx.net" username="$email" />
<outgoing uri="smtp+tls+://mail.gmx.net" username="$email" />
</provider>
<provider id="gmx.eu" label="GMX.eu" domain="gmx.eu">
<incoming uri="imap+ssl+://imap.gmx.net" username="$email" />
<outgoing uri="smtp+ssl+://mail.gmx.net" username="$email" />
<outgoing uri="smtp+tls+://mail.gmx.net" username="$email" />
</provider>
<!-- Netherlands -->
@ -517,7 +525,17 @@
<incoming uri="pop3://pop.safebox.ru" username="$email" />
<outgoing uri="smtp://smtp.safebox.ru:2525" username="$email" />
</provider>
<!-- Slovakia -->
<provider id="azet.sk" label="Azet.sk" domain="azet.sk">
<incoming uri="imap+ssl+://imap.azet.sk" username="$email" />
<outgoing uri="smtp+ssl+://smtp.azet.sk" username="$email" />
</provider>
<provider id="outlook.sk" label="Outlook.sk" domain="outlook.sk">
<incoming uri="imap+ssl+://imap-mail.outlook.com" username="$email" />
<outgoing uri="smtp+tls+://smtp-mail.outlook.com" username="$email" />
</provider>
<!-- Developers' vanity providers -->
<provider id="fsck.com" label="Jesse's personal mail" domain="fsck.com" >
<incoming uri="imap+ssl://fsck.com" username="$user" />

View File

@ -1,16 +1,18 @@
package com.fsck.k9;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;
import android.content.ContentResolver;
@ -22,13 +24,14 @@ import android.net.ConnectivityManager;
import android.net.Uri;
import android.util.Log;
import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection;
import com.fsck.k9.crypto.Apg;
import com.fsck.k9.crypto.CryptoProvider;
import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.Address;
import com.fsck.k9.mail.Folder.FolderClass;
import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.Store;
import com.fsck.k9.mail.Folder.FolderClass;
import com.fsck.k9.mail.store.LocalStore;
import com.fsck.k9.mail.store.StorageManager;
import com.fsck.k9.mail.store.StorageManager.StorageProvider;
@ -36,10 +39,11 @@ import com.fsck.k9.provider.EmailProvider;
import com.fsck.k9.provider.EmailProvider.StatsColumns;
import com.fsck.k9.search.ConditionsTreeNode;
import com.fsck.k9.search.LocalSearch;
import com.fsck.k9.search.SqlQueryBuilder;
import com.fsck.k9.search.SearchSpecification.Attribute;
import com.fsck.k9.search.SearchSpecification.SearchCondition;
import com.fsck.k9.search.SearchSpecification.Searchfield;
import com.fsck.k9.search.SqlQueryBuilder;
import com.fsck.k9.security.LocalKeyStore;
import com.fsck.k9.view.ColorChip;
import com.larswerkman.colorpicker.ColorPicker;
@ -525,7 +529,6 @@ public class Account implements BaseAccount {
}
editor.remove(mUuid + ".storeUri");
editor.remove(mUuid + ".localStoreUri");
editor.remove(mUuid + ".transportUri");
editor.remove(mUuid + ".description");
editor.remove(mUuid + ".name");
@ -551,12 +554,10 @@ public class Account implements BaseAccount {
editor.remove(mUuid + ".vibrateTimes");
editor.remove(mUuid + ".ring");
editor.remove(mUuid + ".ringtone");
editor.remove(mUuid + ".lastFullSync");
editor.remove(mUuid + ".folderDisplayMode");
editor.remove(mUuid + ".folderSyncMode");
editor.remove(mUuid + ".folderPushMode");
editor.remove(mUuid + ".folderTargetMode");
editor.remove(mUuid + ".hideButtonsEnum");
editor.remove(mUuid + ".signatureBeforeQuotedText");
editor.remove(mUuid + ".expungePolicy");
editor.remove(mUuid + ".syncRemoteDeletions");
@ -582,13 +583,24 @@ public class Account implements BaseAccount {
editor.remove(mUuid + ".cryptoAutoSignature");
editor.remove(mUuid + ".cryptoAutoEncrypt");
editor.remove(mUuid + ".enabled");
editor.remove(mUuid + ".hideMoveButtonsEnum");
editor.remove(mUuid + ".markMessageAsReadOnView");
editor.remove(mUuid + ".alwaysShowCcBcc");
editor.remove(mUuid + ".allowRemoteSearch");
editor.remove(mUuid + ".remoteSearchFullText");
editor.remove(mUuid + ".remoteSearchNumResults");
editor.remove(mUuid + ".defaultQuotedTextShown");
editor.remove(mUuid + ".displayCount");
editor.remove(mUuid + ".inboxFolderName");
editor.remove(mUuid + ".localStorageProvider");
editor.remove(mUuid + ".messageFormat");
editor.remove(mUuid + ".messageReadReceipt");
editor.remove(mUuid + ".notifyMailCheck");
for (String type : networkTypes) {
editor.remove(mUuid + ".useCompression." + type);
}
deleteIdentities(preferences.getPreferences(), editor);
// TODO: Remove preference settings that may exist for individual
// folders in the account.
editor.commit();
}
@ -1833,6 +1845,7 @@ public class Account implements BaseAccount {
excludeSpecialFolder(search, getSpamFolderName());
excludeSpecialFolder(search, getOutboxFolderName());
excludeSpecialFolder(search, getSentFolderName());
excludeSpecialFolder(search, getErrorFolderName());
search.or(new SearchCondition(Searchfield.FOLDER, Attribute.EQUALS, getInboxFolderName()));
}
@ -1865,4 +1878,57 @@ public class Account implements BaseAccount {
search.and(Searchfield.FOLDER, folderName, Attribute.NOT_EQUALS);
}
}
/**
* Add a new certificate for the incoming or outgoing server to the local key store.
*/
public void addCertificate(CheckDirection direction,
X509Certificate certificate) throws CertificateException {
Uri uri;
if (direction.equals(CheckDirection.INCOMING)) {
uri = Uri.parse(getStoreUri());
} else {
uri = Uri.parse(getTransportUri());
}
LocalKeyStore localKeyStore = LocalKeyStore.getInstance();
localKeyStore.addCertificate(uri.getHost(), uri.getPort(), certificate);
}
/**
* Examine the existing settings for an account. If the old host/port is different from the
* new host/port, then try and delete any (possibly non-existent) certificate stored for the
* old host/port.
*/
public void deleteCertificate(String newHost, int newPort,
CheckDirection direction) {
Uri uri;
if (direction.equals(CheckDirection.INCOMING)) {
uri = Uri.parse(getStoreUri());
} else {
uri = Uri.parse(getTransportUri());
}
String oldHost = uri.getHost();
int oldPort = uri.getPort();
if (oldPort == -1) {
// This occurs when a new account is created
return;
}
if (!newHost.equals(oldHost) || newPort != oldPort) {
LocalKeyStore localKeyStore = LocalKeyStore.getInstance();
localKeyStore.deleteCertificate(oldHost, oldPort);
}
}
/**
* Examine the settings for the account and attempt to delete (possibly non-existent)
* certificates for the incoming and outgoing servers.
*/
public void deleteCertificates() {
LocalKeyStore localKeyStore = LocalKeyStore.getInstance();
Uri uri = Uri.parse(getStoreUri());
localKeyStore.deleteCertificate(uri.getHost(), uri.getPort());
uri = Uri.parse(getTransportUri());
localKeyStore.deleteCertificate(uri.getHost(), uri.getPort());
}
}

View File

@ -39,6 +39,7 @@ import com.fsck.k9.mail.MessagingException;
import com.fsck.k9.mail.internet.BinaryTempFileBody;
import com.fsck.k9.mail.store.LocalStore;
import com.fsck.k9.provider.UnreadWidgetProvider;
import com.fsck.k9.security.LocalKeyStore;
import com.fsck.k9.service.BootReceiver;
import com.fsck.k9.service.MailService;
import com.fsck.k9.service.ShutdownReceiver;
@ -59,7 +60,7 @@ public class K9 extends Application {
* The application instance. Never <code>null</code>.
* @throws Exception
*/
void initializeComponent(K9 application);
void initializeComponent(Application application);
}
public static Application app = null;
@ -91,6 +92,15 @@ public class K9 extends Application {
*/
private static List<ApplicationAware> observers = new ArrayList<ApplicationAware>();
/**
* This will be {@code true} once the initialization is complete and {@link #notifyObservers()}
* was called.
* Afterwards calls to {@link #registerApplicationAware(com.fsck.k9.K9.ApplicationAware)} will
* immediately call {@link com.fsck.k9.K9.ApplicationAware#initializeComponent(K9)} for the
* supplied argument.
*/
private static boolean sInitialized = false;
public enum BACKGROUND_OPS {
WHEN_CHECKED, ALWAYS, NEVER, WHEN_CHECKED_AUTO_SYNC
}
@ -117,7 +127,7 @@ public class K9 extends Application {
* It should NEVER be on for Market builds
* Right now, it just governs strictmode
**/
public static boolean DEVELOPER_MODE = true;
public static boolean DEVELOPER_MODE = false;
/**
@ -581,6 +591,8 @@ public class K9 extends Application {
*/
BinaryTempFileBody.setTempDirectory(getCacheDir());
LocalKeyStore.setKeyStoreLocation(getDir("KeyStore", MODE_PRIVATE).toString());
/*
* Enable background sync of messages
*/
@ -829,15 +841,20 @@ public class K9 extends Application {
* component that the application is available and ready
*/
protected void notifyObservers() {
for (final ApplicationAware aware : observers) {
if (K9.DEBUG) {
Log.v(K9.LOG_TAG, "Initializing observer: " + aware);
}
try {
aware.initializeComponent(this);
} catch (Exception e) {
Log.w(K9.LOG_TAG, "Failure when notifying " + aware, e);
synchronized (observers) {
for (final ApplicationAware aware : observers) {
if (K9.DEBUG) {
Log.v(K9.LOG_TAG, "Initializing observer: " + aware);
}
try {
aware.initializeComponent(this);
} catch (Exception e) {
Log.w(K9.LOG_TAG, "Failure when notifying " + aware, e);
}
}
sInitialized = true;
observers.clear();
}
}
@ -848,8 +865,12 @@ public class K9 extends Application {
* Never <code>null</code>.
*/
public static void registerApplicationAware(final ApplicationAware component) {
if (!observers.contains(component)) {
observers.add(component);
synchronized (observers) {
if (sInitialized) {
component.initializeComponent(K9.app);
} else if (!observers.contains(component)) {
observers.add(component);
}
}
}

View File

@ -127,6 +127,7 @@ public class Preferences {
Store.removeAccount(account);
account.deleteCertificates();
account.delete(this);
if (newAccount == account) {

View File

@ -1371,10 +1371,8 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
private void onImport() {
Intent i = new Intent(Intent.ACTION_GET_CONTENT);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addCategory(Intent.CATEGORY_OPENABLE);
i.setType("*/*"); // KitKat seems to be ignoring mimetypes and won't load settings
// MimeUtility.K9_SETTINGS_MIME_TYPE);
i.setType("*/*");
PackageManager packageManager = getPackageManager();
List<ResolveInfo> infos = packageManager.queryIntentActivities(i, 0);
@ -1519,7 +1517,7 @@ public class Accounts extends K9ListActivity implements OnItemClickListener {
int imported = mImportResults.importedAccounts.size();
String accounts = activity.getResources().getQuantityString(
R.plurals.settings_import_success, imported, imported);
R.plurals.settings_import_accounts, imported, imported);
return activity.getString(R.string.settings_import_success, accounts, mFilename);
}

View File

@ -121,7 +121,7 @@ public class ChooseFolder extends K9ListActivity {
Intent result = new Intent();
result.putExtra(EXTRA_ACCOUNT, mAccount.getUuid());
result.putExtra(EXTRA_CUR_FOLDER, mFolder);
String destFolderName = (String)((TextView)view).getText();
String destFolderName = ((TextView)view).getText().toString();
if (mHeldInbox != null && getString(R.string.special_mailbox_name_inbox).equals(destFolderName)) {
destFolderName = mHeldInbox;
}

View File

@ -92,6 +92,8 @@ import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.SimpleHtmlSerializer;
import org.htmlcleaner.TagNode;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@ -915,8 +917,6 @@ public class MessageCompose extends K9Activity implements OnClickListener,
final String action = intent.getAction();
if (Intent.ACTION_VIEW.equals(action) || Intent.ACTION_SENDTO.equals(action)) {
startedByExternalIntent = true;
/*
* Someone has clicked a mailto: link. The address is in the URI.
*/
@ -928,21 +928,21 @@ public class MessageCompose extends K9Activity implements OnClickListener,
}
/*
* Note: According to the documenation ACTION_VIEW and ACTION_SENDTO don't accept
* Note: According to the documentation ACTION_VIEW and ACTION_SENDTO don't accept
* EXTRA_* parameters.
* And previously we didn't process these EXTRAs. But it looks like nobody bothers to
* read the official documentation and just copies wrong sample code that happens to
* work with the AOSP Email application. And because even big players get this wrong,
* we're now finally giving in and read the EXTRAs for ACTION_SENDTO (below).
* we're now finally giving in and read the EXTRAs for those actions (below).
*/
}
if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action) ||
Intent.ACTION_SENDTO.equals(action)) {
Intent.ACTION_SENDTO.equals(action) || Intent.ACTION_VIEW.equals(action)) {
startedByExternalIntent = true;
/*
* Note: Here we allow a slight deviation from the documentated behavior.
* Note: Here we allow a slight deviation from the documented behavior.
* EXTRA_TEXT is used as message body (if available) regardless of the MIME
* type of the intent. In addition one or multiple attachments can be added
* using EXTRA_STREAM.
@ -1171,9 +1171,6 @@ public class MessageCompose extends K9Activity implements OnClickListener,
// So compute the visibility of the "Add Cc/Bcc" menu item again.
computeAddCcBccVisibility();
showOrHideQuotedText(
(QuotedTextMode) savedInstanceState.getSerializable(STATE_KEY_QUOTED_TEXT_MODE));
mQuotedHtmlContent =
(InsertableHtmlContent) savedInstanceState.getSerializable(STATE_KEY_HTML_QUOTE);
if (mQuotedHtmlContent != null && mQuotedHtmlContent.getQuotedContent() != null) {
@ -1191,6 +1188,9 @@ public class MessageCompose extends K9Activity implements OnClickListener,
mQuotedTextFormat = (SimpleMessageFormat) savedInstanceState.getSerializable(
STATE_KEY_QUOTED_TEXT_FORMAT);
showOrHideQuotedText(
(QuotedTextMode) savedInstanceState.getSerializable(STATE_KEY_QUOTED_TEXT_MODE));
initializeCrypto();
updateFrom();
updateSignature();
@ -2802,7 +2802,7 @@ public class MessageCompose extends K9Activity implements OnClickListener,
if (mAction == Action.REPLY_ALL) {
if (message.getReplyTo().length > 0) {
for (Address address : message.getFrom()) {
if (!mAccount.isAnIdentity(address)) {
if (!mAccount.isAnIdentity(address) && !Utility.arrayContains(replyToAddresses, address)) {
addAddress(mToView, address);
}
}
@ -3703,12 +3703,20 @@ public class MessageCompose extends K9Activity implements OnClickListener,
*/
private String quoteOriginalTextMessage(final Message originalMessage, final String messageBody, final QuoteStyle quoteStyle) throws MessagingException {
String body = messageBody == null ? "" : messageBody;
String sentDate = getSentDateText(originalMessage);
if (quoteStyle == QuoteStyle.PREFIX) {
StringBuilder quotedText = new StringBuilder(body.length() + QUOTE_BUFFER_LENGTH);
quotedText.append(String.format(
getString(R.string.message_compose_reply_header_fmt) + "\r\n",
Address.toString(originalMessage.getFrom()))
);
if (sentDate.length() != 0) {
quotedText.append(String.format(
getString(R.string.message_compose_reply_header_fmt_with_date) + "\r\n",
sentDate,
Address.toString(originalMessage.getFrom())));
} else {
quotedText.append(String.format(
getString(R.string.message_compose_reply_header_fmt) + "\r\n",
Address.toString(originalMessage.getFrom()))
);
}
final String prefix = mAccount.getQuotePrefix();
final String wrappedText = Utility.wrap(body, REPLY_WRAP_LINE_WIDTH - prefix.length());
@ -3726,8 +3734,8 @@ public class MessageCompose extends K9Activity implements OnClickListener,
if (originalMessage.getFrom() != null && Address.toString(originalMessage.getFrom()).length() != 0) {
quotedText.append(getString(R.string.message_compose_quote_header_from)).append(" ").append(Address.toString(originalMessage.getFrom())).append("\r\n");
}
if (originalMessage.getSentDate() != null) {
quotedText.append(getString(R.string.message_compose_quote_header_send_date)).append(" ").append(originalMessage.getSentDate()).append("\r\n");
if (sentDate.length() != 0) {
quotedText.append(getString(R.string.message_compose_quote_header_send_date)).append(" ").append(sentDate).append("\r\n");
}
if (originalMessage.getRecipients(RecipientType.TO) != null && originalMessage.getRecipients(RecipientType.TO).length != 0) {
quotedText.append(getString(R.string.message_compose_quote_header_to)).append(" ").append(Address.toString(originalMessage.getRecipients(RecipientType.TO))).append("\r\n");
@ -3760,13 +3768,22 @@ public class MessageCompose extends K9Activity implements OnClickListener,
private InsertableHtmlContent quoteOriginalHtmlMessage(final Message originalMessage, final String messageBody, final QuoteStyle quoteStyle) throws MessagingException {
InsertableHtmlContent insertable = findInsertionPoints(messageBody);
String sentDate = getSentDateText(originalMessage);
if (quoteStyle == QuoteStyle.PREFIX) {
StringBuilder header = new StringBuilder(QUOTE_BUFFER_LENGTH);
header.append("<div class=\"gmail_quote\">");
header.append(HtmlConverter.textToHtmlFragment(String.format(
getString(R.string.message_compose_reply_header_fmt),
Address.toString(originalMessage.getFrom()))
));
if (sentDate.length() != 0) {
header.append(HtmlConverter.textToHtmlFragment(String.format(
getString(R.string.message_compose_reply_header_fmt_with_date),
sentDate,
Address.toString(originalMessage.getFrom()))
));
} else {
header.append(HtmlConverter.textToHtmlFragment(String.format(
getString(R.string.message_compose_reply_header_fmt),
Address.toString(originalMessage.getFrom()))
));
}
header.append("<blockquote class=\"gmail_quote\" " +
"style=\"margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;\">\r\n");
@ -3779,29 +3796,29 @@ public class MessageCompose extends K9Activity implements OnClickListener,
StringBuilder header = new StringBuilder();
header.append("<div style='font-size:10.0pt;font-family:\"Tahoma\",\"sans-serif\";padding:3.0pt 0in 0in 0in'>\r\n");
header.append("<hr style='border:none;border-top:solid #E1E1E1 1.0pt'>\r\n"); // This gets converted into a horizontal line during html to text conversion.
if (mSourceMessage.getFrom() != null && Address.toString(mSourceMessage.getFrom()).length() != 0) {
if (originalMessage.getFrom() != null && Address.toString(originalMessage.getFrom()).length() != 0) {
header.append("<b>").append(getString(R.string.message_compose_quote_header_from)).append("</b> ")
.append(HtmlConverter.textToHtmlFragment(Address.toString(mSourceMessage.getFrom())))
.append(HtmlConverter.textToHtmlFragment(Address.toString(originalMessage.getFrom())))
.append("<br>\r\n");
}
if (mSourceMessage.getSentDate() != null) {
if (sentDate.length() != 0) {
header.append("<b>").append(getString(R.string.message_compose_quote_header_send_date)).append("</b> ")
.append(mSourceMessage.getSentDate())
.append(sentDate)
.append("<br>\r\n");
}
if (mSourceMessage.getRecipients(RecipientType.TO) != null && mSourceMessage.getRecipients(RecipientType.TO).length != 0) {
if (originalMessage.getRecipients(RecipientType.TO) != null && originalMessage.getRecipients(RecipientType.TO).length != 0) {
header.append("<b>").append(getString(R.string.message_compose_quote_header_to)).append("</b> ")
.append(HtmlConverter.textToHtmlFragment(Address.toString(mSourceMessage.getRecipients(RecipientType.TO))))
.append(HtmlConverter.textToHtmlFragment(Address.toString(originalMessage.getRecipients(RecipientType.TO))))
.append("<br>\r\n");
}
if (mSourceMessage.getRecipients(RecipientType.CC) != null && mSourceMessage.getRecipients(RecipientType.CC).length != 0) {
if (originalMessage.getRecipients(RecipientType.CC) != null && originalMessage.getRecipients(RecipientType.CC).length != 0) {
header.append("<b>").append(getString(R.string.message_compose_quote_header_cc)).append("</b> ")
.append(HtmlConverter.textToHtmlFragment(Address.toString(mSourceMessage.getRecipients(RecipientType.CC))))
.append(HtmlConverter.textToHtmlFragment(Address.toString(originalMessage.getRecipients(RecipientType.CC))))
.append("<br>\r\n");
}
if (mSourceMessage.getSubject() != null) {
if (originalMessage.getSubject() != null) {
header.append("<b>").append(getString(R.string.message_compose_quote_header_subject)).append("</b> ")
.append(HtmlConverter.textToHtmlFragment(mSourceMessage.getSubject()))
.append(HtmlConverter.textToHtmlFragment(originalMessage.getSubject()))
.append("<br>\r\n");
}
header.append("</div>\r\n");
@ -3990,6 +4007,26 @@ public class MessageCompose extends K9Activity implements OnClickListener,
return (mQuotedTextMode == QuotedTextMode.SHOW);
}
/**
* Extract the date from a message and convert it into a locale-specific
* date string suitable for use in a header for a quoted message.
*
* @param message
* @return A string with the formatted date/time
*/
private String getSentDateText(Message message) {
try {
final int dateStyle = DateFormat.LONG;
final int timeStyle = DateFormat.LONG;
Date date = message.getSentDate();
Locale locale = getResources().getConfiguration().locale;
return DateFormat.getDateTimeInstance(dateStyle, timeStyle, locale)
.format(date);
} catch (Exception e) {
return "";
}
}
/**
* An {@link EditText} extension with methods that convert line endings from
* {@code \r\n} to {@code \n} and back again when setting and getting text.

View File

@ -973,6 +973,7 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme
menu.findItem(R.id.previous_message).setVisible(false);
menu.findItem(R.id.single_message_options).setVisible(false);
menu.findItem(R.id.delete).setVisible(false);
menu.findItem(R.id.compose).setVisible(false);
menu.findItem(R.id.archive).setVisible(false);
menu.findItem(R.id.move).setVisible(false);
menu.findItem(R.id.copy).setVisible(false);
@ -1091,6 +1092,7 @@ public class MessageList extends K9FragmentActivity implements MessageListFragme
} else {
menu.findItem(R.id.set_sort).setVisible(true);
menu.findItem(R.id.select_all).setVisible(true);
menu.findItem(R.id.compose).setVisible(true);
menu.findItem(R.id.mark_all_as_read).setVisible(
mMessageListFragment.isMarkAllAsReadSupported());

View File

@ -90,7 +90,7 @@ public class NotificationDeleteConfirmation extends Activity {
case DIALOG_CONFIRM:
int messageCount = mMessageRefs.size();
alert.setMessage(getResources().getQuantityString(
R.plurals.dialog_confirm_delete_message, messageCount, messageCount));
R.plurals.dialog_confirm_delete_messages, messageCount, messageCount));
break;
}

View File

@ -161,7 +161,7 @@ public class ContactPictureLoader {
return mDefaultBackgroundColor;
}
int val = address.getAddress().toLowerCase(Locale.getDefault()).hashCode();
int val = address.hashCode();
int rgb = CONTACT_DUMMY_COLORS_ARGB[Math.abs(val) % CONTACT_DUMMY_COLORS_ARGB.length];
return rgb;
}

View File

@ -17,6 +17,7 @@ import android.widget.Button;
import android.widget.EditText;
import com.fsck.k9.*;
import com.fsck.k9.activity.K9Activity;
import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection;
import com.fsck.k9.helper.Utility;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
@ -36,7 +37,9 @@ public class AccountSetupBasics extends K9Activity
private final static String EXTRA_ACCOUNT = "com.fsck.k9.AccountSetupBasics.account";
private final static int DIALOG_NOTE = 1;
private final static String STATE_KEY_PROVIDER =
"com.fsck.k9.AccountSetupBasics.provider";
"com.fsck.k9.AccountSetupBasics.provider";
private final static String STATE_KEY_CHECKED_INCOMING =
"com.fsck.k9.AccountSetupBasics.checkedIncoming";
private EditText mEmailView;
private EditText mPasswordView;
@ -46,6 +49,7 @@ public class AccountSetupBasics extends K9Activity
private Provider mProvider;
private EmailAddressValidator mEmailValidator = new EmailAddressValidator();
private boolean mCheckedIncoming = false;
public static void actionNewAccount(Context context) {
Intent i = new Intent(context, AccountSetupBasics.class);
@ -66,15 +70,6 @@ public class AccountSetupBasics extends K9Activity
mEmailView.addTextChangedListener(this);
mPasswordView.addTextChangedListener(this);
if (savedInstanceState != null && savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
}
if (savedInstanceState != null && savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
mProvider = (Provider)savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
}
}
@Override
@ -92,6 +87,23 @@ public class AccountSetupBasics extends K9Activity
if (mProvider != null) {
outState.putSerializable(STATE_KEY_PROVIDER, mProvider);
}
outState.putBoolean(STATE_KEY_CHECKED_INCOMING, mCheckedIncoming);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
if (savedInstanceState.containsKey(EXTRA_ACCOUNT)) {
String accountUuid = savedInstanceState.getString(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
}
if (savedInstanceState.containsKey(STATE_KEY_PROVIDER)) {
mProvider = (Provider) savedInstanceState.getSerializable(STATE_KEY_PROVIDER);
}
mCheckedIncoming = savedInstanceState.getBoolean(STATE_KEY_CHECKED_INCOMING);
}
public void afterTextChanged(Editable s) {
@ -229,7 +241,8 @@ public class AccountSetupBasics extends K9Activity
} else if (incomingUri.toString().startsWith("pop3")) {
mAccount.setDeletePolicy(Account.DELETE_POLICY_NEVER);
}
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, true);
// Check incoming here. Then check outgoing in onActivityResult()
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.INCOMING);
} catch (UnsupportedEncodingException enc) {
// This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);
@ -266,11 +279,18 @@ public class AccountSetupBasics extends K9Activity
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
mAccount.setDescription(mAccount.getEmail());
mAccount.save(Preferences.getPreferences(this));
K9.setServicesEnabled(this);
AccountSetupNames.actionSetNames(this, mAccount);
finish();
if (!mCheckedIncoming) {
//We've successfully checked incoming. Now check outgoing.
mCheckedIncoming = true;
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING);
} else {
//We've successfully checked outgoing as well.
mAccount.setDescription(mAccount.getEmail());
mAccount.save(Preferences.getPreferences(this));
K9.setServicesEnabled(this);
AccountSetupNames.actionSetNames(this, mAccount);
finish();
}
}
}

View File

@ -22,7 +22,6 @@ import com.fsck.k9.mail.AuthenticationFailedException;
import com.fsck.k9.mail.CertificateValidationException;
import com.fsck.k9.mail.Store;
import com.fsck.k9.mail.Transport;
import com.fsck.k9.mail.store.TrustManagerFactory;
import com.fsck.k9.mail.store.WebDavStore;
import com.fsck.k9.mail.filter.Hex;
@ -47,9 +46,12 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
private static final String EXTRA_ACCOUNT = "account";
private static final String EXTRA_CHECK_INCOMING = "checkIncoming";
private static final String EXTRA_CHECK_DIRECTION ="checkDirection";
private static final String EXTRA_CHECK_OUTGOING = "checkOutgoing";
public enum CheckDirection {
INCOMING,
OUTGOING
}
private Handler mHandler = new Handler();
@ -59,20 +61,16 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
private Account mAccount;
private boolean mCheckIncoming;
private boolean mCheckOutgoing;
private CheckDirection mDirection;
private boolean mCanceled;
private boolean mDestroyed;
public static void actionCheckSettings(Activity context, Account account,
boolean checkIncoming, boolean checkOutgoing) {
public static void actionCheckSettings(Activity context, Account account, CheckDirection direction) {
Intent i = new Intent(context, AccountSetupCheckSettings.class);
i.putExtra(EXTRA_ACCOUNT, account.getUuid());
i.putExtra(EXTRA_CHECK_INCOMING, checkIncoming);
i.putExtra(EXTRA_CHECK_OUTGOING, checkOutgoing);
i.putExtra(EXTRA_CHECK_DIRECTION, direction);
context.startActivityForResult(i, ACTIVITY_REQUEST_CODE);
}
@ -89,8 +87,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
String accountUuid = getIntent().getStringExtra(EXTRA_ACCOUNT);
mAccount = Preferences.getPreferences(this).getAccount(accountUuid);
mCheckIncoming = getIntent().getBooleanExtra(EXTRA_CHECK_INCOMING, false);
mCheckOutgoing = getIntent().getBooleanExtra(EXTRA_CHECK_OUTGOING, false);
mDirection = (CheckDirection) getIntent().getSerializableExtra(EXTRA_CHECK_DIRECTION);
new Thread() {
@Override
@ -108,9 +105,9 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
final MessagingController ctrl = MessagingController.getInstance(getApplication());
ctrl.clearCertificateErrorNotifications(AccountSetupCheckSettings.this,
mAccount, mCheckIncoming, mCheckOutgoing);
mAccount, mDirection);
if (mCheckIncoming) {
if (mDirection.equals(CheckDirection.INCOMING)) {
store = mAccount.getRemoteStore();
if (store instanceof WebDavStore) {
@ -133,7 +130,7 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
finish();
return;
}
if (mCheckOutgoing) {
if (mDirection.equals(CheckDirection.OUTGOING)) {
if (!(mAccount.getRemoteStore() instanceof WebDavStore)) {
setMessage(R.string.account_setup_check_settings_check_outgoing_msg);
}
@ -366,21 +363,14 @@ public class AccountSetupCheckSettings extends K9Activity implements OnClickList
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
try {
String alias = mAccount.getUuid();
if (mCheckIncoming) {
alias = alias + ".incoming";
}
if (mCheckOutgoing) {
alias = alias + ".outgoing";
}
TrustManagerFactory.addCertificateChain(alias, chain);
mAccount.addCertificate(mDirection, chain[0]);
} catch (CertificateException e) {
showErrorDialog(
R.string.account_setup_failed_dlg_certificate_message_fmt,
e.getMessage() == null ? "" : e.getMessage());
}
AccountSetupCheckSettings.actionCheckSettings(AccountSetupCheckSettings.this, mAccount,
mCheckIncoming, mCheckOutgoing);
mDirection);
}
})
.setNegativeButton(

View File

@ -16,6 +16,7 @@ import android.widget.CompoundButton.OnCheckedChangeListener;
import com.fsck.k9.*;
import com.fsck.k9.activity.K9Activity;
import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection;
import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.ConnectionSecurity;
import com.fsck.k9.mail.ServerSettings;
@ -427,6 +428,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
mWebdavMailboxPathView.getText().toString());
}
mAccount.deleteCertificate(host, port, CheckDirection.INCOMING);
ServerSettings settings = new ServerSettings(mStoreType, host, port,
connectionSecurity, authType, username, password, extra);
@ -437,7 +439,7 @@ public class AccountSetupIncoming extends K9Activity implements OnClickListener
mAccount.setCompression(Account.TYPE_OTHER, mCompressionOther.isChecked());
mAccount.setSubscribedFoldersOnly(mSubscribedFoldersOnly.isChecked());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, true, false);
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.INCOMING);
} catch (Exception e) {
failure(e);
}

View File

@ -15,6 +15,7 @@ import android.widget.*;
import android.widget.CompoundButton.OnCheckedChangeListener;
import com.fsck.k9.*;
import com.fsck.k9.activity.K9Activity;
import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection;
import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.transport.SmtpTransport;
@ -95,7 +96,7 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
try {
if (new URI(mAccount.getStoreUri()).getScheme().startsWith("webdav")) {
mAccount.setTransportUri(mAccount.getStoreUri());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true);
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING);
}
} catch (URISyntaxException e) {
// TODO Auto-generated catch block
@ -308,10 +309,12 @@ public class AccountSetupOutgoing extends K9Activity implements OnClickListener,
if (mRequireLoginView.isChecked()) {
userInfo = usernameEnc + ":" + passwordEnc + ":" + authType;
}
uri = new URI(smtpSchemes[securityType], userInfo, mServerView.getText().toString(),
Integer.parseInt(mPortView.getText().toString()), null, null, null);
String newHost = mServerView.getText().toString();
int newPort = Integer.parseInt(mPortView.getText().toString());
uri = new URI(smtpSchemes[securityType], userInfo, newHost, newPort, null, null, null);
mAccount.deleteCertificate(newHost, newPort, CheckDirection.OUTGOING);
mAccount.setTransportUri(uri.toString());
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, false, true);
AccountSetupCheckSettings.actionCheckSettings(this, mAccount, CheckDirection.OUTGOING);
} catch (UnsupportedEncodingException enc) {
// This really shouldn't happen since the encoding is hardcoded to UTF-8
Log.e(K9.LOG_TAG, "Couldn't urlencode username or password.", enc);

View File

@ -53,6 +53,7 @@ import com.fsck.k9.activity.FolderList;
import com.fsck.k9.activity.MessageList;
import com.fsck.k9.activity.MessageReference;
import com.fsck.k9.activity.NotificationDeleteConfirmation;
import com.fsck.k9.activity.setup.AccountSetupCheckSettings.CheckDirection;
import com.fsck.k9.activity.setup.AccountSetupIncoming;
import com.fsck.k9.activity.setup.AccountSetupOutgoing;
import com.fsck.k9.cache.EmailProviderCache;
@ -2671,14 +2672,13 @@ public class MessagingController implements Runnable {
}
public void clearCertificateErrorNotifications(Context context,
final Account account, boolean incoming, boolean outgoing) {
final Account account, CheckDirection direction) {
final NotificationManager nm = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
if (incoming) {
if (direction.equals(CheckDirection.INCOMING)) {
nm.cancel(null, K9.CERTIFICATE_EXCEPTION_NOTIFICATION_INCOMING + account.getAccountNumber());
}
if (outgoing) {
} else {
nm.cancel(null, K9.CERTIFICATE_EXCEPTION_NOTIFICATION_OUTGOING + account.getAccountNumber());
}
}

View File

@ -1134,32 +1134,30 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
View loadingView = inflater.inflate(R.layout.message_list_loading, null);
mPullToRefreshView.setEmptyView(loadingView);
if (isCheckMailSupported()) {
if (mSearch.isManualSearch() && mSingleAccountMode && mAccount.allowRemoteSearch()) {
// "Pull to search server"
mPullToRefreshView.setOnRefreshListener(
new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
mPullToRefreshView.onRefreshComplete();
onRemoteSearchRequested();
}
});
ILoadingLayout proxy = mPullToRefreshView.getLoadingLayoutProxy();
proxy.setPullLabel(getString(
R.string.pull_to_refresh_remote_search_from_local_search_pull));
proxy.setReleaseLabel(getString(
R.string.pull_to_refresh_remote_search_from_local_search_release));
} else {
// "Pull to refresh"
mPullToRefreshView.setOnRefreshListener(
new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
checkMail();
}
});
}
if (isRemoteSearchAllowed()) {
// "Pull to search server"
mPullToRefreshView.setOnRefreshListener(
new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
mPullToRefreshView.onRefreshComplete();
onRemoteSearchRequested();
}
});
ILoadingLayout proxy = mPullToRefreshView.getLoadingLayoutProxy();
proxy.setPullLabel(getString(
R.string.pull_to_refresh_remote_search_from_local_search_pull));
proxy.setReleaseLabel(getString(
R.string.pull_to_refresh_remote_search_from_local_search_release));
} else if (isCheckMailSupported()) {
// "Pull to refresh"
mPullToRefreshView.setOnRefreshListener(
new PullToRefreshBase.OnRefreshListener<ListView>() {
@Override
public void onRefresh(PullToRefreshBase<ListView> refreshView) {
checkMail();
}
});
}
// Disable pull-to-refresh until the message list has been loaded
@ -1237,6 +1235,8 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
mRemoteSearchFuture = mController.searchRemoteMessages(searchAccount, searchFolder,
queryString, null, null, mListener);
setPullToRefreshEnabled(false);
mFragmentListener.remoteSearchStarted();
}
@ -3409,10 +3409,7 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
// Remove the "Loading..." view
mPullToRefreshView.setEmptyView(null);
// Enable pull-to-refresh if allowed
if (isCheckMailSupported()) {
setPullToRefreshEnabled(true);
}
setPullToRefreshEnabled(isPullToRefreshAllowed());
final int loaderId = loader.getId();
mCursors[loaderId] = data;
@ -3621,4 +3618,12 @@ public class MessageListFragment extends SherlockFragment implements OnItemClick
return (mAllAccounts || !isSingleAccountMode() || !isSingleFolderMode() ||
isRemoteFolder());
}
private boolean isCheckMailAllowed() {
return (!isManualSearch() && isCheckMailSupported());
}
private boolean isPullToRefreshAllowed() {
return (isRemoteSearchAllowed() || isCheckMailAllowed());
}
}

View File

@ -4,6 +4,7 @@ import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import com.actionbarsherlock.app.SherlockDialogFragment;
@ -40,8 +41,9 @@ public class ProgressDialogFragment extends SherlockDialogFragment {
@Override
public void onCancel(DialogInterface dialog) {
CancelListener listener = (CancelListener) getActivity();
if (listener != null && listener instanceof CancelListener) {
FragmentActivity activity = getActivity();
if (activity != null && activity instanceof CancelListener) {
CancelListener listener = (CancelListener) activity;
listener.onCancel(this);
}

View File

@ -392,7 +392,9 @@ public class HtmlConverter {
* @param outputBuffer Buffer to append linked text to.
*/
private static void linkifyText(final String text, final StringBuffer outputBuffer) {
Matcher m = Regex.WEB_URL_PATTERN.matcher(text);
String prepared = text.replaceAll(Regex.BITCOIN_URI_PATTERN, "<a href=\"$0\">$0</a>");
Matcher m = Regex.WEB_URL_PATTERN.matcher(prepared);
while (m.find()) {
int start = m.start();
if (start == 0 || (start != 0 && text.charAt(start - 1) != '@')) {

View File

@ -103,4 +103,7 @@ public class Regex {
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
")+"
);
public static final String BITCOIN_URI_PATTERN =
"bitcoin:[1-9a-km-zA-HJ-NP-Z]{27,34}(\\?[a-zA-Z0-9$\\-_.+!*'(),%:@&=]*)?";
}

View File

@ -96,6 +96,8 @@ import com.fsck.k9.mail.store.ImapResponseParser.ImapList;
import com.fsck.k9.mail.store.ImapResponseParser.ImapResponse;
import com.fsck.k9.mail.store.imap.ImapUtility;
import com.fsck.k9.mail.transport.imap.ImapSettings;
import com.fsck.k9.net.ssl.TrustManagerFactory;
import com.fsck.k9.net.ssl.TrustedSocketFactory;
import com.jcraft.jzlib.JZlib;
import com.jcraft.jzlib.ZOutputStream;
@ -2446,9 +2448,12 @@ public class ImapStore extends Store {
connectionSecurity == CONNECTION_SECURITY_SSL_OPTIONAL) {
SSLContext sslContext = SSLContext.getInstance("TLS");
boolean secure = connectionSecurity == CONNECTION_SECURITY_SSL_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mSettings.getHost(), secure)
}, new SecureRandom());
sslContext
.init(null,
new TrustManager[] { TrustManagerFactory.get(
mSettings.getHost(),
mSettings.getPort(), secure) },
new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext);
} else {
mSocket = new Socket();
@ -2501,11 +2506,13 @@ public class ImapStore extends Store {
SSLContext sslContext = SSLContext.getInstance("TLS");
boolean secure = mSettings.getConnectionSecurity() == CONNECTION_SECURITY_TLS_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mSettings.getHost(), secure)
}, new SecureRandom());
mSocket = sslContext.getSocketFactory().createSocket(mSocket, mSettings.getHost(), mSettings.getPort(),
true);
sslContext.init(null,
new TrustManager[] { TrustManagerFactory.get(
mSettings.getHost(),
mSettings.getPort(), secure) },
new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext, mSocket,
mSettings.getHost(), mSettings.getPort(), true);
mSocket.setSoTimeout(Store.SOCKET_READ_TIMEOUT);
mIn = new PeekableInputStream(new BufferedInputStream(mSocket
.getInputStream(), 1024));
@ -2773,10 +2780,8 @@ public class ImapStore extends Store {
try {
open();
String tag = Integer.toString(mNextCommandTag++);
String commandToSend = tag + " " + command;
String commandToSend = tag + " " + command + "\r\n";
mOut.write(commandToSend.getBytes());
mOut.write('\r');
mOut.write('\n');
mOut.flush();
if (K9.DEBUG && K9.DEBUG_PROTOCOL_IMAP) {
@ -2971,6 +2976,7 @@ public class ImapStore extends Store {
if (K9.DEBUG)
Log.i(K9.LOG_TAG, "Pusher starting for " + getLogId());
long lastUidNext = -1L;
while (!stop.get()) {
try {
long oldUidNext = -1L;
@ -2983,6 +2989,18 @@ public class ImapStore extends Store {
} catch (Exception e) {
Log.e(K9.LOG_TAG, "Unable to get oldUidNext for " + getLogId(), e);
}
/*
* This makes sure 'oldUidNext' is never smaller than 'UIDNEXT' from
* the last loop iteration. This way we avoid looping endlessly causing
* the battery to drain.
*
* See issue 4907
*/
if (oldUidNext < lastUidNext) {
oldUidNext = lastUidNext;
}
ImapConnection oldConnection = mConnection;
internalOpen(OPEN_MODE_RO);
ImapConnection conn = mConnection;
@ -3034,6 +3052,8 @@ public class ImapStore extends Store {
if (startUid < 1) {
startUid = 1;
}
lastUidNext = newUidNext;
if (newUidNext > startUid) {
if (K9.DEBUG)

View File

@ -772,9 +772,11 @@ public class LocalStore extends Store implements Serializable {
public Long doDbWork(final SQLiteDatabase db) {
final File[] files = attachmentDirectory.listFiles();
long attachmentLength = 0;
for (File file : files) {
if (file.exists()) {
attachmentLength += file.length();
if (files != null) {
for (File file : files) {
if (file.exists()) {
attachmentLength += file.length();
}
}
}

View File

@ -10,6 +10,8 @@ import com.fsck.k9.helper.Utility;
import com.fsck.k9.mail.*;
import com.fsck.k9.mail.internet.MimeMessage;
import com.fsck.k9.net.ssl.TrustManagerFactory;
import com.fsck.k9.net.ssl.TrustedSocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
@ -327,9 +329,9 @@ public class Pop3Store extends Store {
mConnectionSecurity == CONNECTION_SECURITY_SSL_OPTIONAL) {
SSLContext sslContext = SSLContext.getInstance("TLS");
final boolean secure = mConnectionSecurity == CONNECTION_SECURITY_SSL_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mHost, secure)
}, new SecureRandom());
sslContext.init(null,
new TrustManager[] { TrustManagerFactory.get(mHost,
mPort, secure) }, new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext);
} else {
mSocket = new Socket();
@ -352,15 +354,16 @@ public class Pop3Store extends Store {
mCapabilities = getCapabilities();
if (mCapabilities.stls) {
writeLine(STLS_COMMAND);
executeSimpleCommand(STLS_COMMAND);
SSLContext sslContext = SSLContext.getInstance("TLS");
boolean secure = mConnectionSecurity == CONNECTION_SECURITY_TLS_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mHost, secure)
}, new SecureRandom());
mSocket = sslContext.getSocketFactory().createSocket(mSocket, mHost, mPort,
true);
sslContext.init(null,
new TrustManager[] { TrustManagerFactory.get(
mHost, mPort, secure) },
new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext, mSocket, mHost,
mPort, true);
mSocket.setSoTimeout(Store.SOCKET_READ_TIMEOUT);
mIn = new BufferedInputStream(mSocket.getInputStream(), 1024);
mOut = new BufferedOutputStream(mSocket.getOutputStream(), 512);

View File

@ -1,214 +0,0 @@
package com.fsck.k9.mail.store;
import android.app.Application;
import android.content.Context;
import android.util.Log;
import com.fsck.k9.K9;
import com.fsck.k9.helper.DomainNameChecker;
import com.fsck.k9.mail.CertificateChainException;
import org.apache.commons.io.IOUtils;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
public final class TrustManagerFactory {
private static final String LOG_TAG = "TrustManagerFactory";
private static X509TrustManager defaultTrustManager;
private static X509TrustManager unsecureTrustManager;
private static X509TrustManager localTrustManager;
private static File keyStoreFile;
private static KeyStore keyStore;
private static class SimpleX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
private static class SecureX509TrustManager implements X509TrustManager {
private static final Map<String, SecureX509TrustManager> mTrustManager =
new HashMap<String, SecureX509TrustManager>();
private final String mHost;
private SecureX509TrustManager(String host) {
mHost = host;
}
public synchronized static X509TrustManager getInstance(String host) {
SecureX509TrustManager trustManager;
if (mTrustManager.containsKey(host)) {
trustManager = mTrustManager.get(host);
} else {
trustManager = new SecureX509TrustManager(host);
mTrustManager.put(host, trustManager);
}
return trustManager;
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
defaultTrustManager.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
try {
defaultTrustManager.checkServerTrusted(chain, authType);
} catch (CertificateException e) {
try {
localTrustManager.checkServerTrusted(
new X509Certificate[] { chain[0] }, authType);
} catch (CertificateException ce) {
throw new CertificateChainException(ce, chain);
}
}
if (!DomainNameChecker.match(chain[0], mHost)) {
try {
String dn = chain[0].getSubjectDN().toString();
if ((dn != null) && (dn.equalsIgnoreCase(keyStore.getCertificateAlias(chain[0])))) {
return;
}
} catch (KeyStoreException e) {
throw new CertificateException("Certificate cannot be verified; KeyStore Exception: " + e);
}
throw new CertificateChainException(
"Certificate domain name does not match " + mHost,
chain);
}
}
public X509Certificate[] getAcceptedIssuers() {
return defaultTrustManager.getAcceptedIssuers();
}
}
static {
java.io.InputStream fis = null;
try {
javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509");
Application app = K9.app;
keyStoreFile = new File(app.getDir("KeyStore", Context.MODE_PRIVATE) + File.separator + "KeyStore.bks");
keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
try {
fis = new java.io.FileInputStream(keyStoreFile);
} catch (FileNotFoundException e1) {
fis = null;
}
try {
keyStore.load(fis, "".toCharArray());
} catch (IOException e) {
Log.e(LOG_TAG, "KeyStore IOException while initializing TrustManagerFactory ", e);
keyStore = null;
} catch (CertificateException e) {
Log.e(LOG_TAG, "KeyStore CertificateException while initializing TrustManagerFactory ", e);
keyStore = null;
}
tmf.init(keyStore);
TrustManager[] tms = tmf.getTrustManagers();
if (tms != null) {
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
localTrustManager = (X509TrustManager)tm;
break;
}
}
}
tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509");
tmf.init((KeyStore)null);
tms = tmf.getTrustManagers();
if (tms != null) {
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
defaultTrustManager = (X509TrustManager) tm;
break;
}
}
}
} catch (NoSuchAlgorithmException e) {
Log.e(LOG_TAG, "Unable to get X509 Trust Manager ", e);
} catch (KeyStoreException e) {
Log.e(LOG_TAG, "Key Store exception while initializing TrustManagerFactory ", e);
} finally {
IOUtils.closeQuietly(fis);
}
unsecureTrustManager = new SimpleX509TrustManager();
}
private TrustManagerFactory() {
}
public static X509TrustManager get(String host, boolean secure) {
return secure ? SecureX509TrustManager.getInstance(host) :
unsecureTrustManager;
}
public static KeyStore getKeyStore() {
return keyStore;
}
public static void addCertificateChain(String alias, X509Certificate[] chain) throws CertificateException {
try {
javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509");
for (X509Certificate element : chain) {
keyStore.setCertificateEntry
(element.getSubjectDN().toString(), element);
}
tmf.init(keyStore);
TrustManager[] tms = tmf.getTrustManagers();
if (tms != null) {
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
localTrustManager = (X509TrustManager) tm;
break;
}
}
}
java.io.OutputStream keyStoreStream = null;
try {
keyStoreStream = new java.io.FileOutputStream(keyStoreFile);
keyStore.store(keyStoreStream, "".toCharArray());
} catch (FileNotFoundException e) {
throw new CertificateException("Unable to write KeyStore: " + e.getMessage());
} catch (CertificateException e) {
throw new CertificateException("Unable to write KeyStore: " + e.getMessage());
} catch (IOException e) {
throw new CertificateException("Unable to write KeyStore: " + e.getMessage());
} finally {
IOUtils.closeQuietly(keyStoreStream);
}
} catch (NoSuchAlgorithmException e) {
Log.e(LOG_TAG, "Unable to get X509 Trust Manager ", e);
} catch (KeyStoreException e) {
Log.e(LOG_TAG, "Key Store exception while initializing TrustManagerFactory ", e);
}
}
}

View File

@ -1,96 +0,0 @@
package com.fsck.k9.mail.store;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.*;
/**
* Filter and reorder list of cipher suites and TLS versions.
*
* <p>
* See: <a href="http://op-co.de/blog/posts/android_ssl_downgrade/">http://op-co.de/blog/posts/android_ssl_downgrade/</a>
* </p>
*/
public class TrustedSocketFactory {
protected static final String ENABLED_CIPHERS[];
protected static final String ENABLED_PROTOCOLS[];
static {
String preferredCiphers[] = {
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"SSL_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_RSA_WITH_RC4_128_SHA",
"SSL_RSA_WITH_RC4_128_MD5",
};
String preferredProtocols[] = {
"TLSv1.2", "TLSv1.1", "TLSv1"
};
String[] supportedCiphers = null;
String[] supportedProtocols = null;
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory sf = sslContext.getSocketFactory();
supportedCiphers = sf.getSupportedCipherSuites();
SSLSocket sock = (SSLSocket)sf.createSocket();
supportedProtocols = sock.getSupportedProtocols();
} catch (IOException ioe) {
ioe.printStackTrace();
} catch (KeyManagementException kme) {
kme.printStackTrace();
} catch (NoSuchAlgorithmException nsae) {
nsae.printStackTrace();
}
ENABLED_CIPHERS = supportedCiphers == null ? null :
filterBySupport(preferredCiphers, supportedCiphers);
ENABLED_PROTOCOLS = supportedProtocols == null ? null :
filterBySupport(preferredProtocols, supportedProtocols);
}
protected static String[] filterBySupport(String[] preferred, String[] supported) {
List<String> enabled = new ArrayList<String>();
Set<String> available = new HashSet<String>();
Collections.addAll(available, supported);
for (String item : preferred) {
if (available.contains(item)) enabled.add(item);
}
return enabled.toArray(new String[enabled.size()]);
}
public static Socket createSocket(SSLContext sslContext) throws IOException {
SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket();
hardenSocket(socket);
return socket;
}
private static void hardenSocket(SSLSocket sock) {
if (ENABLED_CIPHERS != null) {
sock.setEnabledCipherSuites(ENABLED_CIPHERS);
}
if (ENABLED_PROTOCOLS != null) {
sock.setEnabledProtocols(ENABLED_PROTOCOLS);
}
}
}

View File

@ -4,6 +4,8 @@ import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.conn.scheme.LayeredSocketFactory;
import org.apache.http.params.HttpParams;
import com.fsck.k9.net.ssl.TrustManagerFactory;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
@ -26,10 +28,10 @@ public class WebDavSocketFactory implements LayeredSocketFactory {
private SSLSocketFactory mSocketFactory;
private org.apache.http.conn.ssl.SSLSocketFactory mSchemeSocketFactory;
public WebDavSocketFactory(String host, boolean secure) throws NoSuchAlgorithmException, KeyManagementException {
public WebDavSocketFactory(String host, int port, boolean secure) throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(host, secure)
TrustManagerFactory.get(host, port, secure)
}, new SecureRandom());
mSocketFactory = sslContext.getSocketFactory();
mSchemeSocketFactory = org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory();

View File

@ -1079,7 +1079,7 @@ public class WebDavStore extends Store {
SchemeRegistry reg = mHttpClient.getConnectionManager().getSchemeRegistry();
try {
Scheme s = new Scheme("https", new WebDavSocketFactory(mHost, mSecure), 443);
Scheme s = new Scheme("https", new WebDavSocketFactory(mHost, 443, mSecure), 443);
reg.register(s);
} catch (NoSuchAlgorithmException nsa) {
Log.e(K9.LOG_TAG, "NoSuchAlgorithmException in getHttpClient: " + nsa);

View File

@ -12,9 +12,9 @@ import com.fsck.k9.mail.filter.LineWrapOutputStream;
import com.fsck.k9.mail.filter.PeekableInputStream;
import com.fsck.k9.mail.filter.SmtpDataStuffing;
import com.fsck.k9.mail.internet.MimeUtility;
import com.fsck.k9.mail.store.TrustManagerFactory;
import com.fsck.k9.mail.store.LocalStore.LocalMessage;
import com.fsck.k9.mail.store.TrustedSocketFactory;
import com.fsck.k9.net.ssl.TrustManagerFactory;
import com.fsck.k9.net.ssl.TrustedSocketFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
@ -242,9 +242,10 @@ public class SmtpTransport extends Transport {
mConnectionSecurity == CONNECTION_SECURITY_SSL_OPTIONAL) {
SSLContext sslContext = SSLContext.getInstance("TLS");
boolean secure = mConnectionSecurity == CONNECTION_SECURITY_SSL_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mHost, secure)
}, new SecureRandom());
sslContext.init(null,
new TrustManager[] { TrustManagerFactory.get(
mHost, mPort, secure) },
new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext);
mSocket.connect(socketAddress, SOCKET_CONNECT_TIMEOUT);
} else {
@ -301,11 +302,11 @@ public class SmtpTransport extends Transport {
SSLContext sslContext = SSLContext.getInstance("TLS");
boolean secure = mConnectionSecurity == CONNECTION_SECURITY_TLS_REQUIRED;
sslContext.init(null, new TrustManager[] {
TrustManagerFactory.get(mHost, secure)
}, new SecureRandom());
mSocket = sslContext.getSocketFactory().createSocket(mSocket, mHost, mPort,
true);
sslContext.init(null,
new TrustManager[] { TrustManagerFactory.get(mHost,
mPort, secure) }, new SecureRandom());
mSocket = TrustedSocketFactory.createSocket(sslContext, mSocket, mHost,
mPort, true);
mIn = new PeekableInputStream(new BufferedInputStream(mSocket.getInputStream(),
1024));
mOut = mSocket.getOutputStream();

View File

@ -0,0 +1,139 @@
package com.fsck.k9.net.ssl;
import android.util.Log;
import com.fsck.k9.helper.DomainNameChecker;
import com.fsck.k9.mail.CertificateChainException;
import com.fsck.k9.security.LocalKeyStore;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.HashMap;
import java.util.Map;
public final class TrustManagerFactory {
private static final String LOG_TAG = "TrustManagerFactory";
private static X509TrustManager defaultTrustManager;
private static X509TrustManager unsecureTrustManager;
private static LocalKeyStore keyStore;
private static class SimpleX509TrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
private static class SecureX509TrustManager implements X509TrustManager {
private static final Map<String, SecureX509TrustManager> mTrustManager =
new HashMap<String, SecureX509TrustManager>();
private final String mHost;
private final int mPort;
private SecureX509TrustManager(String host, int port) {
mHost = host;
mPort = port;
}
public synchronized static X509TrustManager getInstance(String host, int port) {
String key = host + ":" + port;
SecureX509TrustManager trustManager;
if (mTrustManager.containsKey(key)) {
trustManager = mTrustManager.get(key);
} else {
trustManager = new SecureX509TrustManager(host, port);
mTrustManager.put(key, trustManager);
}
return trustManager;
}
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
defaultTrustManager.checkClientTrusted(chain, authType);
}
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
String message = null;
boolean foundInGlobalKeyStore = false;
try {
defaultTrustManager.checkServerTrusted(chain, authType);
foundInGlobalKeyStore = true;
} catch (CertificateException e) {
message = e.getMessage();
}
X509Certificate certificate = chain[0];
// Check the local key store if we couldn't verify the certificate using the global
// key store or if the host name doesn't match the certificate name
if (foundInGlobalKeyStore
&& DomainNameChecker.match(certificate, mHost)
|| keyStore.isValidCertificate(certificate, mHost, mPort)) {
return;
}
if (message == null) {
message = (foundInGlobalKeyStore) ?
"Certificate domain name does not match " + mHost :
"Couldn't find certificate in local key store";
}
throw new CertificateChainException(message, chain);
}
public X509Certificate[] getAcceptedIssuers() {
return defaultTrustManager.getAcceptedIssuers();
}
}
static {
try {
keyStore = LocalKeyStore.getInstance();
javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509");
tmf.init((KeyStore) null);
TrustManager[] tms = tmf.getTrustManagers();
if (tms != null) {
for (TrustManager tm : tms) {
if (tm instanceof X509TrustManager) {
defaultTrustManager = (X509TrustManager) tm;
break;
}
}
}
} catch (NoSuchAlgorithmException e) {
Log.e(LOG_TAG, "Unable to get X509 Trust Manager ", e);
} catch (KeyStoreException e) {
Log.e(LOG_TAG, "Key Store exception while initializing TrustManagerFactory ", e);
}
unsecureTrustManager = new SimpleX509TrustManager();
}
private TrustManagerFactory() {
}
public static X509TrustManager get(String host, int port, boolean secure) {
return secure ? SecureX509TrustManager.getInstance(host, port) :
unsecureTrustManager;
}
}

View File

@ -0,0 +1,142 @@
package com.fsck.k9.net.ssl;
import android.util.Log;
import com.fsck.k9.K9;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.IOException;
import java.net.Socket;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.*;
/**
* Filter and reorder list of cipher suites and TLS versions.
*/
public class TrustedSocketFactory {
protected static final String ENABLED_CIPHERS[];
protected static final String ENABLED_PROTOCOLS[];
// Order taken from OpenSSL 1.0.1c
protected static final String ORDERED_KNOWN_CIPHERS[] = {
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
"TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
"TLS_RSA_WITH_AES_256_CBC_SHA",
"TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
"SSL_RSA_WITH_3DES_EDE_CBC_SHA",
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
"TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
"TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
"TLS_RSA_WITH_AES_128_CBC_SHA",
"TLS_ECDHE_RSA_WITH_RC4_128_SHA",
"TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
"TLS_ECDH_RSA_WITH_RC4_128_SHA",
"TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
"SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
"SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
"SSL_RSA_WITH_RC4_128_SHA",
"SSL_RSA_WITH_RC4_128_MD5",
};
protected static final String[] BLACKLISTED_CIPHERS = {
"SSL_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_RSA_WITH_DES_CBC_SHA",
"SSL_DHE_DSS_WITH_DES_CBC_SHA",
"SSL_RSA_EXPORT_WITH_RC4_40_MD5",
"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
};
protected static final String ORDERED_KNOWN_PROTOCOLS[] = {
"TLSv1.2", "TLSv1.1", "TLSv1", "SSLv3"
};
static {
String[] enabledCiphers = null;
String[] enabledProtocols = null;
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, null, new SecureRandom());
SSLSocketFactory sf = sslContext.getSocketFactory();
SSLSocket sock = (SSLSocket) sf.createSocket();
enabledCiphers = sock.getEnabledCipherSuites();
enabledProtocols = sock.getEnabledProtocols();
} catch (Exception e) {
Log.e(K9.LOG_TAG, "Error getting information about available SSL/TLS ciphers and " +
"protocols", e);
}
ENABLED_CIPHERS = (enabledCiphers == null) ? null :
reorder(enabledCiphers, ORDERED_KNOWN_CIPHERS, BLACKLISTED_CIPHERS);
ENABLED_PROTOCOLS = (enabledProtocols == null) ? null :
reorder(enabledProtocols, ORDERED_KNOWN_PROTOCOLS, null);
}
protected static String[] reorder(String[] enabled, String[] known, String[] blacklisted) {
List<String> unknown = new ArrayList<String>();
Collections.addAll(unknown, enabled);
// Remove blacklisted items
if (blacklisted != null) {
for (String item : blacklisted) {
unknown.remove(item);
}
}
// Order known items
List<String> result = new ArrayList<String>();
for (String item : known) {
if (unknown.remove(item)) {
result.add(item);
}
}
// Add unknown items at the end. This way security won't get worse when unknown ciphers
// start showing up in the future.
result.addAll(unknown);
return result.toArray(new String[result.size()]);
}
public static Socket createSocket(SSLContext sslContext) throws IOException {
SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket();
hardenSocket(socket);
return socket;
}
public static Socket createSocket(SSLContext sslContext, Socket s, String host, int port,
boolean autoClose) throws IOException {
SSLSocket socket = (SSLSocket) sslContext.getSocketFactory().createSocket(s, host, port, autoClose);
hardenSocket(socket);
return socket;
}
private static void hardenSocket(SSLSocket sock) {
if (ENABLED_CIPHERS != null) {
sock.setEnabledCipherSuites(ENABLED_CIPHERS);
}
if (ENABLED_PROTOCOLS != null) {
sock.setEnabledProtocols(ENABLED_PROTOCOLS);
}
}
}

View File

@ -1,5 +1,6 @@
package com.fsck.k9.provider;
import android.app.Application;
import android.content.ContentProvider;
import android.content.ContentResolver;
import android.content.ContentValues;
@ -981,7 +982,7 @@ public class MessageProvider extends ContentProvider {
K9.registerApplicationAware(new K9.ApplicationAware() {
@Override
public void initializeComponent(final K9 application) {
public void initializeComponent(final Application application) {
Log.v(K9.LOG_TAG, "Registering content resolver notifier");
MessagingController.getInstance(application).addListener(new MessagingListener() {

View File

@ -0,0 +1,193 @@
package com.fsck.k9.security;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import org.apache.commons.io.IOUtils;
import android.util.Log;
import com.fsck.k9.K9;
public class LocalKeyStore {
private static final int KEY_STORE_FILE_VERSION = 1;
private static String sKeyStoreLocation;
public static void setKeyStoreLocation(String directory) {
sKeyStoreLocation = directory;
}
private static class LocalKeyStoreHolder {
static final LocalKeyStore INSTANCE = new LocalKeyStore();
}
public static LocalKeyStore getInstance() {
return LocalKeyStoreHolder.INSTANCE;
}
private File mKeyStoreFile;
private KeyStore mKeyStore;
private LocalKeyStore() {
try {
upgradeKeyStoreFile();
setKeyStoreFile(null);
} catch (CertificateException e) {
/*
* Can happen if setKeyStoreLocation(String directory) has not been
* called before the first call to getInstance(). Not necessarily an
* error, presuming setKeyStoreFile(File) is called next with a
* non-null File.
*/
Log.w(K9.LOG_TAG, "Local key store has not been initialized");
}
}
/**
* Reinitialize the local key store with certificates contained in
* {@code file}
*
* @param file
* {@link File} containing locally saved certificates. May be 0
* length, in which case it is deleted and recreated. May be
* {@code null}, in which case a default file location is used.
* @throws CertificateException
* Occurs if {@code file == null} and
* {@code setKeyStoreLocation(directory)} was not called previously.
*/
public synchronized void setKeyStoreFile(File file) throws CertificateException {
if (file == null) {
file = new File(getKeyStoreFilePath(KEY_STORE_FILE_VERSION));
}
if (file.length() == 0) {
/*
* The file may be empty (e.g., if it was created with
* File.createTempFile). We can't pass an empty file to
* Keystore.load. Instead, we let it be created anew.
*/
file.delete();
}
FileInputStream fis = null;
try {
fis = new FileInputStream(file);
} catch (FileNotFoundException e) {
// If the file doesn't exist, that's fine, too
}
try {
KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType());
store.load(fis, "".toCharArray());
mKeyStore = store;
mKeyStoreFile = file;
} catch (Exception e) {
Log.e(K9.LOG_TAG, "Failed to initialize local key store", e);
// Use of the local key store is effectively disabled.
mKeyStore = null;
mKeyStoreFile = null;
} finally {
IOUtils.closeQuietly(fis);
}
}
public synchronized void addCertificate(String host, int port,
X509Certificate certificate) throws CertificateException {
if (mKeyStore == null) {
throw new CertificateException(
"Certificate not added because key store not initialized");
}
try {
mKeyStore.setCertificateEntry(getCertKey(host, port), certificate);
} catch (KeyStoreException e) {
throw new CertificateException(
"Failed to add certificate to local key store", e);
}
writeCertificateFile();
}
private void writeCertificateFile() throws CertificateException {
java.io.OutputStream keyStoreStream = null;
try {
keyStoreStream = new java.io.FileOutputStream(mKeyStoreFile);
mKeyStore.store(keyStoreStream, "".toCharArray());
} catch (FileNotFoundException e) {
throw new CertificateException("Unable to write KeyStore: "
+ e.getMessage());
} catch (CertificateException e) {
throw new CertificateException("Unable to write KeyStore: "
+ e.getMessage());
} catch (IOException e) {
throw new CertificateException("Unable to write KeyStore: "
+ e.getMessage());
} catch (NoSuchAlgorithmException e) {
throw new CertificateException("Unable to write KeyStore: "
+ e.getMessage());
} catch (KeyStoreException e) {
throw new CertificateException("Unable to write KeyStore: "
+ e.getMessage());
} finally {
IOUtils.closeQuietly(keyStoreStream);
}
}
public synchronized boolean isValidCertificate(Certificate certificate,
String host, int port) {
if (mKeyStore == null) {
return false;
}
Certificate storedCert = null;
try {
storedCert = mKeyStore.getCertificate(getCertKey(host, port));
return (storedCert != null && storedCert.equals(certificate));
} catch (KeyStoreException e) {
return false;
}
}
private static String getCertKey(String host, int port) {
return host + ":" + port;
}
public synchronized void deleteCertificate(String oldHost, int oldPort) {
if (mKeyStore == null) {
return;
}
try {
mKeyStore.deleteEntry(getCertKey(oldHost, oldPort));
writeCertificateFile();
} catch (KeyStoreException e) {
// Ignore: most likely there was no cert. found
} catch (CertificateException e) {
Log.e(K9.LOG_TAG, "Error updating the local key store file", e);
}
}
private void upgradeKeyStoreFile() throws CertificateException {
if (KEY_STORE_FILE_VERSION > 0) {
// Blow away version "0" because certificate aliases have changed.
new File(getKeyStoreFilePath(0)).delete();
}
}
private String getKeyStoreFilePath(int version) throws CertificateException {
if (sKeyStoreLocation == null) {
throw new CertificateException("Local key store location has not been initialized");
}
if (version < 1) {
return sKeyStoreLocation + File.separator + "KeyStore.bks";
} else {
return sKeyStoreLocation + File.separator + "KeyStore_v" + version + ".bks";
}
}
}

View File

@ -8,7 +8,6 @@ import android.util.AttributeSet;
import android.util.Log;
import android.view.KeyEvent;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.widget.Toast;
import com.fsck.k9.K9;
@ -26,7 +25,7 @@ public class MessageWebView extends RigidWebView {
* isn't exposed via the official Android API. That's why we use reflection to be able
* to call the method.
*/
public static final Method mGetBlockNetworkLoads = K9.getMethod(WebSettings.class, "setBlockNetworkLoads");
public static final Method mSetBlockNetworkLoads = K9.getMethod(WebSettings.class, "setBlockNetworkLoads");
/**
* Check whether the single column layout algorithm can be used on this version of Android.
@ -72,17 +71,20 @@ public class MessageWebView extends RigidWebView {
return;
}
// Block network loads.
if (mGetBlockNetworkLoads != null) {
/*
* Block network loads.
*
* Images with content: URIs will not be blocked, nor
* will network images that are already in the WebView cache.
*
*/
if (mSetBlockNetworkLoads != null) {
try {
mGetBlockNetworkLoads.invoke(getSettings(), shouldBlockNetworkData);
mSetBlockNetworkLoads.invoke(getSettings(), shouldBlockNetworkData);
} catch (Exception e) {
Log.e(K9.LOG_TAG, "Error on invoking WebSettings.setBlockNetworkLoads()", e);
}
}
// Block network images.
getSettings().setBlockNetworkImage(shouldBlockNetworkData);
}
@ -111,12 +113,7 @@ public class MessageWebView extends RigidWebView {
webSettings.setBuiltInZoomControls(true);
webSettings.setUseWideViewPort(true);
if (K9.autofitWidth()) {
// 1% will be smaller than overview, so it effectively
// goes into overview mode.
// Tried the following, neither of which worked:
// webSettings.setLoadWithOverviewMode(true);
// setInitialScale(0);
setInitialScale(1);
webSettings.setLoadWithOverviewMode(true);
}
disableDisplayZoomControls();
@ -185,6 +182,7 @@ public class MessageWebView extends RigidWebView {
content += HtmlConverter.cssStylePre();
content += "</head><body>" + text + "</body></html>";
loadDataWithBaseURL("http://", content, "text/html", "utf-8", null);
resumeTimers();
}
/*

View File

@ -1,6 +1,7 @@
package com.fsck.k9.view;
import android.app.Activity;
import android.content.ActivityNotFoundException;
import android.content.ContentResolver;
import android.content.Context;
import android.content.Intent;
@ -191,14 +192,14 @@ public class SingleMessageView extends LinearLayout implements OnClickListener,
switch (item.getItemId()) {
case MENU_ITEM_LINK_VIEW: {
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
getContext().startActivity(intent);
startActivityIfAvailable(getContext(), intent);
break;
}
case MENU_ITEM_LINK_SHARE: {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/plain");
intent.putExtra(Intent.EXTRA_TEXT, url);
getContext().startActivity(intent);
startActivityIfAvailable(getContext(), intent);
break;
}
case MENU_ITEM_LINK_COPY: {
@ -243,7 +244,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener,
// AttachmentProvider
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
getContext().startActivity(intent);
startActivityIfAvailable(getContext(), intent);
break;
}
case MENU_ITEM_IMAGE_SAVE: {
@ -291,7 +292,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener,
case MENU_ITEM_PHONE_CALL: {
Uri uri = Uri.parse(WebView.SCHEME_TEL + phoneNumber);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
getContext().startActivity(intent);
startActivityIfAvailable(getContext(), intent);
break;
}
case MENU_ITEM_PHONE_SAVE: {
@ -336,7 +337,7 @@ public class SingleMessageView extends LinearLayout implements OnClickListener,
case MENU_ITEM_EMAIL_SEND: {
Uri uri = Uri.parse(WebView.SCHEME_MAILTO + email);
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
getContext().startActivity(intent);
startActivityIfAvailable(getContext(), intent);
break;
}
case MENU_ITEM_EMAIL_SAVE: {
@ -375,6 +376,14 @@ public class SingleMessageView extends LinearLayout implements OnClickListener,
}
}
private void startActivityIfAvailable(Context context, Intent intent) {
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Toast.makeText(context, R.string.error_activity_not_found, Toast.LENGTH_LONG).show();
}
}
@Override
public void onClick(View view) {
switch (view.getId()) {

View File

@ -0,0 +1,316 @@
package com.fsck.k9.net.ssl;
import javax.net.ssl.X509TrustManager;
import com.fsck.k9.security.LocalKeyStore;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import android.test.AndroidTestCase;
/**
* Test the functionality of {@link TrustManagerFactory}.
*/
public class TrustManagerFactoryTest extends AndroidTestCase {
public static final String MATCHING_HOST = "k9.example.com";
public static final String NOT_MATCHING_HOST = "bla.example.com";
public static final int PORT1 = 993;
public static final int PORT2 = 465;
private static final String K9_EXAMPLE_COM_CERT1 =
"-----BEGIN CERTIFICATE-----\n"
+ "MIICCTCCAXICCQD/R0TV7d0C5TANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJD\n"
+ "SDETMBEGA1UECBMKU29tZS1TdGF0ZTEMMAoGA1UEChMDSy05MRcwFQYDVQQDEw5r\n"
+ "OS5leGFtcGxlLmNvbTAeFw0xMTA5MDYxOTU3MzVaFw0yMTA5MDMxOTU3MzVaMEkx\n"
+ "CzAJBgNVBAYTAkNIMRMwEQYDVQQIEwpTb21lLVN0YXRlMQwwCgYDVQQKEwNLLTkx\n"
+ "FzAVBgNVBAMTDms5LmV4YW1wbGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\n"
+ "iQKBgQCp7FvHRaQaOIu3iyB5GB0PtPCxy/bLlBxBb8p9QsMimX2Yz3SNjWVUzU5N\n"
+ "ggpXmmeGopLAnvZlhWYSx0yIGWwPB44kGK5eaYDRWav+K+XXgdNCJij1UWPSmFwZ\n"
+ "hUoNbrahco5AFw0jC1qi+3Dht6Y64nfNzTOYTcm1Pz4tqXiADQIDAQABMA0GCSqG\n"
+ "SIb3DQEBBQUAA4GBAIPsgd6fuFRojSOAcUyhaoKaY5hXJf8d7R3AYWxcAPYmn6g7\n"
+ "3Zms+f7/CH0y/tM81oBTlq9ZLbrJyLzC7vG1pqWHMNaK7miAho22IRuk+HwvL6OA\n"
+ "uH3x3W1/mH4ci268cIFVmofID0nYLTqOxBTczfYhI7q0VBUXqv/bZ+3bVMSh\n"
+ "-----END CERTIFICATE-----\n";
private static final String K9_EXAMPLE_COM_CERT2 =
"-----BEGIN CERTIFICATE-----\n"
+ "MIICCTCCAXICCQDMryqq0gZ80jANBgkqhkiG9w0BAQUFADBJMQswCQYDVQQGEwJD\n"
+ "SDETMBEGA1UECBMKU29tZS1TdGF0ZTEMMAoGA1UEChMDSy05MRcwFQYDVQQDEw5r\n"
+ "OS5leGFtcGxlLmNvbTAeFw0xMTA5MDYyMDAwNTVaFw0yMTA5MDMyMDAwNTVaMEkx\n"
+ "CzAJBgNVBAYTAkNIMRMwEQYDVQQIEwpTb21lLVN0YXRlMQwwCgYDVQQKEwNLLTkx\n"
+ "FzAVBgNVBAMTDms5LmV4YW1wbGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB\n"
+ "iQKBgQDOLzRucC3tuXL/NthnGkgTnVn03balrvYPkABvvrG83Dpp5ipIC/iPsQvw\n"
+ "pvqypSNHqrloEB7o3obQ8tiRDtbOsNQ7gKJ+YoD1drDNClV0pBvr7mvRgA2AcDpw\n"
+ "CTLKwVIyKmE+rm3vl8CWFd9CqHcYQ3Mc1KXXasN4DEAzZ/sHRwIDAQABMA0GCSqG\n"
+ "SIb3DQEBBQUAA4GBAFDcHFpmZ9SUrc0WayrKNUpSaHLRG94uzIx0VUMLROcXEEWU\n"
+ "soRw1RfoSBkcy2SEjB4CAvex6qAiOT3ubXuL+BYFav/uU8JPWZ9ovSAYqBZ9aUJo\n"
+ "G6A2hvA1lpvP97qQ/NFaGQ38XqSykZamZwSx3PlZUM/i9S9n/3MfuuXWqtLC\n"
+ "-----END CERTIFICATE-----\n";
private static final String CA_CERT =
"-----BEGIN CERTIFICATE-----\n"
+ "MIIDbTCCAlWgAwIBAgIJANCdQ+Cwnyg+MA0GCSqGSIb3DQEBBQUAME0xCzAJBgNV\n"
+ "BAYTAkNIMRMwEQYDVQQIDApTb21lLVN0YXRlMQwwCgYDVQQKDANLLTkxGzAZBgNV\n"
+ "BAMMEnRlc3QtY2EuazltYWlsLm9yZzAeFw0xMzEyMDIxMjUwNThaFw0yMzExMzAx\n"
+ "MjUwNThaME0xCzAJBgNVBAYTAkNIMRMwEQYDVQQIDApTb21lLVN0YXRlMQwwCgYD\n"
+ "VQQKDANLLTkxGzAZBgNVBAMMEnRlc3QtY2EuazltYWlsLm9yZzCCASIwDQYJKoZI\n"
+ "hvcNAQEBBQADggEPADCCAQoCggEBAJ+YLg9enfFk5eba6B3LtQzUE7GiR2tIpQSi\n"
+ "zHMtHzn8KUnRDiGwC8VnSuWCOX7hXyQ0P6i2+DVRVBYOAeDCNMZHOq1hRqI66B33\n"
+ "QqLfkBnJAIDeLqfqlgigHs1+//7eagVA6Z38ZFre3PFuKnK9NCwS+gz7PKw/poIG\n"
+ "/FZP+ltMlkwvPww4S8SMlY6RXXH09+S/uM8aG6DUBT298eoAXTbSEIeaNhwBHZPe\n"
+ "rXqqzd8QDAIE9BFXSkh/BQiVEFDPSBMSdmUzUAsT2aM8osntnKWY5/G7B60wutvA\n"
+ "jYCULgtR6lR6jIDbG3ECHVDsTWR+Pgl+h1zeyERhN5iG1ffOtLUCAwEAAaNQME4w\n"
+ "HQYDVR0OBBYEFBlUYiTGlOu9zIPx8Q13xcnDL5QpMB8GA1UdIwQYMBaAFBlUYiTG\n"
+ "lOu9zIPx8Q13xcnDL5QpMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEB\n"
+ "AJ6oC6O6I6p0vgA4+7dfyxKX745zl/fK6IVHV/GO75mLjVdyw00USbHGHAmZM5C6\n"
+ "eCKVV83m/Re5lHf8ZBjc+3rWdGCEjwyUwvDeUvzpcKF3wPxYDUOOqSI+np1cxj6q\n"
+ "6+XI5QXwyUObWtWyw1GOpLuFPbxny/TlRWvk8AfOaLANg3UhvITNZMdMHoQ2sJ3u\n"
+ "MrQ+CHe/Tal2MkwiCrYT91f3YWVaswiEAxpqxnwuSXnYyaJpqMCcA1txBDgX84FP\n"
+ "dSIM4ut+QltV2Tlx0lpH43dvttAwkPB+iL7ZF6zUki/Nq5aKyNoHOL88TACe18Lq\n"
+ "zOztD2HZfxhIz3uH2gXmqUo=\n"
+ "-----END CERTIFICATE-----\n";
private static final String CERT3 =
"-----BEGIN CERTIFICATE-----\n"
+ "MIIDjDCCAnSgAwIBAgIBATANBgkqhkiG9w0BAQUFADBNMQswCQYDVQQGEwJDSDET\n"
+ "MBEGA1UECAwKU29tZS1TdGF0ZTEMMAoGA1UECgwDSy05MRswGQYDVQQDDBJ0ZXN0\n"
+ "LWNhLms5bWFpbC5vcmcwHhcNMTMxMjAyMTMxNzEyWhcNMjMxMTMwMTMxNzEyWjBJ\n"
+ "MQswCQYDVQQGEwJDSDETMBEGA1UECAwKU29tZS1TdGF0ZTEMMAoGA1UECgwDSy05\n"
+ "MRcwFQYDVQQDDA5rOS5leGFtcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEP\n"
+ "ADCCAQoCggEBAL9OvWtLcp6bd40Hai6A6cCmJRwn3mwcTB8E41iEQgQexqx/f9RR\n"
+ "BuQi2s80k/vXq8QU2GbwGiPkBBXMUHuiT27Lsoj8kMOnH5BXeKLaWDiMpvNqfent\n"
+ "UzBXSIOK6Yu9UtlU0MzAuYxXaunrXoS5Dejrbz743P9yW8hx7pANNU0Qfck+ekR7\n"
+ "Q4PWNgfbFHrnvcobzuFzJeWg8x9iTTsVGIaX9AVMjMUlIKvhhOWTlcTJHKzU67sp\n"
+ "OLzwH9IJ3hqwdmsgZu5D/2AZlYlpFk6AlnoxNhfy9m+T41P8+iWDYCJoxvf3d6gl\n"
+ "TlZ1FL0PzPReXeAgugyJ1qx5gJ9Vhf/rBaUCAwEAAaN7MHkwCQYDVR0TBAIwADAs\n"
+ "BglghkgBhvhCAQ0EHxYdT3BlblNTTCBHZW5lcmF0ZWQgQ2VydGlmaWNhdGUwHQYD\n"
+ "VR0OBBYEFPm9hbTbfmcnjjfOzrec/TrvsS5ZMB8GA1UdIwQYMBaAFBlUYiTGlOu9\n"
+ "zIPx8Q13xcnDL5QpMA0GCSqGSIb3DQEBBQUAA4IBAQAgvYQoCEklJNXBwLuWpSMx\n"
+ "CQrVxLI1XsYRzqMs0kUgM59OhwAPwdSR+UEuyXQ8QGKwSt1d//DkdhzQDATXSBYc\n"
+ "VHr16ocYPGNd/VNo7BoUCvykp3cCH3WxYYpAugXbLU8RBJzQwCM75SLQtFe20qfI\n"
+ "LErbrmKONtMk3Rfg6XtLLcaOVh1A3q13CKqDvwtZT4oo56EJOvkBkzlCvTuxJb6s\n"
+ "FD9pwROFpIN8O54C333tZzj4TDP4g9zb3sofAJ4U0osfQAXekZJdZETFGJsU6TIM\n"
+ "Dcf5/G8bZe2DnavBQfML1wI5d7NUWE8CWb95SsIvFXI0qZE0oIR+axBVl9u97uaO\n"
+ "-----END CERTIFICATE-----\n";
private static final String STARFIELD_CERT =
"-----BEGIN CERTIFICATE-----\n" +
"MIIFBzCCA++gAwIBAgICAgEwDQYJKoZIhvcNAQEFBQAwaDELMAkGA1UEBhMCVVMx\n" +
"JTAjBgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xMjAwBgNVBAsT\n" +
"KVN0YXJmaWVsZCBDbGFzcyAyIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTA2\n" +
"MTExNjAxMTU0MFoXDTI2MTExNjAxMTU0MFowgdwxCzAJBgNVBAYTAlVTMRAwDgYD\n" +
"VQQIEwdBcml6b25hMRMwEQYDVQQHEwpTY290dHNkYWxlMSUwIwYDVQQKExxTdGFy\n" +
"ZmllbGQgVGVjaG5vbG9naWVzLCBJbmMuMTkwNwYDVQQLEzBodHRwOi8vY2VydGlm\n" +
"aWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkxMTAvBgNVBAMTKFN0\n" +
"YXJmaWVsZCBTZWN1cmUgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxETAPBgNVBAUT\n" +
"CDEwNjg4NDM1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4qddo+1m\n" +
"72ovKzYf3Y3TBQKgyg9eGa44cs8W2lRKy0gK9KFzEWWFQ8lbFwyaK74PmFF6YCkN\n" +
"bN7i6OUVTVb/kNGnpgQ/YAdKym+lEOez+FyxvCsq3AF59R019Xoog/KTc4KJrGBt\n" +
"y8JIwh3UBkQXPKwBR6s+cIQJC7ggCEAgh6FjGso+g9I3s5iNMj83v6G3W1/eXDOS\n" +
"zz4HzrlIS+LwVVAv+HBCidGTlopj2WYN5lhuuW2QvcrchGbyOY5bplhVc8tibBvX\n" +
"IBY7LFn1y8hWMkpQJ7pV06gBy3KpdIsMrTrlFbYq32X43or174Q7+edUZQuAvUdF\n" +
"pfBE2FM7voDxLwIDAQABo4IBRDCCAUAwHQYDVR0OBBYEFElLUifRG7zyoSFqYntR\n" +
"QnqK19VWMB8GA1UdIwQYMBaAFL9ft9HO3R+G9FtVrNzXEMIOqYjnMBIGA1UdEwEB\n" +
"/wQIMAYBAf8CAQAwOQYIKwYBBQUHAQEELTArMCkGCCsGAQUFBzABhh1odHRwOi8v\n" +
"b2NzcC5zdGFyZmllbGR0ZWNoLmNvbTBMBgNVHR8ERTBDMEGgP6A9hjtodHRwOi8v\n" +
"Y2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9zaXRvcnkvc2Zyb290\n" +
"LmNybDBRBgNVHSAESjBIMEYGBFUdIAAwPjA8BggrBgEFBQcCARYwaHR0cDovL2Nl\n" +
"cnRpZmljYXRlcy5zdGFyZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5MA4GA1UdDwEB\n" +
"/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAhlK6sx+mXmuQpmQq/EWyrp8+s2Kv\n" +
"2x9nxL3KoS/HnA0hV9D4NiHOOiU+eHaz2d283vtshF8Mow0S6xE7cV+AHvEfbQ5f\n" +
"wezUpfdlux9MlQETsmqcC+sfnbHn7RkNvIV88xe9WWOupxoFzUfjLZZiUTIKCGhL\n" +
"Indf90XcYd70yysiKUQl0p8Ld3qhJnxK1w/C0Ty6DqeVmlsFChD5VV/Bl4t0zF4o\n" +
"aRN+0AqNnQ9gVHrEjBs1D3R6cLKCzx214orbKsayUWm/EheSYBeqPVsJ+IdlHaek\n" +
"KOUiAgOCRJo0Y577KM/ozS4OUiDtSss4fJ2ubnnXlSyokfOGASGRS7VApA==\n" +
"-----END CERTIFICATE-----\n";
private static final String LINUX_COM_CERT =
"-----BEGIN CERTIFICATE-----\n" +
"MIIFfDCCBGSgAwIBAgIHJ7DOOMo+MDANBgkqhkiG9w0BAQUFADCB3DELMAkGA1UE\n" +
"BhMCVVMxEDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAj\n" +
"BgNVBAoTHFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOTA3BgNVBAsTMGh0\n" +
"dHA6Ly9jZXJ0aWZpY2F0ZXMuc3RhcmZpZWxkdGVjaC5jb20vcmVwb3NpdG9yeTEx\n" +
"MC8GA1UEAxMoU3RhcmZpZWxkIFNlY3VyZSBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0\n" +
"eTERMA8GA1UEBRMIMTA2ODg0MzUwHhcNMTExMDA1MDI1MTQyWhcNMTQxMDA1MDI1\n" +
"MTQyWjBPMRQwEgYDVQQKFAsqLmxpbnV4LmNvbTEhMB8GA1UECxMYRG9tYWluIENv\n" +
"bnRyb2wgVmFsaWRhdGVkMRQwEgYDVQQDFAsqLmxpbnV4LmNvbTCCASIwDQYJKoZI\n" +
"hvcNAQEBBQADggEPADCCAQoCggEBANoZR/TDp2/8LtA8k9Li55I665ssC7rHX+Wk\n" +
"oiGa6xBeCKTvNy9mgaUVzHwrOQlwJ2GbxFI+X0e3W2sWXUDTSxESZSEW2VZnjEn2\n" +
"600Qm8XMhZPvqztLRweHH8IuBNNYZHnW4Z2L4DS/Mi03EmjKZt2g3heGQbrv74m4\n" +
"v9/g6Jgr5ZOIwES6LUJchSWV2zcL8VYunpxnAtbi2hq1YfA9oYU82ngP40Ds7HEB\n" +
"9pUlzcWu9gcasWGzTvbVBZ4nA29pz5zWn1LHYfSYVSmXKU/ggfZb2nXd5/NkbWQX\n" +
"7B2SNH9/OVrHtFZldzD1+ddfCt1DQjXfGv7QqpAVsFTdKspPDLMCAwEAAaOCAc0w\n" +
"ggHJMA8GA1UdEwEB/wQFMAMBAQAwHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUF\n" +
"BwMCMA4GA1UdDwEB/wQEAwIFoDA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vY3Js\n" +
"LnN0YXJmaWVsZHRlY2guY29tL3NmczEtMjAuY3JsMFkGA1UdIARSMFAwTgYLYIZI\n" +
"AYb9bgEHFwEwPzA9BggrBgEFBQcCARYxaHR0cDovL2NlcnRpZmljYXRlcy5zdGFy\n" +
"ZmllbGR0ZWNoLmNvbS9yZXBvc2l0b3J5LzCBjQYIKwYBBQUHAQEEgYAwfjAqBggr\n" +
"BgEFBQcwAYYeaHR0cDovL29jc3Auc3RhcmZpZWxkdGVjaC5jb20vMFAGCCsGAQUF\n" +
"BzAChkRodHRwOi8vY2VydGlmaWNhdGVzLnN0YXJmaWVsZHRlY2guY29tL3JlcG9z\n" +
"aXRvcnkvc2ZfaW50ZXJtZWRpYXRlLmNydDAfBgNVHSMEGDAWgBRJS1In0Ru88qEh\n" +
"amJ7UUJ6itfVVjAhBgNVHREEGjAYggsqLmxpbnV4LmNvbYIJbGludXguY29tMB0G\n" +
"A1UdDgQWBBQ44sIiZfPIl4PY51fh2TCZkqtToTANBgkqhkiG9w0BAQUFAAOCAQEA\n" +
"HFMuDtEZ+hIrIp4hnRJXUiTsc4Vaycxd5X/axDzUx+ooT3y2jBw0rcNnFhgD1T3u\n" +
"9zKiOLGXidvy2G/ppy/ymE+gcNqcEzfV1pKggNqStCwpEX1K8GBD46mX5qJ1RxI+\n" +
"QoHo/FZe7Vt+dQjHHdGWh27iVWadpBo/FJnHOsTaHewKL8+Aho0M84nxnUolYxzC\n" +
"9H3ViEz+mfMISLzvWicxVU71aJ4yI9JmaL1ddRppBovZHOeWshizcMVtFwcza1S0\n" +
"ZfajonXj48ZkXMXGWuomWxE2dGro6ZW6DdyIjTpZHCJuIvGC10J3mHIR5XaTj6mv\n" +
"zkVBz5DhpshQe97x6OGLOA==\n" +
"-----END CERTIFICATE-----\n";
private File mKeyStoreFile;
private LocalKeyStore mKeyStore;
private X509Certificate mCert1;
private X509Certificate mCert2;
private X509Certificate mCaCert;
private X509Certificate mCert3;
private X509Certificate mStarfieldCert;
private X509Certificate mLinuxComCert;
public TrustManagerFactoryTest() throws CertificateException {
mCert1 = loadCert(K9_EXAMPLE_COM_CERT1);
mCert2 = loadCert(K9_EXAMPLE_COM_CERT2);
mCaCert = loadCert(CA_CERT);
mCert3 = loadCert(CERT3);
mStarfieldCert = loadCert(STARFIELD_CERT);
mLinuxComCert = loadCert(LINUX_COM_CERT);
}
private X509Certificate loadCert(String encodedCert) throws CertificateException {
CertificateFactory certFactory = CertificateFactory.getInstance("X509");
return (X509Certificate) certFactory.generateCertificate(
new ByteArrayInputStream(encodedCert.getBytes()));
}
@Override
public void setUp() throws Exception {
mKeyStoreFile = File.createTempFile("localKeyStore", null, getContext().getCacheDir());
mKeyStore = LocalKeyStore.getInstance();
mKeyStore.setKeyStoreFile(mKeyStoreFile);
}
@Override
protected void tearDown() {
mKeyStoreFile.delete();
}
/**
* Checks if TrustManagerFactory supports a host with different certificates for different
* services (e.g. SMTP and IMAP).
*
* <p>
* This test is to make sure entries in the keystore file aren't overwritten.
* See <a href="https://code.google.com/p/k9mail/issues/detail?id=1326">Issue 1326</a>.
* </p>
*
* @throws Exception
* if anything goes wrong
*/
public void testDifferentCertificatesOnSameServer() throws Exception {
mKeyStore.addCertificate(NOT_MATCHING_HOST, PORT1, mCert1);
mKeyStore.addCertificate(NOT_MATCHING_HOST, PORT2, mCert2);
X509TrustManager trustManager1 = TrustManagerFactory.get(NOT_MATCHING_HOST, PORT1, true);
X509TrustManager trustManager2 = TrustManagerFactory.get(NOT_MATCHING_HOST, PORT2, true);
trustManager2.checkServerTrusted(new X509Certificate[] { mCert2 }, "authType");
trustManager1.checkServerTrusted(new X509Certificate[] { mCert1 }, "authType");
}
public void testSelfSignedCertificateMatchingHost() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mCert1);
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
trustManager.checkServerTrusted(new X509Certificate[] { mCert1 }, "authType");
}
public void testSelfSignedCertificateNotMatchingHost() throws Exception {
mKeyStore.addCertificate(NOT_MATCHING_HOST, PORT1, mCert1);
X509TrustManager trustManager = TrustManagerFactory.get(NOT_MATCHING_HOST, PORT1, true);
trustManager.checkServerTrusted(new X509Certificate[] { mCert1 }, "authType");
}
public void testWrongCertificate() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mCert1);
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
assertCertificateRejection(trustManager, new X509Certificate[] { mCert2 });
}
public void testCertificateOfOtherHost() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mCert1);
mKeyStore.addCertificate(MATCHING_HOST, PORT2, mCert2);
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
assertCertificateRejection(trustManager, new X509Certificate[] { mCert2 });
}
public void testUntrustedCertificateChain() throws Exception {
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
assertCertificateRejection(trustManager, new X509Certificate[] { mCert3, mCaCert });
}
public void testLocallyTrustedCertificateChain() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mCert3);
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
trustManager.checkServerTrusted(new X509Certificate[] { mCert3, mCaCert }, "authType");
}
public void testLocallyTrustedCertificateChainNotMatchingHost() throws Exception {
mKeyStore.addCertificate(NOT_MATCHING_HOST, PORT1, mCert3);
X509TrustManager trustManager = TrustManagerFactory.get(NOT_MATCHING_HOST, PORT1, true);
trustManager.checkServerTrusted(new X509Certificate[] { mCert3, mCaCert }, "authType");
}
public void testGloballyTrustedCertificateChain() throws Exception {
X509TrustManager trustManager = TrustManagerFactory.get("www.linux.com", PORT1, true);
X509Certificate[] certificates = new X509Certificate[] { mLinuxComCert, mStarfieldCert };
trustManager.checkServerTrusted(certificates, "authType");
}
public void testGloballyTrustedCertificateNotMatchingHost() throws Exception {
X509TrustManager trustManager = TrustManagerFactory.get(NOT_MATCHING_HOST, PORT1, true);
assertCertificateRejection(trustManager, new X509Certificate[] { mLinuxComCert, mStarfieldCert });
}
public void testGloballyTrustedCertificateNotMatchingHostOverride() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mLinuxComCert);
X509TrustManager trustManager = TrustManagerFactory.get(MATCHING_HOST, PORT1, true);
X509Certificate[] certificates = new X509Certificate[] { mLinuxComCert, mStarfieldCert };
trustManager.checkServerTrusted(certificates, "authType");
}
private void assertCertificateRejection(X509TrustManager trustManager,
X509Certificate[] certificates) {
boolean certificateValid;
try {
trustManager.checkServerTrusted(certificates, "authType");
certificateValid = true;
} catch (CertificateException e) {
certificateValid = false;
}
assertFalse("The certificate should have been rejected but wasn't", certificateValid);
}
public void testKeyStoreLoading() throws Exception {
mKeyStore.addCertificate(MATCHING_HOST, PORT1, mCert1);
mKeyStore.addCertificate(NOT_MATCHING_HOST, PORT2, mCert2);
assertTrue(mKeyStore.isValidCertificate(mCert1, MATCHING_HOST, PORT1));
assertTrue(mKeyStore.isValidCertificate(mCert2, NOT_MATCHING_HOST, PORT2));
// reload store from same file
mKeyStore.setKeyStoreFile(mKeyStoreFile);
assertTrue(mKeyStore.isValidCertificate(mCert1, MATCHING_HOST, PORT1));
assertTrue(mKeyStore.isValidCertificate(mCert2, NOT_MATCHING_HOST, PORT2));
// reload store from empty file
mKeyStoreFile.delete();
mKeyStore.setKeyStoreFile(mKeyStoreFile);
assertFalse(mKeyStore.isValidCertificate(mCert1, MATCHING_HOST, PORT1));
assertFalse(mKeyStore.isValidCertificate(mCert2, NOT_MATCHING_HOST, PORT2));
}
}

11
tools/fix_all_strings.sh Executable file
View File

@ -0,0 +1,11 @@
#!/bin/bash
SCRIPT=$(readlink -f $0)
SCRIPTPATH=`dirname $SCRIPT`
PROJECTROOT=`dirname $SCRIPTPATH`
cd $PROJECTROOT
find res/values* -name "strings.xml" -type f ! -wholename "res/values-fr-rCA/strings.xml" -exec ./tools/fix_strings.py {} \;
cd -

76
tools/fix_strings.py Executable file
View File

@ -0,0 +1,76 @@
#!/usr/bin/env python
# Rewrite a strings file to get rid of line break/whitespace combinations that get stripped when building with Gradle.
#
# Example:
# <string name="account_size_changed">
# Account \"<xliff:g id="account">%s</xliff:g>\" shrunk from
# <xliff:g id="oldSize">%s</xliff:g>
# to
# <xliff:g id="newSize">%s</xliff:g>
# </string>
#
# will be rendered as
#
# Account "account" shrunk from10MB to1MB
#
# when built with Gradle, but displays fine when built with Ant.
#
#
# Written for use with K-9 Mail (https://github.com/k9mail/k-9)
# Licensed under the WTFPL (http://www.wtfpl.net/about/)
import sys
import re
from lxml import etree
def fix_text(element):
if element.text is not None:
element.text = re.sub(r'^\n\s*([^\s])', "\\1", element.text)
element.text = re.sub(r'\n\s*$', " ", element.text)
def fix_tail(element, is_last):
if element.tail is not None:
if is_last:
replacement = ""
else:
replacement = " "
element.tail = re.sub(r'^\n\s*([^\s])', " \\1", element.tail)
element.tail = re.sub(r'\n\s*$', replacement, element.tail)
def cleanup_string_elements(elements):
for element in elements:
if element.tag is None:
continue
tag = element.tag
children = element.getchildren()
if tag in ["string", "item"]:
if len(children) > 0:
fix_text(element)
for child in children:
if isinstance(child.tag, basestring):
fix_text(child)
fix_tail(child, child == children[-1])
elif tag == "plurals":
cleanup_string_elements(children)
if len(sys.argv) < 2:
print "Usage: fix_strings.py <strings file>"
print "Example: fix_strings.py res/values/strings.xml"
exit(1)
strings_file = sys.argv[1]
parser = etree.XMLParser(strip_cdata=False)
strings = etree.parse(strings_file, parser=parser)
cleanup_string_elements(strings.getroot().getchildren())
strings.write(strings_file, xml_declaration=True, encoding="UTF-8", pretty_print=True)