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 | 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 +6 -10
- bin/docker-functions +0 -0
- bin/format-language-files +0 -15
- bin/integration-tests +2 -2
- bin/test-wordpress +15 -0
- composer.json +1 -1
- composer.lock +14 -12
- readme.txt +7 -2
- src/cacert.pem +139 -234
- src/class-tiny-compress-curl.php +44 -7
- src/class-tiny-compress-fopen.php +21 -10
- src/class-tiny-compress.php +6 -6
- src/class-tiny-notices.php +3 -2
- src/class-tiny-plugin.php +35 -29
- src/class-tiny-settings.php +75 -41
- src/class-tiny-wp-base.php +0 -12
- src/languages/tiny-compress-images-nl_NL.mo +0 -0
- src/languages/tiny-compress-images-nl_NL.po +0 -305
- src/languages/tiny-compress-images-ru_RU.mo +0 -0
- src/languages/tiny-compress-images-ru_RU.po +0 -119
- src/languages/tiny-compress-images-zh_TW.mo +0 -0
- src/languages/tiny-compress-images-zh_TW.po +0 -205
- src/views/compress-details-processing.php +2 -2
- src/views/compress-details.php +24 -20
- test/fixtures/tiny-config.php +1 -0
- test/helpers/setup.php +23 -19
- test/helpers/wordpress.php +10 -0
- test/integration/BulkCompressIntegrationTest.php +3 -0
- test/integration/CompressIntegrationTest.php +37 -7
- test/integration/IntegrationTestCase.php +6 -1
- test/integration/PluginIntegrationTest.php +2 -0
- test/integration/SettingsIntegrationTest.php +9 -7
- test/unit/TinySettingsTest.php +23 -2
- tiny-compress-images.php +1 -1
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 |
-
*
|
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
|
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 |
-
###
|
|
|
|
|
40 |
|
41 |
-
|
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": "
|
8 |
"packages": [
|
9 |
{
|
10 |
"name": "composer/installers",
|
@@ -162,36 +162,38 @@
|
|
162 |
},
|
163 |
{
|
164 |
"name": "facebook/webdriver",
|
165 |
-
"version": "
|
166 |
"source": {
|
167 |
"type": "git",
|
168 |
"url": "https://github.com/facebook/php-webdriver.git",
|
169 |
-
"reference": "
|
170 |
},
|
171 |
"dist": {
|
172 |
"type": "zip",
|
173 |
-
"url": "https://api.github.com/repos/facebook/php-webdriver/zipball/
|
174 |
-
"reference": "
|
175 |
"shasum": ""
|
176 |
},
|
177 |
"require": {
|
178 |
"php": ">=5.3.19"
|
179 |
},
|
180 |
"require-dev": {
|
181 |
-
"
|
182 |
-
|
|
|
|
|
183 |
},
|
184 |
"type": "library",
|
185 |
"autoload": {
|
186 |
-
"
|
187 |
-
"lib/"
|
188 |
-
|
189 |
},
|
190 |
"notification-url": "https://packagist.org/downloads/",
|
191 |
"license": [
|
192 |
"Apache-2.0"
|
193 |
],
|
194 |
-
"description": "A
|
195 |
"homepage": "https://github.com/facebook/php-webdriver",
|
196 |
"keywords": [
|
197 |
"facebook",
|
@@ -199,7 +201,7 @@
|
|
199 |
"selenium",
|
200 |
"webdriver"
|
201 |
],
|
202 |
-
"time": "
|
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.
|
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
|
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
|
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:
|
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, $
|
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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
75 |
$options[CURLOPT_USERPWD] = 'api:' . $this->api_key;
|
76 |
$options[CURLOPT_HTTPHEADER] = array('Content-Type: application/json');
|
77 |
-
$options[CURLOPT_POSTFIELDS] = json_encode(
|
78 |
}
|
|
|
79 |
return $options;
|
80 |
}
|
81 |
|
82 |
-
protected function output($url, $
|
83 |
$request = curl_init();
|
84 |
-
$options = $this->output_options($url, $
|
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($
|
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 |
-
|
84 |
-
|
85 |
-
|
86 |
-
|
87 |
-
|
88 |
-
|
89 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
90 |
}
|
91 |
return $options;
|
92 |
}
|
93 |
|
94 |
-
protected function output($url, $
|
95 |
-
$context = stream_context_create($this->output_options($
|
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, $
|
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 = ' <a href="#" class="tiny-dismiss">' .
|
118 |
}
|
119 |
$css = implode(' ', $css);
|
120 |
-
|
|
|
121 |
}
|
122 |
}
|
114 |
$add = '</p>';
|
115 |
$css[] = 'is-dismissible';
|
116 |
} else {
|
117 |
+
$add = ' <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 |
-
|
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 |
-
|
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' =>
|
91 |
-
'L10nBulkAction' =>
|
92 |
-
'L10nCompressing' =>
|
93 |
-
'L10nCompressions' =>
|
94 |
-
'L10nError' =>
|
95 |
-
'L10nInternalError' =>
|
96 |
-
'L10nOutOf' =>
|
97 |
-
'L10nWaiting' =>
|
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 |
-
$
|
|
|
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 =
|
152 |
echo $json ? json_encode(array('error' => $message)) : $message;
|
153 |
exit();
|
154 |
}
|
155 |
if (empty($_POST['id'])) {
|
156 |
-
$message =
|
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 =
|
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] =
|
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>' .
|
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 |
-
|
239 |
-
echo self::translate_escape("Only images that have not been compressed will be compressed") . '. ';
|
240 |
echo '</p>';
|
241 |
echo '<p>';
|
242 |
-
echo sprintf(
|
243 |
-
|
|
|
244 |
echo '</p>';
|
245 |
echo '<p>';
|
246 |
-
|
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 |
-
|
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 |
-
|
273 |
-
echo
|
274 |
-
|
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>'
|
279 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
-
|
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',
|
55 |
}
|
56 |
|
57 |
$section = self::get_prefixed_name('settings');
|
58 |
-
add_settings_section($section,
|
59 |
|
60 |
$field = self::get_prefixed_name('api_key');
|
61 |
register_setting('media', $field);
|
62 |
-
add_settings_field($field,
|
63 |
|
64 |
$field = self::get_prefixed_name('sizes');
|
65 |
register_setting('media', $field);
|
66 |
-
add_settings_field($field,
|
67 |
|
68 |
$field = self::get_prefixed_name('resize_original');
|
69 |
register_setting('media', $field);
|
70 |
-
add_settings_field($field,
|
71 |
|
72 |
$field = self::get_prefixed_name('status');
|
73 |
register_setting('media', $field);
|
74 |
-
add_settings_field($field,
|
75 |
|
76 |
$field = self::get_prefixed_name('savings');
|
77 |
register_setting('media', $field);
|
78 |
-
add_settings_field($field,
|
|
|
|
|
|
|
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(
|
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">' .
|
223 |
if (empty($key)) {
|
224 |
-
printf(
|
225 |
} else {
|
226 |
-
printf(
|
227 |
}
|
228 |
echo '</p>';
|
229 |
}
|
230 |
|
231 |
public function render_sizes() {
|
232 |
echo '<p>';
|
233 |
-
|
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 =
|
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 |
-
|
268 |
} else {
|
269 |
$free_images_per_month = floor( Tiny_Config::MONTHLY_FREE_COMPRESSIONS / $active_image_sizes_count );
|
270 |
-
|
271 |
-
|
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(
|
293 |
} else {
|
294 |
-
$link = '<a href="upload.php?page=tiny-bulk-compress">' .
|
295 |
-
printf(
|
296 |
}
|
297 |
echo '</p>';
|
298 |
}
|
299 |
|
300 |
public function render_resize() {
|
301 |
echo '<p class="tiny-resize-unavailable" style="display: none">';
|
302 |
-
|
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 =
|
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: ",
|
318 |
$this->render_resize_input('width');
|
319 |
-
printf("%s: ",
|
320 |
$this->render_resize_input('height');
|
321 |
echo '</p>';
|
322 |
|
323 |
-
echo '<p class="tiny-resize-available">';
|
324 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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">' .
|
349 |
$this->notices->add('limit-reached',
|
350 |
-
sprintf(
|
351 |
-
sprintf(
|
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
|
371 |
} else {
|
372 |
echo '<img src="images/no.png"> ';
|
373 |
if ($status === false) {
|
374 |
-
echo
|
375 |
if (isset($details['message'])) {
|
376 |
-
echo
|
377 |
}
|
378 |
} else {
|
379 |
-
|
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">' .
|
389 |
-
printf(
|
390 |
echo '<br>';
|
391 |
-
printf(
|
392 |
} else {
|
393 |
-
printf(
|
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
|
6 |
-
<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
|
|
|
|
|
18 |
</span>
|
19 |
<br/>
|
20 |
<?php } ?>
|
21 |
|
22 |
<?php if ($not_compressed_active > 0) { ?>
|
23 |
<span class="message">
|
24 |
-
|
25 |
</span>
|
26 |
<br />
|
27 |
<?php } ?>
|
28 |
|
29 |
<?php if ($missing > 0) { ?>
|
30 |
<span class="message">
|
31 |
-
|
32 |
</span>
|
33 |
<br />
|
34 |
<?php } ?>
|
35 |
|
36 |
<?php if ($modified > 0) { ?>
|
37 |
<span class="message">
|
38 |
-
|
39 |
</span>
|
40 |
<br />
|
41 |
<?php } ?>
|
42 |
|
43 |
<?php if ($savings["input"] - $savings["output"]) { ?>
|
44 |
<span class="message">
|
45 |
-
<?php printf(
|
46 |
</span>
|
47 |
<br />
|
48 |
<?php } ?>
|
49 |
|
50 |
<?php if ($error) { ?>
|
51 |
<span class="message error_message">
|
52 |
-
|
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 |
-
|
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
|
|
|
|
|
72 |
<table>
|
73 |
<tr>
|
74 |
-
<th><?php
|
75 |
-
<th><?php
|
76 |
-
<th><?php
|
77 |
-
<th><?php
|
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" ?
|
86 |
if ($tiny_metadata->still_exists($size)) {
|
87 |
if ($tiny_metadata->is_compressed($size)) {
|
88 |
if ($tiny_metadata->is_resized($size)) {
|
89 |
-
printf('<em>' .
|
90 |
}
|
91 |
} else {
|
92 |
-
echo '<em>' .
|
93 |
}
|
94 |
} else {
|
95 |
-
echo '<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)) . ' ' .
|
102 |
</tr>
|
103 |
<?php $i++; ?>
|
104 |
<?php } ?>
|
105 |
<?php if ($savings['count'] > 0) { ?>
|
106 |
<tfoot>
|
107 |
<tr>
|
108 |
-
<td><?php
|
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(
|
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(" ", " ", 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 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
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::
|
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('
|
59 |
-
self::$driver->findElement(WebDriverBy::cssSelector('
|
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
|
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
|
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
|
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
|
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
|
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 |
-
$
|
19 |
-
$texts = array_map('innerText', $
|
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
|
129 |
$paragraphs = self::$driver->findElements(WebDriverBy::tagName('p'));
|
130 |
$texts = array_map('innerText', $paragraphs);
|
131 |
-
$this->assertNotContains('Enable
|
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
|
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->
|
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', '
|
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 |
* 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
|