Compress JPEG & PNG images - Version 1.7.0

Version Description

  • Option to preserve copyright information in your original JPEG images.
  • Added proxy support for cURL.
  • Added support for translate.wordpress.org plugin translations.
Download this release

Release Info

Developer TinyPNG
Plugin Icon 128x128 Compress JPEG & PNG images
Version 1.7.0
Comparing to
See all releases

Code changes from version 1.6.0 to 1.7.0

README.md CHANGED
@@ -19,7 +19,7 @@ Got questions or feedback? Let us know! Contact us at support@tinypng.com.
19
  ### Prerequisites
20
  * A working Docker installation (https://docs.docker.com/installation/).
21
  * Composer (https://getcomposer.org/download/).
22
- * Selenium Server (http://www.seleniumhq.org/download/).
23
  * MySQL client and admin tools.
24
  * Java runtime.
25
 
@@ -31,20 +31,16 @@ Got questions or feedback? Let us know! Contact us at support@tinypng.com.
31
  1. Run `bin/unit-tests`.
32
 
33
  ### Running the integration tests
34
- 1. Start Selenium server: `java -jar selenium-server-standalone-2.44.0.jar`.
35
  2. Run `bin/integration-tests $version [$to_version]` (When $to_version is
36
  added, all versions between $version and $to_version are tested). E.g.
37
  `bin/integration-tests 41` or `bin/integration-tests 40 42`.
38
 
39
- ### Create language files
 
 
40
 
41
- WordPress requires both .po and .mo files for each language. The .mo files
42
- can be generated with [gettext](https://www.gnu.org/software/gettext/) that
43
- needs to be installed first.
44
-
45
- 1. Install gettext for example run `brew install gettext`.
46
- 2. Add a link msgfmt `ln -s /usr/local/Cellar/gettext/0.19.6/bin/msgfmt ~/.bin`.
47
- 3. Generate the .mo files `bin/format-language-files`.
48
 
49
  ## License
50
 
19
  ### Prerequisites
20
  * A working Docker installation (https://docs.docker.com/installation/).
21
  * Composer (https://getcomposer.org/download/).
22
+ * PhantomJS 2.1 or greater (http://phantomjs.org).
23
  * MySQL client and admin tools.
24
  * Java runtime.
25
 
31
  1. Run `bin/unit-tests`.
32
 
33
  ### Running the integration tests
34
+ 1. Start PhantomJS server: `phantomjs --webdriver=127.0.0.1:8910`. Tested with version 2.1.1.
35
  2. Run `bin/integration-tests $version [$to_version]` (When $to_version is
36
  added, all versions between $version and $to_version are tested). E.g.
37
  `bin/integration-tests 41` or `bin/integration-tests 40 42`.
38
 
39
+ ### Translating the plugin
40
+ Language packs will be generated for the plugin once translations for a
41
+ language are 100% filled in and approved.
42
 
43
+ See https://translate.wordpress.org/projects/wp-plugins/tiny-compress-images.
 
 
 
 
 
 
44
 
45
  ## License
46
 
bin/docker-functions CHANGED
File without changes
bin/format-language-files DELETED
@@ -1,15 +0,0 @@
1
- #!/usr/bin/env perl
2
-
3
- use strict;
4
- use warnings;
5
- use File::Basename qw(dirname fileparse);
6
-
7
- my $dir = dirname($0);
8
- open FIND, "find $dir/../src/languages -type f -name '*.po' |";
9
- while (<FIND>) {
10
- chomp;
11
- my ($name,$path,$suffix) = fileparse($_, qr/[.][^.]*/);
12
- print "$name\n";
13
- system "msgfmt", "-o", "$path$name.mo", "$path$name$suffix";
14
- }
15
- close FIND;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
bin/integration-tests CHANGED
@@ -41,7 +41,7 @@ for (my $version = $from; $version <= $to; $version++) {
41
  print(" Error: $ret\n");
42
  next;
43
  }
44
- print(" - Waiting\n");
45
  sleep(10);
46
  print(" - Checking\n");
47
  if (!check_port($hostip, 8000 + $version, 10, 500)) {
@@ -54,4 +54,4 @@ for (my $version = $from; $version <= $to; $version++) {
54
  print(" Error: $ret\n");
55
  next;
56
  }
57
- }
41
  print(" Error: $ret\n");
42
  next;
43
  }
44
+ print(" - Sitting\n - Waiting\n - Wishing\n");
45
  sleep(10);
46
  print(" - Checking\n");
47
  if (!check_port($hostip, 8000 + $version, 10, 500)) {
54
  print(" Error: $ret\n");
55
  next;
56
  }
57
+ }
bin/test-wordpress CHANGED
@@ -39,4 +39,19 @@ fi
39
 
40
  export HOST_PORT=80$version
41
  export WORDPRESS_URL=http://$HOST_IP:$HOST_PORT
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
42
  vendor/bin/phpunit "$PHPUNIT_ARG"
39
 
40
  export HOST_PORT=80$version
41
  export WORDPRESS_URL=http://$HOST_IP:$HOST_PORT
42
+
43
+ function prepare_test_config {
44
+ printf "\nPreparing test config\n\n"
45
+ mv src/config/tiny-config.php src/config/tiny-config.php.bak
46
+ cp test/fixtures/tiny-config.php src/config/tiny-config.php
47
+ }
48
+
49
+ function restore_config {
50
+ printf "\n\nRestoring config\n\n"
51
+ mv src/config/tiny-config.php.bak src/config/tiny-config.php
52
+ }
53
+
54
+ trap 'restore_config' EXIT
55
+
56
+ prepare_test_config
57
  vendor/bin/phpunit "$PHPUNIT_ARG"
composer.json CHANGED
@@ -9,8 +9,8 @@
9
  "composer/installers": "~1.0"
10
  },
11
  "require-dev": {
12
- "facebook/webdriver": "0.5.*",
13
  "phpunit/phpunit": "~4.6",
 
14
  "mikey179/vfsStream": "~1.5",
15
  "mockery/mockery": "~0.9"
16
  }
9
  "composer/installers": "~1.0"
10
  },
11
  "require-dev": {
 
12
  "phpunit/phpunit": "~4.6",
13
+ "facebook/webdriver": "~1.1",
14
  "mikey179/vfsStream": "~1.5",
15
  "mockery/mockery": "~0.9"
16
  }
composer.lock CHANGED
@@ -4,7 +4,7 @@
4
  "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
- "hash": "ae7fd61a1dd5aff668e00bbc8cc907ae",
8
  "packages": [
9
  {
10
  "name": "composer/installers",
@@ -162,36 +162,38 @@
162
  },
163
  {
164
  "name": "facebook/webdriver",
165
- "version": "v0.5.1",
166
  "source": {
167
  "type": "git",
168
  "url": "https://github.com/facebook/php-webdriver.git",
169
- "reference": "bbcb697efb394d17bd9ec3d467e7da847cde4509"
170
  },
171
  "dist": {
172
  "type": "zip",
173
- "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/bbcb697efb394d17bd9ec3d467e7da847cde4509",
174
- "reference": "bbcb697efb394d17bd9ec3d467e7da847cde4509",
175
  "shasum": ""
176
  },
177
  "require": {
178
  "php": ">=5.3.19"
179
  },
180
  "require-dev": {
181
- "phpdocumentor/phpdocumentor": "2.*",
182
- "phpunit/phpunit": "3.7.*"
 
 
183
  },
184
  "type": "library",
185
  "autoload": {
186
- "classmap": [
187
- "lib/"
188
- ]
189
  },
190
  "notification-url": "https://packagist.org/downloads/",
191
  "license": [
192
  "Apache-2.0"
193
  ],
194
- "description": "A php client for WebDriver",
195
  "homepage": "https://github.com/facebook/php-webdriver",
196
  "keywords": [
197
  "facebook",
@@ -199,7 +201,7 @@
199
  "selenium",
200
  "webdriver"
201
  ],
202
- "time": "2014-11-05 20:53:09"
203
  },
204
  {
205
  "name": "hamcrest/hamcrest-php",
4
  "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
5
  "This file is @generated automatically"
6
  ],
7
+ "hash": "0a1ea8efccf502da7d108e6d61aabf98",
8
  "packages": [
9
  {
10
  "name": "composer/installers",
162
  },
163
  {
164
  "name": "facebook/webdriver",
165
+ "version": "1.1.1",
166
  "source": {
167
  "type": "git",
168
  "url": "https://github.com/facebook/php-webdriver.git",
169
+ "reference": "1c98108ba3eb435b681655764de11502a0653705"
170
  },
171
  "dist": {
172
  "type": "zip",
173
+ "url": "https://api.github.com/repos/facebook/php-webdriver/zipball/1c98108ba3eb435b681655764de11502a0653705",
174
+ "reference": "1c98108ba3eb435b681655764de11502a0653705",
175
  "shasum": ""
176
  },
177
  "require": {
178
  "php": ">=5.3.19"
179
  },
180
  "require-dev": {
181
+ "phpunit/phpunit": "4.6.*"
182
+ },
183
+ "suggest": {
184
+ "phpdocumentor/phpdocumentor": "2.*"
185
  },
186
  "type": "library",
187
  "autoload": {
188
+ "psr-4": {
189
+ "Facebook\\WebDriver\\": "lib/"
190
+ }
191
  },
192
  "notification-url": "https://packagist.org/downloads/",
193
  "license": [
194
  "Apache-2.0"
195
  ],
196
+ "description": "A PHP client for WebDriver",
197
  "homepage": "https://github.com/facebook/php-webdriver",
198
  "keywords": [
199
  "facebook",
201
  "selenium",
202
  "webdriver"
203
  ],
204
+ "time": "2015-12-31 15:58:49"
205
  },
206
  {
207
  "name": "hamcrest/hamcrest-php",
readme.txt CHANGED
@@ -4,7 +4,7 @@ Donate link: https://tinypng.com/
4
  Tags: compress, optimize, shrink, resize, fit, scale, improve, images, tinypng, tinyjpg, jpeg, jpg, png, lossy, jpegmini, crunch, minify, smush, save, bandwidth, website, speed, faster, performance, panda, wordpress app
5
  Requires at least: 3.0.6
6
  Tested up to: 4.4
7
- Stable tag: 1.6.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -83,7 +83,7 @@ The API key can also be configured in wp-config.php. You can add a TINY_API_KEY
83
  == Frequently Asked Questions ==
84
 
85
  = Q: How many images can I compress for free? =
86
- In a default Wordpress installation you can compress around 100 images for free each month. WordPress creates different sized versions of your images which all have to be compressed. Some plugins even add more sizes, so take a look at the Settings > Media page before you start compressing.
87
 
88
  = Q: What happens to the compressed images when I uninstall the plugin? =
89
  A: When you remove the TinyPNG plugin all your compressed images will remain compressed.
@@ -102,6 +102,11 @@ A: Yes! After installing the plugin, go to Media > Compress All Images, and clic
102
 
103
  == Changelog ==
104
 
 
 
 
 
 
105
  = 1.6.0 =
106
  * Improved compression status in the Media Library with new details window.
107
  * Show total compression savings on the Media Settings page with link to bulk compression page when no images have been compressed yet.
4
  Tags: compress, optimize, shrink, resize, fit, scale, improve, images, tinypng, tinyjpg, jpeg, jpg, png, lossy, jpegmini, crunch, minify, smush, save, bandwidth, website, speed, faster, performance, panda, wordpress app
5
  Requires at least: 3.0.6
6
  Tested up to: 4.4
7
+ Stable tag: 1.7.0
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
83
  == Frequently Asked Questions ==
84
 
85
  = Q: How many images can I compress for free? =
86
+ A: In a default Wordpress installation you can compress around 100 images for free each month. WordPress creates different thumbnails of your images which all have to be compressed. Some plugins even add more sizes, so take a look at the Settings > Media page before you start compressing.
87
 
88
  = Q: What happens to the compressed images when I uninstall the plugin? =
89
  A: When you remove the TinyPNG plugin all your compressed images will remain compressed.
102
 
103
  == Changelog ==
104
 
105
+ = 1.7.0 =
106
+ * Option to preserve copyright information in your original JPEG images.
107
+ * Added proxy support for cURL.
108
+ * Added support for translate.wordpress.org plugin translations.
109
+
110
  = 1.6.0 =
111
  * Improved compression status in the Media Library with new details window.
112
  * Show total compression savings on the Media Settings page with link to bulk compression page when no images have been compressed yet.
src/cacert.pem CHANGED
@@ -1,7 +1,7 @@
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
- ## Certificate data from Mozilla as of: Wed Apr 22 03:12:04 2015
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
@@ -14,30 +14,10 @@
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
  ## Conversion done with mk-ca-bundle.pl version 1.25.
17
- ## SHA1: ed3c0bbfb7912bcc00cd2033b0cb85c98d10559c
18
  ##
19
 
20
 
21
- Equifax Secure CA
22
- =================
23
- -----BEGIN CERTIFICATE-----
24
- MIIDIDCCAomgAwIBAgIENd70zzANBgkqhkiG9w0BAQUFADBOMQswCQYDVQQGEwJVUzEQMA4GA1UE
25
- ChMHRXF1aWZheDEtMCsGA1UECxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5
26
- MB4XDTk4MDgyMjE2NDE1MVoXDTE4MDgyMjE2NDE1MVowTjELMAkGA1UEBhMCVVMxEDAOBgNVBAoT
27
- B0VxdWlmYXgxLTArBgNVBAsTJEVxdWlmYXggU2VjdXJlIENlcnRpZmljYXRlIEF1dGhvcml0eTCB
28
- nzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAwV2xWGcIYu6gmi0fCG2RFGiYCh7+2gRvE4RiIcPR
29
- fM6fBeC4AfBONOziipUEZKzxa1NfBbPLZ4C/QgKO/t0BCezhABRP/PvwDN1Dulsr4R+AcJkVV5MW
30
- 8Q+XarfCaCMczE1ZMKxRHjuvK9buY0V7xdlfUNLjUA86iOe/FP3gx7kCAwEAAaOCAQkwggEFMHAG
31
- A1UdHwRpMGcwZaBjoGGkXzBdMQswCQYDVQQGEwJVUzEQMA4GA1UEChMHRXF1aWZheDEtMCsGA1UE
32
- CxMkRXF1aWZheCBTZWN1cmUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5MQ0wCwYDVQQDEwRDUkwxMBoG
33
- A1UdEAQTMBGBDzIwMTgwODIyMTY0MTUxWjALBgNVHQ8EBAMCAQYwHwYDVR0jBBgwFoAUSOZo+SvS
34
- spXXR9gjIBBPM5iQn9QwHQYDVR0OBBYEFEjmaPkr0rKV10fYIyAQTzOYkJ/UMAwGA1UdEwQFMAMB
35
- Af8wGgYJKoZIhvZ9B0EABA0wCxsFVjMuMGMDAgbAMA0GCSqGSIb3DQEBBQUAA4GBAFjOKer89961
36
- zgK5F7WF0bnj4JXMJTENAKaSbn+2kmOeUJXRmm/kEd5jhW6Y7qj/WsjTVbJmcVfewCHrPSqnI0kB
37
- BIZCe/zuf6IWUrVnZ9NA2zsmWLIodz2uFHdh1voqZiegDfqnc1zqcPGUIWVEX/r87yloqaKHee95
38
- 70+sB3c4
39
- -----END CERTIFICATE-----
40
-
41
  GlobalSign Root CA
42
  ==================
43
  -----BEGIN CERTIFICATE-----
@@ -105,30 +85,6 @@ xuKhXFSbplQAz/DxwceYMBo7Nhbbo27q/a2ywtrvAkcTisDxszGtTxzhT5yvDwyd93gN2PQ1VoDa
105
  t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
106
  -----END CERTIFICATE-----
107
 
108
- Verisign Class 4 Public Primary Certification Authority - G3
109
- ============================================================
110
- -----BEGIN CERTIFICATE-----
111
- MIIEGjCCAwICEQDsoKeLbnVqAc/EfMwvlF7XMA0GCSqGSIb3DQEBBQUAMIHKMQswCQYDVQQGEwJV
112
- UzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRydXN0IE5ldHdv
113
- cmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhvcml6ZWQgdXNl
114
- IG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkgQ2VydGlmaWNh
115
- dGlvbiBBdXRob3JpdHkgLSBHMzAeFw05OTEwMDEwMDAwMDBaFw0zNjA3MTYyMzU5NTlaMIHKMQsw
116
- CQYDVQQGEwJVUzEXMBUGA1UEChMOVmVyaVNpZ24sIEluYy4xHzAdBgNVBAsTFlZlcmlTaWduIFRy
117
- dXN0IE5ldHdvcmsxOjA4BgNVBAsTMShjKSAxOTk5IFZlcmlTaWduLCBJbmMuIC0gRm9yIGF1dGhv
118
- cml6ZWQgdXNlIG9ubHkxRTBDBgNVBAMTPFZlcmlTaWduIENsYXNzIDQgUHVibGljIFByaW1hcnkg
119
- Q2VydGlmaWNhdGlvbiBBdXRob3JpdHkgLSBHMzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC
120
- ggEBAK3LpRFpxlmr8Y+1GQ9Wzsy1HyDkniYlS+BzZYlZ3tCD5PUPtbut8XzoIfzk6AzufEUiGXaS
121
- tBO3IFsJ+mGuqPKljYXCKtbeZjbSmwL0qJJgfJxptI8kHtCGUvYynEFYHiK9zUVilQhu0GbdU6LM
122
- 8BDcVHOLBKFGMzNcF0C5nk3T875Vg+ixiY5afJqWIpA7iCXy0lOIAgwLePLmNxdLMEYH5IBtptiW
123
- Lugs+BGzOA1mppvqySNb247i8xOOGlktqgLw7KSHZtzBP/XYufTsgsbSPZUd5cBPhMnZo0QoBmrX
124
- Razwa2rvTl/4EYIeOGM0ZlDUPpNz+jDDZq3/ky2X7wMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
125
- j/ola09b5KROJ1WrIhVZPMq1CtRK26vdoV9TxaBXOcLORyu+OshWv8LZJxA6sQU8wHcxuzrTBXtt
126
- mhwwjIDLk5Mqg6sFUYICABFna/OIYUdfA5PVWw3g8dShMjWFsjrbsIKr0csKvE+MW8VLADsfKoKm
127
- fjaF3H48ZwC15DtS4KjrXRX5xm3wrR0OhbepmnMUWluPQSjA1egtTaRezarZ7c7c2NU8Qh0XwRJd
128
- RTjDOPP8hS6DRkiy1yBfkjaP53kPmF6Z6PDQpLv1U70qzlmwr25/bLvSHgCwIe34QWKCudiyxLtG
129
- UPMxxY8BqHTr9Xgn2uf3ZkPznoM+IKrDNWCRzg==
130
- -----END CERTIFICATE-----
131
-
132
  Entrust.net Premium 2048 Secure Server CA
133
  =========================================
134
  -----BEGIN CERTIFICATE-----
@@ -695,31 +651,6 @@ nGQI0DvDKcWy7ZAEwbEpkcUwb8GpcjPM/l0WFywRaed+/sWDCN+83CI6LiBpIzlWYGeQiy52OfsR
695
  iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
696
  -----END CERTIFICATE-----
697
 
698
- UTN DATACorp SGC Root CA
699
- ========================
700
- -----BEGIN CERTIFICATE-----
701
- MIIEXjCCA0agAwIBAgIQRL4Mi1AAIbQR0ypoBqmtaTANBgkqhkiG9w0BAQUFADCBkzELMAkGA1UE
702
- BhMCVVMxCzAJBgNVBAgTAlVUMRcwFQYDVQQHEw5TYWx0IExha2UgQ2l0eTEeMBwGA1UEChMVVGhl
703
- IFVTRVJUUlVTVCBOZXR3b3JrMSEwHwYDVQQLExhodHRwOi8vd3d3LnVzZXJ0cnVzdC5jb20xGzAZ
704
- BgNVBAMTElVUTiAtIERBVEFDb3JwIFNHQzAeFw05OTA2MjQxODU3MjFaFw0xOTA2MjQxOTA2MzBa
705
- MIGTMQswCQYDVQQGEwJVUzELMAkGA1UECBMCVVQxFzAVBgNVBAcTDlNhbHQgTGFrZSBDaXR5MR4w
706
- HAYDVQQKExVUaGUgVVNFUlRSVVNUIE5ldHdvcmsxITAfBgNVBAsTGGh0dHA6Ly93d3cudXNlcnRy
707
- dXN0LmNvbTEbMBkGA1UEAxMSVVROIC0gREFUQUNvcnAgU0dDMIIBIjANBgkqhkiG9w0BAQEFAAOC
708
- AQ8AMIIBCgKCAQEA3+5YEKIrblXEjr8uRgnn4AgPLit6E5Qbvfa2gI5lBZMAHryv4g+OGQ0SR+ys
709
- raP6LnD43m77VkIVni5c7yPeIbkFdicZD0/Ww5y0vpQZY/KmEQrrU0icvvIpOxboGqBMpsn0GFlo
710
- wHDyUwDAXlCCpVZvNvlK4ESGoE1O1kduSUrLZ9emxAW5jh70/P/N5zbgnAVssjMiFdC04MwXwLLA
711
- 9P4yPykqlXvY8qdOD1R8oQ2AswkDwf9c3V6aPryuvEeKaq5xyh+xKrhfQgUL7EYw0XILyulWbfXv
712
- 33i+Ybqypa4ETLyorGkVl73v67SMvzX41MPRKA5cOp9wGDMgd8SirwIDAQABo4GrMIGoMAsGA1Ud
713
- DwQEAwIBxjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRTMtGzz3/64PGgXYVOktKeRR20TzA9
714
- BgNVHR8ENjA0MDKgMKAuhixodHRwOi8vY3JsLnVzZXJ0cnVzdC5jb20vVVROLURBVEFDb3JwU0dD
715
- LmNybDAqBgNVHSUEIzAhBggrBgEFBQcDAQYKKwYBBAGCNwoDAwYJYIZIAYb4QgQBMA0GCSqGSIb3
716
- DQEBBQUAA4IBAQAnNZcAiosovcYzMB4p/OL31ZjUQLtgyr+rFywJNn9Q+kHcrpY6CiM+iVnJowft
717
- Gzet/Hy+UUla3joKVAgWRcKZsYfNjGjgaQPpxE6YsjuMFrMOoAyYUJuTqXAJyCyjj98C5OBxOvG0
718
- I3KgqgHf35g+FFCgMSa9KOlaMCZ1+XtgHI3zzVAmbQQnmt/VDUVHKWss5nbZqSl9Mt3JNjy9rjXx
719
- EZ4du5A/EkdOjtd+D2JzHVImOBwYSf0wdJrE5SIv2MCN7ZF6TACPcn9d2t0bi0Vr591pl6jFVkwP
720
- DPafepE39peC4N1xaf92P2BNPM/3mfnGV/TJVTl4uix5yaaIK/QI
721
- -----END CERTIFICATE-----
722
-
723
  UTN USERFirst Hardware Root CA
724
  ==============================
725
  -----BEGIN CERTIFICATE-----
@@ -1142,54 +1073,6 @@ vFcj4jjSm2jzVhKIT0J8uDHEtdvkyCE06UgRNe76x5JXxZ805Mf29w4LTJxoeHtxMcfrHuBnQfO3
1142
  oKfN5XozNmr6mis=
1143
  -----END CERTIFICATE-----
1144
 
1145
- TURKTRUST Certificate Services Provider Root 1
1146
- ==============================================
1147
- -----BEGIN CERTIFICATE-----
1148
- MIID+zCCAuOgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBtzE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1149
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGDAJUUjEP
1150
- MA0GA1UEBwwGQU5LQVJBMVYwVAYDVQQKDE0oYykgMjAwNSBUw5xSS1RSVVNUIEJpbGdpIMSwbGV0
1151
- acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjAeFw0wNTA1MTMx
1152
- MDI3MTdaFw0xNTAzMjIxMDI3MTdaMIG3MT8wPQYDVQQDDDZUw5xSS1RSVVNUIEVsZWt0cm9uaWsg
1153
- U2VydGlmaWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLExCzAJBgNVBAYMAlRSMQ8wDQYDVQQHDAZB
1154
- TktBUkExVjBUBgNVBAoMTShjKSAyMDA1IFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBC
1155
- aWxpxZ9pbSBHw7x2ZW5sacSfaSBIaXptZXRsZXJpIEEuxZ4uMIIBIjANBgkqhkiG9w0BAQEFAAOC
1156
- AQ8AMIIBCgKCAQEAylIF1mMD2Bxf3dJ7XfIMYGFbazt0K3gNfUW9InTojAPBxhEqPZW8qZSwu5GX
1157
- yGl8hMW0kWxsE2qkVa2kheiVfrMArwDCBRj1cJ02i67L5BuBf5OI+2pVu32Fks66WJ/bMsW9Xe8i
1158
- Si9BB35JYbOG7E6mQW6EvAPs9TscyB/C7qju6hJKjRTP8wrgUDn5CDX4EVmt5yLqS8oUBt5CurKZ
1159
- 8y1UiBAG6uEaPj1nH/vO+3yC6BFdSsG5FOpU2WabfIl9BJpiyelSPJ6c79L1JuTm5Rh8i27fbMx4
1160
- W09ysstcP4wFjdFMjK2Sx+F4f2VsSQZQLJ4ywtdKxnWKWU51b0dewQIDAQABoxAwDjAMBgNVHRME
1161
- BTADAQH/MA0GCSqGSIb3DQEBBQUAA4IBAQAV9VX/N5aAWSGk/KEVTCD21F/aAyT8z5Aa9CEKmu46
1162
- sWrv7/hg0Uw2ZkUd82YCdAR7kjCo3gp2D++Vbr3JN+YaDayJSFvMgzbC9UZcWYJWtNX+I7TYVBxE
1163
- q8Sn5RTOPEFhfEPmzcSBCYsk+1Ql1haolgxnB2+zUEfjHCQo3SqYpGH+2+oSN7wBGjSFvW5P55Fy
1164
- B0SFHljKVETd96y5y4khctuPwGkplyqjrhgjlxxBKot8KsF8kOipKMDTkcatKIdAaLX/7KfS0zgY
1165
- nNN9aV3wxqUeJBujR/xpB2jn5Jq07Q+hh4cCzofSSE7hvP/L8XKSRGQDJereW26fyfJOrN3H
1166
- -----END CERTIFICATE-----
1167
-
1168
- TURKTRUST Certificate Services Provider Root 2
1169
- ==============================================
1170
- -----BEGIN CERTIFICATE-----
1171
- MIIEPDCCAySgAwIBAgIBATANBgkqhkiG9w0BAQUFADCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBF
1172
- bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEP
1173
- MA0GA1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUg
1174
- QmlsacWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwHhcN
1175
- MDUxMTA3MTAwNzU3WhcNMTUwOTE2MTAwNzU3WjCBvjE/MD0GA1UEAww2VMOcUktUUlVTVCBFbGVr
1176
- dHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxMQswCQYDVQQGEwJUUjEPMA0G
1177
- A1UEBwwGQW5rYXJhMV0wWwYDVQQKDFRUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
1178
- acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLiAoYykgS2FzxLFtIDIwMDUwggEiMA0G
1179
- CSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpNn7DkUNMwxmYCMjHWHtPFoylzkkBH3MOrHUTpvqe
1180
- LCDe2JAOCtFp0if7qnefJ1Il4std2NiDUBd9irWCPwSOtNXwSadktx4uXyCcUHVPr+G1QRT0mJKI
1181
- x+XlZEdhR3n9wFHxwZnn3M5q+6+1ATDcRhzviuyV79z/rxAc653YsKpqhRgNF8k+v/Gb0AmJQv2g
1182
- QrSdiVFVKc8bcLyEVK3BEx+Y9C52YItdP5qtygy/p1Zbj3e41Z55SZI/4PGXJHpsmxcPbe9TmJEr
1183
- 5A++WXkHeLuXlfSfadRYhwqp48y2WBmfJiGxxFmNskF1wK1pzpwACPI2/z7woQ8arBT9pmAPAgMB
1184
- AAGjQzBBMB0GA1UdDgQWBBTZN7NOBf3Zz58SFq62iS/rJTqIHDAPBgNVHQ8BAf8EBQMDBwYAMA8G
1185
- A1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEFBQADggEBAHJglrfJ3NgpXiOFX7KzLXb7iNcX/ntt
1186
- Rbj2hWyfIvwqECLsqrkw9qtY1jkQMZkpAL2JZkH7dN6RwRgLn7Vhy506vvWolKMiVW4XSf/SKfE4
1187
- Jl3vpao6+XF75tpYHdN0wgH6PmlYX63LaL4ULptswLbcoCb6dxriJNoaN+BnrdFzgw2lGh1uEpJ+
1188
- hGIAF728JRhX8tepb1mIvDS3LoV4nZbcFMMsilKbloxSZj2GFotHuFEJjOp9zYhys2AzsfAKRO8P
1189
- 9Qk3iCQOLGsgOqL6EfJANZxEaGM7rDNvY7wsu/LSy3Z9fYjYHcgFHW68lKlmjHdxx/qR+i9Rnuk5
1190
- UrbnBEI=
1191
- -----END CERTIFICATE-----
1192
-
1193
  SwissSign Gold CA - G2
1194
  ======================
1195
  -----BEGIN CERTIFICATE-----
@@ -1589,56 +1472,6 @@ PBS1xp81HlDQwY9qcEQCYsuuHWhBp6pX6FOqB9IG9tUUBguRA3UsbHK1YZWaDYu5Def131TN3ubY
1589
  WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1590
  -----END CERTIFICATE-----
1591
 
1592
- TC TrustCenter Class 2 CA II
1593
- ============================
1594
- -----BEGIN CERTIFICATE-----
1595
- MIIEqjCCA5KgAwIBAgIOLmoAAQACH9dSISwRXDswDQYJKoZIhvcNAQEFBQAwdjELMAkGA1UEBhMC
1596
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxIjAgBgNVBAsTGVRDIFRydXN0Q2VudGVy
1597
- IENsYXNzIDIgQ0ExJTAjBgNVBAMTHFRDIFRydXN0Q2VudGVyIENsYXNzIDIgQ0EgSUkwHhcNMDYw
1598
- MTEyMTQzODQzWhcNMjUxMjMxMjI1OTU5WjB2MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMgVHJ1
1599
- c3RDZW50ZXIgR21iSDEiMCAGA1UECxMZVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQTElMCMGA1UE
1600
- AxMcVEMgVHJ1c3RDZW50ZXIgQ2xhc3MgMiBDQSBJSTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
1601
- AQoCggEBAKuAh5uO8MN8h9foJIIRszzdQ2Lu+MNF2ujhoF/RKrLqk2jftMjWQ+nEdVl//OEd+DFw
1602
- IxuInie5e/060smp6RQvkL4DUsFJzfb95AhmC1eKokKguNV/aVyQMrKXDcpK3EY+AlWJU+MaWss2
1603
- xgdW94zPEfRMuzBwBJWl9jmM/XOBCH2JXjIeIqkiRUuwZi4wzJ9l/fzLganx4Duvo4bRierERXlQ
1604
- Xa7pIXSSTYtZgo+U4+lK8edJsBTj9WLL1XK9H7nSn6DNqPoByNkN39r8R52zyFTfSUrxIan+GE7u
1605
- SNQZu+995OKdy1u2bv/jzVrndIIFuoAlOMvkaZ6vQaoahPUCAwEAAaOCATQwggEwMA8GA1UdEwEB
1606
- /wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMB0GA1UdDgQWBBTjq1RMgKHbVkO3kUrL84J6E1wIqzCB
1607
- 7QYDVR0fBIHlMIHiMIHfoIHcoIHZhjVodHRwOi8vd3d3LnRydXN0Y2VudGVyLmRlL2NybC92Mi90
1608
- Y19jbGFzc18yX2NhX0lJLmNybIaBn2xkYXA6Ly93d3cudHJ1c3RjZW50ZXIuZGUvQ049VEMlMjBU
1609
- cnVzdENlbnRlciUyMENsYXNzJTIwMiUyMENBJTIwSUksTz1UQyUyMFRydXN0Q2VudGVyJTIwR21i
1610
- SCxPVT1yb290Y2VydHMsREM9dHJ1c3RjZW50ZXIsREM9ZGU/Y2VydGlmaWNhdGVSZXZvY2F0aW9u
1611
- TGlzdD9iYXNlPzANBgkqhkiG9w0BAQUFAAOCAQEAjNfffu4bgBCzg/XbEeprS6iSGNn3Bzn1LL4G
1612
- dXpoUxUc6krtXvwjshOg0wn/9vYua0Fxec3ibf2uWWuFHbhOIprtZjluS5TmVfwLG4t3wVMTZonZ
1613
- KNaL80VKY7f9ewthXbhtvsPcW3nS7Yblok2+XnR8au0WOB9/WIFaGusyiC2y8zl3gK9etmF1Kdsj
1614
- TYjKUCjLhdLTEKJZbtOTVAB6okaVhgWcqRmY5TFyDADiZ9lA4CQze28suVyrZZ0srHbqNZn1l7kP
1615
- JOzHdiEoZa5X6AeIdUpWoNIFOqTmjZKILPPy4cHGYdtBxceb9w4aUUXCYWvcZCcXjFq32nQozZfk
1616
- vQ==
1617
- -----END CERTIFICATE-----
1618
-
1619
- TC TrustCenter Universal CA I
1620
- =============================
1621
- -----BEGIN CERTIFICATE-----
1622
- MIID3TCCAsWgAwIBAgIOHaIAAQAC7LdggHiNtgYwDQYJKoZIhvcNAQEFBQAweTELMAkGA1UEBhMC
1623
- REUxHDAaBgNVBAoTE1RDIFRydXN0Q2VudGVyIEdtYkgxJDAiBgNVBAsTG1RDIFRydXN0Q2VudGVy
1624
- IFVuaXZlcnNhbCBDQTEmMCQGA1UEAxMdVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBIEkwHhcN
1625
- MDYwMzIyMTU1NDI4WhcNMjUxMjMxMjI1OTU5WjB5MQswCQYDVQQGEwJERTEcMBoGA1UEChMTVEMg
1626
- VHJ1c3RDZW50ZXIgR21iSDEkMCIGA1UECxMbVEMgVHJ1c3RDZW50ZXIgVW5pdmVyc2FsIENBMSYw
1627
- JAYDVQQDEx1UQyBUcnVzdENlbnRlciBVbml2ZXJzYWwgQ0EgSTCCASIwDQYJKoZIhvcNAQEBBQAD
1628
- ggEPADCCAQoCggEBAKR3I5ZEr5D0MacQ9CaHnPM42Q9e3s9B6DGtxnSRJJZ4Hgmgm5qVSkr1YnwC
1629
- qMqs+1oEdjneX/H5s7/zA1hV0qq34wQi0fiU2iIIAI3TfCZdzHd55yx4Oagmcw6iXSVphU9VDprv
1630
- xrlE4Vc93x9UIuVvZaozhDrzznq+VZeujRIPFDPiUHDDSYcTvFHe15gSWu86gzOSBnWLknwSaHtw
1631
- ag+1m7Z3W0hZneTvWq3zwZ7U10VOylY0Ibw+F1tvdwxIAUMpsN0/lm7mlaoMwCC2/T42J5zjXM9O
1632
- gdwZu5GQfezmlwQek8wiSdeXhrYTCjxDI3d+8NzmzSQfO4ObNDqDNOMCAwEAAaNjMGEwHwYDVR0j
1633
- BBgwFoAUkqR1LKSevoFE63n8isWVpesQdXMwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMC
1634
- AYYwHQYDVR0OBBYEFJKkdSyknr6BROt5/IrFlaXrEHVzMA0GCSqGSIb3DQEBBQUAA4IBAQAo0uCG
1635
- 1eb4e/CX3CJrO5UUVg8RMKWaTzqwOuAGy2X17caXJ/4l8lfmXpWMPmRgFVp/Lw0BxbFg/UU1z/Cy
1636
- vwbZ71q+s2IhtNerNXxTPqYn8aEt2hojnczd7Dwtnic0XQ/CNnm8yUpiLe1r2X1BQ3y2qsrtYbE3
1637
- ghUJGooWMNjsydZHcnhLEEYUjl8Or+zHL6sQ17bxbuyGssLoDZJz3KL0Dzq/YSMQiZxIQG5wALPT
1638
- ujdEWBF6AmqI8Dc08BnprNRlc/ZpjGSUOnmFKbAWKwyCPwacx/0QK54PLLae4xW/2TYcuiUaUj0a
1639
- 7CIMHOCkoj3w6DnPgcB77V0fb8XQC9eY
1640
- -----END CERTIFICATE-----
1641
-
1642
  Deutsche Telekom Root CA 2
1643
  ==========================
1644
  -----BEGIN CERTIFICATE-----
@@ -1661,28 +1494,6 @@ dyd1Lx+4ivn+xbrYNuSD7Odlt79jWvNGr4GUN9RBjNYj1h7P9WgbRGOiWrqnNVmh5XAFmw4jV5mU
1661
  Cm26OWMohpLzGITY+9HPBVZkVw==
1662
  -----END CERTIFICATE-----
1663
 
1664
- ComSign Secured CA
1665
- ==================
1666
- -----BEGIN CERTIFICATE-----
1667
- MIIDqzCCApOgAwIBAgIRAMcoRwmzuGxFjB36JPU2TukwDQYJKoZIhvcNAQEFBQAwPDEbMBkGA1UE
1668
- AxMSQ29tU2lnbiBTZWN1cmVkIENBMRAwDgYDVQQKEwdDb21TaWduMQswCQYDVQQGEwJJTDAeFw0w
1669
- NDAzMjQxMTM3MjBaFw0yOTAzMTYxNTA0NTZaMDwxGzAZBgNVBAMTEkNvbVNpZ24gU2VjdXJlZCBD
1670
- QTEQMA4GA1UEChMHQ29tU2lnbjELMAkGA1UEBhMCSUwwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
1671
- ggEKAoIBAQDGtWhfHZQVw6QIVS3joFd67+l0Kru5fFdJGhFeTymHDEjWaueP1H5XJLkGieQcPOqs
1672
- 49ohgHMhCu95mGwfCP+hUH3ymBvJVG8+pSjsIQQPRbsHPaHA+iqYHU4Gk/v1iDurX8sWv+bznkqH
1673
- 7Rnqwp9D5PGBpX8QTz7RSmKtUxvLg/8HZaWSLWapW7ha9B20IZFKF3ueMv5WJDmyVIRD9YTC2LxB
1674
- kMyd1mja6YJQqTtoz7VdApRgFrFD2UNd3V2Hbuq7s8lr9gOUCXDeFhF6K+h2j0kQmHe5Y1yLM5d1
1675
- 9guMsqtb3nQgJT/j8xH5h2iGNXHDHYwt6+UarA9z1YJZQIDTAgMBAAGjgacwgaQwDAYDVR0TBAUw
1676
- AwEB/zBEBgNVHR8EPTA7MDmgN6A1hjNodHRwOi8vZmVkaXIuY29tc2lnbi5jby5pbC9jcmwvQ29t
1677
- U2lnblNlY3VyZWRDQS5jcmwwDgYDVR0PAQH/BAQDAgGGMB8GA1UdIwQYMBaAFMFL7XC29z58ADsA
1678
- j8c+DkWfHl3sMB0GA1UdDgQWBBTBS+1wtvc+fAA7AI/HPg5Fnx5d7DANBgkqhkiG9w0BAQUFAAOC
1679
- AQEAFs/ukhNQq3sUnjO2QiBq1BW9Cav8cujvR3qQrFHBZE7piL1DRYHjZiM/EoZNGeQFsOY3wo3a
1680
- BijJD4mkU6l1P7CW+6tMM1X5eCZGbxs2mPtCdsGCuY7e+0X5YxtiOzkGynd6qDwJz2w2PQ8KRUtp
1681
- FhpFfTMDZflScZAmlaxMDPWLkz/MdXSFmLr/YnpNH4n+rr2UAJm/EaXc4HnFFgt9AmEd6oX5AhVP
1682
- 51qJThRv4zdLhfXBPGHg/QVBspJ/wx2g0K5SZGBrGMYmnNj1ZOQ2GmKfig8+/21OGVZOIJFsnzQz
1683
- OjRXUDpvgV4GxvU+fE6OK85lBi5d0ipTdF7Tbieejw==
1684
- -----END CERTIFICATE-----
1685
-
1686
  Cybertrust Global Root
1687
  ======================
1688
  -----BEGIN CERTIFICATE-----
@@ -1784,26 +1595,6 @@ fZleHwzoq0QkKXJAPTZSr4xYkHPB7GEseaHsh7U/2k3ZIQAw3pDaDtMaSKk+hQsUi4y8QZ5q9w5w
1784
  wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
1785
  -----END CERTIFICATE-----
1786
 
1787
- Buypass Class 3 CA 1
1788
- ====================
1789
- -----BEGIN CERTIFICATE-----
1790
- MIIDUzCCAjugAwIBAgIBAjANBgkqhkiG9w0BAQUFADBLMQswCQYDVQQGEwJOTzEdMBsGA1UECgwU
1791
- QnV5cGFzcyBBUy05ODMxNjMzMjcxHTAbBgNVBAMMFEJ1eXBhc3MgQ2xhc3MgMyBDQSAxMB4XDTA1
1792
- MDUwOTE0MTMwM1oXDTE1MDUwOTE0MTMwM1owSzELMAkGA1UEBhMCTk8xHTAbBgNVBAoMFEJ1eXBh
1793
- c3MgQVMtOTgzMTYzMzI3MR0wGwYDVQQDDBRCdXlwYXNzIENsYXNzIDMgQ0EgMTCCASIwDQYJKoZI
1794
- hvcNAQEBBQADggEPADCCAQoCggEBAKSO13TZKWTeXx+HgJHqTjnmGcZEC4DVC69TB4sSveZn8AKx
1795
- ifZgisRbsELRwCGoy+Gb72RRtqfPFfV0gGgEkKBYouZ0plNTVUhjP5JW3SROjvi6K//zNIqeKNc0
1796
- n6wv1g/xpC+9UrJJhW05NfBEMJNGJPO251P7vGGvqaMU+8IXF4Rs4HyI+MkcVyzwPX6UvCWThOia
1797
- AJpFBUJXgPROztmuOfbIUxAMZTpHe2DC1vqRycZxbL2RhzyRhkmr8w+gbCZ2Xhysm3HljbybIR6c
1798
- 1jh+JIAVMYKWsUnTYjdbiAwKYjT+p0h+mbEwi5A3lRyoH6UsjfRVyNvdWQrCrXig9IsCAwEAAaNC
1799
- MEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUOBTmyPCppAP0Tj4io1vy1uCtQHQwDgYDVR0P
1800
- AQH/BAQDAgEGMA0GCSqGSIb3DQEBBQUAA4IBAQABZ6OMySU9E2NdFm/soT4JXJEVKirZgCFPBdy7
1801
- pYmrEzMqnji3jG8CcmPHc3ceCQa6Oyh7pEfJYWsICCD8igWKH7y6xsL+z27sEzNxZy5p+qksP2bA
1802
- EllNC1QCkoS72xLvg3BweMhT+t/Gxv/ciC8HwEmdMldg0/L2mSlf56oBzKwzqBwKu5HEA6BvtjT5
1803
- htOzdlSY9EqBs1OdTUDs5XcTRa9bqh/YL0yCe/4qxFi7T/ye/QNlGioOw6UgFpRreaaiErS7GqQj
1804
- el/wroQk5PMr+4okoyeYZdowdXb8GZHo2+ubPzK/QJcHJrrM85SFSnonk8+QQtS4Wxam58tAA915
1805
- -----END CERTIFICATE-----
1806
-
1807
  EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
1808
  ==========================================================================
1809
  -----BEGIN CERTIFICATE-----
@@ -2635,29 +2426,6 @@ iJ35Rld8TWCvmHMTI6QgkYH60GFmuH3Rr9ZvHmw96RH9qfmCIoaZM3Fa6hlXPZHNqcCjbgcTpsnt
2635
  +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
2636
  -----END CERTIFICATE-----
2637
 
2638
- A-Trust-nQual-03
2639
- ================
2640
- -----BEGIN CERTIFICATE-----
2641
- MIIDzzCCAregAwIBAgIDAWweMA0GCSqGSIb3DQEBBQUAMIGNMQswCQYDVQQGEwJBVDFIMEYGA1UE
2642
- Cgw/QS1UcnVzdCBHZXMuIGYuIFNpY2hlcmhlaXRzc3lzdGVtZSBpbSBlbGVrdHIuIERhdGVudmVy
2643
- a2VociBHbWJIMRkwFwYDVQQLDBBBLVRydXN0LW5RdWFsLTAzMRkwFwYDVQQDDBBBLVRydXN0LW5R
2644
- dWFsLTAzMB4XDTA1MDgxNzIyMDAwMFoXDTE1MDgxNzIyMDAwMFowgY0xCzAJBgNVBAYTAkFUMUgw
2645
- RgYDVQQKDD9BLVRydXN0IEdlcy4gZi4gU2ljaGVyaGVpdHNzeXN0ZW1lIGltIGVsZWt0ci4gRGF0
2646
- ZW52ZXJrZWhyIEdtYkgxGTAXBgNVBAsMEEEtVHJ1c3QtblF1YWwtMDMxGTAXBgNVBAMMEEEtVHJ1
2647
- c3QtblF1YWwtMDMwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCtPWFuA/OQO8BBC4SA
2648
- zewqo51ru27CQoT3URThoKgtUaNR8t4j8DRE/5TrzAUjlUC5B3ilJfYKvUWG6Nm9wASOhURh73+n
2649
- yfrBJcyFLGM/BWBzSQXgYHiVEEvc+RFZznF/QJuKqiTfC0Li21a8StKlDJu3Qz7dg9MmEALP6iPE
2650
- SU7l0+m0iKsMrmKS1GWH2WrX9IWf5DMiJaXlyDO6w8dB3F/GaswADm0yqLaHNgBid5seHzTLkDx4
2651
- iHQF63n1k3Flyp3HaxgtPVxO59X4PzF9j4fsCiIvI+n+u33J4PTs63zEsMMtYrWacdaxaujs2e3V
2652
- cuy+VwHOBVWf3tFgiBCzAgMBAAGjNjA0MA8GA1UdEwEB/wQFMAMBAf8wEQYDVR0OBAoECERqlWdV
2653
- eRFPMA4GA1UdDwEB/wQEAwIBBjANBgkqhkiG9w0BAQUFAAOCAQEAVdRU0VlIXLOThaq/Yy/kgM40
2654
- ozRiPvbY7meIMQQDbwvUB/tOdQ/TLtPAF8fGKOwGDREkDg6lXb+MshOWcdzUzg4NCmgybLlBMRmr
2655
- sQd7TZjTXLDR8KdCoLXEjq/+8T/0709GAHbrAvv5ndJAlseIOrifEXnzgGWovR/TeIGgUUw3tKZd
2656
- JXDRZslo+S4RFGjxVJgIrCaSD96JntT6s3kr0qN51OyLrIdTaEJMUVF0HhsnLuP1Hyl0Te2v9+GS
2657
- mYHovjrHF1D2t8b8m7CKa9aIA5GPBnc6hQLdmNVDeD/GMBWsm2vLV7eJUYs66MmEDNuxUCAKGkq6
2658
- ahq97BvIxYSazQ==
2659
- -----END CERTIFICATE-----
2660
-
2661
  TWCA Root Certification Authority
2662
  =================================
2663
  -----BEGIN CERTIFICATE-----
@@ -3986,3 +3754,140 @@ PDCBBpEi6lmt2hkuIsKNuYyH4Ga8cyNfIWRjgEj1oDwYPZTISEEdQLpe/v5WOaHIz16eGWRGENoX
3986
  kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
3987
  ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
3988
  -----END CERTIFICATE-----
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  ##
2
  ## Bundle of CA Root Certificates
3
  ##
4
+ ## Certificate data from Mozilla as of: Wed Jan 20 04:12:04 2016
5
  ##
6
  ## This is a bundle of X.509 certificates of public Certificate Authorities
7
  ## (CA). These were automatically extracted from Mozilla's root certificates
14
  ## Just configure this file as the SSLCACertificateFile.
15
  ##
16
  ## Conversion done with mk-ca-bundle.pl version 1.25.
17
+ ## SHA1: 0ab47e2f41518f8d223eab517cb799e5b071231e
18
  ##
19
 
20
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
21
  GlobalSign Root CA
22
  ==================
23
  -----BEGIN CERTIFICATE-----
85
  t20Xj50egWTh/sVFuq1ruQp6Tk9LhO5L8X3dEQ==
86
  -----END CERTIFICATE-----
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  Entrust.net Premium 2048 Secure Server CA
89
  =========================================
90
  -----BEGIN CERTIFICATE-----
651
  iJf2fL1LuCAWZwWN4jvBcj+UlTfHXbme2JOhF4//DGYVwSR8MnwDHTuhWEUykw==
652
  -----END CERTIFICATE-----
653
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
654
  UTN USERFirst Hardware Root CA
655
  ==============================
656
  -----BEGIN CERTIFICATE-----
1073
  oKfN5XozNmr6mis=
1074
  -----END CERTIFICATE-----
1075
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1076
  SwissSign Gold CA - G2
1077
  ======================
1078
  -----BEGIN CERTIFICATE-----
1472
  WyH8EZE0vkHve52Xdf+XlcCWWC/qu0bXu+TZLg==
1473
  -----END CERTIFICATE-----
1474
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1475
  Deutsche Telekom Root CA 2
1476
  ==========================
1477
  -----BEGIN CERTIFICATE-----
1494
  Cm26OWMohpLzGITY+9HPBVZkVw==
1495
  -----END CERTIFICATE-----
1496
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1497
  Cybertrust Global Root
1498
  ======================
1499
  -----BEGIN CERTIFICATE-----
1595
  wDX3OaJdZtB7WZ+oRxKaJyOkLY4ng5IgodcVf/EuGO70SH8vf/GhGLWhC5SgYiAynB321O+/TIho
1596
  -----END CERTIFICATE-----
1597
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1598
  EBG Elektronik Sertifika Hizmet Sa\xC4\x9Flay\xc4\xb1\x63\xc4\xb1s\xc4\xb1
1599
  ==========================================================================
1600
  -----BEGIN CERTIFICATE-----
2426
  +GijnsNacgmHKNHEc8RzGF9QdRYxn7fofMM=
2427
  -----END CERTIFICATE-----
2428
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2429
  TWCA Root Certification Authority
2430
  =================================
2431
  -----BEGIN CERTIFICATE-----
3754
  kbcFgKyLmZJ956LYBws2J+dIeWCKw9cTXPhyQN9Ky8+ZAAoACxGV2lZFA4gKn2fQ1XmxqI1AbQ3C
3755
  ekD6819kR5LLU7m7Wc5P/dAVUwHY3+vZ5nbv0CO7O6l5s9UCKc2Jo5YPSjXnTkLAdc0Hz+Ys63su
3756
  -----END CERTIFICATE-----
3757
+
3758
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H5
3759
+ =========================================================
3760
+ -----BEGIN CERTIFICATE-----
3761
+ MIIEJzCCAw+gAwIBAgIHAI4X/iQggTANBgkqhkiG9w0BAQsFADCBsTELMAkGA1UEBhMCVFIxDzAN
3762
+ BgNVBAcMBkFua2FyYTFNMEsGA1UECgxEVMOcUktUUlVTVCBCaWxnaSDEsGxldGnFn2ltIHZlIEJp
3763
+ bGnFn2ltIEfDvHZlbmxpxJ9pIEhpem1ldGxlcmkgQS7Fni4xQjBABgNVBAMMOVTDnFJLVFJVU1Qg
3764
+ RWxla3Ryb25payBTZXJ0aWZpa2EgSGl6bWV0IFNhxJ9sYXnEsWPEsXPEsSBINTAeFw0xMzA0MzAw
3765
+ ODA3MDFaFw0yMzA0MjgwODA3MDFaMIGxMQswCQYDVQQGEwJUUjEPMA0GA1UEBwwGQW5rYXJhMU0w
3766
+ SwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmlsacWfaW0gR8O8dmVubGnE
3767
+ n2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBFbGVrdHJvbmlrIFNlcnRp
3768
+ ZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg1MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3769
+ CgKCAQEApCUZ4WWe60ghUEoI5RHwWrom/4NZzkQqL/7hzmAD/I0Dpe3/a6i6zDQGn1k19uwsu537
3770
+ jVJp45wnEFPzpALFp/kRGml1bsMdi9GYjZOHp3GXDSHHmflS0yxjXVW86B8BSLlg/kJK9siArs1m
3771
+ ep5Fimh34khon6La8eHBEJ/rPCmBp+EyCNSgBbGM+42WAA4+Jd9ThiI7/PS98wl+d+yG6w8z5UNP
3772
+ 9FR1bSmZLmZaQ9/LXMrI5Tjxfjs1nQ/0xVqhzPMggCTTV+wVunUlm+hkS7M0hO8EuPbJbKoCPrZV
3773
+ 4jI3X/xml1/N1p7HIL9Nxqw/dV8c7TKcfGkAaZHjIxhT6QIDAQABo0IwQDAdBgNVHQ4EFgQUVpkH
3774
+ HtOsDGlktAxQR95DLL4gwPswDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZI
3775
+ hvcNAQELBQADggEBAJ5FdnsXSDLyOIspve6WSk6BGLFRRyDN0GSxDsnZAdkJzsiZ3GglE9Rc8qPo
3776
+ BP5yCccLqh0lVX6Wmle3usURehnmp349hQ71+S4pL+f5bFgWV1Al9j4uPqrtd3GqqpmWRgqujuwq
3777
+ URawXs3qZwQcWDD1YIq9pr1N5Za0/EKJAWv2cMhQOQwt1WbZyNKzMrcbGW3LM/nfpeYVhDfwwvJl
3778
+ lpKQd/Ct9JDpEXjXk4nAPQu6KfTomZ1yju2dL+6SfaHx/126M2CFYv4HAqGEVka+lgqaE9chTLd8
3779
+ B59OTj+RdPsnnRHM3eaxynFNExc5JsUpISuTKWqW+qtB4Uu2NQvAmxU=
3780
+ -----END CERTIFICATE-----
3781
+
3782
+ TÜRKTRUST Elektronik Sertifika Hizmet Sağlayıcısı H6
3783
+ =========================================================
3784
+ -----BEGIN CERTIFICATE-----
3785
+ MIIEJjCCAw6gAwIBAgIGfaHyZeyKMA0GCSqGSIb3DQEBCwUAMIGxMQswCQYDVQQGEwJUUjEPMA0G
3786
+ A1UEBwwGQW5rYXJhMU0wSwYDVQQKDERUw5xSS1RSVVNUIEJpbGdpIMSwbGV0acWfaW0gdmUgQmls
3787
+ acWfaW0gR8O8dmVubGnEn2kgSGl6bWV0bGVyaSBBLsWeLjFCMEAGA1UEAww5VMOcUktUUlVTVCBF
3788
+ bGVrdHJvbmlrIFNlcnRpZmlrYSBIaXptZXQgU2HEn2xhecSxY8Sxc8SxIEg2MB4XDTEzMTIxODA5
3789
+ MDQxMFoXDTIzMTIxNjA5MDQxMFowgbExCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExTTBL
3790
+ BgNVBAoMRFTDnFJLVFJVU1QgQmlsZ2kgxLBsZXRpxZ9pbSB2ZSBCaWxpxZ9pbSBHw7x2ZW5sacSf
3791
+ aSBIaXptZXRsZXJpIEEuxZ4uMUIwQAYDVQQDDDlUw5xSS1RSVVNUIEVsZWt0cm9uaWsgU2VydGlm
3792
+ aWthIEhpem1ldCBTYcSfbGF5xLFjxLFzxLEgSDYwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
3793
+ AoIBAQCdsGjW6L0UlqMACprx9MfMkU1xeHe59yEmFXNRFpQJRwXiM/VomjX/3EsvMsew7eKC5W/a
3794
+ 2uqsxgbPJQ1BgfbBOCK9+bGlprMBvD9QFyv26WZV1DOzXPhDIHiTVRZwGTLmiddk671IUP320EED
3795
+ wnS3/faAz1vFq6TWlRKb55cTMgPp1KtDWxbtMyJkKbbSk60vbNg9tvYdDjTu0n2pVQ8g9P0pu5Fb
3796
+ HH3GQjhtQiht1AH7zYiXSX6484P4tZgvsycLSF5W506jM7NE1qXyGJTtHB6plVxiSvgNZ1GpryHV
3797
+ +DKdeboaX+UEVU0TRv/yz3THGmNtwx8XEsMeED5gCLMxAgMBAAGjQjBAMB0GA1UdDgQWBBTdVRcT
3798
+ 9qzoSCHK77Wv0QAy7Z6MtTAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG
3799
+ 9w0BAQsFAAOCAQEAb1gNl0OqFlQ+v6nfkkU/hQu7VtMMUszIv3ZnXuaqs6fvuay0EBQNdH49ba3R
3800
+ fdCaqaXKGDsCQC4qnFAUi/5XfldcEQlLNkVS9z2sFP1E34uXI9TDwe7UU5X+LEr+DXCqu4svLcsy
3801
+ o4LyVN/Y8t3XSHLuSqMplsNEzm61kod2pLv0kmzOLBQJZo6NrRa1xxsJYTvjIKIDgI6tflEATseW
3802
+ hvtDmHd9KMeP2Cpu54Rvl0EpABZeTeIT6lnAY2c6RPuY/ATTMHKm9ocJV612ph1jmv3XZch4gyt1
3803
+ O6VbuA1df74jrlZVlFjvH4GMKrLN5ptjnhi85WsGtAuYSyher4hYyw==
3804
+ -----END CERTIFICATE-----
3805
+
3806
+ Certinomis - Root CA
3807
+ ====================
3808
+ -----BEGIN CERTIFICATE-----
3809
+ MIIFkjCCA3qgAwIBAgIBATANBgkqhkiG9w0BAQsFADBaMQswCQYDVQQGEwJGUjETMBEGA1UEChMK
3810
+ Q2VydGlub21pczEXMBUGA1UECxMOMDAwMiA0MzM5OTg5MDMxHTAbBgNVBAMTFENlcnRpbm9taXMg
3811
+ LSBSb290IENBMB4XDTEzMTAyMTA5MTcxOFoXDTMzMTAyMTA5MTcxOFowWjELMAkGA1UEBhMCRlIx
3812
+ EzARBgNVBAoTCkNlcnRpbm9taXMxFzAVBgNVBAsTDjAwMDIgNDMzOTk4OTAzMR0wGwYDVQQDExRD
3813
+ ZXJ0aW5vbWlzIC0gUm9vdCBDQTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANTMCQos
3814
+ P5L2fxSeC5yaah1AMGT9qt8OHgZbn1CF6s2Nq0Nn3rD6foCWnoR4kkjW4znuzuRZWJflLieY6pOo
3815
+ d5tK8O90gC3rMB+12ceAnGInkYjwSond3IjmFPnVAy//ldu9n+ws+hQVWZUKxkd8aRi5pwP5ynap
3816
+ z8dvtF4F/u7BUrJ1Mofs7SlmO/NKFoL21prbcpjp3vDFTKWrteoB4owuZH9kb/2jJZOLyKIOSY00
3817
+ 8B/sWEUuNKqEUL3nskoTuLAPrjhdsKkb5nPJWqHZZkCqqU2mNAKthH6yI8H7KsZn9DS2sJVqM09x
3818
+ RLWtwHkziOC/7aOgFLScCbAK42C++PhmiM1b8XcF4LVzbsF9Ri6OSyemzTUK/eVNfaoqoynHWmgE
3819
+ 6OXWk6RiwsXm9E/G+Z8ajYJJGYrKWUM66A0ywfRMEwNvbqY/kXPLynNvEiCL7sCCeN5LLsJJwx3t
3820
+ FvYk9CcbXFcx3FXuqB5vbKziRcxXV4p1VxngtViZSTYxPDMBbRZKzbgqg4SGm/lg0h9tkQPTYKbV
3821
+ PZrdd5A9NaSfD171UkRpucC63M9933zZxKyGIjK8e2uR73r4F2iw4lNVYC2vPsKD2NkJK/DAZNuH
3822
+ i5HMkesE/Xa0lZrmFAYb1TQdvtj/dBxThZngWVJKYe2InmtJiUZ+IFrZ50rlau7SZRFDAgMBAAGj
3823
+ YzBhMA4GA1UdDwEB/wQEAwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBTvkUz1pcMw6C8I
3824
+ 6tNxIqSSaHh02TAfBgNVHSMEGDAWgBTvkUz1pcMw6C8I6tNxIqSSaHh02TANBgkqhkiG9w0BAQsF
3825
+ AAOCAgEAfj1U2iJdGlg+O1QnurrMyOMaauo++RLrVl89UM7g6kgmJs95Vn6RHJk/0KGRHCwPT5iV
3826
+ WVO90CLYiF2cN/z7ZMF4jIuaYAnq1fohX9B0ZedQxb8uuQsLrbWwF6YSjNRieOpWauwK0kDDPAUw
3827
+ Pk2Ut59KA9N9J0u2/kTO+hkzGm2kQtHdzMjI1xZSg081lLMSVX3l4kLr5JyTCcBMWwerx20RoFAX
3828
+ lCOotQqSD7J6wWAsOMwaplv/8gzjqh8c3LigkyfeY+N/IZ865Z764BNqdeuWXGKRlI5nU7aJ+BIJ
3829
+ y29SWwNyhlCVCNSNh4YVH5Uk2KRvms6knZtt0rJ2BobGVgjF6wnaNsIbW0G+YSrjcOa4pvi2WsS9
3830
+ Iff/ql+hbHY5ZtbqTFXhADObE5hjyW/QASAJN1LnDE8+zbz1X5YnpyACleAu6AdBBR8Vbtaw5Bng
3831
+ DwKTACdyxYvRVB9dSsNAl35VpnzBMwQUAR1JIGkLGZOdblgi90AMRgwjY/M50n92Uaf0yKHxDHYi
3832
+ I0ZSKS3io0EHVmmY0gUJvGnHWmHNj4FgFU2A3ZDifcRQ8ow7bkrHxuaAKzyBvBGAFhAn1/DNP3nM
3833
+ cyrDflOR1m749fPH0FFNjkulW+YZFzvWgQncItzujrnEj1PhZ7szuIgVRs/taTX/dQ1G885x4cVr
3834
+ hkIGuUE=
3835
+ -----END CERTIFICATE-----
3836
+
3837
+ OISTE WISeKey Global Root GB CA
3838
+ ===============================
3839
+ -----BEGIN CERTIFICATE-----
3840
+ MIIDtTCCAp2gAwIBAgIQdrEgUnTwhYdGs/gjGvbCwDANBgkqhkiG9w0BAQsFADBtMQswCQYDVQQG
3841
+ EwJDSDEQMA4GA1UEChMHV0lTZUtleTEiMCAGA1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNl
3842
+ ZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBHbG9iYWwgUm9vdCBHQiBDQTAeFw0xNDEyMDExNTAw
3843
+ MzJaFw0zOTEyMDExNTEwMzFaMG0xCzAJBgNVBAYTAkNIMRAwDgYDVQQKEwdXSVNlS2V5MSIwIAYD
3844
+ VQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5IEds
3845
+ b2JhbCBSb290IEdCIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2Be3HEokKtaX
3846
+ scriHvt9OO+Y9bI5mE4nuBFde9IllIiCFSZqGzG7qFshISvYD06fWvGxWuR51jIjK+FTzJlFXHtP
3847
+ rby/h0oLS5daqPZI7H17Dc0hBt+eFf1Biki3IPShehtX1F1Q/7pn2COZH8g/497/b1t3sWtuuMlk
3848
+ 9+HKQUYOKXHQuSP8yYFfTvdv37+ErXNku7dCjmn21HYdfp2nuFeKUWdy19SouJVUQHMD9ur06/4o
3849
+ Qnc/nSMbsrY9gBQHTC5P99UKFg29ZkM3fiNDecNAhvVMKdqOmq0NpQSHiB6F4+lT1ZvIiwNjeOvg
3850
+ GUpuuy9rM2RYk61pv48b74JIxwIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB
3851
+ /zAdBgNVHQ4EFgQUNQ/INmNe4qPs+TtmFc5RUuORmj0wEAYJKwYBBAGCNxUBBAMCAQAwDQYJKoZI
3852
+ hvcNAQELBQADggEBAEBM+4eymYGQfp3FsLAmzYh7KzKNbrghcViXfa43FK8+5/ea4n32cZiZBKpD
3853
+ dHij40lhPnOMTZTg+XHEthYOU3gf1qKHLwI5gSk8rxWYITD+KJAAjNHhy/peyP34EEY7onhCkRd0
3854
+ VQreUGdNZtGn//3ZwLWoo4rOZvUPQ82nK1d7Y0Zqqi5S2PTt4W2tKZB4SLrhI6qjiey1q5bAtEui
3855
+ HZeeevJuQHHfaPFlTc58Bd9TZaml8LGXBHAVRgOY1NK/VLSgWH1Sb9pWJmLU2NuJMW8c8CLC02Ic
3856
+ Nc1MaRVUGpCY3useX8p3x8uOPUNpnJpY0CQ73xtAln41rYHHTnG6iBM=
3857
+ -----END CERTIFICATE-----
3858
+
3859
+ Certification Authority of WoSign G2
3860
+ ====================================
3861
+ -----BEGIN CERTIFICATE-----
3862
+ MIIDfDCCAmSgAwIBAgIQayXaioidfLwPBbOxemFFRDANBgkqhkiG9w0BAQsFADBYMQswCQYDVQQG
3863
+ EwJDTjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxLTArBgNVBAMTJENlcnRpZmljYXRpb24g
3864
+ QXV0aG9yaXR5IG9mIFdvU2lnbiBHMjAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMFgx
3865
+ CzAJBgNVBAYTAkNOMRowGAYDVQQKExFXb1NpZ24gQ0EgTGltaXRlZDEtMCsGA1UEAxMkQ2VydGlm
3866
+ aWNhdGlvbiBBdXRob3JpdHkgb2YgV29TaWduIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIB
3867
+ CgKCAQEAvsXEoCKASU+/2YcRxlPhuw+9YH+v9oIOH9ywjj2X4FA8jzrvZjtFB5sg+OPXJYY1kBai
3868
+ XW8wGQiHC38Gsp1ij96vkqVg1CuAmlI/9ZqD6TRay9nVYlzmDuDfBpgOgHzKtB0TiGsOqCR3A9Du
3869
+ W/PKaZE1OVbFbeP3PU9ekzgkyhjpJMuSA93MHD0JcOQg5PGurLtzaaNjOg9FD6FKmsLRY6zLEPg9
3870
+ 5k4ot+vElbGs/V6r+kHLXZ1L3PR8du9nfwB6jdKgGlxNIuG12t12s9R23164i5jIFFTMaxeSt+BK
3871
+ v0mUYQs4kI9dJGwlezt52eJ+na2fmKEG/HgUYFf47oB3sQIDAQABo0IwQDAOBgNVHQ8BAf8EBAMC
3872
+ AQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU+mCp62XF3RYUCE4MD42b4Pdkr2cwDQYJKoZI
3873
+ hvcNAQELBQADggEBAFfDejaCnI2Y4qtAqkePx6db7XznPWZaOzG73/MWM5H8fHulwqZm46qwtyeY
3874
+ P0nXYGdnPzZPSsvxFPpahygc7Y9BMsaV+X3avXtbwrAh449G3CE4Q3RM+zD4F3LBMvzIkRfEzFg3
3875
+ TgvMWvchNSiDbGAtROtSjFA9tWwS1/oJu2yySrHFieT801LYYRf+epSEj3m2M1m6D8QL4nCgS3gu
3876
+ +sif/a+RZQp4OBXllxcU3fngLDT4ONCEIgDAFFEYKwLcMFrw6AF8NTojrwjkr6qOKEJJLvD1mTS+
3877
+ 7Q9LGOHSJDy7XUe3IfKN0QqZjuNuPq1w4I+5ysxugTH2e5x6eeRncRg=
3878
+ -----END CERTIFICATE-----
3879
+
3880
+ CA WoSign ECC Root
3881
+ ==================
3882
+ -----BEGIN CERTIFICATE-----
3883
+ MIICCTCCAY+gAwIBAgIQaEpYcIBr8I8C+vbe6LCQkDAKBggqhkjOPQQDAzBGMQswCQYDVQQGEwJD
3884
+ TjEaMBgGA1UEChMRV29TaWduIENBIExpbWl0ZWQxGzAZBgNVBAMTEkNBIFdvU2lnbiBFQ0MgUm9v
3885
+ dDAeFw0xNDExMDgwMDU4NThaFw00NDExMDgwMDU4NThaMEYxCzAJBgNVBAYTAkNOMRowGAYDVQQK
3886
+ ExFXb1NpZ24gQ0EgTGltaXRlZDEbMBkGA1UEAxMSQ0EgV29TaWduIEVDQyBSb290MHYwEAYHKoZI
3887
+ zj0CAQYFK4EEACIDYgAE4f2OuEMkq5Z7hcK6C62N4DrjJLnSsb6IOsq/Srj57ywvr1FQPEd1bPiU
3888
+ t5v8KB7FVMxjnRZLU8HnIKvNrCXSf4/CwVqCXjCLelTOA7WRf6qU0NGKSMyCBSah1VES1ns2o0Iw
3889
+ QDAOBgNVHQ8BAf8EBAMCAQYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUqv3VWqP2h4syhf3R
3890
+ MluARZPzA7gwCgYIKoZIzj0EAwMDaAAwZQIxAOSkhLCB1T2wdKyUpOgOPQB0TKGXa/kNUTyh2Tv0
3891
+ Daupn75OcsqF1NnstTJFGG+rrQIwfcf3aWMvoeGY7xMQ0Xk/0f7qO3/eVvSQsRUR2LIiFdAvwyYu
3892
+ a/GRspBl9JrmkO5K
3893
+ -----END CERTIFICATE-----
src/class-tiny-compress-curl.php CHANGED
@@ -19,6 +19,15 @@
19
  */
20
 
21
  class Tiny_Compress_Curl extends Tiny_Compress {
 
 
 
 
 
 
 
 
 
22
  protected function shrink_options($input) {
23
  $options = array(
24
  CURLOPT_URL => Tiny_Config::URL,
@@ -29,8 +38,9 @@ class Tiny_Compress_Curl extends Tiny_Compress {
29
  CURLOPT_HEADER => true,
30
  CURLOPT_CAINFO => self::get_ca_file(),
31
  CURLOPT_SSL_VERIFYPEER => true,
32
- CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL'
33
  );
 
34
  if (TINY_DEBUG) {
35
  $f = fopen(dirname(__FILE__) . '/curl.log', 'w');
36
  if (is_resource($f)) {
@@ -62,26 +72,39 @@ class Tiny_Compress_Curl extends Tiny_Compress {
62
  return array(self::decode(substr($response, $header_size)), $headers, $status_code);
63
  }
64
 
65
- protected function output_options($url, $resize) {
66
  $options = array(
67
  CURLOPT_URL => $url,
68
  CURLOPT_RETURNTRANSFER => true,
69
  CURLOPT_HEADER => true,
70
  CURLOPT_CAINFO => self::get_ca_file(),
71
  CURLOPT_SSL_VERIFYPEER => true,
72
- CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL'
73
  );
74
- if ($resize) {
 
 
 
 
 
 
 
 
 
 
 
 
75
  $options[CURLOPT_USERPWD] = 'api:' . $this->api_key;
76
  $options[CURLOPT_HTTPHEADER] = array('Content-Type: application/json');
77
- $options[CURLOPT_POSTFIELDS] = json_encode(array('resize' => $resize));
78
  }
 
79
  return $options;
80
  }
81
 
82
- protected function output($url, $resize) {
83
  $request = curl_init();
84
- $options = $this->output_options($url, $resize);
85
  curl_setopt_array($request, $options);
86
 
87
  $response = curl_exec($request);
@@ -91,4 +114,18 @@ class Tiny_Compress_Curl extends Tiny_Compress {
91
 
92
  return array(substr($response, $header_size), $headers);
93
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94
  }
19
  */
20
 
21
  class Tiny_Compress_Curl extends Tiny_Compress {
22
+ private static $curl_version;
23
+
24
+ protected static function curl_version() {
25
+ if (is_null(self::$curl_version)) {
26
+ self::$curl_version = curl_version();
27
+ }
28
+ return self::$curl_version['version'];
29
+ }
30
+
31
  protected function shrink_options($input) {
32
  $options = array(
33
  CURLOPT_URL => Tiny_Config::URL,
38
  CURLOPT_HEADER => true,
39
  CURLOPT_CAINFO => self::get_ca_file(),
40
  CURLOPT_SSL_VERIFYPEER => true,
41
+ CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL/' . self::curl_version()
42
  );
43
+ $options = $this->add_proxy_options(Tiny_Config::URL, $options);
44
  if (TINY_DEBUG) {
45
  $f = fopen(dirname(__FILE__) . '/curl.log', 'w');
46
  if (is_resource($f)) {
72
  return array(self::decode(substr($response, $header_size)), $headers, $status_code);
73
  }
74
 
75
+ protected function output_options($url, $resize_options, $preserve_options) {
76
  $options = array(
77
  CURLOPT_URL => $url,
78
  CURLOPT_RETURNTRANSFER => true,
79
  CURLOPT_HEADER => true,
80
  CURLOPT_CAINFO => self::get_ca_file(),
81
  CURLOPT_SSL_VERIFYPEER => true,
82
+ CURLOPT_USERAGENT => Tiny_WP_Base::plugin_identification() . ' cURL/' . self::curl_version()
83
  );
84
+ $this->add_proxy_options($url, $options);
85
+
86
+ $body = array();
87
+
88
+ if ($preserve_options) {
89
+ $body['preserve'] = $preserve_options;
90
+ }
91
+
92
+ if ($resize_options) {
93
+ $body['resize'] = $resize_options;
94
+ }
95
+
96
+ if ($resize_options || $preserve_options) {
97
  $options[CURLOPT_USERPWD] = 'api:' . $this->api_key;
98
  $options[CURLOPT_HTTPHEADER] = array('Content-Type: application/json');
99
+ $options[CURLOPT_POSTFIELDS] = json_encode($body);
100
  }
101
+
102
  return $options;
103
  }
104
 
105
+ protected function output($url, $resize_options, $preserve_options) {
106
  $request = curl_init();
107
+ $options = $this->output_options($url, $resize_options, $preserve_options);
108
  curl_setopt_array($request, $options);
109
 
110
  $response = curl_exec($request);
114
 
115
  return array(substr($response, $header_size), $headers);
116
  }
117
+
118
+ private function add_proxy_options($url, $options) {
119
+ if ($this->proxy->is_enabled() && $this->proxy->send_through_proxy($url)) {
120
+ $options[CURLOPT_PROXYTYPE] = CURLPROXY_HTTP;
121
+ $options[CURLOPT_PROXY] = $this->proxy->host();
122
+ $options[CURLOPT_PROXYPORT] = $this->proxy->port();
123
+
124
+ if ($this->proxy->use_authentication()) {
125
+ $options[CURLOPT_PROXYAUTH] = CURLAUTH_ANY;
126
+ $options[CURLOPT_PROXYUSERPWD] = $this->proxy->authentication();
127
+ }
128
+ }
129
+ return $options;
130
+ }
131
  }
src/class-tiny-compress-fopen.php CHANGED
@@ -70,29 +70,40 @@ class Tiny_Compress_Fopen extends Tiny_Compress {
70
  return array(self::decode($response), $headers, $status_code);
71
  }
72
 
73
- protected function output_options($resize) {
74
  $options = array(
75
  'http' => array(
76
  'method' => 'GET',
 
 
 
77
  ),
78
  'ssl' => array(
79
  'cafile' => self::get_ca_file(),
80
  'verify_peer' => true
81
  )
82
  );
83
- if ($resize) {
84
- $options['http']['header'] = array(
85
- 'Authorization: Basic ' . base64_encode('api:' . $this->api_key),
86
- 'Content-Type: application/json',
87
- 'User-Agent: ' . Tiny_WP_Base::plugin_identification() . ' fopen'
88
- );
89
- $options['http']['content'] = json_encode(array('resize' => $resize));
 
 
 
 
 
 
 
 
90
  }
91
  return $options;
92
  }
93
 
94
- protected function output($url, $resize) {
95
- $context = stream_context_create($this->output_options($resize));
96
  $request = @fopen($url, 'rb', false, $context);
97
 
98
  if ($request) {
70
  return array(self::decode($response), $headers, $status_code);
71
  }
72
 
73
+ protected function output_options($resize_options, $preserve_options) {
74
  $options = array(
75
  'http' => array(
76
  'method' => 'GET',
77
+ 'header' => array(
78
+ 'User-Agent: ' . Tiny_WP_Base::plugin_identification() . ' fopen',
79
+ ),
80
  ),
81
  'ssl' => array(
82
  'cafile' => self::get_ca_file(),
83
  'verify_peer' => true
84
  )
85
  );
86
+
87
+ $body = array();
88
+
89
+ if ($preserve_options) {
90
+ $body['preserve'] = $preserve_options;
91
+ }
92
+
93
+ if ($resize_options) {
94
+ $body['resize'] = $resize_options;
95
+ }
96
+
97
+ if ($resize_options || $preserve_options) {
98
+ $options['http']['header'][] = 'Authorization: Basic ' . base64_encode('api:' . $this->api_key);
99
+ $options['http']['header'][] = 'Content-Type: application/json';
100
+ $options['http']['content'] = json_encode($body);
101
  }
102
  return $options;
103
  }
104
 
105
+ protected function output($url, $resize_options, $preserve_options) {
106
+ $context = stream_context_create($this->output_options($resize_options, $preserve_options));
107
  $request = @fopen($url, 'rb', false, $context);
108
 
109
  if ($request) {
src/class-tiny-compress.php CHANGED
@@ -38,10 +38,11 @@ abstract class Tiny_Compress {
38
  protected function __construct($api_key, $after_compress_callback) {
39
  $this->api_key = $api_key;
40
  $this->after_compress_callback = $after_compress_callback;
 
41
  }
42
 
43
  abstract protected function shrink($input);
44
- abstract protected function output($url, $resize);
45
 
46
  public function get_status(&$details) {
47
  list($details, $headers, $status_code) = $this->shrink(null);
@@ -54,7 +55,7 @@ abstract class Tiny_Compress {
54
  }
55
  }
56
 
57
- public function compress($input, $resize_options) {
58
  list($details, $headers) = $this->shrink($input);
59
  $this->call_after_compress_callback($details, $headers);
60
  $outputUrl = isset($headers['location']) ? $headers['location'] : null;
@@ -63,7 +64,7 @@ abstract class Tiny_Compress {
63
  } else if ($outputUrl === null) {
64
  throw new Tiny_Exception('Could not find output url', 'OutputNotFound');
65
  }
66
- list($output, $headers) = $this->output($outputUrl, $resize_options);
67
  $this->call_after_compress_callback(null, $headers);
68
  if (strlen($output) == 0) {
69
  throw new Tiny_Exception('Could not download output', 'OutputError');
@@ -72,7 +73,7 @@ abstract class Tiny_Compress {
72
  return array($output, $details);
73
  }
74
 
75
- public function compress_file($file, $resize_options) {
76
  if (!file_exists($file)) {
77
  throw new Tiny_Exception('File does not exist', 'FileError');
78
  }
@@ -81,7 +82,7 @@ abstract class Tiny_Compress {
81
  $resize_options = false;
82
  }
83
 
84
- list($output, $details) = $this->compress(file_get_contents($file), $resize_options);
85
  file_put_contents($file, $output);
86
 
87
  if ($resize_options) {
@@ -143,4 +144,3 @@ abstract class Tiny_Compress {
143
  );
144
  }
145
  }
146
-
38
  protected function __construct($api_key, $after_compress_callback) {
39
  $this->api_key = $api_key;
40
  $this->after_compress_callback = $after_compress_callback;
41
+ $this->proxy = new WP_HTTP_Proxy();
42
  }
43
 
44
  abstract protected function shrink($input);
45
+ abstract protected function output($url, $resize_options, $preserve_options);
46
 
47
  public function get_status(&$details) {
48
  list($details, $headers, $status_code) = $this->shrink(null);
55
  }
56
  }
57
 
58
+ public function compress($input, $resize_options, $preserve_options) {
59
  list($details, $headers) = $this->shrink($input);
60
  $this->call_after_compress_callback($details, $headers);
61
  $outputUrl = isset($headers['location']) ? $headers['location'] : null;
64
  } else if ($outputUrl === null) {
65
  throw new Tiny_Exception('Could not find output url', 'OutputNotFound');
66
  }
67
+ list($output, $headers) = $this->output($outputUrl, $resize_options, $preserve_options);
68
  $this->call_after_compress_callback(null, $headers);
69
  if (strlen($output) == 0) {
70
  throw new Tiny_Exception('Could not download output', 'OutputError');
73
  return array($output, $details);
74
  }
75
 
76
+ public function compress_file($file, $resize_options, $preserve_options) {
77
  if (!file_exists($file)) {
78
  throw new Tiny_Exception('File does not exist', 'FileError');
79
  }
82
  $resize_options = false;
83
  }
84
 
85
+ list($output, $details) = $this->compress(file_get_contents($file), $resize_options, $preserve_options);
86
  file_put_contents($file, $output);
87
 
88
  if ($resize_options) {
144
  );
145
  }
146
  }
 
src/class-tiny-notices.php CHANGED
@@ -114,9 +114,10 @@ class Tiny_Notices extends Tiny_WP_Base {
114
  $add = '</p>';
115
  $css[] = 'is-dismissible';
116
  } else {
117
- $add = '&nbsp;<a href="#" class="tiny-dismiss">' . self::translate_escape('Dismiss') . '</a></p>';
118
  }
119
  $css = implode(' ', $css);
120
- add_action('admin_notices', create_function('', "echo '<div class=\"$css\" data-name=\"$name\"><p>Compress JPEG & PNG images: $message$add</div>';"));
 
121
  }
122
  }
114
  $add = '</p>';
115
  $css[] = 'is-dismissible';
116
  } else {
117
+ $add = '&nbsp;<a href="#" class="tiny-dismiss">' . esc_html__('Dismiss', 'tiny-compress-images') . '</a></p>';
118
  }
119
  $css = implode(' ', $css);
120
+ $pluginName = __('Compress JPEG & PNG images', 'tiny-compress-images');
121
+ add_action('admin_notices', create_function('', "echo '<div class=\"$css\" data-name=\"$name\"><p>" . $pluginName . ": $message$add</div>';"));
122
  }
123
  }
src/class-tiny-plugin.php CHANGED
@@ -20,7 +20,6 @@
20
 
21
  class Tiny_Plugin extends Tiny_WP_Base {
22
  const MEDIA_COLUMN = self::NAME;
23
- const MEDIA_COLUMN_HEADER = 'Compression';
24
  const DATETIME_FORMAT = 'Y-m-d G:i:s';
25
 
26
  private $settings;
@@ -63,14 +62,14 @@ class Tiny_Plugin extends Tiny_WP_Base {
63
 
64
  public function admin_menu() {
65
  add_media_page(
66
- self::translate('Compress JPEG & PNG Images'), self::translate('Compress All Images'),
67
  'upload_files', 'tiny-bulk-compress', $this->get_method('bulk_compress_page')
68
  );
69
  }
70
 
71
  public function add_plugin_links($current_links) {
72
  $additional[] = sprintf('<a href="options-media.php#%s">%s</a>', self::NAME,
73
- self::translate_escape('Settings'));
74
  return array_merge($additional, $current_links);
75
  }
76
 
@@ -87,14 +86,14 @@ class Tiny_Plugin extends Tiny_WP_Base {
87
  'nonce' => wp_create_nonce('tiny-compress'),
88
  'wpVersion' => self::wp_version(),
89
  'pluginVersion' => self::plugin_version(),
90
- 'L10nAllDone' => self::translate('All images are processed'),
91
- 'L10nBulkAction' => self::translate('Compress Images'),
92
- 'L10nCompressing' => self::translate('Compressing'),
93
- 'L10nCompressions' => self::translate('compressions'),
94
- 'L10nError' => self::translate('Error'),
95
- 'L10nInternalError' => self::translate('Internal error'),
96
- 'L10nOutOf' => self::translate('out of'),
97
- 'L10nWaiting' => self::translate('Waiting'),
98
  ));
99
  wp_enqueue_script($handle);
100
  }
@@ -120,7 +119,8 @@ class Tiny_Plugin extends Tiny_WP_Base {
120
  $tiny_metadata->update();
121
 
122
  $resize = $tiny_metadata->is_resizable($uncompressed_size) ? $this->settings->get_resize_options() : false;
123
- $response = $compressor->compress_file($tiny_metadata->get_filename($uncompressed_size), $resize);
 
124
 
125
  $tiny_metadata->add_response($response, $uncompressed_size);
126
  $tiny_metadata->update();
@@ -148,19 +148,19 @@ class Tiny_Plugin extends Tiny_WP_Base {
148
  }
149
  $json = !empty($_POST['json']) && $_POST['json'];
150
  if (!current_user_can('upload_files')) {
151
- $message = self::translate("You don't have permission to work with uploaded files") . '.';
152
  echo $json ? json_encode(array('error' => $message)) : $message;
153
  exit();
154
  }
155
  if (empty($_POST['id'])) {
156
- $message = self::translate("Not a valid media file") . '.';
157
  echo $json ? json_encode(array('error' => $message)) : $message;
158
  exit();
159
  }
160
  $id = intval($_POST['id']);
161
  $metadata = wp_get_attachment_metadata($id);
162
  if (!is_array($metadata)) {
163
- $message = self::translate("Could not find metadata of media file") . '.';
164
  echo $json ? json_encode(array('error' => $message)) : $message;
165
  exit;
166
  }
@@ -197,7 +197,7 @@ class Tiny_Plugin extends Tiny_WP_Base {
197
  }
198
 
199
  public function add_media_columns($columns) {
200
- $columns[self::MEDIA_COLUMN] = self::translate(self::MEDIA_COLUMN_HEADER);
201
  return $columns;
202
  }
203
 
@@ -228,22 +228,22 @@ class Tiny_Plugin extends Tiny_WP_Base {
228
  global $wpdb;
229
 
230
  echo '<div class="wrap" id="tiny-bulk-compress">';
231
- echo '<h2>' . self::translate('Compress JPEG & PNG Images') . '</h2>';
232
  if (empty($_POST['tiny-bulk-compress']) && empty($_REQUEST['ids'])) {
233
  $result = $wpdb->get_results("SELECT COUNT(*) AS `count` FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' ORDER BY ID DESC", ARRAY_A);
234
  $image_count = $result[0]['count'];
235
  $sizes_count = count($this->settings->get_active_tinify_sizes());
236
 
237
  echo '<p>';
238
- echo self::translate_escape("Use this tool to compress all images in your media library") . '. ';
239
- echo self::translate_escape("Only images that have not been compressed will be compressed") . '. ';
240
  echo '</p>';
241
  echo '<p>';
242
- echo sprintf(self::translate_escape("We have found %d images in your media library and for each image %d sizes will be compressed"), $image_count, $sizes_count) . '. ';
243
- echo sprintf(self::translate_escape('This results in %d compressions at most'), $image_count*$sizes_count) . '. ';
 
244
  echo '</p>';
245
  echo '<p>';
246
- echo self::translate_escape("To begin, just press the button below") . '. ';
247
  echo '</p>';
248
 
249
  echo '<form method="POST" action="?page=tiny-bulk-compress">';
@@ -251,7 +251,7 @@ class Tiny_Plugin extends Tiny_WP_Base {
251
  echo '<input type="hidden" name="tiny-bulk-compress" value="1">';
252
  echo '<p>';
253
  echo '<button class="button button-primary button-large" type="submit">';
254
- echo self::translate_escape('Compress All Images');
255
  echo '</button>';
256
  echo '</p>';
257
  echo '</form>';
@@ -269,14 +269,20 @@ class Tiny_Plugin extends Tiny_WP_Base {
269
  $items = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' $cond ORDER BY ID DESC", ARRAY_A);
270
 
271
  echo '<p>';
272
- echo self::translate_escape("Please be patient while the images are being compressed") . '. ';
273
- echo self::translate_escape("This can take a while if you have many images") . '. ';
274
- echo self::translate_escape("Do not navigate away from this page because it will stop the process") . '. ';
275
- echo self::translate_escape("You will be notified via this page when the processing is done") . '.';
276
  echo "</p>";
277
 
278
- echo '<div id="tiny-status"><p>'. self::translate_escape('Compressions this month') . sprintf(' <span>%d</span></p></div>', $this->settings->get_status());
279
- echo '<div id="tiny-progress"><p>'. self::translate_escape('Processing') . ' <span>0</span> ' . self::translate_escape('out of') . sprintf(' %d </p></div>', count($items));
 
 
 
 
 
 
 
280
  echo '<div id="media-items">';
281
  echo '</div>';
282
 
20
 
21
  class Tiny_Plugin extends Tiny_WP_Base {
22
  const MEDIA_COLUMN = self::NAME;
 
23
  const DATETIME_FORMAT = 'Y-m-d G:i:s';
24
 
25
  private $settings;
62
 
63
  public function admin_menu() {
64
  add_media_page(
65
+ __('Compress JPEG & PNG Images', 'tiny-compress-images'), __('Compress All Images', 'tiny-compress-images'),
66
  'upload_files', 'tiny-bulk-compress', $this->get_method('bulk_compress_page')
67
  );
68
  }
69
 
70
  public function add_plugin_links($current_links) {
71
  $additional[] = sprintf('<a href="options-media.php#%s">%s</a>', self::NAME,
72
+ esc_html__('Settings', 'tiny-compress-images'));
73
  return array_merge($additional, $current_links);
74
  }
75
 
86
  'nonce' => wp_create_nonce('tiny-compress'),
87
  'wpVersion' => self::wp_version(),
88
  'pluginVersion' => self::plugin_version(),
89
+ 'L10nAllDone' => __('All images are processed', 'tiny-compress-images'),
90
+ 'L10nBulkAction' => __('Compress Images', 'tiny-compress-images'),
91
+ 'L10nCompressing' => __('Compressing', 'tiny-compress-images'),
92
+ 'L10nCompressions' => __('compressions', 'tiny-compress-images'),
93
+ 'L10nError' => __('Error', 'tiny-compress-images'),
94
+ 'L10nInternalError' => __('Internal error', 'tiny-compress-images'),
95
+ 'L10nOutOf' => __('out of', 'tiny-compress-images'),
96
+ 'L10nWaiting' => __('Waiting', 'tiny-compress-images'),
97
  ));
98
  wp_enqueue_script($handle);
99
  }
119
  $tiny_metadata->update();
120
 
121
  $resize = $tiny_metadata->is_resizable($uncompressed_size) ? $this->settings->get_resize_options() : false;
122
+ $preserve = count($this->settings->get_preserve_options()) > 0 ? $this->settings->get_preserve_options() : false;
123
+ $response = $compressor->compress_file($tiny_metadata->get_filename($uncompressed_size), $resize, $preserve);
124
 
125
  $tiny_metadata->add_response($response, $uncompressed_size);
126
  $tiny_metadata->update();
148
  }
149
  $json = !empty($_POST['json']) && $_POST['json'];
150
  if (!current_user_can('upload_files')) {
151
+ $message = __("You don't have permission to work with uploaded files.", 'tiny-compress-images');
152
  echo $json ? json_encode(array('error' => $message)) : $message;
153
  exit();
154
  }
155
  if (empty($_POST['id'])) {
156
+ $message = __('Not a valid media file.', 'tiny-compress-images');
157
  echo $json ? json_encode(array('error' => $message)) : $message;
158
  exit();
159
  }
160
  $id = intval($_POST['id']);
161
  $metadata = wp_get_attachment_metadata($id);
162
  if (!is_array($metadata)) {
163
+ $message = __('Could not find metadata of media file.', 'tiny-compress-images');
164
  echo $json ? json_encode(array('error' => $message)) : $message;
165
  exit;
166
  }
197
  }
198
 
199
  public function add_media_columns($columns) {
200
+ $columns[self::MEDIA_COLUMN] = __('Compression', 'tiny-compress-images');
201
  return $columns;
202
  }
203
 
228
  global $wpdb;
229
 
230
  echo '<div class="wrap" id="tiny-bulk-compress">';
231
+ echo '<h2>' . __('Compress JPEG & PNG Images', 'tiny-compress-images') . '</h2>';
232
  if (empty($_POST['tiny-bulk-compress']) && empty($_REQUEST['ids'])) {
233
  $result = $wpdb->get_results("SELECT COUNT(*) AS `count` FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' ORDER BY ID DESC", ARRAY_A);
234
  $image_count = $result[0]['count'];
235
  $sizes_count = count($this->settings->get_active_tinify_sizes());
236
 
237
  echo '<p>';
238
+ esc_html_e('Use this tool to compress all images in your media library. Only images that have not been compressed will be compressed.', 'tiny-compress-images');
 
239
  echo '</p>';
240
  echo '<p>';
241
+ echo sprintf(esc_html__('We have found %d images in your media library and for each image %d sizes will be compressed.', 'tiny-compress-images'),
242
+ $image_count, $sizes_count) . ' ';
243
+ echo sprintf(esc_html__('This results in %d compressions at most.', 'tiny-compress-images'), $image_count * $sizes_count);
244
  echo '</p>';
245
  echo '<p>';
246
+ esc_html_e('To begin, just press the button below.', 'tiny-compress-images');
247
  echo '</p>';
248
 
249
  echo '<form method="POST" action="?page=tiny-bulk-compress">';
251
  echo '<input type="hidden" name="tiny-bulk-compress" value="1">';
252
  echo '<p>';
253
  echo '<button class="button button-primary button-large" type="submit">';
254
+ esc_html_e('Compress All Images', 'tiny-compress-images');
255
  echo '</button>';
256
  echo '</p>';
257
  echo '</form>';
269
  $items = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_type = 'attachment' AND post_mime_type LIKE 'image/%' $cond ORDER BY ID DESC", ARRAY_A);
270
 
271
  echo '<p>';
272
+ esc_html_e('Please be patient while the images are being compressed, it can take a while if you have many images. Do not navigate away from this page because it will stop the process.', 'tiny-compress-images');
273
+ echo '</p><p>';
274
+ esc_html_e('You will be notified via this page when the processing is done.', 'tiny-compress-images');
 
275
  echo "</p>";
276
 
277
+ echo '<div id="tiny-status"><p>';
278
+ esc_html_e('Compressions this month', 'tiny-compress-images');
279
+ printf(' <span>%d</span></p></div>', $this->settings->get_status());
280
+
281
+ echo '<div id="tiny-progress"><p>';
282
+
283
+ /* translators: as in 'processing image X out of Y' */
284
+ esc_html_e('Processing', 'tiny-compress-images');
285
+ echo ' <span>0</span> ' . esc_html__('out of', 'tiny-compress-images') . sprintf(' %d </p></div>', count($items));
286
  echo '<div id="media-items">';
287
  echo '</div>';
288
 
src/class-tiny-settings.php CHANGED
@@ -45,37 +45,40 @@ class Tiny_Settings extends Tiny_WP_Base {
45
  public function admin_init() {
46
  if (current_user_can('manage_options') && !$this->get_api_key()) {
47
  $link = sprintf('<a href="options-media.php#%s">%s</a>', self::NAME,
48
- self::translate_escape('Please fill in an API key to start compressing images'));
49
  $this->notices->show('setting', $link, 'error', false);
50
  }
51
  try {
52
  $this->init_compressor();
53
  } catch (Tiny_Exception $e) {
54
- $this->notices->show('compressor_exception', self::translate_escape($e->getMessage()), 'error', false);
55
  }
56
 
57
  $section = self::get_prefixed_name('settings');
58
- add_settings_section($section, self::translate('PNG and JPEG compression'), $this->get_method('render_section'), 'media');
59
 
60
  $field = self::get_prefixed_name('api_key');
61
  register_setting('media', $field);
62
- add_settings_field($field, self::translate('TinyPNG API key'), $this->get_method('render_api_key'), 'media', $section, array('label_for' => $field));
63
 
64
  $field = self::get_prefixed_name('sizes');
65
  register_setting('media', $field);
66
- add_settings_field($field, self::translate('File compression'), $this->get_method('render_sizes'), 'media', $section);
67
 
68
  $field = self::get_prefixed_name('resize_original');
69
  register_setting('media', $field);
70
- add_settings_field($field, self::translate('Resize original'), $this->get_method('render_resize'), 'media', $section);
71
 
72
  $field = self::get_prefixed_name('status');
73
  register_setting('media', $field);
74
- add_settings_field($field, self::translate('Connection status'), $this->get_method('render_pending_status'), 'media', $section);
75
 
76
  $field = self::get_prefixed_name('savings');
77
  register_setting('media', $field);
78
- add_settings_field($field, self::translate('Savings'), $this->get_method('render_pending_savings'), 'media', $section);
 
 
 
79
 
80
  add_action('wp_ajax_tiny_image_sizes_notice', $this->get_method('image_sizes_notice'));
81
  add_action('wp_ajax_tiny_compress_status', $this->get_method('connection_status'));
@@ -184,6 +187,25 @@ class Tiny_Settings extends Tiny_WP_Base {
184
  return isset($setting['enabled']) && $setting['enabled'] === 'on';
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  public function get_resize_options() {
188
  $setting = get_option(self::get_prefixed_name('resize_original'));
189
  if (!$this->get_resize_enabled()) {
@@ -214,24 +236,23 @@ class Tiny_Settings extends Tiny_WP_Base {
214
  $key = $this->get_api_key();
215
 
216
  if (defined('TINY_API_KEY')) {
217
- echo '<p>' . sprintf(self::translate('The API key has been configured in %s'), 'wp-config.php') . '.</p>';
218
  } else {
219
  echo '<input type="text" id="' . $field . '" name="' . $field . '" value="' . htmlspecialchars($key) . '" size="40" />';
220
  }
221
  echo '<p>';
222
- $link = '<a href="https://tinypng.com/developers" target="_blank">' . self::translate_escape('TinyPNG Developer section') . '</a>';
223
  if (empty($key)) {
224
- printf(self::translate_escape('Visit %s to get an API key') . '.', $link);
225
  } else {
226
- printf(self::translate_escape('Visit %s to view or upgrade your account') . '.', $link);
227
  }
228
  echo '</p>';
229
  }
230
 
231
  public function render_sizes() {
232
  echo '<p>';
233
- echo self::translate_escape('Choose sizes to compress') . '. ';
234
- echo self::translate_escape('Remember each selected size counts as a compression') . '. ';
235
  echo '</p>';
236
  echo '<input type="hidden" name="' . self::get_prefixed_name('sizes[' . self::DUMMY_SIZE . ']') . '" value="on"/>';
237
  foreach ($this->get_sizes() as $size => $option) {
@@ -248,7 +269,7 @@ class Tiny_Settings extends Tiny_WP_Base {
248
  $name = self::get_prefixed_name("sizes[$size]");
249
  $checked = ( $option['tinify'] ? ' checked="checked"' : '' );
250
  if ($size === Tiny_Metadata::ORIGINAL) {
251
- $label = self::translate_escape("original") . ' (' . self::translate_escape('overwritten by compressed image') . ')';
252
  } else {
253
  $label = $size . ' - ' . $option['width'] . 'x' . $option['height'];
254
  }
@@ -264,14 +285,11 @@ class Tiny_Settings extends Tiny_WP_Base {
264
  $active_image_sizes_count++;
265
  }
266
  if ($active_image_sizes_count < 1) {
267
- echo self::translate_escape('With these settings no images will be compressed') . '.';
268
  } else {
269
  $free_images_per_month = floor( Tiny_Config::MONTHLY_FREE_COMPRESSIONS / $active_image_sizes_count );
270
- echo self::translate_escape('With these settings you can compress');
271
- echo ' <strong>';
272
- printf(self::translate_escape('at least %s images'), $free_images_per_month);
273
- echo '</strong> ';
274
- echo self::translate_escape('for free each month') . '.';
275
  }
276
  echo '</p>';
277
  }
@@ -289,23 +307,23 @@ class Tiny_Settings extends Tiny_WP_Base {
289
 
290
  echo '<p>';
291
  if ($total_savings > 0) {
292
- printf( self::translate_escape( "You have saved a total of %s on images") . '!', '<strong>' . size_format( $total_savings ) . '</strong>' );
293
  } else {
294
- $link = '<a href="upload.php?page=tiny-bulk-compress">' . self::translate_escape('Compress All Images') . '</a>';
295
- printf(self::translate_escape('No images compressed yet. Use %s to compress existing images') . '.', $link);
296
  }
297
  echo '</p>';
298
  }
299
 
300
  public function render_resize() {
301
  echo '<p class="tiny-resize-unavailable" style="display: none">';
302
- echo self::translate_escape("Enable the compression of the original image size to configure resizing") . '.';
303
  echo '</p>';
304
 
305
  $id = self::get_prefixed_name("resize_original_enabled");
306
  $name = self::get_prefixed_name("resize_original[enabled]");
307
  $checked = ( $this->get_resize_enabled() ? ' checked="checked"' : '' );
308
- $label = self::translate_escape('Resize and compress the orginal image');
309
 
310
  echo '<p class="tiny-resize-available">';
311
  echo '<input type="checkbox" id="' . $id . '" name="' . $name . '" value="on" '. $checked . '/>';
@@ -314,14 +332,29 @@ class Tiny_Settings extends Tiny_WP_Base {
314
  echo '</p>';
315
 
316
  echo '<p class="tiny-resize-available tiny-resize-resolution">';
317
- printf("%s: ", self::translate_escape('Max Width'));
318
  $this->render_resize_input('width');
319
- printf("%s: ", self::translate_escape('Max Height'));
320
  $this->render_resize_input('height');
321
  echo '</p>';
322
 
323
- echo '<p class="tiny-resize-available">';
324
- echo sprintf(self::translate_escape("Resizing takes %s for each image that is larger"), self::translate_escape('1 additional compression')) . '.';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
325
  echo '</p>';
326
  }
327
 
@@ -345,10 +378,10 @@ class Tiny_Settings extends Tiny_WP_Base {
345
  update_option($field, $count);
346
 
347
  if (isset($details['error']) && $details['error'] == 'TooManyRequests') {
348
- $link = '<a href="https://tinypng.com/developers" target="_blank">' . self::translate_escape('TinyPNG API account') . '</a>';
349
  $this->notices->add('limit-reached',
350
- sprintf(self::translate_escape('You have reached your limit of %s compressions this month'), $count) . '. ' .
351
- sprintf(self::translate_escape('Upgrade your %s if you like to compress more images'), $link) . '.');
352
  } else {
353
  $this->notices->remove('limit-reached');
354
  }
@@ -367,30 +400,31 @@ class Tiny_Settings extends Tiny_WP_Base {
367
  echo '<p>';
368
  if ($status) {
369
  echo '<img src="images/yes.png"> ';
370
- echo self::translate_escape('API connection successful');
371
  } else {
372
  echo '<img src="images/no.png"> ';
373
  if ($status === false) {
374
- echo self::translate_escape('API connection unsuccessful') . '<br>';
375
  if (isset($details['message'])) {
376
- echo self::translate_escape('Error') . ': ' . self::translate_escape($details['message']);
377
  }
378
  } else {
379
- echo self::translate_escape('API status could not be checked, enable cURL for more information');
380
  }
381
  }
382
  echo '</p>';
 
383
  if ($status) {
384
  $compressions = self::get_compression_count();
385
  echo '<p>';
386
  // It is not possible to check if a subscription is free or flexible.
387
  if ( $compressions == Tiny_Config::MONTHLY_FREE_COMPRESSIONS ) {
388
- $link = '<a href="https://tinypng.com/developers" target="_blank">' . self::translate_escape('TinyPNG API account') . '</a>';
389
- printf(self::translate_escape('You have reached your limit of %s compressions this month') . '.', $compressions);
390
  echo '<br>';
391
- printf(self::translate_escape('If you need to compress more images you can change your %s') . '.', $link);
392
  } else {
393
- printf(self::translate_escape('You have made %s compressions this month') . '.', self::get_compression_count());
394
  }
395
  echo '</p>';
396
  }
45
  public function admin_init() {
46
  if (current_user_can('manage_options') && !$this->get_api_key()) {
47
  $link = sprintf('<a href="options-media.php#%s">%s</a>', self::NAME,
48
+ esc_html__('Please fill in an API key to start compressing images', 'tiny-compress-images'));
49
  $this->notices->show('setting', $link, 'error', false);
50
  }
51
  try {
52
  $this->init_compressor();
53
  } catch (Tiny_Exception $e) {
54
+ $this->notices->show('compressor_exception', esc_html__($e->getMessage(), 'tiny-compress-images'), 'error', false);
55
  }
56
 
57
  $section = self::get_prefixed_name('settings');
58
+ add_settings_section($section, __('PNG and JPEG compression', 'tiny-compress-images'), $this->get_method('render_section'), 'media');
59
 
60
  $field = self::get_prefixed_name('api_key');
61
  register_setting('media', $field);
62
+ add_settings_field($field, __('TinyPNG API key', 'tiny-compress-images'), $this->get_method('render_api_key'), 'media', $section, array('label_for' => $field));
63
 
64
  $field = self::get_prefixed_name('sizes');
65
  register_setting('media', $field);
66
+ add_settings_field($field, __('File compression', 'tiny-compress-images'), $this->get_method('render_sizes'), 'media', $section);
67
 
68
  $field = self::get_prefixed_name('resize_original');
69
  register_setting('media', $field);
70
+ add_settings_field($field, __('Original image', 'tiny-compress-images'), $this->get_method('render_resize'), 'media', $section);
71
 
72
  $field = self::get_prefixed_name('status');
73
  register_setting('media', $field);
74
+ add_settings_field($field, __('Connection status', 'tiny-compress-images'), $this->get_method('render_pending_status'), 'media', $section);
75
 
76
  $field = self::get_prefixed_name('savings');
77
  register_setting('media', $field);
78
+ add_settings_field($field, __('Savings'), $this->get_method('render_pending_savings'), 'media', $section);
79
+
80
+ $field = self::get_prefixed_name('preserve_data');
81
+ register_setting('media', $field);
82
 
83
  add_action('wp_ajax_tiny_image_sizes_notice', $this->get_method('image_sizes_notice'));
84
  add_action('wp_ajax_tiny_compress_status', $this->get_method('connection_status'));
187
  return isset($setting['enabled']) && $setting['enabled'] === 'on';
188
  }
189
 
190
+ public function get_preserve_enabled($name) {
191
+ $setting = get_option(self::get_prefixed_name('preserve_data'));
192
+ return isset($setting[$name]) && $setting[$name] === 'on';
193
+ }
194
+
195
+ public function get_preserve_options() {
196
+ $settings = get_option(self::get_prefixed_name('preserve_data'));
197
+ $options = array();
198
+ if ($settings) {
199
+ $keys = array_keys($settings);
200
+ foreach ($keys as &$key) {
201
+ if ($settings[$key] === "on") {
202
+ array_push($options, $key);
203
+ }
204
+ }
205
+ }
206
+ return $options;
207
+ }
208
+
209
  public function get_resize_options() {
210
  $setting = get_option(self::get_prefixed_name('resize_original'));
211
  if (!$this->get_resize_enabled()) {
236
  $key = $this->get_api_key();
237
 
238
  if (defined('TINY_API_KEY')) {
239
+ echo '<p>' . sprintf(__('The API key has been configured in %s', 'tiny-compress-images'), 'wp-config.php') . '.</p>';
240
  } else {
241
  echo '<input type="text" id="' . $field . '" name="' . $field . '" value="' . htmlspecialchars($key) . '" size="40" />';
242
  }
243
  echo '<p>';
244
+ $link = '<a href="https://tinypng.com/developers" target="_blank">' . esc_html__('TinyPNG Developer section', 'tiny-compress-images') . '</a>';
245
  if (empty($key)) {
246
+ printf(esc_html__('Visit %s to get an API key.', 'tiny-compress-images'), $link);
247
  } else {
248
+ printf(esc_html__('Visit %s to view or upgrade your account.', 'tiny-compress-images'), $link);
249
  }
250
  echo '</p>';
251
  }
252
 
253
  public function render_sizes() {
254
  echo '<p>';
255
+ esc_html_e('Choose sizes to compress. Remember each selected size counts as a compression.', 'tiny-compress-images');
 
256
  echo '</p>';
257
  echo '<input type="hidden" name="' . self::get_prefixed_name('sizes[' . self::DUMMY_SIZE . ']') . '" value="on"/>';
258
  foreach ($this->get_sizes() as $size => $option) {
269
  $name = self::get_prefixed_name("sizes[$size]");
270
  $checked = ( $option['tinify'] ? ' checked="checked"' : '' );
271
  if ($size === Tiny_Metadata::ORIGINAL) {
272
+ $label = esc_html__('original', 'tiny-compress-images') . ' (' . esc_html__('overwritten by compressed image', 'tiny-compress-images') . ')';
273
  } else {
274
  $label = $size . ' - ' . $option['width'] . 'x' . $option['height'];
275
  }
285
  $active_image_sizes_count++;
286
  }
287
  if ($active_image_sizes_count < 1) {
288
+ esc_html_e('With these settings no images will be compressed.', 'tiny-compress-images');
289
  } else {
290
  $free_images_per_month = floor( Tiny_Config::MONTHLY_FREE_COMPRESSIONS / $active_image_sizes_count );
291
+ printf(__('With these settings you can compress <strong> at least %s images </strong> for free each month.',
292
+ 'tiny-compress-images'), $free_images_per_month);
 
 
 
293
  }
294
  echo '</p>';
295
  }
307
 
308
  echo '<p>';
309
  if ($total_savings > 0) {
310
+ printf(esc_html__('You have saved a total of %s on images!', 'tiny-compress-images'), '<strong>' . size_format($total_savings) . '</strong>' );
311
  } else {
312
+ $link = '<a href="upload.php?page=tiny-bulk-compress">' . esc_html__('Compress All Images', 'tiny-compress-images') . '</a>';
313
+ printf(esc_html__('No images compressed yet. Use %s to compress existing images.', 'tiny-compress-images'), $link);
314
  }
315
  echo '</p>';
316
  }
317
 
318
  public function render_resize() {
319
  echo '<p class="tiny-resize-unavailable" style="display: none">';
320
+ esc_html_e('Enable compression of the original image size for more options.', 'tiny-compress-images');
321
  echo '</p>';
322
 
323
  $id = self::get_prefixed_name("resize_original_enabled");
324
  $name = self::get_prefixed_name("resize_original[enabled]");
325
  $checked = ( $this->get_resize_enabled() ? ' checked="checked"' : '' );
326
+ $label = esc_html__('Resize and compress the orginal image', 'tiny-compress-images');
327
 
328
  echo '<p class="tiny-resize-available">';
329
  echo '<input type="checkbox" id="' . $id . '" name="' . $name . '" value="on" '. $checked . '/>';
332
  echo '</p>';
333
 
334
  echo '<p class="tiny-resize-available tiny-resize-resolution">';
335
+ printf("%s: ", esc_html__('Max Width', 'tiny-compress-images'));
336
  $this->render_resize_input('width');
337
+ printf("%s: ", esc_html__('Max Height', 'tiny-compress-images'));
338
  $this->render_resize_input('height');
339
  echo '</p>';
340
 
341
+ echo '<p class="tiny-resize-available tiny-resize-resolution">';
342
+ esc_html_e('Resizing takes 1 additional compression for each image that is larger.', 'tiny-compress-images');
343
+ echo '</p>';
344
+
345
+ echo '<br>';
346
+ $this->render_preserve_input("copyright", 'Preserve copyright information in the original image (JPEG only)');
347
+ }
348
+
349
+ public function render_preserve_input($name, $description) {
350
+ echo '<p>';
351
+ $id = sprintf(self::get_prefixed_name('preserve_data_%s'), $name);
352
+ $field = sprintf(self::get_prefixed_name('preserve_data[%s]'), $name);
353
+ $checked = ( $this->get_preserve_enabled($name) ? ' checked="checked"' : '' );
354
+ $label = esc_html__($description, 'tiny-compress-images');
355
+ echo '<input type="checkbox" id="' . $id . '" name="' . $field . '" value="on" ' . $checked . '/>';
356
+ echo '<label for="' . $id . '">' . $label . '</label>';
357
+ echo '<br>';
358
  echo '</p>';
359
  }
360
 
378
  update_option($field, $count);
379
 
380
  if (isset($details['error']) && $details['error'] == 'TooManyRequests') {
381
+ $link = '<a href="https://tinypng.com/developers" target="_blank">' . esc_html__('TinyPNG API account', 'tiny-compress-images') . '</a>';
382
  $this->notices->add('limit-reached',
383
+ sprintf(esc_html__('You have reached your limit of %s compressions this month.', 'tiny-compress-images'), $count) .
384
+ sprintf(esc_html__('Upgrade your %s if you like to compress more images.', 'tiny-compress-images'), $link));
385
  } else {
386
  $this->notices->remove('limit-reached');
387
  }
400
  echo '<p>';
401
  if ($status) {
402
  echo '<img src="images/yes.png"> ';
403
+ echo esc_html__('API connection successful', 'tiny-compress-images');
404
  } else {
405
  echo '<img src="images/no.png"> ';
406
  if ($status === false) {
407
+ echo esc_html__('API connection unsuccessful', 'tiny-compress-images') . '<br>';
408
  if (isset($details['message'])) {
409
+ echo esc_html__('Error', 'tiny-compress-images') . ': ' . esc_html__($details['message'], 'tiny-compress-images');
410
  }
411
  } else {
412
+ esc_html_e('API status could not be checked, enable cURL for more information', 'tiny-compress-images');
413
  }
414
  }
415
  echo '</p>';
416
+
417
  if ($status) {
418
  $compressions = self::get_compression_count();
419
  echo '<p>';
420
  // It is not possible to check if a subscription is free or flexible.
421
  if ( $compressions == Tiny_Config::MONTHLY_FREE_COMPRESSIONS ) {
422
+ $link = '<a href="https://tinypng.com/developers" target="_blank">' . esc_html__('TinyPNG API account', 'tiny-compress-images') . '</a>';
423
+ printf(esc_html__('You have reached your limit of %s compressions this month.', 'tiny-compress-images'), $compressions);
424
  echo '<br>';
425
+ printf(esc_html__('If you need to compress more images you can change your %s.', 'tiny-compress-images'), $link);
426
  } else {
427
+ printf(esc_html__('You have made %s compressions this month.', 'tiny-compress-images'), self::get_compression_count());
428
  }
429
  echo '</p>';
430
  }
src/class-tiny-wp-base.php CHANGED
@@ -62,18 +62,6 @@ abstract class Tiny_WP_Base {
62
  return self::PREFIX . $name;
63
  }
64
 
65
- protected static function translate($phrase) {
66
- return translate($phrase, self::NAME);
67
- }
68
-
69
- protected static function translate_escape($phrase) {
70
- return htmlspecialchars(translate($phrase, self::NAME));
71
- }
72
-
73
- protected static function ntranslate_escape($single, $plural, $amount) {
74
- return htmlspecialchars(_n($single, $plural, $amount, self::NAME));
75
- }
76
-
77
  public function __construct() {
78
  add_action('init', $this->get_method('init'));
79
  if (self::is_xmlrpc_request()) {
62
  return self::PREFIX . $name;
63
  }
64
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  public function __construct() {
66
  add_action('init', $this->get_method('init'));
67
  if (self::is_xmlrpc_request()) {
src/languages/tiny-compress-images-nl_NL.mo DELETED
Binary file
src/languages/tiny-compress-images-nl_NL.po DELETED
@@ -1,305 +0,0 @@
1
- msgid "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG."
2
- msgstr "Maak je website sneller. Optimaliseer alle JPEG en PNG afbeeldingen automatisch met TinyPNG."
3
-
4
- msgid "PNG and JPEG compression"
5
- msgstr "PNG- en JPEG-compressie"
6
-
7
- msgid "Visit %s to get an API key"
8
- msgstr "Bezoek de %s om een API-sleutel te verkrijgen"
9
-
10
- msgid "Visit %s to view or upgrade your account"
11
- msgstr "Bezoek de %s om je account te bekijken of aan te passen"
12
-
13
- msgid "TinyPNG Developer section"
14
- msgstr "TinyPNG Developer pagina"
15
-
16
- msgid "TinyPNG API key"
17
- msgstr "TinyPNG API-sleutel"
18
-
19
- msgid "File compression"
20
- msgstr "Bestandscompressie"
21
-
22
- msgid "original"
23
- msgstr "origineel"
24
-
25
- msgid "Choose sizes to compress"
26
- msgstr "Kies afmetingen om te comprimeren"
27
-
28
- msgid "Remember each selected size counts as a compression"
29
- msgstr "Elke geselecteerde afmeting telt als een compressie"
30
-
31
- msgid "Compression"
32
- msgstr "Compressie"
33
-
34
- msgid "Compress"
35
- msgstr "Comprimeer"
36
-
37
- msgid "Compress Images"
38
- msgstr "Comprimeer Afbeeldingen"
39
-
40
- msgid "size compressed"
41
- msgstr "afmeting gecomprimeerd"
42
-
43
- msgid "sizes compressed"
44
- msgstr "afmetingen gecomprimeerd"
45
-
46
- msgid "%d size not compressed"
47
- msgstr "%d afmeting niet gecomprimeerd"
48
-
49
- msgid "%d sizes not compressed"
50
- msgstr "%d afmetingen niet gecomprimeerd"
51
-
52
- msgid "%d file removed"
53
- msgstr "%d bestand verwijderd"
54
-
55
- msgid "%d files removed"
56
- msgstr "%d bestanden verwijderd"
57
-
58
- msgid "%d file missing"
59
- msgstr "%d bestand bestaat niet"
60
-
61
- msgid "%d files missing"
62
- msgstr "%d bestanden bestaan niet"
63
-
64
- msgid "%d file modified after compression"
65
- msgstr "%d bestand veranderd na comprimeren"
66
-
67
- msgid "%d files modified after compression"
68
- msgstr "%d bestanden veranderd na comprimeren"
69
-
70
- msgid "Compression details for %s"
71
- msgstr "Compressie details voor %s"
72
-
73
- msgid "Size"
74
- msgstr "Afmeting"
75
-
76
- msgid "Date"
77
- msgstr "Datum"
78
-
79
- msgid "(resized to %dx%d)"
80
- msgstr "(verkleind naar %dx%d)"
81
-
82
- msgid "(modified after compression)"
83
- msgstr "(veranderd na compressie)"
84
-
85
- msgid "(file removed)"
86
- msgstr "(bestand ontbreekt)"
87
-
88
- msgid "ago"
89
- msgstr "geleden"
90
-
91
- msgid "Combined"
92
- msgstr "Gecombineerd"
93
-
94
- msgid "Total savings %s"
95
- msgstr "Totaal bespaard %s"
96
-
97
- msgid "size being compressed"
98
- msgstr "afmeting wordt gecomprimeerd"
99
-
100
- msgid "sizes being compressed"
101
- msgstr "afmetingen worden gecomprimeerd"
102
-
103
- msgid "Total size"
104
- msgstr "Totale grootte"
105
-
106
- msgid "Original"
107
- msgstr "Origineel"
108
-
109
- msgid "Compressed"
110
- msgstr "Gecomprimeerd"
111
-
112
- msgid "Latest error"
113
- msgstr "Laatste fout"
114
-
115
- msgid "Error"
116
- msgstr "Fout"
117
-
118
- msgid "Internal error"
119
- msgstr "Interne fout"
120
-
121
- msgid "Credentials are invalid"
122
- msgstr "Ongeldige API-sleutel"
123
-
124
- msgid "Your monthly limit has been exceeded"
125
- msgstr "Je maandelijks limiet is bereikt"
126
-
127
- msgid "File is empty"
128
- msgstr "Bestand is leeg"
129
-
130
- msgid "Does not appear to be a PNG or JPEG file"
131
- msgstr "Lijkt geen PNG- of JPEG-bestand te zijn"
132
-
133
- msgid "CMYK color space is not supported"
134
- msgstr "CMYK-kleurruimte wordt niet ondersteund"
135
-
136
- msgid "Image appears corrupt"
137
- msgstr "Bestand lijkt corrupt"
138
-
139
- msgid "Compression failed"
140
- msgstr "Compressie gefaald"
141
-
142
- msgid "No HTTP client is available (cURL or fopen)"
143
- msgstr "Geen HTTP-client beschikbaar (cURL of fopen)"
144
-
145
- msgid "Could not find output url"
146
- msgstr "Kon geen outputlocatie vinden"
147
-
148
- msgid "Could not download output"
149
- msgstr "Kon output niet downloaden"
150
-
151
- msgid "File does not exist"
152
- msgstr "Bestand bestaat niet"
153
-
154
- msgid "Could not compress, enable cURL for detailed error"
155
- msgstr "Kon niet comprimeren, schakel cURL in voor een preciezere foutmelding"
156
-
157
- msgid "You don't have permission to work with uploaded files"
158
- msgstr "Je hebt niet de permissies om met geüploade bestanden te werken"
159
-
160
- msgid "Not a valid media file"
161
- msgstr "Geen geldig media-bestand"
162
-
163
- msgid "Could not find metadata of media file"
164
- msgstr "Kon de metadata niet vinden van het bestand"
165
-
166
- msgid "The API key has been configured in %s"
167
- msgstr "De API-sleutel is geconfigureerd in %s"
168
-
169
- msgid "Connection status"
170
- msgstr "Verbinding status"
171
-
172
- msgid "Dismiss"
173
- msgstr "Negeer"
174
-
175
- msgid "TinyPNG API account"
176
- msgstr "TinyPNG API account"
177
-
178
- msgid "API connection successful"
179
- msgstr "API-verbinding succesvol"
180
-
181
- msgid "API connection unsuccessful"
182
- msgstr "API-verbinding niet succesvol"
183
-
184
- msgid "API status could not be checked, enable cURL for more information"
185
- msgstr "API-status kon niet worden gecontroleerd, schakel cURL in voor meer informatie"
186
-
187
- msgid "You have made %s compressions this month"
188
- msgstr "Je hebt deze maand %s compressies uitgevoerd"
189
-
190
- msgid "You have reached your limit of %s compressions this month"
191
- msgstr "Je hebt je maandelijkse limiet van %s compressies bereikt"
192
-
193
- msgid "If you need to compress more images you can change your %s"
194
- msgstr "Als je meer afbeeldingen wilt comprimeren kun je je %s aanpassen"
195
-
196
- msgid "Upgrade your %s if you like to compress more images"
197
- msgstr "Upgrade je %s als je meer afbeeldingen wilt comprimeren"
198
-
199
- msgid "Savings"
200
- msgstr "Besparingen"
201
-
202
- msgid "You have saved a total of %s on images"
203
- msgstr "Je hebt in totaal %s bespaard op afbeeldingen"
204
-
205
- msgid "No images compressed yet. Use %s to compress existing images"
206
- msgstr "Nog geen gecomprimeerde afbeeldingen. Gebruik %s om bestaande afbeeldingen te comprimeren"
207
-
208
- msgid "With these settings you can compress"
209
- msgstr "Met deze instellingen kan je elke maand"
210
-
211
- msgid "at least %s images"
212
- msgstr "minstens %s afbeeldingen"
213
-
214
- msgid "for free each month"
215
- msgstr "gratis comprimeren"
216
-
217
- msgid "With these settings no images will be compressed"
218
- msgstr "Met deze instellingen worden geen afbeeldingen gecomprimeerd"
219
-
220
- msgid "overwritten by compressed image"
221
- msgstr "overschreven door gecomprimeerde afbeelding"
222
-
223
- msgid "Please fill in an API key to start compressing images"
224
- msgstr "Vul een API-sleutel in om te starten met comprimeren"
225
-
226
- msgid "Compress All Images"
227
- msgstr "Comprimeer alle afbeeldingen"
228
-
229
- msgid "Compress JPEG & PNG Images"
230
- msgstr "Comprimeer JPEG & PNG afbeeldingen"
231
-
232
- msgid "All images are processed"
233
- msgstr "Alle afbeeldingen zijn verwerkt"
234
-
235
- msgid "Compressions this month"
236
- msgstr "Compressies deze maand"
237
-
238
- msgid "Processing"
239
- msgstr "Bezig met"
240
-
241
- msgid "Waiting"
242
- msgstr "Wachten"
243
-
244
- msgid "Compressing"
245
- msgstr "Comprimeren"
246
-
247
- msgid "compressions"
248
- msgstr "compressies"
249
-
250
- msgid "out of"
251
- msgstr "van de"
252
-
253
- msgid "Use this tool to compress all images in your media library"
254
- msgstr "Deze tool comprimeert alle afbeeldingen in je mediabibliotheek"
255
-
256
- msgid "Only images that have not been compressed will be compressed"
257
- msgstr "Dit geldt alleen voor de afbeeldingen die nog niet zijn gecomprimeerd"
258
-
259
- msgid "We have found %d images in your media library and for each image %d sizes will be compressed"
260
- msgstr "We hebben %d afbeeldingen in de mediabibliotheek gevonden en voor elke afbeelding worden %d afmetingen gecomprimeerd"
261
-
262
- msgid "This results in %d compressions at most"
263
- msgstr "Dit resulteert in een maximaal verbruik van %d compressies"
264
-
265
- msgid "To begin, just press the button below"
266
- msgstr "Druk op de knop om te starten"
267
-
268
- msgid "Please be patient while the images are being compressed"
269
- msgstr "Even geduld terwijl de afbeeldingen worden gecomprimeerd"
270
-
271
- msgid "This can take a while if you have many images"
272
- msgstr "Het kan een poos duren als je veel afbeeldingen hebt"
273
-
274
- msgid "Do not navigate away from this page because it will stop the process"
275
- msgstr "Navigeer niet van deze pagina want daardoor stopt het proces"
276
-
277
- msgid "You will be notified via this page when the processing is done"
278
- msgstr "Je wordt genotificeerd op deze pagina bij voltooing"
279
-
280
- msgid "Settings"
281
- msgstr "Instellingen"
282
-
283
- msgid "Resize original"
284
- msgstr "Orgineel verkleinen"
285
-
286
- msgid "Enable the compression of the original image size to configure resizing"
287
- msgstr "Schakel compressie van de originele afbeelding in om te kunnen verkleinen"
288
-
289
- msgid "Resize and compress the orginal image"
290
- msgstr "Verklein en comprimeer de originele afbeelding"
291
-
292
- msgid "Resizing takes %s for each image that is larger"
293
- msgstr "Verkleinen gebruikt %s voor elke afbeelding die groter is dan de vermelde afmetingen"
294
-
295
- msgid "1 additional compression"
296
- msgstr "1 extra compressie"
297
-
298
- msgid "Resized original to %dx%d"
299
- msgstr "Origineel verkleind tot %dx%d"
300
-
301
- msgid "Max Width"
302
- msgstr "Maximale breedte"
303
-
304
- msgid "Max Height"
305
- msgstr "Maximale hoogte"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/languages/tiny-compress-images-ru_RU.mo DELETED
Binary file
src/languages/tiny-compress-images-ru_RU.po DELETED
@@ -1,119 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: \n"
4
- "POT-Creation-Date: \n"
5
- "PO-Revision-Date: \n"
6
- "Last-Translator: Oleg Shalomanov <shalomanov@gmail.com>\n"
7
- "Language-Team: \n"
8
- "MIME-Version: 1.0\n"
9
- "Content-Type: text/plain; charset=UTF-8\n"
10
- "Content-Transfer-Encoding: 8bit\n"
11
- "X-Generator: Poedit 1.6.5\n"
12
- "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
13
- "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
14
- "Language: ru_RU\n"
15
-
16
- msgid "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG."
17
- msgstr "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG."
18
-
19
- msgid "PNG and JPEG compression"
20
- msgstr "Сжатие PNG и JPEG"
21
-
22
- msgid "Visit %s to get an API key"
23
- msgstr "Посетите %s, чтобы получить API ключ"
24
-
25
- msgid "Visit %s to view or upgrade your account"
26
- msgstr "Посетите %s, чтобы посмотреть свою статистику использования сервиса и повысить статус аккаунта"
27
-
28
- msgid "TinyPNG Developer section"
29
- msgstr "раздел TinyPNG для разработчиков"
30
-
31
- msgid "TinyPNG API key"
32
- msgstr "TinyPNG API ключ"
33
-
34
- msgid "File compression"
35
- msgstr "Сжатие файлов"
36
-
37
- msgid "original"
38
- msgstr "оригинальное изображение"
39
-
40
- msgid "You can choose to compress different image sizes created by WordPress here"
41
- msgstr "Здесь вы можете выбрать, какие размеры изображений сжимать"
42
-
43
- msgid "Remember each selected size counts as a compression"
44
- msgstr "Помните, каждый дополнительный типоразмер влияет на месячное использование сервиса TinyPNG"
45
-
46
- msgid "Compression"
47
- msgstr "Сжатие"
48
-
49
- msgid "Compress"
50
- msgstr "Сжать"
51
-
52
- msgid "Compress all"
53
- msgstr "Сжать все"
54
-
55
- msgid "Compressed %d out of %d sizes"
56
- msgstr "Сжато %d из %d типоразмера(-ов)"
57
-
58
- msgid "Total size"
59
- msgstr "Было"
60
-
61
- msgid "Compressed size"
62
- msgstr "Стало"
63
-
64
- msgid "Latest error"
65
- msgstr "Последняя ошибка"
66
-
67
- msgid "Error"
68
- msgstr "Oшибка"
69
-
70
- msgid "Internal error"
71
- msgstr "Oшибка"
72
-
73
- msgid "Credentials are invalid"
74
- msgstr "Параметры доступа некорректны"
75
-
76
- msgid "Your monthly limit has been exceeded"
77
- msgstr "Ваш месячный лимит израсходован"
78
-
79
- msgid "File is empty"
80
- msgstr "Файл пустой"
81
-
82
- msgid "Does not appear to be a PNG or JPEG file"
83
- msgstr "Файл не PNG или JPEG"
84
-
85
- msgid "CMYK color space is not supported"
86
- msgstr "Цветовая модель CMYK не поддерживается"
87
-
88
- msgid "Image appears corrupt"
89
- msgstr "Изображение повреждено"
90
-
91
- msgid "Compression failed"
92
- msgstr "Сжатие не удалось"
93
-
94
- msgid "No HTTP client is available (cURL or fopen)"
95
- msgstr "Нет HTTP клиента (нужны cURL или fopen)"
96
-
97
- msgid "Could not find output url"
98
- msgstr "Не могу найти url результата"
99
-
100
- msgid "Could not download output"
101
- msgstr "Не могу загрузить результат"
102
-
103
- msgid "File does not exist"
104
- msgstr "Файл не существует или не найден плагином"
105
-
106
- msgid "Could not compress, enable cURL for detailed error"
107
- msgstr "Не могу сжать. Подключите cURL для деталей"
108
-
109
- msgid "You don't have permission to work with uploaded files"
110
- msgstr "У вас нет разрешения работать с загруженными файлами"
111
-
112
- msgid "Not a valid media file"
113
- msgstr "Неподходящий медиа-файл"
114
-
115
- msgid "Could not find metadata of media file"
116
- msgstr "Не найдены метаданные файла"
117
-
118
- msgid "The API key has been configured in %s"
119
- msgstr "API ключ был определен в %s"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/languages/tiny-compress-images-zh_TW.mo DELETED
Binary file
src/languages/tiny-compress-images-zh_TW.po DELETED
@@ -1,205 +0,0 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: \n"
4
- "POT-Creation-Date: \n"
5
- "PO-Revision-Date: \n"
6
- "Language-Team: \n"
7
- "MIME-Version: 1.0\n"
8
- "Content-Type: text/plain; charset=UTF-8\n"
9
- "Content-Transfer-Encoding: 8bit\n"
10
- "X-Generator: Poedit 1.8.4\n"
11
- "Last-Translator: Pseric <pserics@gmail.com>\n"
12
- "Plural-Forms: nplurals=1; plural=0;\n"
13
- "Language: zh_TW\n"
14
-
15
- msgid "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG."
16
- msgstr "Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG."
17
-
18
- msgid "PNG and JPEG compression"
19
- msgstr "PNG 和 JPEG 壓縮"
20
-
21
- msgid "Visit %s to get an API key"
22
- msgstr "訪問 %s 取得一個 API 金鑰"
23
-
24
- msgid "Visit %s to view or upgrade your account"
25
- msgstr "訪問 %s 檢視你的使用量或升級你的帳號"
26
-
27
- msgid "TinyPNG Developer section"
28
- msgstr "TinyPNG 開發者功能"
29
-
30
- msgid "TinyPNG API key"
31
- msgstr "TinyPNG API 金鑰"
32
-
33
- msgid "File compression"
34
- msgstr "檔案壓縮"
35
-
36
- msgid "original"
37
- msgstr "原始大小"
38
-
39
- msgid "You can choose to compress different image sizes created by WordPress here"
40
- msgstr "你可以在這裡選擇要壓縮的圖片大小,由 WordPress 建立"
41
-
42
- msgid "Remember each selected size counts as a compression"
43
- msgstr "請記住,每個額外圖片尺寸都會影響你的 TinyPNG 每月使用量"
44
-
45
- msgid "Compression"
46
- msgstr "壓縮"
47
-
48
- msgid "Compress"
49
- msgstr "壓縮"
50
-
51
- msgid "Compress Images"
52
- msgstr "壓縮圖片"
53
-
54
- msgid "Compressed %d out of %d sizes"
55
- msgstr "已壓縮 %d/%d 個尺寸"
56
-
57
- msgid "Compressing %d sizes..."
58
- msgstr "壓縮 %d 個尺寸..."
59
-
60
- msgid "Total size"
61
- msgstr "總共大小"
62
-
63
- msgid "Compressed size"
64
- msgstr "已壓縮尺寸"
65
-
66
- msgid "Latest error"
67
- msgstr "最近錯誤"
68
-
69
- msgid "Error"
70
- msgstr "錯誤"
71
-
72
- msgid "Internal error"
73
- msgstr "內部錯誤"
74
-
75
- msgid "Credentials are invalid"
76
- msgstr "憑證無效"
77
-
78
- msgid "Your monthly limit has been exceeded"
79
- msgstr "你的每月限額已經超過"
80
-
81
- msgid "File is empty"
82
- msgstr "檔案是空的"
83
-
84
- msgid "Does not appear to be a PNG or JPEG file"
85
- msgstr "似乎不是一個 PNG 或 JPEG 檔案"
86
-
87
- msgid "CMYK color space is not supported"
88
- msgstr "不支援 CMYK 色彩空間"
89
-
90
- msgid "Image appears corrupt"
91
- msgstr "圖片似乎已經損壞"
92
-
93
- msgid "Compression failed"
94
- msgstr "壓縮失敗"
95
-
96
- msgid "No HTTP client is available (cURL or fopen)"
97
- msgstr "沒有 HTTP 客戶端可用(cURL 或 fopen)"
98
-
99
- msgid "Could not find output url"
100
- msgstr "找不到輸出網址"
101
-
102
- msgid "Could not download output"
103
- msgstr "無法下載輸出"
104
-
105
- msgid "File does not exist"
106
- msgstr "檔案不存在"
107
-
108
- msgid "Could not compress, enable cURL for detailed error"
109
- msgstr "無法壓縮,啟用 cURL 取得詳細錯誤資訊"
110
-
111
- msgid "You don't have permission to work with uploaded files"
112
- msgstr "你沒有權限來處理上傳的檔案"
113
-
114
- msgid "Not a valid media file"
115
- msgstr "不是一個有效的媒體檔案"
116
-
117
- msgid "Could not find metadata of media file"
118
- msgstr "找不到媒體檔案的 metadata"
119
-
120
- msgid "The API key has been configured in %s"
121
- msgstr "這個 API 金鑰已經設定在 %s"
122
-
123
- msgid "Connection status"
124
- msgstr "連線狀態"
125
-
126
- msgid "Dismiss"
127
- msgstr "拒絕"
128
-
129
- msgid "TinyPNG API account"
130
- msgstr "TinyPNG API 帳號"
131
-
132
- msgid "API connection successful"
133
- msgstr "API 連線成功"
134
-
135
- msgid "API connection unsuccessful"
136
- msgstr "API 連線不成功"
137
-
138
- msgid "API status could not be checked, enable cURL for more information"
139
- msgstr "無法檢查 API 狀態,啟用 cURL 取得更多資訊"
140
-
141
- msgid "You have made %s compressions this month"
142
- msgstr "本月你已經壓縮 %s 張圖片"
143
-
144
- msgid "You have reached your limit of %s compressions this month"
145
- msgstr "本月你已經到達你的壓縮限制 %s 張圖片"
146
-
147
- msgid "If you need to compress more images you can change your %s"
148
- msgstr "如果你需要壓縮更多圖片,你可以變更你的 %s"
149
-
150
- msgid "Upgrade your %s if you like to compress more images"
151
- msgstr "如果你想壓縮更多圖片,升級你的 %s"
152
-
153
- msgid "Please fill in an API key to start compressing images"
154
- msgstr "請填入一個 API 金鑰來開始壓縮圖片"
155
-
156
- msgid "Compress All Images"
157
- msgstr "壓縮所有圖片"
158
-
159
- msgid "Compress JPEG & PNG Images"
160
- msgstr "壓縮 JPEG & PNG 圖片"
161
-
162
- msgid "All images are processed"
163
- msgstr "所有圖片皆處理完成"
164
-
165
- msgid "Compressions this month"
166
- msgstr "本月壓縮"
167
-
168
- msgid "Processing"
169
- msgstr "處理中"
170
-
171
- msgid "Waiting"
172
- msgstr "等待中"
173
-
174
- msgid "Compressing"
175
- msgstr "壓縮中"
176
-
177
- msgid "compressions"
178
- msgstr "壓縮"
179
-
180
- msgid "out of"
181
- msgstr "以外"
182
-
183
- msgid "Use this tool to compress all images in your media library"
184
- msgstr "使用這個工具來壓縮你媒體庫的所有圖片"
185
-
186
- msgid "Only images that have not been compressed will be compressed"
187
- msgstr "只有沒被壓縮過的圖片才會壓縮"
188
-
189
- msgid "We have found %d images in your media library"
190
- msgstr "我們在你的媒體庫找到 %d 張圖片"
191
-
192
- msgid "To begin, just press the button below"
193
- msgstr "如要開始,只要點選下方案扭"
194
-
195
- msgid "Please be patient while the images are being compressed"
196
- msgstr "相片壓縮時請耐心等待"
197
-
198
- msgid "This can take a while if you have many images"
199
- msgstr "如果你有許多圖片,這可能需要一段時間"
200
-
201
- msgid "Do not navigate away from this page because it will stop the process"
202
- msgstr "請不要離開此頁面,因為它會停止壓縮程序"
203
-
204
- msgid "You will be notified via this page when the processing is done"
205
- msgstr "當處理完成後,你將透過此頁面取得通知"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
src/views/compress-details-processing.php CHANGED
@@ -2,8 +2,8 @@
2
  <div class="details">
3
  <span class="icon spinner"></span>
4
  <span class="message">
5
- <strong><?php echo $compressing ?></strong>
6
- <span><?php printf(self::ntranslate_escape('size being compressed', 'sizes being compressed', $compressing)) ?></span>
7
  </span>
8
  </div>
9
  </div>
2
  <div class="details">
3
  <span class="icon spinner"></span>
4
  <span class="message">
5
+ <strong><?= $compressing ?></strong>
6
+ <span><?= _n('size being compressed', 'sizes being compressed', $compressing, 'tiny-compress-images') ?></span>
7
  </span>
8
  </div>
9
  </div>
src/views/compress-details.php CHANGED
@@ -1,5 +1,5 @@
1
  <div class="details-container">
2
- <div class="details">
3
  <?php if ($error) { ?>
4
  <span class="icon dashicons dashicons-warning error"></span>
5
  <?php } else if ($missing > 0 || $modified > 0) { ?>
@@ -14,42 +14,44 @@
14
  <?php if ($tiny_metadata->get_compressed_count() > 0 || ($tiny_metadata->get_compressed_count() == 0 && count($uncompressed) == 0)) { ?>
15
  <span class="message">
16
  <strong><?php echo $tiny_metadata->get_compressed_count() ?></strong>
17
- <span><?php printf(self::ntranslate_escape('size compressed', 'sizes compressed', $tiny_metadata->get_compressed_count())) ?></span>
 
 
18
  </span>
19
  <br/>
20
  <?php } ?>
21
 
22
  <?php if ($not_compressed_active > 0) { ?>
23
  <span class="message">
24
- <?php printf(self::ntranslate_escape('%d size not compressed', '%d sizes not compressed', $not_compressed_active), $not_compressed_active) ?>
25
  </span>
26
  <br />
27
  <?php } ?>
28
 
29
  <?php if ($missing > 0) { ?>
30
  <span class="message">
31
- <?php printf(self::ntranslate_escape('%d file removed', '%d files removed', $missing), $missing) ?>
32
  </span>
33
  <br />
34
  <?php } ?>
35
 
36
  <?php if ($modified > 0) { ?>
37
  <span class="message">
38
- <?php printf(self::ntranslate_escape('%d file modified after compression', '%d files modified after compression', $modified), $modified) ?>
39
  </span>
40
  <br />
41
  <?php } ?>
42
 
43
  <?php if ($savings["input"] - $savings["output"]) { ?>
44
  <span class="message">
45
- <?php printf(self::translate_escape('Total savings %s' ), str_replace( " ", "&nbsp;", size_format($savings["input"] - $savings["output"], 1))) ?>
46
  </span>
47
  <br />
48
  <?php } ?>
49
 
50
  <?php if ($error) { ?>
51
  <span class="message error_message">
52
- <?php echo self::translate_escape('Latest error') . ': '. self::translate_escape($error) ?>
53
  </span>
54
  <br/>
55
  <?php } ?>
@@ -61,20 +63,22 @@
61
 
62
  <?php if (count($uncompressed) > 0) { ?>
63
  <button type="button" class="tiny-compress button button-small button-primary" data-id="<?php echo $tiny_metadata->get_id() ?>">
64
- <?php echo self::translate_escape('Compress') ?>
65
  </button>
66
  <?php } ?>
67
  </div>
68
  <?php if ($tiny_metadata->get_compressed_count() > 0) { ?>
69
  <div class="modal" id="modal_<?php echo $tiny_metadata->get_id() ?>">
70
  <div class="tiny-compression-details">
71
- <h3><?php printf(self::translate_escape('Compression details for %s'), $tiny_metadata->get_name()) ?></h3>
 
 
72
  <table>
73
  <tr>
74
- <th><?php echo self::translate_escape('Size') ?></th>
75
- <th><?php echo self::translate_escape('Original') ?></th>
76
- <th><?php echo self::translate_escape('Compressed') ?></th>
77
- <th><?php echo self::translate_escape('Date') ?></th>
78
  </tr>
79
  <?php $i = 0; ?>
80
  <?php foreach ($tiny_metadata->get_compressed_sizes() as $size) { ?>
@@ -82,30 +86,30 @@
82
  <tr class="<?php echo ($i % 2 == 0) ? 'even' : 'odd' ?>">
83
  <td>
84
  <?php
85
- echo ($size == "0" ? self::translate_escape('original') : $size ) . ' ';
86
  if ($tiny_metadata->still_exists($size)) {
87
  if ($tiny_metadata->is_compressed($size)) {
88
  if ($tiny_metadata->is_resized($size)) {
89
- printf('<em>' . self::translate_escape('(resized to %dx%d)') . '</em>', $meta['output']['width'], $meta['output']['height']);
90
  }
91
  } else {
92
- echo '<em>' . self::translate_escape('(modified after compression)') . '</em>';
93
  }
94
  } else {
95
- echo '<em>' . self::translate_escape('(file removed)') . '</em>';
96
  }
97
  ?>
98
  </td>
99
  <td><?php echo size_format($meta["input"]["size"], 1) ?></td>
100
  <td><?php echo size_format($meta["output"]["size"], 1) ?></td>
101
- <td><?php echo human_time_diff($tiny_metadata->get_end_time($size)) . ' ' . self::translate_escape('ago') ?></td>
102
  </tr>
103
  <?php $i++; ?>
104
  <?php } ?>
105
  <?php if ($savings['count'] > 0) { ?>
106
  <tfoot>
107
  <tr>
108
- <td><?php echo self::translate_escape('Combined') ?></td>
109
  <td><?php echo size_format($savings['input'], 1) ?></td>
110
  <td><?php echo size_format($savings['output'], 1) ?></td>
111
  <td></td>
@@ -113,7 +117,7 @@
113
  </tfoot>
114
  <?php } ?>
115
  </table>
116
- <p><strong><?php printf( self::translate_escape( 'Total savings %s' ), size_format($savings["input"] - $savings["output"], 1)) ?></strong></p>
117
  </div>
118
  </div>
119
  <?php } ?>
1
  <div class="details-container">
2
+ <div class="details" id="tinify-compress-details">
3
  <?php if ($error) { ?>
4
  <span class="icon dashicons dashicons-warning error"></span>
5
  <?php } else if ($missing > 0 || $modified > 0) { ?>
14
  <?php if ($tiny_metadata->get_compressed_count() > 0 || ($tiny_metadata->get_compressed_count() == 0 && count($uncompressed) == 0)) { ?>
15
  <span class="message">
16
  <strong><?php echo $tiny_metadata->get_compressed_count() ?></strong>
17
+ <span>
18
+ <?= htmlspecialchars(_n('size compressed', 'sizes compressed', $tiny_metadata->get_compressed_count(), 'tiny-compress-images')) ?>
19
+ </span>
20
  </span>
21
  <br/>
22
  <?php } ?>
23
 
24
  <?php if ($not_compressed_active > 0) { ?>
25
  <span class="message">
26
+ <?= htmlspecialchars(sprintf(_n('%d size not compressed', '%d sizes not compressed', $not_compressed_active), $not_compressed_active)) ?>
27
  </span>
28
  <br />
29
  <?php } ?>
30
 
31
  <?php if ($missing > 0) { ?>
32
  <span class="message">
33
+ <?= htmlspecialchars(sprintf(_n('%d file removed', '%d files removed', $missing), $missing)) ?>
34
  </span>
35
  <br />
36
  <?php } ?>
37
 
38
  <?php if ($modified > 0) { ?>
39
  <span class="message">
40
+ <?= htmlspecialchars(sprintf(_n('%d file modified after compression', '%d files modified after compression', $modified), $modified)) ?>
41
  </span>
42
  <br />
43
  <?php } ?>
44
 
45
  <?php if ($savings["input"] - $savings["output"]) { ?>
46
  <span class="message">
47
+ <?php printf(esc_html__('Total savings %s', 'tiny-compress-images'), str_replace(" ", "&nbsp;", size_format($savings["input"] - $savings["output"], 1))) ?>
48
  </span>
49
  <br />
50
  <?php } ?>
51
 
52
  <?php if ($error) { ?>
53
  <span class="message error_message">
54
+ <?= esc_html__('Latest error', 'tiny-compress-images') . ': '. esc_html__($error, 'tiny-compress-images') ?>
55
  </span>
56
  <br/>
57
  <?php } ?>
63
 
64
  <?php if (count($uncompressed) > 0) { ?>
65
  <button type="button" class="tiny-compress button button-small button-primary" data-id="<?php echo $tiny_metadata->get_id() ?>">
66
+ <?= esc_html__('Compress', 'tiny-compress-images') ?>
67
  </button>
68
  <?php } ?>
69
  </div>
70
  <?php if ($tiny_metadata->get_compressed_count() > 0) { ?>
71
  <div class="modal" id="modal_<?php echo $tiny_metadata->get_id() ?>">
72
  <div class="tiny-compression-details">
73
+ <h3>
74
+ <?php printf(esc_html__('Compression details for %s', 'tiny-compress-images'), $tiny_metadata->get_name()) ?>
75
+ </h3>
76
  <table>
77
  <tr>
78
+ <th><?php esc_html_e('Size', 'tiny-compress-images') ?></th>
79
+ <th><?php esc_html_e('Original', 'tiny-compress-images') ?></th>
80
+ <th><?php esc_html_e('Compressed', 'tiny-compress-images') ?></th>
81
+ <th><?php esc_html_e('Date', 'tiny-compress-images') ?></th>
82
  </tr>
83
  <?php $i = 0; ?>
84
  <?php foreach ($tiny_metadata->get_compressed_sizes() as $size) { ?>
86
  <tr class="<?php echo ($i % 2 == 0) ? 'even' : 'odd' ?>">
87
  <td>
88
  <?php
89
+ echo ($size == "0" ? esc_html__('original', 'tiny-compress-images') : $size ) . ' ';
90
  if ($tiny_metadata->still_exists($size)) {
91
  if ($tiny_metadata->is_compressed($size)) {
92
  if ($tiny_metadata->is_resized($size)) {
93
+ printf('<em>' . esc_html__('(resized to %dx%d)', 'tiny-compress-images') . '</em>', $meta['output']['width'], $meta['output']['height']);
94
  }
95
  } else {
96
+ echo '<em>' . esc_html__('(modified after compression)', 'tiny-compress-images') . '</em>';
97
  }
98
  } else {
99
+ echo '<em>' . esc_html__('(file removed)', 'tiny-compress-images') . '</em>';
100
  }
101
  ?>
102
  </td>
103
  <td><?php echo size_format($meta["input"]["size"], 1) ?></td>
104
  <td><?php echo size_format($meta["output"]["size"], 1) ?></td>
105
+ <td><?php echo human_time_diff($tiny_metadata->get_end_time($size)) . ' ' . esc_html__('ago', 'tiny-compress-images') ?></td>
106
  </tr>
107
  <?php $i++; ?>
108
  <?php } ?>
109
  <?php if ($savings['count'] > 0) { ?>
110
  <tfoot>
111
  <tr>
112
+ <td><?php esc_html_e('Combined', 'tiny-compress-images') ?></td>
113
  <td><?php echo size_format($savings['input'], 1) ?></td>
114
  <td><?php echo size_format($savings['output'], 1) ?></td>
115
  <td></td>
117
  </tfoot>
118
  <?php } ?>
119
  </table>
120
+ <p><strong><?php printf(esc_html__('Total savings %s', 'tiny-compress-images'), size_format($savings["input"] - $savings["output"], 1)) ?></strong></p>
121
  </div>
122
  </div>
123
  <?php } ?>
test/fixtures/tiny-config.php CHANGED
@@ -2,4 +2,5 @@
2
 
3
  class Tiny_Config {
4
  const URL = 'http://webservice/shrink';
 
5
  }
2
 
3
  class Tiny_Config {
4
  const URL = 'http://webservice/shrink';
5
+ const MONTHLY_FREE_COMPRESSIONS = 500;
6
  }
test/helpers/setup.php CHANGED
@@ -2,6 +2,13 @@
2
 
3
  require 'vendor/autoload.php';
4
 
 
 
 
 
 
 
 
5
  function wordpress($url = null) {
6
  return getenv('WORDPRESS_URL') . $url;
7
  }
@@ -26,14 +33,12 @@ function configure_wordpress_for_testing($driver) {
26
  activate_plugin($driver);
27
  backup_wordpress_site();
28
  }
29
- set_test_webservice_url();
30
  }
31
 
32
  function restore_wordpress() {
33
  if (is_wordpress_setup()) {
34
  set_siteurl('http://' . getenv('HOST_IP') . ':' . getenv('HOST_PORT'));
35
  }
36
- restore_webservice_url();
37
  }
38
 
39
  function mysql_dump_file() {
@@ -48,17 +53,6 @@ function backup_wordpress_site() {
48
  shell_exec('mysqldump -h ' . getenv('HOST_IP') . ' -u root -p' . getenv('MYSQL_ROOT_PASSWORD') . ' ' . getenv('WORDPRESS_DATABASE') . ' | gzip -c > ' . mysql_dump_file());
49
  }
50
 
51
- function set_test_webservice_url() {
52
- $config_dir = dirname(__FILE__) . '/../../src/config';
53
- shell_exec('mv ' . $config_dir . '/tiny-config.php ' . $config_dir . '/tiny-config.php.bak');
54
- shell_exec('cp ' . dirname(__FILE__) . '/../fixtures/tiny-config.php ' . $config_dir . '/tiny-config.php');
55
- }
56
-
57
- function restore_webservice_url() {
58
- $config_dir = dirname(__FILE__) . '/../../src/config';
59
- shell_exec('test -f ' . $config_dir . '/tiny-config.php.bak && mv ' . $config_dir . '/tiny-config.php.bak ' . $config_dir . '/tiny-config.php');
60
- }
61
-
62
  function set_siteurl($site_url) {
63
  $db = new mysqli(getenv('HOST_IP'), 'root', getenv('MYSQL_ROOT_PASSWORD'), getenv('WORDPRESS_DATABASE'));
64
  $statement = $db->prepare("UPDATE wp_options SET option_value = ? WHERE option_name = 'home' OR option_name = 'siteurl'");
@@ -129,10 +123,16 @@ function login($driver) {
129
  $driver->findElement(WebDriverBy::name('pwd'))->clear()->click()->sendKeys('admin');
130
  $driver->findElement(WebDriverBy::tagName('form'))->submit();
131
 
132
- $dashboardHeading = $driver->findElement(WebDriverBy::xpath("//html/body//div[@class='wrap']/*[self::h1 or self::h2]"));
133
- if ($dashboardHeading->getText() == 'Dashboard') {
134
- print "success!\n";
135
- } else {
 
 
 
 
 
 
136
  var_dump($driver->getPageSource());
137
  throw new UnexpectedValueException('Login failed.');
138
  }
@@ -168,9 +168,13 @@ function reset_webservice() {
168
  curl_close($request);
169
  }
170
 
171
- $global_webdriver_host = 'http://127.0.0.1:4444/wd/hub';
172
- $global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::firefox());
 
 
173
  $global_session_id = $global_driver->getSessionID();
 
 
174
 
175
  register_shutdown_function('close_webdriver');
176
  register_shutdown_function('restore_wordpress');
2
 
3
  require 'vendor/autoload.php';
4
 
5
+ use Facebook\WebDriver;
6
+ use Facebook\WebDriver\WebDriverDimension;
7
+ use Facebook\WebDriver\WebDriverBy;
8
+ use Facebook\WebDriver\Remote;
9
+ use Facebook\WebDriver\Remote\RemoteWebDriver;
10
+ use Facebook\WebDriver\Remote\DesiredCapabilities;
11
+
12
  function wordpress($url = null) {
13
  return getenv('WORDPRESS_URL') . $url;
14
  }
33
  activate_plugin($driver);
34
  backup_wordpress_site();
35
  }
 
36
  }
37
 
38
  function restore_wordpress() {
39
  if (is_wordpress_setup()) {
40
  set_siteurl('http://' . getenv('HOST_IP') . ':' . getenv('HOST_PORT'));
41
  }
 
42
  }
43
 
44
  function mysql_dump_file() {
53
  shell_exec('mysqldump -h ' . getenv('HOST_IP') . ' -u root -p' . getenv('MYSQL_ROOT_PASSWORD') . ' ' . getenv('WORDPRESS_DATABASE') . ' | gzip -c > ' . mysql_dump_file());
54
  }
55
 
 
 
 
 
 
 
 
 
 
 
 
56
  function set_siteurl($site_url) {
57
  $db = new mysqli(getenv('HOST_IP'), 'root', getenv('MYSQL_ROOT_PASSWORD'), getenv('WORDPRESS_DATABASE'));
58
  $statement = $db->prepare("UPDATE wp_options SET option_value = ? WHERE option_name = 'home' OR option_name = 'siteurl'");
123
  $driver->findElement(WebDriverBy::name('pwd'))->clear()->click()->sendKeys('admin');
124
  $driver->findElement(WebDriverBy::tagName('form'))->submit();
125
 
126
+ try {
127
+ $dashboardHeading = $driver->findElement(WebDriverBy::xpath("//html/body//div[@class='wrap']/*[self::h1 or self::h2]"));
128
+ if ($dashboardHeading->getText() == 'Dashboard') {
129
+ print "success!\n";
130
+ } else {
131
+ var_dump($driver->getPageSource());
132
+ throw new UnexpectedValueException('Login failed.');
133
+ }
134
+ } catch (Exception $e) {
135
+ // Fixme: sometimes we get a login error randomly. Perhaps it's caused by one of the tests.
136
  var_dump($driver->getPageSource());
137
  throw new UnexpectedValueException('Login failed.');
138
  }
168
  curl_close($request);
169
  }
170
 
171
+ // $global_webdriver_host = 'http://127.0.0.1:4444/wd/hub';
172
+ // $global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::firefox());
173
+ $global_webdriver_host = 'http://127.0.0.1:8910';
174
+ $global_driver = RemoteWebDriver::create($global_webdriver_host, DesiredCapabilities::phantomjs());
175
  $global_session_id = $global_driver->getSessionID();
176
+ $window = new WebDriverDimension(1280, 1024);
177
+ $global_driver->manage()->window()->setSize($window);
178
 
179
  register_shutdown_function('close_webdriver');
180
  register_shutdown_function('restore_wordpress');
test/helpers/wordpress.php CHANGED
@@ -233,3 +233,13 @@ class WordPressStubs {
233
  return $metadata;
234
  }
235
  }
 
 
 
 
 
 
 
 
 
 
233
  return $metadata;
234
  }
235
  }
236
+
237
+ class WP_HTTP_Proxy {
238
+ public function is_enabled() {
239
+ return false;
240
+ }
241
+ }
242
+
243
+ function __($text, $domain = 'default') {
244
+ return translate($text, $domain);
245
+ }
test/integration/BulkCompressIntegrationTest.php CHANGED
@@ -2,6 +2,9 @@
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
 
 
 
5
  class BulkCompressIntegrationTest extends IntegrationTestCase {
6
 
7
  public function setUp() {
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
5
+ use Facebook\WebDriver\WebDriverBy;
6
+ use Facebook\WebDriver\WebDriverExpectedCondition;
7
+
8
  class BulkCompressIntegrationTest extends IntegrationTestCase {
9
 
10
  public function setUp() {
test/integration/CompressIntegrationTest.php CHANGED
@@ -2,6 +2,9 @@
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
 
 
 
5
  class CompressIntegrationTest extends IntegrationTestCase {
6
 
7
  public function setUp() {
@@ -26,7 +29,7 @@ class CompressIntegrationTest extends IntegrationTestCase {
26
  $this->set_api_key('1234');
27
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-example.png');
28
  $this->assertContains('Latest error: Credentials are invalid',
29
- self::$driver->findElement(WebDriverBy::cssSelector('span.details'))->getText());
30
  }
31
 
32
  public function testShrink() {
@@ -55,8 +58,8 @@ class CompressIntegrationTest extends IntegrationTestCase {
55
  public function testLimitReached() {
56
  $this->set_api_key('LIMIT123');
57
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-example.png');
58
- $this->assertContains('You have reached your limit',
59
- self::$driver->findElement(WebDriverBy::cssSelector('div.error p'))->getText());
60
  }
61
 
62
  public function testLimitReachedDismisses() {
@@ -83,31 +86,43 @@ class CompressIntegrationTest extends IntegrationTestCase {
83
  WebDriverBy::cssSelector('td.tiny-compress-images'), 'JSON: Syntax error [4]'));
84
  }
85
 
86
- public function testResizeFit() {
87
  $this->set_api_key('JPG123');
88
  $this->enable_resize(300, 200);
89
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.png');
90
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
91
  $this->assertContains('resized to 300x200',
92
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
 
 
 
 
 
 
93
  $this->view_edit_image();
94
  $this->assertContains('Dimensions: 300 × 200',
95
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
96
  }
97
 
98
- public function testResizeScale() {
99
  $this->set_api_key('JPG123');
100
  $this->enable_resize(0, 200);
101
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.jpg');
102
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
103
  $this->assertContains('resized to 300x200', self::$driver->findElement(
104
  WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
 
 
 
 
 
 
105
  $this->view_edit_image();
106
  $this->assertContains('Dimensions: 300 × 200',
107
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
108
  }
109
 
110
- public function testResizeNotNeeded()
111
  {
112
  $this->set_api_key('JPG123');
113
  $this->enable_resize(30000, 20000);
@@ -115,12 +130,19 @@ class CompressIntegrationTest extends IntegrationTestCase {
115
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
116
  $this->assertNotContains('resized',
117
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
 
 
 
 
 
 
 
118
  $this->view_edit_image();
119
  $this->assertContains('Dimensions: 1080 × 330',
120
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
121
  }
122
 
123
- public function testResizeDisabled()
124
  {
125
  $this->set_api_key('JPG123');
126
  $this->enable_resize(300, 200);
@@ -129,6 +151,14 @@ class CompressIntegrationTest extends IntegrationTestCase {
129
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
130
  $this->assertNotContains('resized',
131
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
 
 
 
 
 
 
 
 
132
  $this->view_edit_image();
133
  $this->assertContains('Dimensions: 1080 × 330',
134
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
5
+ use Facebook\WebDriver\WebDriverBy;
6
+ use Facebook\WebDriver\WebDriverExpectedCondition;
7
+
8
  class CompressIntegrationTest extends IntegrationTestCase {
9
 
10
  public function setUp() {
29
  $this->set_api_key('1234');
30
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-example.png');
31
  $this->assertContains('Latest error: Credentials are invalid',
32
+ self::$driver->findElement(WebDriverBy::id('tinify-compress-details'))->getText());
33
  }
34
 
35
  public function testShrink() {
58
  public function testLimitReached() {
59
  $this->set_api_key('LIMIT123');
60
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-example.png');
61
+ $this->assertContains('Latest error: Your monthly limit has been exceeded',
62
+ self::$driver->findElement(WebDriverBy::cssSelector('span.error_message'))->getText());
63
  }
64
 
65
  public function testLimitReachedDismisses() {
86
  WebDriverBy::cssSelector('td.tiny-compress-images'), 'JSON: Syntax error [4]'));
87
  }
88
 
89
+ public function testResizeFitShouldDisplayResizedTextInMediaLibrary() {
90
  $this->set_api_key('JPG123');
91
  $this->enable_resize(300, 200);
92
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.png');
93
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
94
  $this->assertContains('resized to 300x200',
95
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
96
+ }
97
+
98
+ public function testResizeFitShouldDisplayResizedTextInEditScreen() {
99
+ $this->set_api_key('JPG123');
100
+ $this->enable_resize(300, 200);
101
+ $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.png');
102
  $this->view_edit_image();
103
  $this->assertContains('Dimensions: 300 × 200',
104
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
105
  }
106
 
107
+ public function testResizeScaleShouldDisplayResizedTextInMediaLibrary() {
108
  $this->set_api_key('JPG123');
109
  $this->enable_resize(0, 200);
110
  $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.jpg');
111
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
112
  $this->assertContains('resized to 300x200', self::$driver->findElement(
113
  WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
114
+ }
115
+
116
+ public function testResizeScaleShouldDisplayResizedTextInEditScreen() {
117
+ $this->set_api_key('JPG123');
118
+ $this->enable_resize(0, 200);
119
+ $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.jpg');
120
  $this->view_edit_image();
121
  $this->assertContains('Dimensions: 300 × 200',
122
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
123
  }
124
 
125
+ public function testResizeNotNeededShouldNotDisplayResizedTextInMediaLibrary()
126
  {
127
  $this->set_api_key('JPG123');
128
  $this->enable_resize(30000, 20000);
130
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
131
  $this->assertNotContains('resized',
132
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
133
+ }
134
+
135
+ public function testResizeNotNeededShouldDisplayOriginalDimensionsInEditScreen()
136
+ {
137
+ $this->set_api_key('JPG123');
138
+ $this->enable_resize(30000, 20000);
139
+ $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.jpg');
140
  $this->view_edit_image();
141
  $this->assertContains('Dimensions: 1080 × 330',
142
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
143
  }
144
 
145
+ public function testResizeDisabledShouldNotDisplayResizedTextInMediaLibrary()
146
  {
147
  $this->set_api_key('JPG123');
148
  $this->enable_resize(300, 200);
151
  self::$driver->findElement(WebDriverBy::cssSelector('td.tiny-compress-images a.thickbox'))->click();
152
  $this->assertNotContains('resized',
153
  self::$driver->findElement(WebDriverBy::cssSelector('div.tiny-compression-details'))->getText());
154
+ }
155
+
156
+ public function testResizeDisabledShouldDisplayOriginalDimensionsInEditScreen()
157
+ {
158
+ $this->set_api_key('JPG123');
159
+ $this->enable_resize(300, 200);
160
+ $this->disable_resize();
161
+ $this->upload_image(dirname(__FILE__) . '/../fixtures/input-large.jpg');
162
  $this->view_edit_image();
163
  $this->assertContains('Dimensions: 1080 × 330',
164
  self::$driver->findElement(WebDriverBy::cssSelector('div.misc-pub-dimensions'))->getText());
test/integration/IntegrationTestCase.php CHANGED
@@ -3,6 +3,11 @@
3
  require(dirname(__FILE__) . '/../helpers/integration_helper.php');
4
  require(dirname(__FILE__) . '/../helpers/setup.php');
5
 
 
 
 
 
 
6
  abstract class IntegrationTestCase extends PHPUnit_Framework_TestCase {
7
 
8
  protected static $driver;
@@ -22,7 +27,7 @@ abstract class IntegrationTestCase extends PHPUnit_Framework_TestCase {
22
  }
23
  self::$driver->wait(2)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::name('async-upload')));
24
  $file_input = self::$driver->findElement(WebDriverBy::name('async-upload'));
25
- $file_input->setFileDetector(new LocalFileDetector());
26
  $file_input->sendKeys($path);
27
  self::$driver->findElement(WebDriverBy::xpath('//input[@value="Upload"]'))->click();
28
  $path_elements = explode('/', $path);
3
  require(dirname(__FILE__) . '/../helpers/integration_helper.php');
4
  require(dirname(__FILE__) . '/../helpers/setup.php');
5
 
6
+ use Facebook\WebDriver\WebDriverBy;
7
+ use Facebook\WebDriver\WebDriverExpectedCondition;
8
+ use Facebook\WebDriver\Remote\RemoteWebDriver;
9
+ use Facebook\WebDriver\Remote\UselessFileDetector;
10
+
11
  abstract class IntegrationTestCase extends PHPUnit_Framework_TestCase {
12
 
13
  protected static $driver;
27
  }
28
  self::$driver->wait(2)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::name('async-upload')));
29
  $file_input = self::$driver->findElement(WebDriverBy::name('async-upload'));
30
+ $file_input->setFileDetector(new UselessFileDetector());
31
  $file_input->sendKeys($path);
32
  self::$driver->findElement(WebDriverBy::xpath('//input[@value="Upload"]'))->click();
33
  $path_elements = explode('/', $path);
test/integration/PluginIntegrationTest.php CHANGED
@@ -2,6 +2,8 @@
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
 
 
5
  class PluginIntegrationTest extends IntegrationTestCase {
6
 
7
  public function setUp() {
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
5
+ use Facebook\WebDriver\WebDriverBy;
6
+
7
  class PluginIntegrationTest extends IntegrationTestCase {
8
 
9
  public function setUp() {
test/integration/SettingsIntegrationTest.php CHANGED
@@ -2,6 +2,9 @@
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
 
 
 
5
  class SettingsIntegrationTest extends IntegrationTestCase {
6
 
7
  public function setUp() {
@@ -15,8 +18,8 @@ class SettingsIntegrationTest extends IntegrationTestCase {
15
 
16
  public function testTitlePresence()
17
  {
18
- $h3s = self::$driver->findElements(WebDriverBy::tagName('h3'));
19
- $texts = array_map('innerText', $h3s);
20
  $this->assertContains('PNG and JPEG compression', $texts);
21
  }
22
 
@@ -46,7 +49,6 @@ class SettingsIntegrationTest extends IntegrationTestCase {
46
  $this->assertStringEndsWith('options-media.php#tiny-compress-images', self::$driver->getCurrentURL());
47
  }
48
 
49
-
50
  public function testDefaultSizesBeingCompressed() {
51
  $elements = self::$driver->findElements(
52
  WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
@@ -125,10 +127,10 @@ class SettingsIntegrationTest extends IntegrationTestCase {
125
  }
126
  $labels = self::$driver->findElements(WebDriverBy::tagName('label'));
127
  $texts = array_map('innerText', $labels);
128
- $this->assertContains('Resize and compress orginal images to fit within:', $texts);
129
  $paragraphs = self::$driver->findElements(WebDriverBy::tagName('p'));
130
  $texts = array_map('innerText', $paragraphs);
131
- $this->assertNotContains('Enable the compression of the original image size to configure resizing.', $texts);
132
  }
133
 
134
  public function testShouldNotShowResizingWhenOriginalDisabled() {
@@ -137,7 +139,7 @@ class SettingsIntegrationTest extends IntegrationTestCase {
137
  $element->click();
138
  }
139
  self::$driver->wait(1)->until(WebDriverExpectedCondition::textToBePresentInElement(
140
- WebDriverBy::cssSelector('p.tiny-resize-unavailable'), 'Enable the compression of the original image size to configure resizing.'));
141
  $labels = self::$driver->findElements(WebDriverBy::tagName('label'));
142
  $texts = array_map('innerText', $labels);
143
  $this->assertNotContains('Resize and compress orginal images to fit within:', $texts);
@@ -183,6 +185,6 @@ class SettingsIntegrationTest extends IntegrationTestCase {
183
  self::$driver->wait(2)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::cssSelector('#tiny-compress-savings p')));
184
  $elements = self::$driver->findElement(WebDriverBy::id('tiny-compress-savings'))->findElements(WebDriverBy::tagName('p'));
185
  $statuses = array_map('innerText', $elements);
186
- $this->assertContains('You have saved a total of 53.0 kB on images!', $statuses);
187
  }
188
  }
2
 
3
  require_once(dirname(__FILE__) . "/IntegrationTestCase.php");
4
 
5
+ use Facebook\WebDriver\WebDriverBy;
6
+ use Facebook\WebDriver\WebDriverExpectedCondition;
7
+
8
  class SettingsIntegrationTest extends IntegrationTestCase {
9
 
10
  public function setUp() {
18
 
19
  public function testTitlePresence()
20
  {
21
+ $headings = self::$driver->findElements(WebDriverBy::cssSelector('h1, h2, h3, h4'));
22
+ $texts = array_map('innerText', $headings);
23
  $this->assertContains('PNG and JPEG compression', $texts);
24
  }
25
 
49
  $this->assertStringEndsWith('options-media.php#tiny-compress-images', self::$driver->getCurrentURL());
50
  }
51
 
 
52
  public function testDefaultSizesBeingCompressed() {
53
  $elements = self::$driver->findElements(
54
  WebDriverBy::xpath('//input[@type="checkbox" and starts-with(@name, "tinypng_sizes") and @checked="checked"]'));
127
  }
128
  $labels = self::$driver->findElements(WebDriverBy::tagName('label'));
129
  $texts = array_map('innerText', $labels);
130
+ $this->assertContains('Resize and compress the orginal image', $texts);
131
  $paragraphs = self::$driver->findElements(WebDriverBy::tagName('p'));
132
  $texts = array_map('innerText', $paragraphs);
133
+ $this->assertNotContains('Enable compression of the original image size for more options.', $texts);
134
  }
135
 
136
  public function testShouldNotShowResizingWhenOriginalDisabled() {
139
  $element->click();
140
  }
141
  self::$driver->wait(1)->until(WebDriverExpectedCondition::textToBePresentInElement(
142
+ WebDriverBy::cssSelector('p.tiny-resize-unavailable'), 'Enable compression of the original image size for more options.'));
143
  $labels = self::$driver->findElements(WebDriverBy::tagName('label'));
144
  $texts = array_map('innerText', $labels);
145
  $this->assertNotContains('Resize and compress orginal images to fit within:', $texts);
185
  self::$driver->wait(2)->until(WebDriverExpectedCondition::presenceOfElementLocated(WebDriverBy::cssSelector('#tiny-compress-savings p')));
186
  $elements = self::$driver->findElement(WebDriverBy::id('tiny-compress-savings'))->findElements(WebDriverBy::tagName('p'));
187
  $statuses = array_map('innerText', $elements);
188
+ $this->assertRegexp('/You have saved a total of .. kB on images!/', $statuses[0]);
189
  }
190
  }
test/unit/TinySettingsTest.php CHANGED
@@ -16,7 +16,8 @@ class Tiny_Settings_Test extends TinyTestCase {
16
  array('media', 'tinypng_sizes'),
17
  array('media', 'tinypng_resize_original'),
18
  array('media', 'tinypng_status'),
19
- array('media', 'tinypng_savings')
 
20
  ), $this->wp->getCalls('register_setting'));
21
  }
22
 
@@ -30,7 +31,7 @@ class Tiny_Settings_Test extends TinyTestCase {
30
  $this->assertEquals(array(
31
  array('tinypng_api_key', 'TinyPNG API key', array($this->subject, 'render_api_key'), 'media', 'tinypng_settings', array('label_for' => 'tinypng_api_key')),
32
  array('tinypng_sizes', 'File compression', array($this->subject, 'render_sizes'), 'media', 'tinypng_settings'),
33
- array('tinypng_resize_original', 'Resize original', array($this->subject, 'render_resize'), 'media', 'tinypng_settings'),
34
  array('tinypng_status', 'Connection status', array($this->subject, 'render_pending_status'), 'media', 'tinypng_settings'),
35
  array('tinypng_savings', 'Savings', array($this->subject, 'render_pending_savings'), 'media', 'tinypng_settings')
36
  ), $this->wp->getCalls('add_settings_field'));
@@ -148,4 +149,24 @@ class Tiny_Settings_Test extends TinyTestCase {
148
  $this->wp->addOption("tinypng_resize_original", array('width' => '800', 'height' => '600'));
149
  $this->assertEquals(false, $this->subject->get_resize_options());
150
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
151
  }
16
  array('media', 'tinypng_sizes'),
17
  array('media', 'tinypng_resize_original'),
18
  array('media', 'tinypng_status'),
19
+ array('media', 'tinypng_savings'),
20
+ array('media', 'tinypng_preserve_data')
21
  ), $this->wp->getCalls('register_setting'));
22
  }
23
 
31
  $this->assertEquals(array(
32
  array('tinypng_api_key', 'TinyPNG API key', array($this->subject, 'render_api_key'), 'media', 'tinypng_settings', array('label_for' => 'tinypng_api_key')),
33
  array('tinypng_sizes', 'File compression', array($this->subject, 'render_sizes'), 'media', 'tinypng_settings'),
34
+ array('tinypng_resize_original', 'Original image', array($this->subject, 'render_resize'), 'media', 'tinypng_settings'),
35
  array('tinypng_status', 'Connection status', array($this->subject, 'render_pending_status'), 'media', 'tinypng_settings'),
36
  array('tinypng_savings', 'Savings', array($this->subject, 'render_pending_savings'), 'media', 'tinypng_settings')
37
  ), $this->wp->getCalls('add_settings_field'));
149
  $this->wp->addOption("tinypng_resize_original", array('width' => '800', 'height' => '600'));
150
  $this->assertEquals(false, $this->subject->get_resize_options());
151
  }
152
+
153
+ public function testShouldReturnIncludeMetadataEnabled() {
154
+ $this->wp->addOption("tinypng_preserve_data", array('copyright' => 'on'));
155
+ $this->assertEquals(true, $this->subject->get_preserve_enabled("copyright"));
156
+ }
157
+
158
+ public function testShouldReturnIncludeMetadataNotEnabledWithoutConfiguration() {
159
+ $this->wp->addOption("tinypng_include_metadata", array());
160
+ $this->assertEquals(false, $this->subject->get_preserve_enabled("copyright"));
161
+ }
162
+
163
+ public function testShouldReturnPreserveOptionsWhenEnabled() {
164
+ $this->wp->addOption("tinypng_preserve_data", array('copyright' => 'on'));
165
+ $this->assertEquals(array('0' => 'copyright'), $this->subject->get_preserve_options());
166
+ }
167
+
168
+ public function testShouldNotReturnPreserveOptionsWhenDisabled() {
169
+ $this->wp->addOption("tinypng_include_metadata", array());
170
+ $this->assertEquals(array(), $this->subject->get_preserve_options());
171
+ }
172
  }
tiny-compress-images.php CHANGED
@@ -2,7 +2,7 @@
2
  /**
3
  * Plugin Name: Compress JPEG & PNG images
4
  * Description: Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.
5
- * Version: 1.6.0
6
  * Author: TinyPNG
7
  * Author URI: https://tinypng.com
8
  * Text Domain: tiny-compress-images
2
  /**
3
  * Plugin Name: Compress JPEG & PNG images
4
  * Description: Speed up your website. Optimize your JPEG and PNG images automatically with TinyPNG.
5
+ * Version: 1.7.0
6
  * Author: TinyPNG
7
  * Author URI: https://tinypng.com
8
  * Text Domain: tiny-compress-images