Loco Translate - Version 2.6.3

Version Description

  • Fixed bug in plural forms comparison
  • Fixed bug generating author theme jsons
  • Fixed errors in bundle debugger
  • Extended cli type argument to filter specific bundle
  • Bumped WordPress version to 6.0.3
Download this release

Release Info

Developer timwhitlock
Plugin Icon 128x128 Loco Translate
Version 2.6.3
Comparing to
See all releases

Code changes from version 2.6.2 to 2.6.3

languages/loco-translate.pot CHANGED
@@ -1,9 +1,9 @@
1
  #, fuzzy
2
  msgid ""
3
  msgstr ""
4
- "Project-Id-Version: Loco Translate 2.6.2\n"
5
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/loco-translate/\n"
6
- "POT-Creation-Date: 2022-05-24 10:44+0000\n"
7
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
8
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
9
  "Language-Team: \n"
@@ -13,7 +13,7 @@ msgstr ""
13
  "Content-Type: text/plain; charset=UTF-8\n"
14
  "Content-Transfer-Encoding: 8bit\n"
15
  "X-Generator: Loco https://localise.biz/\n"
16
- "X-Loco-Version: 2.6.2; wp-6.0-RC4-53443\n"
17
  "X-Domain: loco-translate"
18
 
19
  #: src/fs/FileWriter.php:214
@@ -38,7 +38,7 @@ msgstr[0] ""
38
  msgstr[1] ""
39
 
40
  #. 1: Number of strings; 2: Text Domain; e.g. 100 strings extracted from source code for "loco-translate"
41
- #: src/package/Debugger.php:187
42
  #, php-format
43
  msgid "%1$s string extracted from source code for \"%2$s\""
44
  msgid_plural "%1$s strings extracted from source code for \"%2$s\""
@@ -72,7 +72,7 @@ msgstr ""
72
  msgid "%s characters will be sent for translation."
73
  msgstr ""
74
 
75
- #: src/admin/file/DeleteController.php:99
76
  #, php-format
77
  msgid "%s dependent file will also be deleted"
78
  msgid_plural "%s dependent files will also be deleted"
@@ -86,7 +86,7 @@ msgid_plural "%s files can't be matched to a known set of strings"
86
  msgstr[0] ""
87
  msgstr[1] ""
88
 
89
- #: src/admin/file/MoveController.php:89
90
  #, php-format
91
  msgid "%s file could not be moved"
92
  msgid_plural "%s files could not be moved"
@@ -99,7 +99,7 @@ msgstr[1] ""
99
  msgid "%s file is writeable"
100
  msgstr ""
101
 
102
- #: src/admin/file/MoveController.php:85
103
  #, php-format
104
  msgid "%s file moved"
105
  msgid_plural "%s files moved"
@@ -107,7 +107,7 @@ msgstr[0] ""
107
  msgstr[1] ""
108
 
109
  #. Where %s is either PO or POT
110
- #: src/gettext/Compiler.php:239 src/admin/file/HeadController.php:80
111
  #, php-format
112
  msgid "%s file saved"
113
  msgstr ""
@@ -119,7 +119,7 @@ msgid "%s fuzzy"
119
  msgstr ""
120
 
121
  #. Error thrown when attempting to parse a file that is not PO, POT or MO
122
- #: src/gettext/Data.php:23
123
  #, php-format
124
  msgid "%s is not a Gettext file"
125
  msgstr ""
@@ -253,7 +253,7 @@ msgid ""
253
  "privacy notice</a>."
254
  msgstr ""
255
 
256
- #: src/admin/bundle/BaseController.php:110 tpl/admin/file/conf.php:58
257
  #: tpl/admin/file/move.php:26
258
  msgid "Advanced"
259
  msgstr ""
@@ -428,11 +428,11 @@ msgstr ""
428
  msgid "Compiling MO files"
429
  msgstr ""
430
 
431
- #: src/admin/bundle/BaseController.php:53
432
  msgid "Configuration reset"
433
  msgstr ""
434
 
435
- #: src/admin/bundle/BaseController.php:38
436
  msgid "Configuration saved"
437
  msgstr ""
438
 
@@ -442,7 +442,7 @@ msgstr ""
442
  msgid "Configure %s"
443
  msgstr ""
444
 
445
- #: src/package/Debugger.php:205
446
  #, php-format
447
  msgid "Configured domain has no extractable strings"
448
  msgid_plural "%u configured domains have no extractable strings"
@@ -498,7 +498,7 @@ msgstr ""
498
 
499
  #: src/error/Debug.php:19 src/admin/config/BaseController.php:24
500
  #: src/admin/config/DebugController.php:12
501
- #: src/admin/bundle/BaseController.php:113
502
  msgid "Debug"
503
  msgstr ""
504
 
@@ -507,8 +507,8 @@ msgstr ""
507
  msgid "Delete"
508
  msgstr ""
509
 
510
- #: src/admin/file/DeleteController.php:76
511
- #: src/admin/file/DeleteController.php:94
512
  #, php-format
513
  msgid "Delete %s"
514
  msgstr ""
@@ -632,7 +632,7 @@ msgid "Download"
632
  msgstr ""
633
 
634
  #. Label for the plural form of the original English text
635
- #: src/Locale.php:404 src/js/Strings.php:143
636
  msgctxt "Editor"
637
  msgid "Plural"
638
  msgstr ""
@@ -656,7 +656,7 @@ msgid "Save"
656
  msgstr ""
657
 
658
  #. Label for the singular form of the original English text
659
- #: src/Locale.php:403 src/js/Strings.php:140
660
  msgctxt "Editor"
661
  msgid "Single"
662
  msgstr ""
@@ -738,7 +738,7 @@ msgstr ""
738
  msgid "Enter a new location for this file"
739
  msgstr ""
740
 
741
- #: src/js/Strings.php:102 src/error/Exception.php:164
742
  msgid "Error"
743
  msgstr ""
744
 
@@ -810,7 +810,7 @@ msgstr ""
810
  msgid "File backups are disabled in your plugin settings"
811
  msgstr ""
812
 
813
- #: src/admin/file/DeleteController.php:57 src/admin/file/DiffController.php:45
814
  #, php-format
815
  msgid "File deleted"
816
  msgid_plural "%u files deleted"
@@ -1045,7 +1045,7 @@ msgstr ""
1045
  msgid "Installed languages"
1046
  msgstr ""
1047
 
1048
- #: src/Locale.php:330
1049
  msgid "Invalid locale"
1050
  msgstr ""
1051
 
@@ -1053,7 +1053,7 @@ msgstr ""
1053
  msgid "It needs configuring before you can do any translations"
1054
  msgstr ""
1055
 
1056
- #: src/gettext/Compiler.php:136 src/gettext/Compiler.php:194
1057
  #, php-format
1058
  msgid "JSON compilation failed for %s"
1059
  msgstr ""
@@ -1156,7 +1156,7 @@ msgstr ""
1156
  msgid "Loco Translate is powered by"
1157
  msgstr ""
1158
 
1159
- #: loco.php:141
1160
  #, php-format
1161
  msgid ""
1162
  "Loco Translate requires the \"%s\" PHP extension. Ask your hosting provider "
@@ -1231,7 +1231,7 @@ msgstr ""
1231
  msgid "Move"
1232
  msgstr ""
1233
 
1234
- #: src/admin/file/MoveController.php:106 src/admin/file/MoveController.php:133
1235
  #, php-format
1236
  msgid "Move %s"
1237
  msgstr ""
@@ -1341,7 +1341,7 @@ msgstr ""
1341
  msgid "Out of sync with template"
1342
  msgstr ""
1343
 
1344
- #: src/admin/bundle/BaseController.php:108
1345
  msgid "Overview"
1346
  msgstr ""
1347
 
@@ -1406,43 +1406,43 @@ msgid "Plugins"
1406
  msgstr ""
1407
 
1408
  #. Plural category used in some multi-plural languages
1409
- #: src/Locale.php:418
1410
  msgctxt "Plural category"
1411
  msgid "Few"
1412
  msgstr ""
1413
 
1414
  #. Plural category used in some multi-plural languages
1415
- #: src/Locale.php:420
1416
  msgctxt "Plural category"
1417
  msgid "Many"
1418
  msgstr ""
1419
 
1420
  #. Plural category for singular quantity
1421
- #: src/Locale.php:414
1422
  msgctxt "Plural category"
1423
  msgid "One"
1424
  msgstr ""
1425
 
1426
  #. General plural category not covered by other forms
1427
- #: src/Locale.php:422
1428
  msgctxt "Plural category"
1429
  msgid "Other"
1430
  msgstr ""
1431
 
1432
  #. Plural category used in some multi-plural languages
1433
- #: src/Locale.php:416
1434
  msgctxt "Plural category"
1435
  msgid "Two"
1436
  msgstr ""
1437
 
1438
  #. Plural category for zero quantity
1439
- #: src/Locale.php:412
1440
  msgctxt "Plural category"
1441
  msgid "Zero"
1442
  msgstr ""
1443
 
1444
  #. Shown when a PO file's Plural-Forms header has a different formula from the Unicode CLDR rules
1445
- #: src/Locale.php:527
1446
  msgid ""
1447
  "Plural forms differ from Loco Translate's built in rules for this language"
1448
  msgstr ""
@@ -1465,15 +1465,15 @@ msgstr ""
1465
  msgid "PO file missing"
1466
  msgstr ""
1467
 
1468
- #: src/gettext/Compiler.php:235
1469
  msgid "PO file saved and MO file compiled"
1470
  msgstr ""
1471
 
1472
- #: src/gettext/Compiler.php:232
1473
  msgid "PO file saved and MO/JSON files compiled"
1474
  msgstr ""
1475
 
1476
- #: src/gettext/Compiler.php:107
1477
  msgid "PO file saved, but MO file compilation failed"
1478
  msgstr ""
1479
 
@@ -1630,7 +1630,7 @@ msgstr ""
1630
  msgid "Settings saved"
1631
  msgstr ""
1632
 
1633
- #: src/admin/bundle/BaseController.php:109
1634
  msgid "Setup"
1635
  msgstr ""
1636
 
@@ -1741,7 +1741,7 @@ msgstr ""
1741
  msgid "Text domain"
1742
  msgstr ""
1743
 
1744
- #: src/config/FormModel.php:146
1745
  msgid "Text Domain cannot be empty"
1746
  msgstr ""
1747
 
@@ -2147,7 +2147,7 @@ msgstr ""
2147
  msgid "XML setup"
2148
  msgstr ""
2149
 
2150
- #: src/config/XMLModel.php:42
2151
  msgid "XML supplied is empty"
2152
  msgstr ""
2153
 
1
  #, fuzzy
2
  msgid ""
3
  msgstr ""
4
+ "Project-Id-Version: Loco Translate 2.6.3\n"
5
  "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/loco-translate/\n"
6
+ "POT-Creation-Date: 2022-10-25 19:47+0000\n"
7
  "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
8
  "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
9
  "Language-Team: \n"
13
  "Content-Type: text/plain; charset=UTF-8\n"
14
  "Content-Transfer-Encoding: 8bit\n"
15
  "X-Generator: Loco https://localise.biz/\n"
16
+ "X-Loco-Version: 2.6.3; wp-6.0.3\n"
17
  "X-Domain: loco-translate"
18
 
19
  #: src/fs/FileWriter.php:214
38
  msgstr[1] ""
39
 
40
  #. 1: Number of strings; 2: Text Domain; e.g. 100 strings extracted from source code for "loco-translate"
41
+ #: src/package/Debugger.php:177
42
  #, php-format
43
  msgid "%1$s string extracted from source code for \"%2$s\""
44
  msgid_plural "%1$s strings extracted from source code for \"%2$s\""
72
  msgid "%s characters will be sent for translation."
73
  msgstr ""
74
 
75
+ #: src/admin/file/DeleteController.php:100
76
  #, php-format
77
  msgid "%s dependent file will also be deleted"
78
  msgid_plural "%s dependent files will also be deleted"
86
  msgstr[0] ""
87
  msgstr[1] ""
88
 
89
+ #: src/admin/file/MoveController.php:90
90
  #, php-format
91
  msgid "%s file could not be moved"
92
  msgid_plural "%s files could not be moved"
99
  msgid "%s file is writeable"
100
  msgstr ""
101
 
102
+ #: src/admin/file/MoveController.php:86
103
  #, php-format
104
  msgid "%s file moved"
105
  msgid_plural "%s files moved"
107
  msgstr[1] ""
108
 
109
  #. Where %s is either PO or POT
110
+ #: src/gettext/Compiler.php:258 src/admin/file/HeadController.php:80
111
  #, php-format
112
  msgid "%s file saved"
113
  msgstr ""
119
  msgstr ""
120
 
121
  #. Error thrown when attempting to parse a file that is not PO, POT or MO
122
+ #: src/gettext/Data.php:22
123
  #, php-format
124
  msgid "%s is not a Gettext file"
125
  msgstr ""
253
  "privacy notice</a>."
254
  msgstr ""
255
 
256
+ #: src/admin/bundle/BaseController.php:123 tpl/admin/file/conf.php:58
257
  #: tpl/admin/file/move.php:26
258
  msgid "Advanced"
259
  msgstr ""
428
  msgid "Compiling MO files"
429
  msgstr ""
430
 
431
+ #: src/admin/bundle/BaseController.php:66
432
  msgid "Configuration reset"
433
  msgstr ""
434
 
435
+ #: src/admin/bundle/BaseController.php:51
436
  msgid "Configuration saved"
437
  msgstr ""
438
 
442
  msgid "Configure %s"
443
  msgstr ""
444
 
445
+ #: src/package/Debugger.php:195
446
  #, php-format
447
  msgid "Configured domain has no extractable strings"
448
  msgid_plural "%u configured domains have no extractable strings"
498
 
499
  #: src/error/Debug.php:19 src/admin/config/BaseController.php:24
500
  #: src/admin/config/DebugController.php:12
501
+ #: src/admin/bundle/BaseController.php:126
502
  msgid "Debug"
503
  msgstr ""
504
 
507
  msgid "Delete"
508
  msgstr ""
509
 
510
+ #: src/admin/file/DeleteController.php:77
511
+ #: src/admin/file/DeleteController.php:95
512
  #, php-format
513
  msgid "Delete %s"
514
  msgstr ""
632
  msgstr ""
633
 
634
  #. Label for the plural form of the original English text
635
+ #: src/Locale.php:402 src/js/Strings.php:143
636
  msgctxt "Editor"
637
  msgid "Plural"
638
  msgstr ""
656
  msgstr ""
657
 
658
  #. Label for the singular form of the original English text
659
+ #: src/Locale.php:401 src/js/Strings.php:140
660
  msgctxt "Editor"
661
  msgid "Single"
662
  msgstr ""
738
  msgid "Enter a new location for this file"
739
  msgstr ""
740
 
741
+ #: src/js/Strings.php:102 src/error/Exception.php:163
742
  msgid "Error"
743
  msgstr ""
744
 
810
  msgid "File backups are disabled in your plugin settings"
811
  msgstr ""
812
 
813
+ #: src/admin/file/DeleteController.php:58 src/admin/file/DiffController.php:45
814
  #, php-format
815
  msgid "File deleted"
816
  msgid_plural "%u files deleted"
1045
  msgid "Installed languages"
1046
  msgstr ""
1047
 
1048
+ #: src/Locale.php:329
1049
  msgid "Invalid locale"
1050
  msgstr ""
1051
 
1053
  msgid "It needs configuring before you can do any translations"
1054
  msgstr ""
1055
 
1056
+ #: src/gettext/Compiler.php:132 src/gettext/Compiler.php:191
1057
  #, php-format
1058
  msgid "JSON compilation failed for %s"
1059
  msgstr ""
1156
  msgid "Loco Translate is powered by"
1157
  msgstr ""
1158
 
1159
+ #: loco.php:137
1160
  #, php-format
1161
  msgid ""
1162
  "Loco Translate requires the \"%s\" PHP extension. Ask your hosting provider "
1231
  msgid "Move"
1232
  msgstr ""
1233
 
1234
+ #: src/admin/file/MoveController.php:108 src/admin/file/MoveController.php:136
1235
  #, php-format
1236
  msgid "Move %s"
1237
  msgstr ""
1341
  msgid "Out of sync with template"
1342
  msgstr ""
1343
 
1344
+ #: src/admin/bundle/BaseController.php:121
1345
  msgid "Overview"
1346
  msgstr ""
1347
 
1406
  msgstr ""
1407
 
1408
  #. Plural category used in some multi-plural languages
1409
+ #: src/Locale.php:416
1410
  msgctxt "Plural category"
1411
  msgid "Few"
1412
  msgstr ""
1413
 
1414
  #. Plural category used in some multi-plural languages
1415
+ #: src/Locale.php:418
1416
  msgctxt "Plural category"
1417
  msgid "Many"
1418
  msgstr ""
1419
 
1420
  #. Plural category for singular quantity
1421
+ #: src/Locale.php:412
1422
  msgctxt "Plural category"
1423
  msgid "One"
1424
  msgstr ""
1425
 
1426
  #. General plural category not covered by other forms
1427
+ #: src/Locale.php:420
1428
  msgctxt "Plural category"
1429
  msgid "Other"
1430
  msgstr ""
1431
 
1432
  #. Plural category used in some multi-plural languages
1433
+ #: src/Locale.php:414
1434
  msgctxt "Plural category"
1435
  msgid "Two"
1436
  msgstr ""
1437
 
1438
  #. Plural category for zero quantity
1439
+ #: src/Locale.php:410
1440
  msgctxt "Plural category"
1441
  msgid "Zero"
1442
  msgstr ""
1443
 
1444
  #. Shown when a PO file's Plural-Forms header has a different formula from the Unicode CLDR rules
1445
+ #: src/Locale.php:528
1446
  msgid ""
1447
  "Plural forms differ from Loco Translate's built in rules for this language"
1448
  msgstr ""
1465
  msgid "PO file missing"
1466
  msgstr ""
1467
 
1468
+ #: src/gettext/Compiler.php:254
1469
  msgid "PO file saved and MO file compiled"
1470
  msgstr ""
1471
 
1472
+ #: src/gettext/Compiler.php:251
1473
  msgid "PO file saved and MO/JSON files compiled"
1474
  msgstr ""
1475
 
1476
+ #: src/gettext/Compiler.php:103
1477
  msgid "PO file saved, but MO file compilation failed"
1478
  msgstr ""
1479
 
1630
  msgid "Settings saved"
1631
  msgstr ""
1632
 
1633
+ #: src/admin/bundle/BaseController.php:122
1634
  msgid "Setup"
1635
  msgstr ""
1636
 
1741
  msgid "Text domain"
1742
  msgstr ""
1743
 
1744
+ #: src/config/FormModel.php:147
1745
  msgid "Text Domain cannot be empty"
1746
  msgstr ""
1747
 
2147
  msgid "XML setup"
2148
  msgstr ""
2149
 
2150
+ #: src/config/XMLModel.php:54
2151
  msgid "XML supplied is empty"
2152
  msgstr ""
2153
 
lib/compiled/gettext.php CHANGED
@@ -25,10 +25,10 @@ public function offsetSet($key, $v ){ $k = strtolower($key); if( isset($this->ma
25
  public function offsetUnset($key ){ $k = strtolower($key); if( isset($this->map[$k]) ){ parent::offsetUnset( $this->map[$k] ); unset( $this->map[$k] ); } }
26
  #[ReturnTypeWillChange]
27
  public function jsonSerialize(){ return $this->getArrayCopy(); } }
28
- function loco_normalize_charset( $cs ) { if( preg_match('/^UTF-?8$/i',$cs) ){ return 'UTF-8'; } try { $aliases = @mb_encoding_aliases($cs); } catch( Throwable $e ){ $aliases = false; } if( false === $aliases ){ throw new InvalidArgumentException('Unsupported character encoding: '.$cs ); } if( preg_grep('/^ISO[-_]\\d+[-_]\\d+$/i',$aliases) ){ $cs = current($aliases); $cs = strtr( strtoupper($cs), '_', '-' ); } else if( in_array('US-ASCII',$aliases,true) ){ $cs = 'US-ASCII'; } return $cs; }
29
  class LocoPoHeaders extends LocoHeaders {
30
  private $cs = null;
31
- public function getCharset(){ $cs = $this->cs; if( is_null($cs) ){ $cs = ''; $raw = $this->offsetGet('content-type'); if( $raw && preg_match('!\\bcharset[= ]+([-\\w]+)!',$raw,$r) ){ try { $cs = loco_normalize_charset($r[1]); } catch( InvalidArgumentException $e ){ $cs = null; } catch( Throwable $e ){ trigger_error( $e->getMessage(), E_USER_NOTICE ); $cs = null; } } $this->cs = $cs; } return $cs; }
32
  public function setCharset( $to ){ $to = loco_normalize_charset($to); $from = $this->getCharset(); $this->cs = $to; $this['Content-Type'] = 'text/plain; charset='.$to; if( $from && $from !== $to ){ foreach( $this as $key => $val ){ $this[$key] = mb_convert_encoding($val,$to,$from); } } return $to; }
33
  public static function fromMsgstr( $str ){ $headers = new LocoPoHeaders; $key = ''; foreach( preg_split('/[\\r\\n]+/',$str) as $line ){ $i = strpos($line,':'); if( is_int($i) ){ $key = trim( substr($line,0,$i), " \t" ); $headers->offsetSet( $key, ltrim( substr($line,++$i)," \t" ) ); } else if( '' !== $key ){ $headers->offsetSet( $key, $headers->offsetGet($key)."\n".$line ); } } $cs = $headers->getCharset(); if( $cs && 'UTF-8' !== $cs && 'UTF-8' !== mb_detect_encoding($str,['UTF-8',$cs],true) ){ foreach( $headers as $key => $val ){ $headers[$key] = mb_convert_encoding($val,'UTF-8',[$cs]); } } return $headers; }
34
  public static function fromSource( $raw ){ $po = new LocoPoParser($raw); $po->parse(0); return $po->getHeader(); } }
@@ -295,7 +295,7 @@ protected function stripSlashes( $s ) { return preg_replace_callback('/\\\\(x[0
295
  function loco_unescape_php_string( $s ){ static $l; if( is_null($l) ) { $l = new LocoPHPEscapeParser; } return $l->unescape($s); }
296
  function loco_decapse_php_string( $s ){ if( ! $s ){ return (string) $s; } $q = $s[0]; if( "'" === $q ){ return str_replace( ['\\'.$q, '\\\\'], [$q, '\\'], substr( $s, 1, -1 ) ); } if( '"' !== $q ){ return $s; } return loco_unescape_php_string( substr($s,1,-1) ); }
297
  function loco_parse_php_comment($comment){ $comment = trim( $comment,"/ \n\r\t" ); if( '' !== $comment && '*' === $comment[0] ){ $lines = []; $junk = "\r\t/ *"; foreach( explode("\n",$comment) as $line ){ $line = trim($line,$junk); if( '' !== $line ){ $lines[] = $line; } } $comment = implode("\n", $lines); } return $comment; }
298
- function loco_parse_wp_comment( $block ){ $header = []; if( '/*' === substr($block,0,2) ){ $junk = "\r\t/ *"; foreach( explode("\n", $block) as $line ){ if( false !== ( $i = strpos($line,':') ) ){ $key = substr($line,0,$i); $val = substr($line,++$i); $header[ trim($key,$junk) ] = trim($val,$junk); } } } return $header; }
299
  function loco_sniff_printf( $s, $p, $limit = 0, $offset = 0 ){ $n = 0; while( is_string($s) && '' !== $s && false !== ( $i = strpos($s,'%',$offset) ) ){ if( 0 !== $i ){ $s = substr( $s, $i ); } if( preg_match( $p, $s, $r ) ){ $match = $r[0]; if( 0 < $n && isset($r[1]) && '' === $r[1] && '%' !== substr($match,-1) ){ return 0; } if( ++$n === $limit ){ break; } $offset = strlen($match); } else { return 0; } } return $n; }
300
  function loco_sniff_php_printf( $s, $limit = 0 ){ return loco_sniff_printf( $s, '/^%(?:[1-9]\\d*\\$)?(?:\'.|[-+0 ])*\\d*(?:\\.\\d+)?[suxXbcdeEfFgGo%]/', $limit ); }
301
  class LocoPHPExtractor extends LocoExtractor {
@@ -313,7 +313,7 @@ public function fsniff( $str ){ return loco_sniff_js_printf($str) ? 'javascript'
313
  public function decapse( $encapsed ){ return LocoJsTokens::decapse($encapsed); } }
314
  class LocoTwigExtractor extends LocoPHPExtractor {
315
  public function tokenize( $src ){ $src = '<?php '.preg_replace('/{#([^#]+)#}/su','/*\\1*/',$src); return parent::tokenize($src); } }
316
- function loco_wp_extractor( $type = 'php' ){ static $rules = [ '__' => 'sd', '_e' => 'sd', '_c' => 'sd', '_n' => 'sp_d', '_n_noop' => 'spd', '_nc' => 'sp_d', '__ngettext' => 'spd', '__ngettext_noop' => 'spd', '_x' => 'scd', '_ex' => 'scd', '_nx' => 'sp_cd', '_nx_noop' => 'spcd', 'esc_attr__' => 'sd', 'esc_html__' => 'sd', 'esc_attr_e' => 'sd', 'esc_html_e' => 'sd', 'esc_attr_x' => 'scd', 'esc_html_x' => 'scd', ]; if( 'php' === $type ){ $extr = new LocoPHPExtractor($rules); } else if( 'twig' === $type ){ $extr = new LocoTwigExtractor($rules); } else if( 'js' === $type ){ $extr = new LocoJsExtractor($rules); } else { throw new InvalidArgumentException('No string extractor for '.$type); } return $extr; }
317
  function loco_string_percent( $n, $t ) { if( ! $t || ! $n ){ $s = '0'; } else if( $t === $n ){ $s = '100'; } else { $dp = 0; $n = 100 * $n / $t; if( $n > 99 ){ $s = number_format( min( $n, 99.9 ), ++$dp ); } else if( $n < 0.5 ){ $n = max( $n, 0.0001 ); do { $s = number_format( $n, ++$dp ); } while( preg_match('/^0\\.0+$/',$s) && $dp < 4 ); $s = substr($s,1); } else { $s = number_format( $n, $dp ); } } return $s; }
318
  function loco_print_progress( $translated, $untranslated, $flagged ) { $total = $translated + $untranslated; $complete = loco_string_percent( $translated - $flagged, $total ); $class = 'progress'; if( ! $translated && ! $flagged ){ $class .= ' empty'; } else if( '100' === $complete ){ $class .= ' done'; } echo '<div class="',$class,'"><div class="t">'; if( $flagged ){ $s = loco_string_percent( $flagged, $total ); echo '<div class="bar f" style="width:',$s,'%">&nbsp;</div>'; } if( '0' === $complete ){ echo '&nbsp;'; } else { $class = 'bar p'; $p = (int) $complete; $class .= sprintf(' p-%u', 10*floor($p/10) ); $style = 'width:'.$complete.'%'; if( $flagged ){ $remain = 100.0 - (float) $s; $style .= '; max-width: '.sprintf('%s',$remain).'%'; } echo '<div class="',$class,'" style="'.$style.'">&nbsp;</div>'; } echo '</div><div class="l">',$complete,'%</div></div>'; }
319
  class LocoFuzzyMatcher implements Countable {
25
  public function offsetUnset($key ){ $k = strtolower($key); if( isset($this->map[$k]) ){ parent::offsetUnset( $this->map[$k] ); unset( $this->map[$k] ); } }
26
  #[ReturnTypeWillChange]
27
  public function jsonSerialize(){ return $this->getArrayCopy(); } }
28
+ function loco_normalize_charset( $cs ) { if( preg_match('/^UTF-?8$/i',$cs) ){ return 'UTF-8'; } try { $aliases = @mb_encoding_aliases($cs); } catch( ValueError $e ){ $aliases = false; } if( false === $aliases ){ throw new InvalidArgumentException('Unsupported character encoding: '.$cs ); } if( preg_grep('/^ISO[-_]\\d+[-_]\\d+$/i',$aliases) ){ $cs = current($aliases); $cs = strtr( strtoupper($cs), '_', '-' ); } else if( in_array('US-ASCII',$aliases,true) ){ $cs = 'US-ASCII'; } return $cs; }
29
  class LocoPoHeaders extends LocoHeaders {
30
  private $cs = null;
31
+ public function getCharset(){ $cs = $this->cs; if( is_null($cs) ){ $cs = ''; $raw = $this->offsetGet('content-type'); if( $raw && preg_match('!\\bcharset[= ]+([-\\w]+)!',$raw,$r) ){ try { $cs = loco_normalize_charset($r[1]); } catch( InvalidArgumentException $e ){ $cs = null; } catch( Exception $e ){ trigger_error( $e->getMessage(), E_USER_NOTICE ); $cs = null; } } $this->cs = $cs; } return $cs; }
32
  public function setCharset( $to ){ $to = loco_normalize_charset($to); $from = $this->getCharset(); $this->cs = $to; $this['Content-Type'] = 'text/plain; charset='.$to; if( $from && $from !== $to ){ foreach( $this as $key => $val ){ $this[$key] = mb_convert_encoding($val,$to,$from); } } return $to; }
33
  public static function fromMsgstr( $str ){ $headers = new LocoPoHeaders; $key = ''; foreach( preg_split('/[\\r\\n]+/',$str) as $line ){ $i = strpos($line,':'); if( is_int($i) ){ $key = trim( substr($line,0,$i), " \t" ); $headers->offsetSet( $key, ltrim( substr($line,++$i)," \t" ) ); } else if( '' !== $key ){ $headers->offsetSet( $key, $headers->offsetGet($key)."\n".$line ); } } $cs = $headers->getCharset(); if( $cs && 'UTF-8' !== $cs && 'UTF-8' !== mb_detect_encoding($str,['UTF-8',$cs],true) ){ foreach( $headers as $key => $val ){ $headers[$key] = mb_convert_encoding($val,'UTF-8',[$cs]); } } return $headers; }
34
  public static function fromSource( $raw ){ $po = new LocoPoParser($raw); $po->parse(0); return $po->getHeader(); } }
295
  function loco_unescape_php_string( $s ){ static $l; if( is_null($l) ) { $l = new LocoPHPEscapeParser; } return $l->unescape($s); }
296
  function loco_decapse_php_string( $s ){ if( ! $s ){ return (string) $s; } $q = $s[0]; if( "'" === $q ){ return str_replace( ['\\'.$q, '\\\\'], [$q, '\\'], substr( $s, 1, -1 ) ); } if( '"' !== $q ){ return $s; } return loco_unescape_php_string( substr($s,1,-1) ); }
297
  function loco_parse_php_comment($comment){ $comment = trim( $comment,"/ \n\r\t" ); if( '' !== $comment && '*' === $comment[0] ){ $lines = []; $junk = "\r\t/ *"; foreach( explode("\n",$comment) as $line ){ $line = trim($line,$junk); if( '' !== $line ){ $lines[] = $line; } } $comment = implode("\n", $lines); } return $comment; }
298
+ function loco_parse_wp_comment( $block ) { $header = []; if( '/*' === substr($block,0,2) ){ $junk = "\r\t/ *"; foreach( explode("\n", $block) as $line ){ if( false !== ( $i = strpos($line,':') ) ){ $key = substr($line,0,$i); $val = substr($line,++$i); $header[ trim($key,$junk) ] = trim($val,$junk); } } } return $header; }
299
  function loco_sniff_printf( $s, $p, $limit = 0, $offset = 0 ){ $n = 0; while( is_string($s) && '' !== $s && false !== ( $i = strpos($s,'%',$offset) ) ){ if( 0 !== $i ){ $s = substr( $s, $i ); } if( preg_match( $p, $s, $r ) ){ $match = $r[0]; if( 0 < $n && isset($r[1]) && '' === $r[1] && '%' !== substr($match,-1) ){ return 0; } if( ++$n === $limit ){ break; } $offset = strlen($match); } else { return 0; } } return $n; }
300
  function loco_sniff_php_printf( $s, $limit = 0 ){ return loco_sniff_printf( $s, '/^%(?:[1-9]\\d*\\$)?(?:\'.|[-+0 ])*\\d*(?:\\.\\d+)?[suxXbcdeEfFgGo%]/', $limit ); }
301
  class LocoPHPExtractor extends LocoExtractor {
313
  public function decapse( $encapsed ){ return LocoJsTokens::decapse($encapsed); } }
314
  class LocoTwigExtractor extends LocoPHPExtractor {
315
  public function tokenize( $src ){ $src = '<?php '.preg_replace('/{#([^#]+)#}/su','/*\\1*/',$src); return parent::tokenize($src); } }
316
+ function loco_wp_extractor( $type = 'php' ) { static $rules = [ '__' => 'sd', '_e' => 'sd', '_c' => 'sd', '_n' => 'sp_d', '_n_noop' => 'spd', '_nc' => 'sp_d', '__ngettext' => 'spd', '__ngettext_noop' => 'spd', '_x' => 'scd', '_ex' => 'scd', '_nx' => 'sp_cd', '_nx_noop' => 'spcd', 'esc_attr__' => 'sd', 'esc_html__' => 'sd', 'esc_attr_e' => 'sd', 'esc_html_e' => 'sd', 'esc_attr_x' => 'scd', 'esc_html_x' => 'scd', ]; if( 'php' === $type ){ $extr = new LocoPHPExtractor($rules); } else if( 'twig' === $type ){ $extr = new LocoTwigExtractor($rules); } else if( 'js' === $type ){ $extr = new LocoJsExtractor($rules); } else { throw new InvalidArgumentException('No string extractor for '.$type); } return $extr; }
317
  function loco_string_percent( $n, $t ) { if( ! $t || ! $n ){ $s = '0'; } else if( $t === $n ){ $s = '100'; } else { $dp = 0; $n = 100 * $n / $t; if( $n > 99 ){ $s = number_format( min( $n, 99.9 ), ++$dp ); } else if( $n < 0.5 ){ $n = max( $n, 0.0001 ); do { $s = number_format( $n, ++$dp ); } while( preg_match('/^0\\.0+$/',$s) && $dp < 4 ); $s = substr($s,1); } else { $s = number_format( $n, $dp ); } } return $s; }
318
  function loco_print_progress( $translated, $untranslated, $flagged ) { $total = $translated + $untranslated; $complete = loco_string_percent( $translated - $flagged, $total ); $class = 'progress'; if( ! $translated && ! $flagged ){ $class .= ' empty'; } else if( '100' === $complete ){ $class .= ' done'; } echo '<div class="',$class,'"><div class="t">'; if( $flagged ){ $s = loco_string_percent( $flagged, $total ); echo '<div class="bar f" style="width:',$s,'%">&nbsp;</div>'; } if( '0' === $complete ){ echo '&nbsp;'; } else { $class = 'bar p'; $p = (int) $complete; $class .= sprintf(' p-%u', 10*floor($p/10) ); $style = 'width:'.$complete.'%'; if( $flagged ){ $remain = 100.0 - (float) $s; $style .= '; max-width: '.sprintf('%s',$remain).'%'; } echo '<div class="',$class,'" style="'.$style.'">&nbsp;</div>'; } echo '</div><div class="l">',$complete,'%</div></div>'; }
319
  class LocoFuzzyMatcher implements Countable {
lib/compiled/locales.php CHANGED
@@ -3,4 +3,4 @@
3
  * Downgraded for PHP 5.6 compatibility. Do not edit.
4
  * @noinspection ALL
5
  */
6
- function loco_parse_wp_locale( $tag ){ if( ! preg_match( '/^([a-z]{2,3})(?:[-_]([a-z]{2}))?(?:[-_]([a-z0-9]{3,8}))?$/i', $tag, $tags ) ){ throw new InvalidArgumentException('Invalid WordPress locale: '.json_encode($tag) ); } $data = [ 'lang' => strtolower( $tags[1] ), ]; if( isset($tags[2]) && ( $subtag = $tags[2] ) ){ $data['region'] = strtoupper($tags[2]); } if( isset($tags[3]) && ( $subtag = $tags[3] ) ){ $data['variant'] = strtolower($tags[3]); } return $data; }
3
  * Downgraded for PHP 5.6 compatibility. Do not edit.
4
  * @noinspection ALL
5
  */
6
+ function loco_parse_wp_locale( $tag ) { if( ! preg_match( '/^([a-z]{2,3})(?:[-_]([a-z]{2}))?(?:[-_]([a-z\\d]{3,8}))?$/i', $tag, $tags ) ){ throw new InvalidArgumentException('Invalid WordPress locale: '.json_encode($tag) ); } $data = [ 'lang' => strtolower( $tags[1] ), ]; if( array_key_exists(2,$tags) && $tags[2] ){ $data['region'] = strtoupper($tags[2]); } if( array_key_exists(3,$tags) && $tags[3] ){ $data['variant'] = strtolower($tags[3]); } return $data; }
lib/compiled/phpunit.php CHANGED
@@ -10,7 +10,7 @@ public function __construct( $value ){ $id = '[-_a-z][-_a-z0-9]*'; if( ! preg_m
10
  public function filter( DOMElement $el ) { if( '' !== $this->tag ){ $list = $el->getElementsByTagName($this->tag); $recursive = false; } else { $list = $el->childNodes; $recursive = true; } if( $this->attr ){ $list = $this->reduce( $list, new ArrayIterator, $recursive )->getArrayCopy(); } return $list; }
11
  public function reduce( DOMNodeList $list, ArrayIterator $reduced, $recursive ) { foreach( $list as $node ){ if( $node instanceof DOMElement ){ $matched = false; foreach( $this->attr as $name => $value ){ if( ! $node->hasAttribute($name) ){ $matched = false; break; } $values = array_flip( explode(' ', $node->getAttribute($name) ) ); if( ! isset($values[$value]) ){ $matched = false; break; } $matched = true; } if( $matched ){ $reduced[] = $node; } if( $recursive && $node->hasChildNodes() ){ $this->reduce( $node->childNodes, $reduced, true ); } } } return $reduced; } }
12
  class LocoDomQuery extends ArrayIterator {
13
- public static function parse( $source ) { $dom = new DOMDocument('1.0', 'UTF-8' ); $dom->preserveWhitespace = true; $dom->formatOutput = false; $source = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>'.$source.'</body></html>'; $used_errors = libxml_use_internal_errors(true); $opts = LIBXML_HTML_NODEFDTD; $parsed = $dom->loadHTML( $source, $opts ); $errors = libxml_get_errors(); $used_errors || libxml_use_internal_errors(false); libxml_clear_errors(); if( $errors || ! $parsed ){ $e = new Loco_error_ParseException('Unknown parse error'); foreach( $errors as $error ){ $e = new Loco_error_ParseException( trim($error->message) ); $e->setContext( $error->line, $error->column, $source ); if( LIBXML_ERR_FATAL === $error->level ){ throw $e; } } if( ! $parsed ){ throw $e; } } return $dom; }
14
  public function __construct( $value ){ if( $value instanceof DOMDocument ){ $value = [ $value->documentElement ]; } else if( $value instanceof DOMNode ){ $value = [ $value ]; } if( is_iterable($value) ){ $nodes = []; foreach( $value as $node ){ $nodes[] = $node; } } else if( is_string($value) || method_exists($value,'__toString') ){ $value = self::parse( $value ); $nodes = [ $value->documentElement ]; } else { $type = is_object($value) ? get_class($value) : gettype($value); throw new InvalidArgumentException('Cannot construct DOM from '.$type ); } parent::__construct( $nodes ); }
15
  public function eq( $index ) { $q = new LocoDomQuery([]); if( $el = $this[$index] ){ $q[] = $el; } return $q; }
16
  public function find( $value ) { $q = new LocoDomQuery( [] ); $f = new LocoDomQueryFilter($value); foreach( $this as $el ){ foreach( $f->filter($el) as $match ){ $q[] = $match; } } return $q; }
10
  public function filter( DOMElement $el ) { if( '' !== $this->tag ){ $list = $el->getElementsByTagName($this->tag); $recursive = false; } else { $list = $el->childNodes; $recursive = true; } if( $this->attr ){ $list = $this->reduce( $list, new ArrayIterator, $recursive )->getArrayCopy(); } return $list; }
11
  public function reduce( DOMNodeList $list, ArrayIterator $reduced, $recursive ) { foreach( $list as $node ){ if( $node instanceof DOMElement ){ $matched = false; foreach( $this->attr as $name => $value ){ if( ! $node->hasAttribute($name) ){ $matched = false; break; } $values = array_flip( explode(' ', $node->getAttribute($name) ) ); if( ! isset($values[$value]) ){ $matched = false; break; } $matched = true; } if( $matched ){ $reduced[] = $node; } if( $recursive && $node->hasChildNodes() ){ $this->reduce( $node->childNodes, $reduced, true ); } } } return $reduced; } }
12
  class LocoDomQuery extends ArrayIterator {
13
+ public static function parse( $source ) { $dom = new DOMDocument('1.0', 'UTF-8' ); $source = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body>'.$source.'</body></html>'; $used_errors = libxml_use_internal_errors(true); $opts = LIBXML_HTML_NODEFDTD; $parsed = $dom->loadHTML( $source, $opts ); $errors = libxml_get_errors(); $used_errors || libxml_use_internal_errors(false); libxml_clear_errors(); if( $errors || ! $parsed ){ $e = new Loco_error_ParseException('Unknown parse error'); foreach( $errors as $error ){ $e = new Loco_error_ParseException( trim($error->message) ); $e->setContext( $error->line, $error->column, $source ); if( LIBXML_ERR_FATAL === $error->level ){ throw $e; } } if( ! $parsed ){ throw $e; } } return $dom; }
14
  public function __construct( $value ){ if( $value instanceof DOMDocument ){ $value = [ $value->documentElement ]; } else if( $value instanceof DOMNode ){ $value = [ $value ]; } if( is_iterable($value) ){ $nodes = []; foreach( $value as $node ){ $nodes[] = $node; } } else if( is_string($value) || method_exists($value,'__toString') ){ $value = self::parse( $value ); $nodes = [ $value->documentElement ]; } else { $type = is_object($value) ? get_class($value) : gettype($value); throw new InvalidArgumentException('Cannot construct DOM from '.$type ); } parent::__construct( $nodes ); }
15
  public function eq( $index ) { $q = new LocoDomQuery([]); if( $el = $this[$index] ){ $q[] = $el; } return $q; }
16
  public function find( $value ) { $q = new LocoDomQuery( [] ); $f = new LocoDomQueryFilter($value); foreach( $this as $el ){ foreach( $f->filter($el) as $match ){ $q[] = $match; } } return $q; }
lib/data/locales.php CHANGED
@@ -2,4 +2,4 @@
2
  /**
3
  * Compiled data. Do not edit.
4
  */
5
- return ['af'=>[0=>'Afrikaans',1=>'Afrikaans'],'am'=>[0=>'Amharic',1=>'አማርኛ'],'ar'=>[0=>'Arabic',1=>'العربية'],'ary'=>[0=>'Moroccan Arabic',1=>'العربية المغربية'],'as'=>[0=>'Assamese',1=>'অসমীয়া'],'azb'=>[0=>'South Azerbaijani',1=>'گؤنئی آذربایجان'],'az'=>[0=>'Azerbaijani',1=>'Azərbaycan dili'],'bel'=>[0=>'Belarusian',1=>'Беларуская мова'],'bg_BG'=>[0=>'Bulgarian',1=>'Български'],'bn_BD'=>[0=>'Bengali (Bangladesh)',1=>'বাংলা'],'bo'=>[0=>'Tibetan',1=>'བོད་ཡིག'],'bs_BA'=>[0=>'Bosnian',1=>'Bosanski'],'ca'=>[0=>'Catalan',1=>'Català'],'ceb'=>[0=>'Cebuano',1=>'Cebuano'],'cs_CZ'=>[0=>'Czech',1=>'Čeština'],'cy'=>[0=>'Welsh',1=>'Cymraeg'],'da_DK'=>[0=>'Danish',1=>'Dansk'],'de_CH_informal'=>[0=>'German (Switzerland, Informal)',1=>'Deutsch (Schweiz, Du)'],'de_AT'=>[0=>'German (Austria)',1=>'Deutsch (Österreich)'],'de_DE_formal'=>[0=>'German (Formal)',1=>'Deutsch (Sie)'],'de_DE'=>[0=>'German',1=>'Deutsch'],'de_CH'=>[0=>'German (Switzerland)',1=>'Deutsch (Schweiz)'],'dsb'=>[0=>'Lower Sorbian',1=>'Dolnoserbšćina'],'dzo'=>[0=>'Dzongkha',1=>'རྫོང་ཁ'],'el'=>[0=>'Greek',1=>'Ελληνικά'],'en_ZA'=>[0=>'English (South Africa)',1=>'English (South Africa)'],'en_CA'=>[0=>'English (Canada)',1=>'English (Canada)'],'en_NZ'=>[0=>'English (New Zealand)',1=>'English (New Zealand)'],'en_GB'=>[0=>'English (UK)',1=>'English (UK)'],'en_AU'=>[0=>'English (Australia)',1=>'English (Australia)'],'eo'=>[0=>'Esperanto',1=>'Esperanto'],'es_EC'=>[0=>'Spanish (Ecuador)',1=>'Español de Ecuador'],'es_AR'=>[0=>'Spanish (Argentina)',1=>'Español de Argentina'],'es_CO'=>[0=>'Spanish (Colombia)',1=>'Español de Colombia'],'es_MX'=>[0=>'Spanish (Mexico)',1=>'Español de México'],'es_DO'=>[0=>'Spanish (Dominican Republic)',1=>'Español de República Dominicana'],'es_PE'=>[0=>'Spanish (Peru)',1=>'Español de Perú'],'es_UY'=>[0=>'Spanish (Uruguay)',1=>'Español de Uruguay'],'es_CL'=>[0=>'Spanish (Chile)',1=>'Español de Chile'],'es_PR'=>[0=>'Spanish (Puerto Rico)',1=>'Español de Puerto Rico'],'es_VE'=>[0=>'Spanish (Venezuela)',1=>'Español de Venezuela'],'es_GT'=>[0=>'Spanish (Guatemala)',1=>'Español de Guatemala'],'es_ES'=>[0=>'Spanish (Spain)',1=>'Español'],'es_CR'=>[0=>'Spanish (Costa Rica)',1=>'Español de Costa Rica'],'et'=>[0=>'Estonian',1=>'Eesti'],'eu'=>[0=>'Basque',1=>'Euskara'],'fa_IR'=>[0=>'Persian',1=>'فارسی'],'fa_AF'=>[0=>'Persian (Afghanistan)',1=>'(فارسی (افغانستان'],'fi'=>[0=>'Finnish',1=>'Suomi'],'fr_CA'=>[0=>'French (Canada)',1=>'Français du Canada'],'fr_FR'=>[0=>'French (France)',1=>'Français'],'fr_BE'=>[0=>'French (Belgium)',1=>'Français de Belgique'],'fur'=>[0=>'Friulian',1=>'Friulian'],'gd'=>[0=>'Scottish Gaelic',1=>'Gàidhlig'],'gl_ES'=>[0=>'Galician',1=>'Galego'],'gu'=>[0=>'Gujarati',1=>'ગુજરાતી'],'haz'=>[0=>'Hazaragi',1=>'هزاره گی'],'he_IL'=>[0=>'Hebrew',1=>'עִבְרִית'],'hi_IN'=>[0=>'Hindi',1=>'हिन्दी'],'hr'=>[0=>'Croatian',1=>'Hrvatski'],'hsb'=>[0=>'Upper Sorbian',1=>'Hornjoserbšćina'],'hu_HU'=>[0=>'Hungarian',1=>'Magyar'],'hy'=>[0=>'Armenian',1=>'Հայերեն'],'id_ID'=>[0=>'Indonesian',1=>'Bahasa Indonesia'],'is_IS'=>[0=>'Icelandic',1=>'Íslenska'],'it_IT'=>[0=>'Italian',1=>'Italiano'],'ja'=>[0=>'Japanese',1=>'日本語'],'jv_ID'=>[0=>'Javanese',1=>'Basa Jawa'],'ka_GE'=>[0=>'Georgian',1=>'ქართული'],'kab'=>[0=>'Kabyle',1=>'Taqbaylit'],'kk'=>[0=>'Kazakh',1=>'Қазақ тілі'],'km'=>[0=>'Khmer',1=>'ភាសាខ្មែរ'],'kn'=>[0=>'Kannada',1=>'ಕನ್ನಡ'],'ko_KR'=>[0=>'Korean',1=>'한국어'],'ckb'=>[0=>'Kurdish (Sorani)',1=>'كوردی‎'],'lo'=>[0=>'Lao',1=>'ພາສາລາວ'],'lt_LT'=>[0=>'Lithuanian',1=>'Lietuvių kalba'],'lv'=>[0=>'Latvian',1=>'Latviešu valoda'],'mk_MK'=>[0=>'Macedonian',1=>'Македонски јазик'],'ml_IN'=>[0=>'Malayalam',1=>'മലയാളം'],'mn'=>[0=>'Mongolian',1=>'Монгол'],'mr'=>[0=>'Marathi',1=>'मराठी'],'ms_MY'=>[0=>'Malay',1=>'Bahasa Melayu'],'my_MM'=>[0=>'Myanmar (Burmese)',1=>'ဗမာစာ'],'nb_NO'=>[0=>'Norwegian (Bokmål)',1=>'Norsk bokmål'],'ne_NP'=>[0=>'Nepali',1=>'नेपाली'],'nl_NL_formal'=>[0=>'Dutch (Formal)',1=>'Nederlands (Formeel)'],'nl_BE'=>[0=>'Dutch (Belgium)',1=>'Nederlands (België)'],'nl_NL'=>[0=>'Dutch',1=>'Nederlands'],'nn_NO'=>[0=>'Norwegian (Nynorsk)',1=>'Norsk nynorsk'],'oci'=>[0=>'Occitan',1=>'Occitan'],'pa_IN'=>[0=>'Punjabi',1=>'ਪੰਜਾਬੀ'],'pl_PL'=>[0=>'Polish',1=>'Polski'],'ps'=>[0=>'Pashto',1=>'پښتو'],'pt_PT'=>[0=>'Portuguese (Portugal)',1=>'Português'],'pt_AO'=>[0=>'Portuguese (Angola)',1=>'Português de Angola'],'pt_PT_ao90'=>[0=>'Portuguese (Portugal, AO90)',1=>'Português (AO90)'],'pt_BR'=>[0=>'Portuguese (Brazil)',1=>'Português do Brasil'],'rhg'=>[0=>'Rohingya',1=>'Ruáinga'],'ro_RO'=>[0=>'Romanian',1=>'Română'],'ru_RU'=>[0=>'Russian',1=>'Русский'],'sah'=>[0=>'Sakha',1=>'Сахалыы'],'snd'=>[0=>'Sindhi',1=>'سنڌي'],'si_LK'=>[0=>'Sinhala',1=>'සිංහල'],'sk_SK'=>[0=>'Slovak',1=>'Slovenčina'],'skr'=>[0=>'Saraiki',1=>'سرائیکی'],'sl_SI'=>[0=>'Slovenian',1=>'Slovenščina'],'sq'=>[0=>'Albanian',1=>'Shqip'],'sr_RS'=>[0=>'Serbian',1=>'Српски језик'],'sv_SE'=>[0=>'Swedish',1=>'Svenska'],'sw'=>[0=>'Swahili',1=>'Kiswahili'],'szl'=>[0=>'Silesian',1=>'Ślōnskŏ gŏdka'],'ta_IN'=>[0=>'Tamil',1=>'தமிழ்'],'ta_LK'=>[0=>'Tamil (Sri Lanka)',1=>'தமிழ்'],'te'=>[0=>'Telugu',1=>'తెలుగు'],'th'=>[0=>'Thai',1=>'ไทย'],'tl'=>[0=>'Tagalog',1=>'Tagalog'],'tr_TR'=>[0=>'Turkish',1=>'Türkçe'],'tt_RU'=>[0=>'Tatar',1=>'Татар теле'],'tah'=>[0=>'Tahitian',1=>'Reo Tahiti'],'ug_CN'=>[0=>'Uighur',1=>'ئۇيغۇرچە'],'uk'=>[0=>'Ukrainian',1=>'Українська'],'ur'=>[0=>'Urdu',1=>'اردو'],'uz_UZ'=>[0=>'Uzbek',1=>'O‘zbekcha'],'vi'=>[0=>'Vietnamese',1=>'Tiếng Việt'],'zh_HK'=>[0=>'Chinese (Hong Kong)',1=>'香港中文版 '],'zh_TW'=>[0=>'Chinese (Taiwan)',1=>'繁體中文'],'zh_CN'=>[0=>'Chinese (China)',1=>'简体中文']];
2
  /**
3
  * Compiled data. Do not edit.
4
  */
5
+ return ['af'=>[0=>'Afrikaans',1=>'Afrikaans'],'am'=>[0=>'Amharic',1=>'አማርኛ'],'arg'=>[0=>'Aragonese',1=>'Aragonés'],'ar'=>[0=>'Arabic',1=>'العربية'],'ary'=>[0=>'Moroccan Arabic',1=>'العربية المغربية'],'as'=>[0=>'Assamese',1=>'অসমীয়া'],'azb'=>[0=>'South Azerbaijani',1=>'گؤنئی آذربایجان'],'az'=>[0=>'Azerbaijani',1=>'Azərbaycan dili'],'bel'=>[0=>'Belarusian',1=>'Беларуская мова'],'bg_BG'=>[0=>'Bulgarian',1=>'Български'],'bn_BD'=>[0=>'Bengali (Bangladesh)',1=>'বাংলা'],'bo'=>[0=>'Tibetan',1=>'བོད་ཡིག'],'bs_BA'=>[0=>'Bosnian',1=>'Bosanski'],'ca'=>[0=>'Catalan',1=>'Català'],'ceb'=>[0=>'Cebuano',1=>'Cebuano'],'cs_CZ'=>[0=>'Czech',1=>'Čeština'],'cy'=>[0=>'Welsh',1=>'Cymraeg'],'da_DK'=>[0=>'Danish',1=>'Dansk'],'de_DE'=>[0=>'German',1=>'Deutsch'],'de_AT'=>[0=>'German (Austria)',1=>'Deutsch (Österreich)'],'de_CH_informal'=>[0=>'German (Switzerland, Informal)',1=>'Deutsch (Schweiz, Du)'],'de_CH'=>[0=>'German (Switzerland)',1=>'Deutsch (Schweiz)'],'de_DE_formal'=>[0=>'German (Formal)',1=>'Deutsch (Sie)'],'dsb'=>[0=>'Lower Sorbian',1=>'Dolnoserbšćina'],'dzo'=>[0=>'Dzongkha',1=>'རྫོང་ཁ'],'el'=>[0=>'Greek',1=>'Ελληνικά'],'en_ZA'=>[0=>'English (South Africa)',1=>'English (South Africa)'],'en_AU'=>[0=>'English (Australia)',1=>'English (Australia)'],'en_NZ'=>[0=>'English (New Zealand)',1=>'English (New Zealand)'],'en_CA'=>[0=>'English (Canada)',1=>'English (Canada)'],'en_GB'=>[0=>'English (UK)',1=>'English (UK)'],'eo'=>[0=>'Esperanto',1=>'Esperanto'],'es_AR'=>[0=>'Spanish (Argentina)',1=>'Español de Argentina'],'es_CR'=>[0=>'Spanish (Costa Rica)',1=>'Español de Costa Rica'],'es_EC'=>[0=>'Spanish (Ecuador)',1=>'Español de Ecuador'],'es_MX'=>[0=>'Spanish (Mexico)',1=>'Español de México'],'es_PE'=>[0=>'Spanish (Peru)',1=>'Español de Perú'],'es_DO'=>[0=>'Spanish (Dominican Republic)',1=>'Español de República Dominicana'],'es_CL'=>[0=>'Spanish (Chile)',1=>'Español de Chile'],'es_UY'=>[0=>'Spanish (Uruguay)',1=>'Español de Uruguay'],'es_PR'=>[0=>'Spanish (Puerto Rico)',1=>'Español de Puerto Rico'],'es_GT'=>[0=>'Spanish (Guatemala)',1=>'Español de Guatemala'],'es_CO'=>[0=>'Spanish (Colombia)',1=>'Español de Colombia'],'es_ES'=>[0=>'Spanish (Spain)',1=>'Español'],'es_VE'=>[0=>'Spanish (Venezuela)',1=>'Español de Venezuela'],'et'=>[0=>'Estonian',1=>'Eesti'],'eu'=>[0=>'Basque',1=>'Euskara'],'fa_AF'=>[0=>'Persian (Afghanistan)',1=>'(فارسی (افغانستان'],'fa_IR'=>[0=>'Persian',1=>'فارسی'],'fi'=>[0=>'Finnish',1=>'Suomi'],'fr_CA'=>[0=>'French (Canada)',1=>'Français du Canada'],'fr_FR'=>[0=>'French (France)',1=>'Français'],'fr_BE'=>[0=>'French (Belgium)',1=>'Français de Belgique'],'fur'=>[0=>'Friulian',1=>'Friulian'],'gd'=>[0=>'Scottish Gaelic',1=>'Gàidhlig'],'gl_ES'=>[0=>'Galician',1=>'Galego'],'gu'=>[0=>'Gujarati',1=>'ગુજરાતી'],'haz'=>[0=>'Hazaragi',1=>'هزاره گی'],'he_IL'=>[0=>'Hebrew',1=>'עִבְרִית'],'hi_IN'=>[0=>'Hindi',1=>'हिन्दी'],'hr'=>[0=>'Croatian',1=>'Hrvatski'],'hsb'=>[0=>'Upper Sorbian',1=>'Hornjoserbšćina'],'hu_HU'=>[0=>'Hungarian',1=>'Magyar'],'hy'=>[0=>'Armenian',1=>'Հայերեն'],'id_ID'=>[0=>'Indonesian',1=>'Bahasa Indonesia'],'is_IS'=>[0=>'Icelandic',1=>'Íslenska'],'it_IT'=>[0=>'Italian',1=>'Italiano'],'ja'=>[0=>'Japanese',1=>'日本語'],'jv_ID'=>[0=>'Javanese',1=>'Basa Jawa'],'ka_GE'=>[0=>'Georgian',1=>'ქართული'],'kab'=>[0=>'Kabyle',1=>'Taqbaylit'],'kk'=>[0=>'Kazakh',1=>'Қазақ тілі'],'km'=>[0=>'Khmer',1=>'ភាសាខ្មែរ'],'kn'=>[0=>'Kannada',1=>'ಕನ್ನಡ'],'ko_KR'=>[0=>'Korean',1=>'한국어'],'ckb'=>[0=>'Kurdish (Sorani)',1=>'كوردی‎'],'lo'=>[0=>'Lao',1=>'ພາສາລາວ'],'lt_LT'=>[0=>'Lithuanian',1=>'Lietuvių kalba'],'lv'=>[0=>'Latvian',1=>'Latviešu valoda'],'mk_MK'=>[0=>'Macedonian',1=>'Македонски јазик'],'ml_IN'=>[0=>'Malayalam',1=>'മലയാളം'],'mn'=>[0=>'Mongolian',1=>'Монгол'],'mr'=>[0=>'Marathi',1=>'मराठी'],'ms_MY'=>[0=>'Malay',1=>'Bahasa Melayu'],'my_MM'=>[0=>'Myanmar (Burmese)',1=>'ဗမာစာ'],'nb_NO'=>[0=>'Norwegian (Bokmål)',1=>'Norsk bokmål'],'ne_NP'=>[0=>'Nepali',1=>'नेपाली'],'nl_NL'=>[0=>'Dutch',1=>'Nederlands'],'nl_NL_formal'=>[0=>'Dutch (Formal)',1=>'Nederlands (Formeel)'],'nl_BE'=>[0=>'Dutch (Belgium)',1=>'Nederlands (België)'],'nn_NO'=>[0=>'Norwegian (Nynorsk)',1=>'Norsk nynorsk'],'oci'=>[0=>'Occitan',1=>'Occitan'],'pa_IN'=>[0=>'Panjabi (India)',1=>'ਪੰਜਾਬੀ'],'pl_PL'=>[0=>'Polish',1=>'Polski'],'ps'=>[0=>'Pashto',1=>'پښتو'],'pt_BR'=>[0=>'Portuguese (Brazil)',1=>'Português do Brasil'],'pt_PT'=>[0=>'Portuguese (Portugal)',1=>'Português'],'pt_PT_ao90'=>[0=>'Portuguese (Portugal, AO90)',1=>'Português (AO90)'],'pt_AO'=>[0=>'Portuguese (Angola)',1=>'Português de Angola'],'rhg'=>[0=>'Rohingya',1=>'Ruáinga'],'ro_RO'=>[0=>'Romanian',1=>'Română'],'ru_RU'=>[0=>'Russian',1=>'Русский'],'sah'=>[0=>'Sakha',1=>'Сахалыы'],'snd'=>[0=>'Sindhi',1=>'سنڌي'],'si_LK'=>[0=>'Sinhala',1=>'සිංහල'],'sk_SK'=>[0=>'Slovak',1=>'Slovenčina'],'skr'=>[0=>'Saraiki',1=>'سرائیکی'],'sl_SI'=>[0=>'Slovenian',1=>'Slovenščina'],'sq'=>[0=>'Albanian',1=>'Shqip'],'sr_RS'=>[0=>'Serbian',1=>'Српски језик'],'sv_SE'=>[0=>'Swedish',1=>'Svenska'],'sw'=>[0=>'Swahili',1=>'Kiswahili'],'szl'=>[0=>'Silesian',1=>'Ślōnskŏ gŏdka'],'ta_IN'=>[0=>'Tamil',1=>'தமிழ்'],'ta_LK'=>[0=>'Tamil (Sri Lanka)',1=>'தமிழ்'],'te'=>[0=>'Telugu',1=>'తెలుగు'],'th'=>[0=>'Thai',1=>'ไทย'],'tl'=>[0=>'Tagalog',1=>'Tagalog'],'tr_TR'=>[0=>'Turkish',1=>'Türkçe'],'tt_RU'=>[0=>'Tatar',1=>'Татар теле'],'tah'=>[0=>'Tahitian',1=>'Reo Tahiti'],'ug_CN'=>[0=>'Uighur',1=>'ئۇيغۇرچە'],'uk'=>[0=>'Ukrainian',1=>'Українська'],'ur'=>[0=>'Urdu',1=>'اردو'],'uz_UZ'=>[0=>'Uzbek',1=>'O‘zbekcha'],'vi'=>[0=>'Vietnamese',1=>'Tiếng Việt'],'zh_TW'=>[0=>'Chinese (Taiwan)',1=>'繁體中文'],'zh_CN'=>[0=>'Chinese (China)',1=>'简体中文'],'zh_HK'=>[0=>'Chinese (Hong Kong)',1=>'香港中文']];
loco.php CHANGED
@@ -4,10 +4,10 @@ Plugin Name: Loco Translate
4
  Plugin URI: https://wordpress.org/plugins/loco-translate/
5
  Description: Translate themes and plugins directly in WordPress
6
  Author: Tim Whitlock
7
- Version: 2.6.2
8
  Requires at least: 5.2
9
  Requires PHP: 5.6.20
10
- Tested up to: 6.0.0
11
  Author URI: https://localise.biz/wordpress/plugin
12
  Text Domain: loco-translate
13
  Domain Path: /languages/
@@ -33,7 +33,7 @@ function loco_plugin_file(){
33
  * @return string
34
  */
35
  function loco_plugin_version(){
36
- return '2.6.2';
37
  }
38
 
39
 
@@ -77,23 +77,19 @@ function loco_doing_ajax(){
77
 
78
  /**
79
  * Evaluate a constant by name
80
- * @param string
81
  * @return mixed
82
  */
83
- function loco_constant( $name ){
84
- $value = defined($name) ? constant($name) : null;
85
- // constant values will only be modified in tests
86
- if( defined('LOCO_TEST') && LOCO_TEST ){
87
- $value = apply_filters('loco_constant', $value, $name );
88
- $value = apply_filters('loco_constant_'.$name, $value );
89
  }
90
- return $value;
91
  }
92
 
93
 
94
  /**
95
  * Runtime inclusion of any file under plugin root
96
- * @param string PHP file path relative to __DIR__
97
  * @return mixed return value from included file
98
  */
99
  function loco_include( $relpath ){
@@ -118,7 +114,7 @@ function loco_include( $relpath ){
118
 
119
  /**
120
  * Require dependant library once only
121
- * @param string PHP file path relative to ./lib
122
  * @return void
123
  */
124
  function loco_require_lib( $path ){
@@ -128,7 +124,7 @@ function loco_require_lib( $path ){
128
 
129
  /**
130
  * Check PHP extension required by Loco and load polyfill if needed
131
- * @param string
132
  * @return bool
133
  */
134
  function loco_check_extension( $name ) {
@@ -153,7 +149,7 @@ function loco_check_extension( $name ) {
153
  * Also does autoload for polyfills under "src/compat" if $name < 20 chars
154
  *
155
  * @internal
156
- * @param string
157
  * @return void
158
  */
159
  function loco_autoload( $name ){
@@ -171,7 +167,7 @@ function loco_autoload( $name ){
171
 
172
  /**
173
  * class_exists wrapper that fails silently.
174
- * @param string class name
175
  * @return bool
176
  */
177
  function loco_class_exists( $class ){
@@ -210,8 +206,8 @@ try {
210
 
211
  }
212
  catch( Exception $e ){ // PHP5+
213
- trigger_error(sprintf('[Loco.fatal] %s in %s:%u',$e->getMessage(), $e->getFile(), $e->getLine() ),E_USER_NOTICE);
214
  }
215
  catch( Throwable $e ){ // PHP7+
216
- trigger_error(sprintf('[Loco.fatal] %s in %s:%u',$e->getMessage(), $e->getFile(), $e->getLine() ),E_USER_NOTICE);
217
  }
4
  Plugin URI: https://wordpress.org/plugins/loco-translate/
5
  Description: Translate themes and plugins directly in WordPress
6
  Author: Tim Whitlock
7
+ Version: 2.6.3
8
  Requires at least: 5.2
9
  Requires PHP: 5.6.20
10
+ Tested up to: 6.0.3
11
  Author URI: https://localise.biz/wordpress/plugin
12
  Text Domain: loco-translate
13
  Domain Path: /languages/
33
  * @return string
34
  */
35
  function loco_plugin_version(){
36
+ return '2.6.3';
37
  }
38
 
39
 
77
 
78
  /**
79
  * Evaluate a constant by name
80
+ * @param string $name
81
  * @return mixed
82
  */
83
+ if( ! function_exists('loco_constant') ) {
84
+ function loco_constant( $name ) {
85
+ return defined($name) ? constant($name) : null;
 
 
 
86
  }
 
87
  }
88
 
89
 
90
  /**
91
  * Runtime inclusion of any file under plugin root
92
+ * @param string $relpath PHP file path relative to __DIR__
93
  * @return mixed return value from included file
94
  */
95
  function loco_include( $relpath ){
114
 
115
  /**
116
  * Require dependant library once only
117
+ * @param string $path PHP file path relative to ./lib
118
  * @return void
119
  */
120
  function loco_require_lib( $path ){
124
 
125
  /**
126
  * Check PHP extension required by Loco and load polyfill if needed
127
+ * @param string $name
128
  * @return bool
129
  */
130
  function loco_check_extension( $name ) {
149
  * Also does autoload for polyfills under "src/compat" if $name < 20 chars
150
  *
151
  * @internal
152
+ * @param $name string
153
  * @return void
154
  */
155
  function loco_autoload( $name ){
167
 
168
  /**
169
  * class_exists wrapper that fails silently.
170
+ * @param string $class Class name
171
  * @return bool
172
  */
173
  function loco_class_exists( $class ){
206
 
207
  }
208
  catch( Exception $e ){ // PHP5+
209
+ trigger_error(sprintf('[Loco.fatal] %s in %s:%u',$e->getMessage(), $e->getFile(), $e->getLine() ) );
210
  }
211
  catch( Throwable $e ){ // PHP7+
212
+ trigger_error(sprintf('[Loco.fatal] %s in %s:%u',$e->getMessage(), $e->getFile(), $e->getLine() ) );
213
  }
pub/css/admin.css CHANGED
@@ -1 +1 @@
1
- ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.2) 0 0 no-repeat;min-height:75px}._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.2);background-size:16px}._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.2);background-size:16px}}._green_glow_inner{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}.loco-font,#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after,#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:"loco";src:url("../font/loco.eot?v=2.6.2");src:url("../font/loco.eot?v=2.6.2?#iefix") format("embedded-opentype"),url("../font/loco.woff?v=2.6.2") format("woff"),url("../font/loco.ttf?v=2.6.2") format("truetype"),url("../font/loco.svg?v=2.6.2#loco") format("svg");font-weight:normal;font-style:normal}.tipsy{font-size:11px;position:absolute;padding:5px;z-index:500001;opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.tipsy.in{opacity:1}.tipsy-inner{background-color:#000;color:#fff;white-space:nowrap;padding:6px 8px;line-height:1.3em;text-align:center;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;-webkit-font-smoothing:subpixel-antialiased}.tipsy-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.tipsy-n .tipsy-arrow{top:0px;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-nw .tipsy-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-ne .tipsy-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-s .tipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-sw .tipsy-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-se .tipsy-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-e .tipsy-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.tipsy-w .tipsy-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}#loco-admin.wrap .selector li,#loco-admin.wrap .selector .handle,#loco-admin.wrap .selectoradd a,#loco-admin.wrap .selectorsep:before,#loco-admin.wrap .selectorsep span{padding:.3em .75em}#loco-admin.wrap .selector{text-align:left;display:inline-block;white-space:nowrap}#loco-admin.wrap .selectoradd a,#loco-admin.wrap .selector .handle{cursor:default;display:block;position:relative;border-top:solid 1px #fff;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd;border-left:solid 1px #fff;color:#666;height:1.3em;overflow:hidden;white-space:normal}#loco-admin.wrap .selectorsep{display:inline-block;border:solid 1px transparent}#loco-admin.wrap .selectorsep:before{display:block;position:relative;color:#999;height:1.3em;overflow:hidden}#loco-admin.wrap .selectorsep>*{display:block;line-height:1em;color:#666;height:1.3em;overflow:hidden}#loco-admin.wrap .selector .handle{outline:none;white-space:nowrap;padding-right:2.3em;max-width:250px;text-overflow:ellipsis}#loco-admin.wrap .selector .handle .prefix{padding-right:.6ex}#loco-admin.wrap .selector .handle:after{font-family:loco;font-size:1.3em;color:#ccc;display:block;position:absolute;top:.25em;right:.6em;content:"▼"}#loco-admin.wrap .selector .handle:focus:after,#loco-admin.wrap .selector .handle:hover:after{color:#666}#loco-admin.wrap .selector.no-caret .handle{padding-right:.75em}#loco-admin.wrap .selector.no-caret .handle:after{display:none}#loco-admin.wrap .selector.no-title .handle{padding-left:.5em;padding-right:.5em}#loco-admin.wrap .selector.no-title .handle .label{display:none}#loco-admin.wrap .selector.no-title .handle .icon{margin-right:0px}#loco-admin.wrap .selector.dummy .handle{border-color:transparent}#loco-admin.wrap .selector.dummy .handle:after{display:none}#loco-admin.wrap .selectoradd{position:relative}#loco-admin.wrap .selectoradd>*{display:block;float:left;clear:none}#loco-admin.wrap .selectoradd>a.has-icon{width:1.3em}#loco-admin.wrap .selectoradd>a.has-icon:before{color:#999;display:inline;padding-left:0;padding-right:0;line-height:1.4em}#loco-admin.wrap .selectoradd>a.has-icon:hover:after{color:#2e892e}#loco-admin.wrap .selectorsep{display:inline-block}#loco-admin.wrap .selectorsep span{color:#666;height:1.3em}#loco-admin.wrap .selector ul{padding:0}#loco-admin.wrap .selector ul,#loco-admin.wrap .selector li{display:block;position:relative;cursor:default;margin:0}#loco-admin.wrap .selector ul{z-index:5;position:absolute;left:0;top:0;background:#f5f5f5;box-shadow:0 10px 5px rgba(0,0,0,.2);border:solid 1px #ccc;overflow:auto}#loco-admin.wrap .selector.up ul{margin-top:0}#loco-admin.wrap .selector.multi li input{display:none}#loco-admin.wrap .selector.multi li.checked{background:#e5e5e5}#loco-admin.wrap .selector li.active{background:#e5e5e5 !important}#loco-admin.wrap .selector li.over{background:#ccc !important;color:#fff;text-shadow:1px 1px #aaa}#loco-admin.wrap .selector li.over .label{color:#fff}#loco-admin.wrap .selector .label{font:inherit;color:inherit}#loco-admin.wrap .selector .icon{display:inline-block;min-width:1.2em;text-align:center;font-size:14px}#loco-admin.wrap .selector .icon.no-icon{display:none}#loco-admin.wrap .selector .icon:before{color:#666}#loco-admin.wrap .selector .avtr{width:18px;height:18px;background-size:18px;background-repeat:no-repeat}#loco-admin.wrap .selector .label{line-height:1}#loco-admin.wrap .selector .icon,#loco-admin.wrap .selector .icon-16{vertical-align:bottom}#loco-admin.wrap .selector .icon,#loco-admin.wrap .selector .lang,#loco-admin.wrap .selector .icon-16{margin-right:5px}#loco-admin.wrap .selector .region,#loco-admin.wrap .selector .variant-wales,#loco-admin.wrap .selector .region-gb.lang-cy,#loco-admin.wrap .selector .variant-scotland,#loco-admin.wrap .selector .region-gb.lang-gd,#loco-admin.wrap .selector .variant-valencia,#loco-admin.wrap .selector .region-es.variant-valencia,#loco-admin.wrap .selector .lang-ca,#loco-admin.wrap .selector .region-es.lang-ca,#loco-admin.wrap .selector .lang-eo,#loco-admin.wrap .selector .lang-eu{margin-left:2px;margin-right:7px}#loco-admin.wrap .selector.ticked .icon.no-icon{font-size:12px;display:inline-block}#loco-admin.wrap .selector.ticked .active .icon.no-icon:before{content:"✓"}#loco-admin.wrap .selectoradd a:hover,#loco-admin.wrap .selector a.handle:focus,#loco-admin.wrap .selector a.handle:hover{color:#000;border-color:#999}#loco-admin.wrap .selector.active .handle{border-color:#999;background-color:#eee;color:#999}#loco-admin.wrap .selector.active .handle:after{color:#999;content:"▲"}#loco-admin.wrap .selector.disabled{cursor:default;cursor:no-drop;cursor:not-allowed}#loco-admin.wrap .selector.disabled .handle{pointer-events:none;border-top:solid 1px #fff;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd;border-left:solid 1px #fff;color:#999;padding-right:1em}#loco-admin.wrap .selector.disabled .handle:after{display:none}#loco-admin.wrap .selector.disabled .handle span.icon{color:#999 !important}#loco-admin.wrap .selector li.disabled,#loco-admin.wrap .selector li.disabled.over{color:#aaa;text-shadow:1px 1px #fff;pointer-events:none}#loco-admin.wrap .selector li.disabled *{cursor:text}#loco-admin.wrap .selector li.disabled .icon:before{color:#aaa}#loco-admin.wrap .selector li.disabled .flag,#loco-admin.wrap .selector li.disabled .icon-16{opacity:.4}#loco-admin.wrap .selector.lefty ul{left:auto;right:0}#loco-admin.wrap .selector.lefty ul .icon,#loco-admin.wrap .selector.lefty ul .icon-32{display:block;float:right;clear:none}#loco-admin.wrap .selector.lefty ul .label{padding-right:32px;padding-left:0}#loco-admin.wrap .selector ul>form{margin:0;display:block}#loco-admin.wrap .selector ul>form input{margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}#loco-admin.wrap .selector ul>form input:focus{-webkit-box-shadow:inset 0 0 5px 0 #3db63d;-moz-box-shadow:inset 0 0 5px 0 #3db63d;box-shadow:inset 0 0 5px 0 #3db63d}#loco-admin.wrap .selector ul>form input.error{border-color:#c00;-webkit-box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5);-moz-box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5);box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5)}#loco-admin.wrap .selector ul>form a.clear{margin:0;border:none}#loco-admin.wrap .selector ul>form ::placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form ::-webkit-input-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form :-moz-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block;opacity:1}#loco-admin.wrap .selector ul>form ::-moz-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block;opacity:1}#loco-admin.wrap .selector ul>form :-ms-input-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form .ielt10 .placeheld{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap div.auto-comp-wrap{width:100%}#loco-admin.wrap div.auto-comp-wrap input{display:inline-block}#loco-admin.wrap div.auto-comp-wrap.loading input{background:transparent url(../img/ajax-loader.gif?v=2.6.2) right 2px no-repeat}#loco-admin.wrap div.auto-comp-drop{color:#333;background:#fff;border-top:none;position:absolute;width:auto;top:0;left:0;z-index:99;-webkit-box-shadow:0 5px 5px rgba(0,0,0,.4);-moz-box-shadow:0 5px 5px rgba(0,0,0,.4);box-shadow:0 5px 5px rgba(0,0,0,.4)}#loco-admin.wrap div.auto-comp-result{padding:5px 10px;cursor:pointer;background:#f0f0f0;border-top:solid 1px #fff;border-bottom:solid 1px #ddd;white-space:nowrap}#loco-admin.wrap div.auto-comp-result:first-child{border-top:solid 1px #ddd}#loco-admin.wrap div.auto-comp-result>*{display:inline-block;vertical-align:middle;line-height:normal}#loco-admin.wrap div.auto-comp-result .icon:before{padding-right:5px}#loco-admin.wrap div.auto-comp-result:hover{background:#a8a8a8;color:#fff;border-top-color:#a8a8a8;border-bottom-color:#999}#loco-admin.wrap div.auto-comp-result.selected{background:#666 !important;color:#fff;border-top-color:#666;border-bottom-color:#666}#loco-admin.wrap div.auto-comp-result .lang,#loco-admin.wrap div.auto-comp-result .region,#loco-admin.wrap div.auto-comp-result .variant-wales,#loco-admin.wrap div.auto-comp-result .region-gb.lang-cy,#loco-admin.wrap div.auto-comp-result .variant-scotland,#loco-admin.wrap div.auto-comp-result .region-gb.lang-gd,#loco-admin.wrap div.auto-comp-result .variant-valencia,#loco-admin.wrap div.auto-comp-result .region-es.variant-valencia,#loco-admin.wrap div.auto-comp-result .lang-ca,#loco-admin.wrap div.auto-comp-result .region-es.lang-ca,#loco-admin.wrap div.auto-comp-result .lang-eo,#loco-admin.wrap div.auto-comp-result .lang-eu,#loco-admin.wrap div.auto-comp-result .avtr{margin-right:5px}#loco-admin.wrap div.auto-comp-wrap.error a.icon.clear:before{color:#c00;opacity:1}#loco-admin.wrap div.auto-comp-wrap.error input[type=text]{border-color:#c00;color:#c00}#loco-admin.wrap div.auto-comp-wrap.error input[type=text]:focus{-webkit-box-shadow:0 0 .5em 0 rgba(153,0,0,.5);-moz-box-shadow:0 0 .5em 0 rgba(153,0,0,.5);box-shadow:0 0 .5em 0 rgba(153,0,0,.5)}#loco-admin.wrap ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}#loco-admin.wrap ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.2) 0 0 no-repeat;min-height:75px}#loco-admin.wrap ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-admin.wrap ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.2);background-size:16px}#loco-admin.wrap ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.2);background-size:16px}}#loco-admin.wrap ._green_glow_inner{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-admin.wrap ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-admin.wrap .loco-font,#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after,#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-admin.wrap .has-icon:before{display:inline-block;padding-right:.3em}#loco-admin.wrap a.icon-help{cursor:help}#loco-admin.wrap a.icon-help span{display:none}#loco-admin.wrap .icon-share:before{content:"↑"}#loco-admin.wrap .icon-notag:before{content:""}#loco-admin.wrap .icon-magnify:before{content:"🔍"}#loco-admin.wrap .icon-python:before{content:"🐍"}#loco-admin.wrap .icon-unicode:before{content:"u"}#loco-admin.wrap .icon-json:before{content:"{"}#loco-admin.wrap .icon-bullist:before{content:""}#loco-admin.wrap .icon-numlist:before{content:""}#loco-admin.wrap .icon-indent:before{content:""}#loco-admin.wrap .icon-outdent:before{content:""}#loco-admin.wrap .icon-link:before{content:""}#loco-admin.wrap .icon-unlink:before{content:""}#loco-admin.wrap .icon-bold:before{content:"B"}#loco-admin.wrap .icon-italic:before{content:"I"}#loco-admin.wrap .icon-translate:before{content:""}#loco-admin.wrap .icon-proj:before{content:""}#loco-admin.wrap .icon-plural:before{content:"᛬"}#loco-admin.wrap .icon-max:before,#loco-admin.wrap .icon-full-screen:before{content:""}#loco-admin.wrap .icon-min:before{content:""}#loco-admin.wrap .icon-sort:before{content:""}#loco-admin.wrap .icon-ok:before,#loco-admin.wrap .notice-success>.has-icon:before,#loco-admin.wrap .notice-success p>strong.has-icon:before{content:"✓"}#loco-admin.wrap .icon-ok-empty:before{content:"🗌"}#loco-admin.wrap .icon-checkbox-checked:before,#loco-admin.wrap .selector.multi li.checked .icon-checkbox:before{content:"☑"}#loco-admin.wrap .icon-checkbox-unchecked:before{content:"☐"}#loco-admin.wrap .icon-checkbox-partial:before{content:"☉"}#loco-admin.wrap .icon-radio-checked:before{content:"⚫"}#loco-admin.wrap .icon-radio-unchecked:before{content:"⚪"}#loco-admin.wrap .icon-ext:before{content:"⬈"}#loco-admin.wrap .icon-star:before{content:""}#loco-admin.wrap .icon-user:before{content:""}#loco-admin.wrap .icon-remove:before,#loco-admin.wrap a.icon.close:before{content:"×"}#loco-admin.wrap .icon-cog:before{content:""}#loco-admin.wrap .icon-trash:before{content:""}#loco-admin.wrap .icon-time:before,#loco-admin.wrap .icon-history:before{content:""}#loco-admin.wrap .icon-download:before{content:""}#loco-admin.wrap .icon-revert:before{content:""}#loco-admin.wrap .icon-sync:before{content:""}#loco-admin.wrap .icon-lock:before,#loco-admin.wrap .notice-locked>.has-icon:before,#loco-admin.wrap .notice-locked p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-flag:before{content:""}#loco-admin.wrap .icon-tag:before{content:""}#loco-admin.wrap .icon-tags:before{content:""}#loco-admin.wrap .icon-print:before{content:""}#loco-admin.wrap .icon-camera:before{content:""}#loco-admin.wrap .icon-pencil:before{content:""}#loco-admin.wrap .icon-add:before{content:""}#loco-admin.wrap .icon-del:before{content:""}#loco-admin.wrap .icon-clear:before,#loco-admin.wrap a.icon.clear:before{content:""}#loco-admin.wrap .icon-ok-sign:before{content:"✔"}#loco-admin.wrap .icon-help:before{content:"?"}#loco-admin.wrap .icon-info:before,#loco-admin.wrap .notice-info>.has-icon:before,#loco-admin.wrap .notice-info p>strong.has-icon:before{content:"ℹ"}#loco-admin.wrap .icon-cancel:before{content:""}#loco-admin.wrap .icon-warn:before,#loco-admin.wrap .notice-error>.has-icon:before,#loco-admin.wrap .notice-error p>strong.has-icon:before,#loco-admin.wrap .notice-warning>.has-icon:before,#loco-admin.wrap .notice-warning p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-comment:before{content:""}#loco-admin.wrap .icon-bar-chart:before{content:""}#loco-admin.wrap .icon-key:before{content:""}#loco-admin.wrap .icon-cogs:before{content:""}#loco-admin.wrap .icon-comments:before{content:""}#loco-admin.wrap .icon-signout:before{content:""}#loco-admin.wrap .icon-signin:before{content:""}#loco-admin.wrap .icon-upload:before{content:""}#loco-admin.wrap .icon-twitter:before{content:"🐦"}#loco-admin.wrap .icon-facebook:before{content:""}#loco-admin.wrap .icon-github:before{content:""}#loco-admin.wrap .icon-feed:before{content:""}#loco-admin.wrap .icon-globe:before{content:""}#loco-admin.wrap .icon-wrench:before,#loco-admin.wrap .notice-debug>.has-icon:before,#loco-admin.wrap .notice-debug p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-group:before{content:""}#loco-admin.wrap .icon-cloud:before{content:""}#loco-admin.wrap .icon-copy:before{content:""}#loco-admin.wrap .icon-save:before{content:""}#loco-admin.wrap .icon-menu:before{content:""}#loco-admin.wrap .icon-table:before{content:""}#loco-admin.wrap .icon-caret-down:before{content:"▼"}#loco-admin.wrap .icon-caret-up:before{content:"▲"}#loco-admin.wrap .icon-caret-right:before{content:"▶"}#loco-admin.wrap .icon-mail:before{content:""}#loco-admin.wrap .icon-cloud-upload:before{content:""}#loco-admin.wrap .icon-file:before{content:""}#loco-admin.wrap .icon-circle-white:before{content:"⚬"}#loco-admin.wrap .icon-circle-black:before{content:"●"}#loco-admin.wrap .icon-eraser:before{content:""}#loco-admin.wrap .icon-unlock:before{content:""}#loco-admin.wrap .icon-apple:before{content:""}#loco-admin.wrap .icon-android:before{content:""}#loco-admin.wrap .icon-robot:before{content:"🤖"}#loco-admin.wrap .icon-back:before{content:"⬅"}#loco-admin.wrap .icon-next:before{content:"➔"}#loco-admin.wrap .icon-arrow-up:before{content:""}#loco-admin.wrap .icon-calendar:before{content:""}#loco-admin.wrap .icon-ccard:before{content:""}#loco-admin.wrap .icon-caret-left:before{content:"◀"}#loco-admin.wrap .icon-pro:before{content:"⚡"}#loco-admin.wrap .icon-bell:before{content:""}#loco-admin.wrap .icon-code:before{content:""}#loco-admin.wrap .icon-privacy:before{content:"🛡"}#loco-admin.wrap .icon-hellip:before{content:"…"}#loco-admin.wrap .icon-vellip:before{content:"⁞"}#loco-admin.wrap .icon-collapse:before{content:""}#loco-admin.wrap .icon-expand:before{content:""}#loco-admin.wrap .icon-wordpress:before{content:""}#loco-admin.wrap .icon-database:before{content:""}#loco-admin.wrap .icon-restore:before{content:""}#loco-admin.wrap .icon-pilcrow:before{content:"¶"}#loco-admin.wrap .icon-status.is-translated:before,#loco-admin.wrap .is-translated>header>.icon-status:before{color:#2e892e;content:"✓";text-align:center}#loco-admin.wrap .icon-status.is-untranslated:before,#loco-admin.wrap .is-untranslated>header>.icon-status:before{color:#aaa;content:"×";text-align:center;font-size:1.1em}#loco-admin.wrap .icon-status.is-flagged:before,#loco-admin.wrap .is-flagged>header>.icon-status:before{color:#bd2c00;content:"";text-align:center}#loco-admin.wrap .icon-status.is-translated.is-blank:before,#loco-admin.wrap .icon-status.is-translated.is-inherit:before,#loco-admin.wrap .is-translated.is-blank>header>.icon-status:before,#loco-admin.wrap .is-translated.is-inherit>header>.icon-status:before{content:"🗌"}#loco-admin.wrap .icon-status.is-fuzzy:before,#loco-admin.wrap .is-fuzzy>header>.icon-status:before{color:#666;content:""}#loco-admin.wrap .lang,#loco-admin.wrap .region,#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy,#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd,#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia,#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca,#loco-admin.wrap .lang-eo,#loco-admin.wrap .lang-eu{color:#fff;background:#2e892e;display:inline-block;text-transform:uppercase;overflow:hidden;font-family:Verdana,Arial,sans-serif;font-size:9px;font-weight:normal;font-style:normal;line-height:12px;text-align:center;white-space:normal;text-shadow:none}#loco-admin.wrap .lang{width:20px;height:12px;line-height:12px;vertical-align:middle}#loco-admin.wrap .lang:before{content:attr(lang);vertical-align:baseline}#loco-admin.wrap .no-lang{width:18px;height:10px;border:solid 1px #2e892e;background:transparent}#loco-admin.wrap .lang-el{background-color:#1d48a3}#loco-admin.wrap .lang-el:before{content:"Ελ"}#loco-admin.wrap .region,#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy,#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd,#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia,#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca,#loco-admin.wrap .lang-eo,#loco-admin.wrap .lang-eu{width:16px;height:12px;margin:0 2px;background-image:url(../img/flags.png?v=2.6.2);background-repeat:no-repeat;background-color:transparent}#loco-admin.wrap .region:before,#loco-admin.wrap .variant-wales:before,#loco-admin.wrap .region-gb.lang-cy:before,#loco-admin.wrap .variant-scotland:before,#loco-admin.wrap .region-gb.lang-gd:before,#loco-admin.wrap .variant-valencia:before,#loco-admin.wrap .region-es.variant-valencia:before,#loco-admin.wrap .lang-ca:before,#loco-admin.wrap .region-es.lang-ca:before,#loco-admin.wrap .lang-eo:before,#loco-admin.wrap .lang-eu:before{visibility:hidden}#loco-admin.wrap .lang-zh{background-color:#b90000}#loco-admin.wrap .lang-zh.script-hans:before{content:"中国"}#loco-admin.wrap .lang-zh.script-hant:before{content:"中國"}#loco-admin.wrap .__{background-position:0 0}#loco-admin.wrap .lang-eo{background-position:0 -12px}#loco-admin.wrap .lang-eu{background-position:0 -24px}#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca{background-position:0 -36px}#loco-admin.wrap .region-tg{background-position:0 -48px}#loco-admin.wrap .region-me{background-position:0 -60px}#loco-admin.wrap .region-la{background-position:0 -73px}#loco-admin.wrap .region-mr{background-position:0 -85px}#loco-admin.wrap .region-ni{background-position:0 -97px}#loco-admin.wrap .region-lv{background-position:0 -109px}#loco-admin.wrap .region-om{background-position:0 -121px}#loco-admin.wrap .region-af{background-position:0 -133px}#loco-admin.wrap .region-cy{background-position:0 -145px}#loco-admin.wrap .region-bj{background-position:0 -157px}#loco-admin.wrap .region-aq{background-position:0 -169px}#loco-admin.wrap .region-cn{background-position:0 -186px}#loco-admin.wrap .region-co{background-position:0 -198px}#loco-admin.wrap .region-cx{background-position:0 -210px}#loco-admin.wrap .region-ag{background-position:0 -222px}#loco-admin.wrap .region-ms{background-position:0 -234px}#loco-admin.wrap .region-md{background-position:0 -246px}#loco-admin.wrap .region-zm{background-position:0 -258px}#loco-admin.wrap .region-vn{background-position:0 -270px}#loco-admin.wrap .region-tf{background-position:0 -282px}#loco-admin.wrap .region-td{background-position:0 -294px}#loco-admin.wrap .region-yt{background-position:0 -306px}#loco-admin.wrap .region-lb{background-position:0 -318px}#loco-admin.wrap .region-mf{background-position:0 -330px}#loco-admin.wrap .region-lu{background-position:0 -347px}#loco-admin.wrap .region-mq{background-position:0 -359px}#loco-admin.wrap .region-cz{background-position:0 -371px}#loco-admin.wrap .region-ae{background-position:0 -383px}#loco-admin.wrap .region-cm{background-position:0 -395px}#loco-admin.wrap .region-bi{background-position:0 -407px}#loco-admin.wrap .region-ar{background-position:0 -419px}#loco-admin.wrap .region-as{background-position:0 -431px}#loco-admin.wrap .region-bh{background-position:0 -443px}#loco-admin.wrap .region-cl{background-position:0 -455px}#loco-admin.wrap .region-ad{background-position:0 -467px}#loco-admin.wrap .region-mp{background-position:0 -479px}#loco-admin.wrap .region-lt{background-position:0 -491px}#loco-admin.wrap .region-mg{background-position:0 -503px}#loco-admin.wrap .region-lc{background-position:0 -515px}#loco-admin.wrap .region-tr{background-position:0 -527px}#loco-admin.wrap .region-ua{background-position:0 -539px}#loco-admin.wrap .region-tv{background-position:0 -551px}#loco-admin.wrap .region-vi{background-position:0 -563px}#loco-admin.wrap .region-mt{background-position:0 -575px}#loco-admin.wrap .region-no{background-position:0 -587px}#loco-admin.wrap .region-mc{background-position:0 -599px}#loco-admin.wrap .region-ch{background-position:0 -611px}#loco-admin.wrap .region-bl{background-position:0 -623px}#loco-admin.wrap .region-aw{background-position:0 -640px}#loco-admin.wrap .region-bz{background-position:0 -652px}#loco-admin.wrap .region-bm{background-position:0 -664px}#loco-admin.wrap .region-ci{background-position:0 -676px}#loco-admin.wrap .region-mu{background-position:0 -688px}#loco-admin.wrap .region-us{background-position:0 -700px}#loco-admin.wrap .region-tw{background-position:0 -712px}#loco-admin.wrap .region-ye{background-position:0 -724px}#loco-admin.wrap .region-mw{background-position:0 -736px}#loco-admin.wrap .region-nl{background-position:0 -748px}#loco-admin.wrap .region-ls{background-position:0 -760px}#loco-admin.wrap .region-bo{background-position:0 -772px}#loco-admin.wrap .region-at{background-position:0 -784px}#loco-admin.wrap .region-ck{background-position:0 -796px}#loco-admin.wrap .region-by{background-position:0 -808px}#loco-admin.wrap .region-au{background-position:0 -820px}#loco-admin.wrap .region-bn{background-position:0 -832px}#loco-admin.wrap .region-ma{background-position:0 -844px}#loco-admin.wrap .region-nz{background-position:0 -856px}#loco-admin.wrap .region-lr{background-position:0 -868px}#loco-admin.wrap .region-mv{background-position:0 -880px}#loco-admin.wrap .region-tc{background-position:0 -892px}#loco-admin.wrap .region-ug{background-position:0 -904px}#loco-admin.wrap .region-tt{background-position:0 -916px}#loco-admin.wrap .region-pl{background-position:0 -928px}#loco-admin.wrap .region-rs{background-position:0 -940px}#loco-admin.wrap .region-in{background-position:0 -952px}#loco-admin.wrap .region-ge{background-position:0 -964px}#loco-admin.wrap .region-gr{background-position:0 -976px}#loco-admin.wrap .region-gs{background-position:0 -988px}#loco-admin.wrap .region-gd{background-position:0 -1000px}#loco-admin.wrap .region-io{background-position:0 -1012px}#loco-admin.wrap .region-hk{background-position:0 -1024px}#loco-admin.wrap .region-kp{background-position:0 -1036px}#loco-admin.wrap .region-kg{background-position:0 -1048px}#loco-admin.wrap .region-pm{background-position:0 -1060px}#loco-admin.wrap .region-sv{background-position:0 -1072px}#loco-admin.wrap .region-re{background-position:0 -1084px}#loco-admin.wrap .region-sa{background-position:0 -1096px}#loco-admin.wrap .region-sc{background-position:0 -1108px}#loco-admin.wrap .region-st{background-position:0 -1120px}#loco-admin.wrap .region-ke{background-position:0 -1132px}#loco-admin.wrap .region-im{background-position:0 -1144px}#loco-admin.wrap .region-kr{background-position:0 -1161px}#loco-admin.wrap .region-gf{background-position:0 -1173px}#loco-admin.wrap .region-dj{background-position:0 -1185px}#loco-admin.wrap .region-gq{background-position:0 -1197px}#loco-admin.wrap .region-gp{background-position:0 -1209px}#loco-admin.wrap .region-dk{background-position:0 -1221px}#loco-admin.wrap .region-gg{background-position:0 -1233px}#loco-admin.wrap .region-il{background-position:0 -1250px}#loco-admin.wrap .region-pn{background-position:0 -1262px}#loco-admin.wrap .region-sb{background-position:0 -1274px}#loco-admin.wrap .region-py{background-position:0 -1286px}#loco-admin.wrap .region-ru{background-position:0 -1298px}#loco-admin.wrap .region-kw{background-position:0 -1310px}#loco-admin.wrap .region-do{background-position:0 -1322px}#loco-admin.wrap .region-gt{background-position:0 -1334px}#loco-admin.wrap .region-gb{background-position:0 -1346px}#loco-admin.wrap .region-gu{background-position:0 -1358px}#loco-admin.wrap .region-je{background-position:0 -1370px}#loco-admin.wrap .region-hm{background-position:0 -1387px}#loco-admin.wrap .region-sg{background-position:0 -1399px}#loco-admin.wrap .region-pk{background-position:0 -1411px}#loco-admin.wrap .region-sr{background-position:0 -1423px}#loco-admin.wrap .region-se{background-position:0 -1435px}#loco-admin.wrap .region-jp{background-position:0 -1447px}#loco-admin.wrap .region-gw{background-position:0 -1459px}#loco-admin.wrap .region-eh{background-position:0 -1471px}#loco-admin.wrap .region-dz{background-position:0 -1483px}#loco-admin.wrap .region-ga{background-position:0 -1495px}#loco-admin.wrap .region-fr{background-position:0 -1507px}#loco-admin.wrap .region-dm{background-position:0 -1519px}#loco-admin.wrap .region-hn{background-position:0 -1531px}#loco-admin.wrap .region-sd{background-position:0 -1543px}#loco-admin.wrap .region-rw{background-position:0 -1555px}#loco-admin.wrap .region-ph{background-position:0 -1567px}#loco-admin.wrap .region-ss{background-position:0 -1579px}#loco-admin.wrap .region-qa{background-position:0 -1596px}#loco-admin.wrap .region-pe{background-position:0 -1608px}#loco-admin.wrap .region-pr{background-position:0 -1620px}#loco-admin.wrap .region-si{background-position:0 -1632px}#loco-admin.wrap .region-ht{background-position:0 -1644px}#loco-admin.wrap .region-es{background-position:0 -1656px}#loco-admin.wrap .region-gl{background-position:0 -1668px}#loco-admin.wrap .region-gm{background-position:0 -1680px}#loco-admin.wrap .region-er{background-position:0 -1692px}#loco-admin.wrap .region-fi{background-position:0 -1704px}#loco-admin.wrap .region-ee{background-position:0 -1716px}#loco-admin.wrap .region-kn{background-position:0 -1728px}#loco-admin.wrap .region-hu{background-position:0 -1740px}#loco-admin.wrap .region-iq{background-position:0 -1752px}#loco-admin.wrap .region-ky{background-position:0 -1764px}#loco-admin.wrap .region-sh{background-position:0 -1776px}#loco-admin.wrap .region-ps{background-position:0 -1788px}#loco-admin.wrap .region-pf{background-position:0 -1800px}#loco-admin.wrap .region-sj{background-position:0 -1812px}#loco-admin.wrap .region-id{background-position:0 -1824px}#loco-admin.wrap .region-is{background-position:0 -1836px}#loco-admin.wrap .region-eg{background-position:0 -1848px}#loco-admin.wrap .region-fk{background-position:0 -1860px}#loco-admin.wrap .region-fj{background-position:0 -1872px}#loco-admin.wrap .region-gn{background-position:0 -1884px}#loco-admin.wrap .region-gy{background-position:0 -1896px}#loco-admin.wrap .region-ir{background-position:0 -1908px}#loco-admin.wrap .region-km{background-position:0 -1920px}#loco-admin.wrap .region-ie{background-position:0 -1932px}#loco-admin.wrap .region-kz{background-position:0 -1944px}#loco-admin.wrap .region-ro{background-position:0 -1956px}#loco-admin.wrap .region-sk{background-position:0 -1968px}#loco-admin.wrap .region-pg{background-position:0 -1980px}#loco-admin.wrap .region-pt{background-position:0 -1992px}#loco-admin.wrap .region-so{background-position:0 -2004px}#loco-admin.wrap .region-sx{background-position:0 -2016px}#loco-admin.wrap .region-hr{background-position:0 -2033px}#loco-admin.wrap .region-ki{background-position:0 -2045px}#loco-admin.wrap .region-jm{background-position:0 -2057px}#loco-admin.wrap .region-ec{background-position:0 -2069px}#loco-admin.wrap .region-et{background-position:0 -2081px}#loco-admin.wrap .region-fo{background-position:0 -2093px}#loco-admin.wrap .region-kh{background-position:0 -2105px}#loco-admin.wrap .region-sy{background-position:0 -2117px}#loco-admin.wrap .region-sn{background-position:0 -2129px}#loco-admin.wrap .region-pw{background-position:0 -2141px}#loco-admin.wrap .region-sl{background-position:0 -2153px}#loco-admin.wrap .region-fm{background-position:0 -2165px}#loco-admin.wrap .region-gi{background-position:0 -2177px}#loco-admin.wrap .region-de{background-position:0 -2189px}#loco-admin.wrap .region-gh{background-position:0 -2201px}#loco-admin.wrap .region-jo{background-position:0 -2213px}#loco-admin.wrap .region-it{background-position:0 -2225px}#loco-admin.wrap .region-pa{background-position:0 -2237px}#loco-admin.wrap .region-sz{background-position:0 -2249px}#loco-admin.wrap .region-sm{background-position:0 -2261px}#loco-admin.wrap .region-tn{background-position:0 -2273px}#loco-admin.wrap .region-ml{background-position:0 -2285px}#loco-admin.wrap .region-cg{background-position:0 -2297px}#loco-admin.wrap .region-ax{background-position:0 -2309px}#loco-admin.wrap .region-ao{background-position:0 -2321px}#loco-admin.wrap .region-bt{background-position:0 -2333px}#loco-admin.wrap .region-an{background-position:0 -2345px}#loco-admin.wrap .region-bb{background-position:0 -2357px}#loco-admin.wrap .region-cf{background-position:0 -2369px}#loco-admin.wrap .region-mm{background-position:0 -2381px}#loco-admin.wrap .region-li{background-position:0 -2393px}#loco-admin.wrap .region-na{background-position:0 -2405px}#loco-admin.wrap .region-mz{background-position:0 -2417px}#loco-admin.wrap .region-to{background-position:0 -2429px}#loco-admin.wrap .region-vg{background-position:0 -2441px}#loco-admin.wrap .region-ve{background-position:0 -2453px}#loco-admin.wrap .region-tz{background-position:0 -2465px}#loco-admin.wrap .region-tm{background-position:0 -2477px}#loco-admin.wrap .region-mx{background-position:0 -2489px}#loco-admin.wrap .region-nc{background-position:0 -2501px}#loco-admin.wrap .region-mo{background-position:0 -2513px}#loco-admin.wrap .region-lk{background-position:0 -2525px}#loco-admin.wrap .region-cd{background-position:0 -2537px}#loco-admin.wrap .region-al{background-position:0 -2549px}#loco-admin.wrap .region-bw{background-position:0 -2561px}#loco-admin.wrap .region-cs{background-position:0 -2573px}#loco-admin.wrap .region-cr{background-position:0 -2585px}#loco-admin.wrap .region-bv{background-position:0 -2597px}#loco-admin.wrap .region-am{background-position:0 -2609px}#loco-admin.wrap .region-az{background-position:0 -2621px}#loco-admin.wrap .region-ba{background-position:0 -2633px}#loco-admin.wrap .region-mn{background-position:0 -2645px}#loco-admin.wrap .region-nu{background-position:0 -2657px}#loco-admin.wrap .region-my{background-position:0 -2669px}#loco-admin.wrap .region-tl{background-position:0 -2681px}#loco-admin.wrap .region-ws{background-position:0 -2693px}#loco-admin.wrap .region-th{background-position:0 -2705px}#loco-admin.wrap .region-nf{background-position:0 -2717px}#loco-admin.wrap .region-ly{background-position:0 -2729px}#loco-admin.wrap .region-ai{background-position:0 -2741px}#loco-admin.wrap .region-br{background-position:0 -2753px}#loco-admin.wrap .region-cv{background-position:0 -2765px}#loco-admin.wrap .region-be{background-position:0 -2777px}#loco-admin.wrap .region-ca{background-position:0 -2789px}#loco-admin.wrap .region-bd{background-position:0 -2801px}#loco-admin.wrap .region-cw{background-position:0 -2813px}#loco-admin.wrap .region-bs{background-position:0 -2830px}#loco-admin.wrap .region-ng{background-position:0 -2842px}#loco-admin.wrap .region-mk{background-position:0 -2854px}#loco-admin.wrap .region-np{background-position:0 -2866px}#loco-admin.wrap .region-va{background-position:0 -2878px}#loco-admin.wrap .region-uz{background-position:0 -2890px}#loco-admin.wrap .region-um{background-position:0 -2902px}#loco-admin.wrap .region-tk{background-position:0 -2914px}#loco-admin.wrap .region-vc{background-position:0 -2926px}#loco-admin.wrap .region-zw{background-position:0 -2938px}#loco-admin.wrap .region-nr{background-position:0 -2950px}#loco-admin.wrap .region-ne{background-position:0 -2962px}#loco-admin.wrap .region-cu{background-position:0 -2974px}#loco-admin.wrap .region-bq{background-position:0 -2986px}#loco-admin.wrap .region-bf{background-position:0 -2998px}#loco-admin.wrap .region-bg{background-position:0 -3010px}#loco-admin.wrap .region-cc{background-position:0 -3022px}#loco-admin.wrap .region-mh{background-position:0 -3034px}#loco-admin.wrap .region-za{background-position:0 -3046px}#loco-admin.wrap .region-uy{background-position:0 -3058px}#loco-admin.wrap .region-wf{background-position:0 -3070px}#loco-admin.wrap .region-vu{background-position:0 -3082px}#loco-admin.wrap .region-tj{background-position:0 -3094px}#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd{background-position:0 -3106px}#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia{background-position:0 -3118px}#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy{background-position:0 -3130px}#loco-admin.wrap .x-eu{background-position:0 -3142px}#loco-admin.wrap span.lang code{display:none}#loco-admin.wrap .icon-share:before{content:"↑"}#loco-admin.wrap .icon-notag:before{content:""}#loco-admin.wrap .icon-magnify:before{content:"🔍"}#loco-admin.wrap .icon-python:before{content:"🐍"}#loco-admin.wrap .icon-unicode:before{content:"u"}#loco-admin.wrap .icon-json:before{content:"{"}#loco-admin.wrap .icon-bullist:before{content:""}#loco-admin.wrap .icon-numlist:before{content:""}#loco-admin.wrap .icon-indent:before{content:""}#loco-admin.wrap .icon-outdent:before{content:""}#loco-admin.wrap .icon-link:before{content:""}#loco-admin.wrap .icon-unlink:before{content:""}#loco-admin.wrap .icon-bold:before{content:"B"}#loco-admin.wrap .icon-italic:before{content:"I"}#loco-admin.wrap .icon-translate:before{content:""}#loco-admin.wrap .icon-proj:before{content:""}#loco-admin.wrap .icon-plural:before{content:"᛬"}#loco-admin.wrap .icon-max:before,#loco-admin.wrap .icon-full-screen:before{content:""}#loco-admin.wrap .icon-min:before{content:""}#loco-admin.wrap .icon-sort:before{content:""}#loco-admin.wrap .icon-ok:before,#loco-admin.wrap .notice-success>.has-icon:before,#loco-admin.wrap .notice-success p>strong.has-icon:before{content:"✓"}#loco-admin.wrap .icon-ok-empty:before{content:"🗌"}#loco-admin.wrap .icon-checkbox-checked:before,#loco-admin.wrap .selector.multi li.checked .icon-checkbox:before{content:"☑"}#loco-admin.wrap .icon-checkbox-unchecked:before{content:"☐"}#loco-admin.wrap .icon-checkbox-partial:before{content:"☉"}#loco-admin.wrap .icon-radio-checked:before{content:"⚫"}#loco-admin.wrap .icon-radio-unchecked:before{content:"⚪"}#loco-admin.wrap .icon-ext:before{content:"⬈"}#loco-admin.wrap .icon-star:before{content:""}#loco-admin.wrap .icon-user:before{content:""}#loco-admin.wrap .icon-remove:before,#loco-admin.wrap a.icon.close:before{content:"×"}#loco-admin.wrap .icon-cog:before{content:""}#loco-admin.wrap .icon-trash:before{content:""}#loco-admin.wrap .icon-time:before,#loco-admin.wrap .icon-history:before{content:""}#loco-admin.wrap .icon-download:before{content:""}#loco-admin.wrap .icon-revert:before{content:""}#loco-admin.wrap .icon-sync:before{content:""}#loco-admin.wrap .icon-lock:before,#loco-admin.wrap .notice-locked>.has-icon:before,#loco-admin.wrap .notice-locked p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-flag:before{content:""}#loco-admin.wrap .icon-tag:before{content:""}#loco-admin.wrap .icon-tags:before{content:""}#loco-admin.wrap .icon-print:before{content:""}#loco-admin.wrap .icon-camera:before{content:""}#loco-admin.wrap .icon-pencil:before{content:""}#loco-admin.wrap .icon-add:before{content:""}#loco-admin.wrap .icon-del:before{content:""}#loco-admin.wrap .icon-clear:before,#loco-admin.wrap a.icon.clear:before{content:""}#loco-admin.wrap .icon-ok-sign:before{content:"✔"}#loco-admin.wrap .icon-help:before{content:"?"}#loco-admin.wrap .icon-info:before,#loco-admin.wrap .notice-info>.has-icon:before,#loco-admin.wrap .notice-info p>strong.has-icon:before{content:"ℹ"}#loco-admin.wrap .icon-cancel:before{content:""}#loco-admin.wrap .icon-warn:before,#loco-admin.wrap .notice-error>.has-icon:before,#loco-admin.wrap .notice-error p>strong.has-icon:before,#loco-admin.wrap .notice-warning>.has-icon:before,#loco-admin.wrap .notice-warning p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-comment:before{content:""}#loco-admin.wrap .icon-bar-chart:before{content:""}#loco-admin.wrap .icon-key:before{content:""}#loco-admin.wrap .icon-cogs:before{content:""}#loco-admin.wrap .icon-comments:before{content:""}#loco-admin.wrap .icon-signout:before{content:""}#loco-admin.wrap .icon-signin:before{content:""}#loco-admin.wrap .icon-upload:before{content:""}#loco-admin.wrap .icon-twitter:before{content:"🐦"}#loco-admin.wrap .icon-facebook:before{content:""}#loco-admin.wrap .icon-github:before{content:""}#loco-admin.wrap .icon-feed:before{content:""}#loco-admin.wrap .icon-globe:before{content:""}#loco-admin.wrap .icon-wrench:before,#loco-admin.wrap .notice-debug>.has-icon:before,#loco-admin.wrap .notice-debug p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-group:before{content:""}#loco-admin.wrap .icon-cloud:before{content:""}#loco-admin.wrap .icon-copy:before{content:""}#loco-admin.wrap .icon-save:before{content:""}#loco-admin.wrap .icon-menu:before{content:""}#loco-admin.wrap .icon-table:before{content:""}#loco-admin.wrap .icon-caret-down:before{content:"▼"}#loco-admin.wrap .icon-caret-up:before{content:"▲"}#loco-admin.wrap .icon-caret-right:before{content:"▶"}#loco-admin.wrap .icon-mail:before{content:""}#loco-admin.wrap .icon-cloud-upload:before{content:""}#loco-admin.wrap .icon-file:before{content:""}#loco-admin.wrap .icon-circle-white:before{content:"⚬"}#loco-admin.wrap .icon-circle-black:before{content:"●"}#loco-admin.wrap .icon-eraser:before{content:""}#loco-admin.wrap .icon-unlock:before{content:""}#loco-admin.wrap .icon-apple:before{content:""}#loco-admin.wrap .icon-android:before{content:""}#loco-admin.wrap .icon-robot:before{content:"🤖"}#loco-admin.wrap .icon-back:before{content:"⬅"}#loco-admin.wrap .icon-next:before{content:"➔"}#loco-admin.wrap .icon-arrow-up:before{content:""}#loco-admin.wrap .icon-calendar:before{content:""}#loco-admin.wrap .icon-ccard:before{content:""}#loco-admin.wrap .icon-caret-left:before{content:"◀"}#loco-admin.wrap .icon-pro:before{content:"⚡"}#loco-admin.wrap .icon-bell:before{content:""}#loco-admin.wrap .icon-code:before{content:""}#loco-admin.wrap .icon-privacy:before{content:"🛡"}#loco-admin.wrap .icon-hellip:before{content:"…"}#loco-admin.wrap .icon-vellip:before{content:"⁞"}#loco-admin.wrap .icon-collapse:before{content:""}#loco-admin.wrap .icon-expand:before{content:""}#loco-admin.wrap .icon-wordpress:before{content:""}#loco-admin.wrap .icon-database:before{content:""}#loco-admin.wrap .icon-restore:before{content:""}#loco-admin.wrap .icon-pilcrow:before{content:"¶"}#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before,#loco-admin.wrap .has-dashicon:before{speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco"}#loco-admin.wrap .has-dashicon:before{font-family:"dashicons";font-size:1.4em}#loco-admin.wrap .has-icon:before,#loco-admin.wrap .has-dashicon:before,#loco-admin.wrap .has-icon>span{display:inline-block;vertical-align:middle}#loco-admin.wrap .only-icon{text-align:center}#loco-admin.wrap .only-icon:before{text-align:center;padding:0}#loco-admin.wrap .only-icon span{display:none}#loco-admin.wrap a,#loco-admin.wrap .wp-core-ui .button-link{text-decoration:none}#loco-admin.wrap h3:hover>a.loco-anchor{color:#ccc}#loco-admin.wrap h3:hover>a.loco-anchor:before{content:"¶"}#loco-admin.wrap .has-lang>span{display:inline-block;vertical-align:middle}#loco-admin.wrap a.has-lang:hover>span:last-child{text-decoration:underline}#loco-admin.wrap h1 ul,#loco-admin.wrap h1 li{margin:0;padding:0}#loco-admin.wrap h1 li{display:inline-block}#loco-admin.wrap h1 li:after{content:"/";color:#999;text-shadow:none;display:inline-block}#loco-admin.wrap h1 li:last-child:after{content:""}#loco-admin.wrap h1 li:last-child a{color:inherit;pointer-events:none;cursor:auto}#loco-admin.wrap h2 span{color:#999;font-weight:normal}#loco-admin.wrap h2 .loco-meta,#loco-admin.wrap h3 .loco-meta{color:inherit;font-size:14px;font-weight:normal;vertical-align:middle}#loco-admin.wrap .wp-list-table td:first-child .icon{width:16px;display:inline-block;text-align:center}#loco-admin.wrap .wp-list-table td{white-space:nowrap}#loco-admin.wrap .wp-list-table td>a,#loco-admin.wrap .wp-list-table td>time{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis}#loco-admin.wrap .wp-list-table th.loco-sort{cursor:pointer}#loco-admin.wrap .wp-list-table th.loco-sort:hover{color:#000}#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after{padding:0 0 0 4px;color:#999}#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after{content:"▼"}#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after{content:"▲"}#loco-admin.wrap .wp-list-table td.has-row-actions{overflow:visible}#loco-admin.wrap form.loco-filter{display:block;margin-bottom:5px}#loco-admin.wrap form.loco-filter .icon-filter{color:#999}#loco-admin.wrap nav.above-list-table{margin-bottom:1em}#loco-admin.wrap nav.above-list-table a{display:inline-block;margin-right:1em}#loco-admin.wrap .wp-core-ui button.inverted,#loco-admin.wrap .wp-core-ui button.inverted:hover,#loco-admin.wrap .po-fuzzy button.icon-cloud{background:-moz-linear-gradient(top, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);background:-webkit-linear-gradient(top, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);background:linear-gradient(to bottom, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);-webkit-box-shadow:0 1px 0 #fff;-moz-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;border-color:gray}#loco-admin.wrap .wp-core-ui button:active,#loco-admin.wrap .wp-core-ui button.inverted:active{border-color:#5b9dd9}#loco-admin.wrap .loco-clearable{display:inline-block;vertical-align:middle;position:relative}#loco-admin.wrap .loco-clearable a.clear,#loco-admin.wrap .auto-comp-wrap a.clear{top:0;right:0;outline:none;margin:0;border:solid 1px transparent;padding:5px 5px;position:absolute;font-size:1em;line-height:normal}#loco-admin.wrap .loco-clearable a.clear:before,#loco-admin.wrap .auto-comp-wrap a.clear:before{vertical-align:middle;padding:0;color:#999}#loco-admin.wrap .loco-clearable a.clear:hover:before,#loco-admin.wrap .auto-comp-wrap a.clear:hover:before{color:#333}#loco-admin.wrap .loco-clearable a.clear span,#loco-admin.wrap .auto-comp-wrap a.clear span{display:none}#loco-admin.wrap .loco-clearable ::-ms-clear,#loco-admin.wrap .auto-comp-wrap ::-ms-clear{display:none}#loco-admin.wrap div.progress{color:#000;background:transparent !important}#loco-admin.wrap div.progress *{height:100%;overflow:hidden;white-space:nowrap}#loco-admin.wrap div.progress .t{background-color:#ddd;border:1px solid #ccc}#loco-admin.wrap div.progress .t .bar{float:left;clear:none;background-color:#3db63d}#loco-admin.wrap div.progress .t .bar.f{background-color:#bd2c00}#loco-admin.wrap div.progress .l{display:block}#loco-admin.wrap td div.progress .t{border:none}#loco-admin.wrap td div.progress .l{display:none}#loco-admin.wrap code.path{color:#333;margin:0;padding:0;display:inline;background:transparent}#loco-admin.wrap .loco-danger{color:#d54e21}#loco-admin.wrap .notice,#loco-admin.wrap .panel{background:#fff;position:relative;margin:1em 0;padding:1px 12px}#loco-admin.wrap .notice-generic{border-color:#ddd}#loco-admin.wrap .notice-success>.has-icon,#loco-admin.wrap .notice-success p>strong.has-icon{color:#000}#loco-admin.wrap .notice-warning{border-color:orange}#loco-admin.wrap .notice-error{border-color:#dc3232}#loco-admin.wrap .notice-debug{border-color:#00a0d2}#loco-admin.wrap .notice-danger{border-color:#dc3232}#loco-admin.wrap .notice-locked{border-color:orange}#loco-admin.wrap .notice>.has-icon:before,#loco-admin.wrap .notice p>strong.has-icon:before{padding-right:6px}#loco-admin.wrap .notice>p>a.button.has-icon:before{width:1.2em}#loco-admin.wrap .notice>p>em{color:#d54e21;font-style:normal}#loco-admin.wrap .notice>p>em a{color:inherit}#loco-admin.wrap .notice>p a:hover,#loco-admin.wrap .notice>nav a:hover{text-decoration:underline}#loco-admin.wrap .notice>p a.button,#loco-admin.wrap .notice>nav a.button{text-decoration:inherit}#loco-admin.wrap .notice.has-nav{display:flex;flex-direction:row}#loco-admin.wrap .notice.has-nav p,#loco-admin.wrap .notice.has-nav nav{line-height:22px;flex-grow:1}#loco-admin.wrap .notice.has-nav nav{text-align:right;padding:2px;margin:.5em 0}#loco-admin.wrap .notice.has-nav.is-dismissible{padding-right:38px}#loco-admin.wrap .notice.has-nav a{white-space:nowrap}#loco-admin.wrap .notice.has-nav nav>span{color:#666}#loco-admin.wrap .notice>h3>span{display:inline-block;vertical-align:middle}#loco-admin.wrap ul.problems li{font-style:italic}#loco-admin.wrap label{position:relative}#loco-admin.wrap label.for-disabled,#loco-admin.wrap label.for-disabled>input{cursor:default !important}#loco-admin.wrap input.regular-text,#loco-admin.wrap textarea.regular-text{width:25em}#loco-admin.wrap .button-link{padding:0 10px 1px}#loco-admin.wrap .button-danger{background:#ba0000;border-color:#900 #600 #600;-webkit-box-shadow:0 1px 0 #600;-moz-box-shadow:0 1px 0 #600;box-shadow:0 1px 0 #600;color:#fff;text-shadow:0 -1px 1px #600,1px 0 1px #600,0 1px 1px #600,-1px 0 1px #600}#loco-admin.wrap .button-success{background:#00b500;border-color:#090 #2e892e #2e892e;-webkit-box-shadow:0 1px 0 #2e892e;-moz-box-shadow:0 1px 0 #2e892e;box-shadow:0 1px 0 #2e892e;color:#fff;text-shadow:0 -1px 1px #2e892e,1px 0 1px #2e892e,0 1px 1px #2e892e,-1px 0 1px #2e892e}#loco-admin.wrap .button-success:hover{background:#3db63d}#loco-admin.wrap .button-danger[disabled],#loco-admin.wrap .button-success[disabled]{text-shadow:none !important}#loco-admin.wrap form button.loco-loading.button-large{padding-left:0}#loco-admin.wrap form button.loco-loading.button-large:before{width:16px;height:16px;margin:0 4px;content:" ";font-size:16px;line-height:1;display:inline-block;vertical-align:sub}#loco-admin.wrap ::placeholder{color:#ccc}#loco-admin.wrap ::-webkit-input-placeholder{color:#ccc}#loco-admin.wrap :-moz-placeholder{color:#ccc;opacity:1}#loco-admin.wrap ::-moz-placeholder{color:#ccc;opacity:1}#loco-admin.wrap :-ms-input-placeholder{color:#ccc}#loco-admin.wrap .ielt10 .placeheld{color:#ccc}#loco-admin.wrap a.has-raquo:after{content:" »"}#loco-admin.wrap a.has-laquo:before{content:"« "}#loco-admin.wrap span.inline-spinner{display:inline-block;min-width:16px;min-height:16px;background:transparent url(../img/spin-modal.gif?v=2.6.2) 0 0 no-repeat}.js #wpbody-content>.notice{display:none}.js #wpbody-content>.notice.inline{display:block}.js #loco-admin.wrap .jshide,.no-js #loco-admin.wrap .jsonly{display:none !important}#loco-admin.wrap .invis{visibility:hidden}.form-table tr td{vertical-align:top}.form-table tr.compact td{padding-top:0}.form-table tr th a.icon-help{display:none}.loco-modal{min-width:50%;min-height:100px}.loco-modal-wide{min-width:90% !important}.loco-modal-no-close .ui-dialog-titlebar-close{display:none}.loco-modal .ui-dialog-titlebar-close{overflow:hidden}.loco-modal.request-filesystem-credentials-dialog{top:15% !important;max-height:85% !important}.loco-modal.request-filesystem-credentials-dialog>.ui-dialog-content{background:inherit}.loco-modal.request-filesystem-credentials-dialog .ftp-password>label>em:last-child{display:none}.ui-dialog-content>div.loco-loading{height:100%;background:transparent url(../img/spin-modal.gif?v=2.6.2) center 20px no-repeat}#loco-po-ref ol li{color:#aaa;margin:0;white-space:pre;padding:0 0 0 1em;font:normal 12px/17px Consolas,Monaco,monospace;background:transparent;border-left:1px solid #eee}#loco-po-ref ol li code{margin:0;padding:0;display:inline;background:inherit}#loco-po-ref ol li.highlighted{color:#666;background-color:#f8eec7}#loco-po-ref ol li.highlighted code.T_CONSTANT_ENCAPSED_STRING{color:#c931c7}#loco-credit>*{vertical-align:middle}#loco-credit>a{display:inline-block;position:relative;overflow:hidden;background:transparent url(../img/logo-foot.gif?v=2.6.2) 0 0 no-repeat;height:30px;width:100px;text-indent:200px;-webkit-transition-duration:0s;transition-duration:0s}#loco-credit>a:hover{background-position:0 -35px}#loco-content{position:relative}#footer-upgrade span:before{color:#ccc;content:" | ";display:inline;padding-left:.5em;padding-right:.5em}#footer-upgrade span:first-child:before{content:"";display:none}.loco-clearfix:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}dl.debug dt{font-weight:bold}dl.debug dt,dl.debug dd{white-space:pre}.wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(0,115,170,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#0073aa}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#66c6e4 !important;background:#008ec2 !important;border-color:#008ec2 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../img/skins/fresh/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.3) 0 0 no-repeat;min-height:75px}._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.3);background-size:16px}._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.3);background-size:16px}}._green_glow_inner{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}.loco-font,#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after,#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@font-face{font-family:"loco";src:url("../font/loco.eot?v=2.6.3");src:url("../font/loco.eot?v=2.6.3?#iefix") format("embedded-opentype"),url("../font/loco.woff?v=2.6.3") format("woff"),url("../font/loco.ttf?v=2.6.3") format("truetype"),url("../font/loco.svg?v=2.6.3#loco") format("svg");font-weight:normal;font-style:normal}.tipsy{font-size:11px;position:absolute;padding:5px;z-index:500001;opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.tipsy.in{opacity:1}.tipsy-inner{background-color:#000;color:#fff;white-space:nowrap;padding:6px 8px;line-height:1.3em;text-align:center;-webkit-border-radius:3px;-moz-border-radius:3px;-ms-border-radius:3px;-o-border-radius:3px;border-radius:3px;-webkit-font-smoothing:subpixel-antialiased}.tipsy-arrow{position:absolute;width:0;height:0;line-height:0;border:5px dashed #000}.tipsy-n .tipsy-arrow{top:0px;left:50%;margin-left:-5px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-nw .tipsy-arrow{top:0;left:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-ne .tipsy-arrow{top:0;right:10px;border-bottom-style:solid;border-top:none;border-left-color:transparent;border-right-color:transparent}.tipsy-s .tipsy-arrow{bottom:0;left:50%;margin-left:-5px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-sw .tipsy-arrow{bottom:0;left:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-se .tipsy-arrow{bottom:0;right:10px;border-top-style:solid;border-bottom:none;border-left-color:transparent;border-right-color:transparent}.tipsy-e .tipsy-arrow{right:0;top:50%;margin-top:-5px;border-left-style:solid;border-right:none;border-top-color:transparent;border-bottom-color:transparent}.tipsy-w .tipsy-arrow{left:0;top:50%;margin-top:-5px;border-right-style:solid;border-left:none;border-top-color:transparent;border-bottom-color:transparent}#loco-admin.wrap .selector li,#loco-admin.wrap .selector .handle,#loco-admin.wrap .selectoradd a,#loco-admin.wrap .selectorsep:before,#loco-admin.wrap .selectorsep span{padding:.3em .75em}#loco-admin.wrap .selector{text-align:left;display:inline-block;white-space:nowrap}#loco-admin.wrap .selectoradd a,#loco-admin.wrap .selector .handle{cursor:default;display:block;position:relative;border-top:solid 1px #fff;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd;border-left:solid 1px #fff;color:#666;height:1.3em;overflow:hidden;white-space:normal}#loco-admin.wrap .selectorsep{display:inline-block;border:solid 1px transparent}#loco-admin.wrap .selectorsep:before{display:block;position:relative;color:#999;height:1.3em;overflow:hidden}#loco-admin.wrap .selectorsep>*{display:block;line-height:1em;color:#666;height:1.3em;overflow:hidden}#loco-admin.wrap .selector .handle{outline:none;white-space:nowrap;padding-right:2.3em;max-width:250px;text-overflow:ellipsis}#loco-admin.wrap .selector .handle .prefix{padding-right:.6ex}#loco-admin.wrap .selector .handle:after{font-family:loco;font-size:1.3em;color:#ccc;display:block;position:absolute;top:.25em;right:.6em;content:"▼"}#loco-admin.wrap .selector .handle:focus:after,#loco-admin.wrap .selector .handle:hover:after{color:#666}#loco-admin.wrap .selector.no-caret .handle{padding-right:.75em}#loco-admin.wrap .selector.no-caret .handle:after{display:none}#loco-admin.wrap .selector.no-title .handle{padding-left:.5em;padding-right:.5em}#loco-admin.wrap .selector.no-title .handle .label{display:none}#loco-admin.wrap .selector.no-title .handle .icon{margin-right:0px}#loco-admin.wrap .selector.dummy .handle{border-color:transparent}#loco-admin.wrap .selector.dummy .handle:after{display:none}#loco-admin.wrap .selectoradd{position:relative}#loco-admin.wrap .selectoradd>*{display:block;float:left;clear:none}#loco-admin.wrap .selectoradd>a.has-icon{width:1.3em}#loco-admin.wrap .selectoradd>a.has-icon:before{color:#999;display:inline;padding-left:0;padding-right:0;line-height:1.4em}#loco-admin.wrap .selectoradd>a.has-icon:hover:after{color:#2e892e}#loco-admin.wrap .selectorsep{display:inline-block}#loco-admin.wrap .selectorsep span{color:#666;height:1.3em}#loco-admin.wrap .selector ul{padding:0}#loco-admin.wrap .selector ul,#loco-admin.wrap .selector li{display:block;position:relative;cursor:default;margin:0}#loco-admin.wrap .selector ul{z-index:5;position:absolute;left:0;top:0;background:#f5f5f5;box-shadow:0 10px 5px rgba(0,0,0,.2);border:solid 1px #ccc;overflow:auto}#loco-admin.wrap .selector.up ul{margin-top:0}#loco-admin.wrap .selector.multi li input{display:none}#loco-admin.wrap .selector.multi li.checked{background:#e5e5e5}#loco-admin.wrap .selector li.active{background:#e5e5e5 !important}#loco-admin.wrap .selector li.over{background:#ccc !important;color:#fff;text-shadow:1px 1px #aaa}#loco-admin.wrap .selector li.over .label{color:#fff}#loco-admin.wrap .selector .label{font:inherit;color:inherit}#loco-admin.wrap .selector .icon{display:inline-block;min-width:1.2em;text-align:center;font-size:14px}#loco-admin.wrap .selector .icon.no-icon{display:none}#loco-admin.wrap .selector .icon:before{color:#666}#loco-admin.wrap .selector .avtr{width:18px;height:18px;background-size:18px;background-repeat:no-repeat}#loco-admin.wrap .selector .label{line-height:1}#loco-admin.wrap .selector .icon,#loco-admin.wrap .selector .icon-16{vertical-align:bottom}#loco-admin.wrap .selector .icon,#loco-admin.wrap .selector .lang,#loco-admin.wrap .selector .icon-16{margin-right:5px}#loco-admin.wrap .selector .region,#loco-admin.wrap .selector .variant-wales,#loco-admin.wrap .selector .region-gb.lang-cy,#loco-admin.wrap .selector .variant-scotland,#loco-admin.wrap .selector .region-gb.lang-gd,#loco-admin.wrap .selector .variant-valencia,#loco-admin.wrap .selector .region-es.variant-valencia,#loco-admin.wrap .selector .lang-ca,#loco-admin.wrap .selector .region-es.lang-ca,#loco-admin.wrap .selector .lang-eo,#loco-admin.wrap .selector .lang-eu{margin-left:2px;margin-right:7px}#loco-admin.wrap .selector.ticked .icon.no-icon{font-size:12px;display:inline-block}#loco-admin.wrap .selector.ticked .active .icon.no-icon:before{content:"✓"}#loco-admin.wrap .selectoradd a:hover,#loco-admin.wrap .selector a.handle:focus,#loco-admin.wrap .selector a.handle:hover{color:#000;border-color:#999}#loco-admin.wrap .selector.active .handle{border-color:#999;background-color:#eee;color:#999}#loco-admin.wrap .selector.active .handle:after{color:#999;content:"▲"}#loco-admin.wrap .selector.disabled{cursor:default;cursor:no-drop;cursor:not-allowed}#loco-admin.wrap .selector.disabled .handle{pointer-events:none;border-top:solid 1px #fff;border-right:solid 1px #ddd;border-bottom:solid 1px #ddd;border-left:solid 1px #fff;color:#999;padding-right:1em}#loco-admin.wrap .selector.disabled .handle:after{display:none}#loco-admin.wrap .selector.disabled .handle span.icon{color:#999 !important}#loco-admin.wrap .selector li.disabled,#loco-admin.wrap .selector li.disabled.over{color:#aaa;text-shadow:1px 1px #fff;pointer-events:none}#loco-admin.wrap .selector li.disabled *{cursor:text}#loco-admin.wrap .selector li.disabled .icon:before{color:#aaa}#loco-admin.wrap .selector li.disabled .flag,#loco-admin.wrap .selector li.disabled .icon-16{opacity:.4}#loco-admin.wrap .selector.lefty ul{left:auto;right:0}#loco-admin.wrap .selector.lefty ul .icon,#loco-admin.wrap .selector.lefty ul .icon-32{display:block;float:right;clear:none}#loco-admin.wrap .selector.lefty ul .label{padding-right:32px;padding-left:0}#loco-admin.wrap .selector ul>form{margin:0;display:block}#loco-admin.wrap .selector ul>form input{margin:0;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}#loco-admin.wrap .selector ul>form input:focus{-webkit-box-shadow:inset 0 0 5px 0 #3db63d;-moz-box-shadow:inset 0 0 5px 0 #3db63d;box-shadow:inset 0 0 5px 0 #3db63d}#loco-admin.wrap .selector ul>form input.error{border-color:#c00;-webkit-box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5);-moz-box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5);box-shadow:inset 0 0 5px 0 rgba(153,0,0,.5)}#loco-admin.wrap .selector ul>form a.clear{margin:0;border:none}#loco-admin.wrap .selector ul>form ::placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form ::-webkit-input-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form :-moz-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block;opacity:1}#loco-admin.wrap .selector ul>form ::-moz-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block;opacity:1}#loco-admin.wrap .selector ul>form :-ms-input-placeholder{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap .selector ul>form .ielt10 .placeheld{color:gray;font-size:16px;font-family:"loco";text-align:right;display:block}#loco-admin.wrap div.auto-comp-wrap{width:100%}#loco-admin.wrap div.auto-comp-wrap input{display:inline-block}#loco-admin.wrap div.auto-comp-wrap.loading input{background:transparent url(../img/ajax-loader.gif?v=2.6.3) right 2px no-repeat}#loco-admin.wrap div.auto-comp-drop{color:#333;background:#fff;border-top:none;position:absolute;width:auto;top:0;left:0;z-index:99;-webkit-box-shadow:0 5px 5px rgba(0,0,0,.4);-moz-box-shadow:0 5px 5px rgba(0,0,0,.4);box-shadow:0 5px 5px rgba(0,0,0,.4)}#loco-admin.wrap div.auto-comp-result{padding:5px 10px;cursor:pointer;background:#f0f0f0;border-top:solid 1px #fff;border-bottom:solid 1px #ddd;white-space:nowrap}#loco-admin.wrap div.auto-comp-result:first-child{border-top:solid 1px #ddd}#loco-admin.wrap div.auto-comp-result>*{display:inline-block;vertical-align:middle;line-height:normal}#loco-admin.wrap div.auto-comp-result .icon:before{padding-right:5px}#loco-admin.wrap div.auto-comp-result:hover{background:#a8a8a8;color:#fff;border-top-color:#a8a8a8;border-bottom-color:#999}#loco-admin.wrap div.auto-comp-result.selected{background:#666 !important;color:#fff;border-top-color:#666;border-bottom-color:#666}#loco-admin.wrap div.auto-comp-result .lang,#loco-admin.wrap div.auto-comp-result .region,#loco-admin.wrap div.auto-comp-result .variant-wales,#loco-admin.wrap div.auto-comp-result .region-gb.lang-cy,#loco-admin.wrap div.auto-comp-result .variant-scotland,#loco-admin.wrap div.auto-comp-result .region-gb.lang-gd,#loco-admin.wrap div.auto-comp-result .variant-valencia,#loco-admin.wrap div.auto-comp-result .region-es.variant-valencia,#loco-admin.wrap div.auto-comp-result .lang-ca,#loco-admin.wrap div.auto-comp-result .region-es.lang-ca,#loco-admin.wrap div.auto-comp-result .lang-eo,#loco-admin.wrap div.auto-comp-result .lang-eu,#loco-admin.wrap div.auto-comp-result .avtr{margin-right:5px}#loco-admin.wrap div.auto-comp-wrap.error a.icon.clear:before{color:#c00;opacity:1}#loco-admin.wrap div.auto-comp-wrap.error input[type=text]{border-color:#c00;color:#c00}#loco-admin.wrap div.auto-comp-wrap.error input[type=text]:focus{-webkit-box-shadow:0 0 .5em 0 rgba(153,0,0,.5);-moz-box-shadow:0 0 .5em 0 rgba(153,0,0,.5);box-shadow:0 0 .5em 0 rgba(153,0,0,.5)}#loco-admin.wrap ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}#loco-admin.wrap ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.3) 0 0 no-repeat;min-height:75px}#loco-admin.wrap ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-admin.wrap ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.3);background-size:16px}#loco-admin.wrap ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.3);background-size:16px}}#loco-admin.wrap ._green_glow_inner{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-admin.wrap ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-admin.wrap .loco-font,#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after,#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-admin.wrap .has-icon:before{display:inline-block;padding-right:.3em}#loco-admin.wrap a.icon-help{cursor:help}#loco-admin.wrap a.icon-help span{display:none}#loco-admin.wrap .icon-share:before{content:"↑"}#loco-admin.wrap .icon-notag:before{content:""}#loco-admin.wrap .icon-magnify:before{content:"🔍"}#loco-admin.wrap .icon-python:before{content:"🐍"}#loco-admin.wrap .icon-unicode:before{content:"u"}#loco-admin.wrap .icon-json:before{content:"{"}#loco-admin.wrap .icon-bullist:before{content:""}#loco-admin.wrap .icon-numlist:before{content:""}#loco-admin.wrap .icon-indent:before{content:""}#loco-admin.wrap .icon-outdent:before{content:""}#loco-admin.wrap .icon-link:before{content:""}#loco-admin.wrap .icon-unlink:before{content:""}#loco-admin.wrap .icon-bold:before{content:"B"}#loco-admin.wrap .icon-italic:before{content:"I"}#loco-admin.wrap .icon-translate:before{content:""}#loco-admin.wrap .icon-proj:before{content:""}#loco-admin.wrap .icon-plural:before{content:"᛬"}#loco-admin.wrap .icon-max:before,#loco-admin.wrap .icon-full-screen:before{content:""}#loco-admin.wrap .icon-min:before{content:""}#loco-admin.wrap .icon-sort:before{content:""}#loco-admin.wrap .icon-ok:before,#loco-admin.wrap .notice-success>.has-icon:before,#loco-admin.wrap .notice-success p>strong.has-icon:before{content:"✓"}#loco-admin.wrap .icon-ok-empty:before{content:"🗌"}#loco-admin.wrap .icon-checkbox-checked:before,#loco-admin.wrap .selector.multi li.checked .icon-checkbox:before{content:"☑"}#loco-admin.wrap .icon-checkbox-unchecked:before{content:"☐"}#loco-admin.wrap .icon-checkbox-partial:before{content:"☉"}#loco-admin.wrap .icon-radio-checked:before{content:"⚫"}#loco-admin.wrap .icon-radio-unchecked:before{content:"⚪"}#loco-admin.wrap .icon-ext:before{content:"⬈"}#loco-admin.wrap .icon-star:before{content:""}#loco-admin.wrap .icon-user:before{content:""}#loco-admin.wrap .icon-remove:before,#loco-admin.wrap a.icon.close:before{content:"×"}#loco-admin.wrap .icon-cog:before{content:""}#loco-admin.wrap .icon-trash:before{content:""}#loco-admin.wrap .icon-time:before,#loco-admin.wrap .icon-history:before{content:""}#loco-admin.wrap .icon-download:before{content:""}#loco-admin.wrap .icon-revert:before{content:""}#loco-admin.wrap .icon-sync:before{content:""}#loco-admin.wrap .icon-lock:before,#loco-admin.wrap .notice-locked>.has-icon:before,#loco-admin.wrap .notice-locked p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-flag:before{content:""}#loco-admin.wrap .icon-tag:before{content:""}#loco-admin.wrap .icon-tags:before{content:""}#loco-admin.wrap .icon-print:before{content:""}#loco-admin.wrap .icon-camera:before{content:""}#loco-admin.wrap .icon-pencil:before{content:""}#loco-admin.wrap .icon-add:before{content:""}#loco-admin.wrap .icon-del:before{content:""}#loco-admin.wrap .icon-clear:before,#loco-admin.wrap a.icon.clear:before{content:""}#loco-admin.wrap .icon-ok-sign:before{content:"✔"}#loco-admin.wrap .icon-help:before{content:"?"}#loco-admin.wrap .icon-info:before,#loco-admin.wrap .notice-info>.has-icon:before,#loco-admin.wrap .notice-info p>strong.has-icon:before{content:"ℹ"}#loco-admin.wrap .icon-cancel:before{content:""}#loco-admin.wrap .icon-warn:before,#loco-admin.wrap .notice-error>.has-icon:before,#loco-admin.wrap .notice-error p>strong.has-icon:before,#loco-admin.wrap .notice-warning>.has-icon:before,#loco-admin.wrap .notice-warning p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-comment:before{content:""}#loco-admin.wrap .icon-bar-chart:before{content:""}#loco-admin.wrap .icon-key:before{content:""}#loco-admin.wrap .icon-cogs:before{content:""}#loco-admin.wrap .icon-comments:before{content:""}#loco-admin.wrap .icon-signout:before{content:""}#loco-admin.wrap .icon-signin:before{content:""}#loco-admin.wrap .icon-upload:before{content:""}#loco-admin.wrap .icon-twitter:before{content:"🐦"}#loco-admin.wrap .icon-facebook:before{content:""}#loco-admin.wrap .icon-github:before{content:""}#loco-admin.wrap .icon-feed:before{content:""}#loco-admin.wrap .icon-globe:before{content:""}#loco-admin.wrap .icon-wrench:before,#loco-admin.wrap .notice-debug>.has-icon:before,#loco-admin.wrap .notice-debug p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-group:before{content:""}#loco-admin.wrap .icon-cloud:before{content:""}#loco-admin.wrap .icon-copy:before{content:""}#loco-admin.wrap .icon-save:before{content:""}#loco-admin.wrap .icon-menu:before{content:""}#loco-admin.wrap .icon-table:before{content:""}#loco-admin.wrap .icon-caret-down:before{content:"▼"}#loco-admin.wrap .icon-caret-up:before{content:"▲"}#loco-admin.wrap .icon-caret-right:before{content:"▶"}#loco-admin.wrap .icon-mail:before{content:""}#loco-admin.wrap .icon-cloud-upload:before{content:""}#loco-admin.wrap .icon-file:before{content:""}#loco-admin.wrap .icon-circle-white:before{content:"⚬"}#loco-admin.wrap .icon-circle-black:before{content:"●"}#loco-admin.wrap .icon-eraser:before{content:""}#loco-admin.wrap .icon-unlock:before{content:""}#loco-admin.wrap .icon-apple:before{content:""}#loco-admin.wrap .icon-android:before{content:""}#loco-admin.wrap .icon-robot:before{content:"🤖"}#loco-admin.wrap .icon-back:before{content:"⬅"}#loco-admin.wrap .icon-next:before{content:"➔"}#loco-admin.wrap .icon-arrow-up:before{content:""}#loco-admin.wrap .icon-calendar:before{content:""}#loco-admin.wrap .icon-ccard:before{content:""}#loco-admin.wrap .icon-caret-left:before{content:"◀"}#loco-admin.wrap .icon-pro:before{content:"⚡"}#loco-admin.wrap .icon-bell:before{content:""}#loco-admin.wrap .icon-code:before{content:""}#loco-admin.wrap .icon-privacy:before{content:"🛡"}#loco-admin.wrap .icon-hellip:before{content:"…"}#loco-admin.wrap .icon-vellip:before{content:"⁞"}#loco-admin.wrap .icon-collapse:before{content:""}#loco-admin.wrap .icon-expand:before{content:""}#loco-admin.wrap .icon-wordpress:before{content:""}#loco-admin.wrap .icon-database:before{content:""}#loco-admin.wrap .icon-restore:before{content:""}#loco-admin.wrap .icon-pilcrow:before{content:"¶"}#loco-admin.wrap .icon-status.is-translated:before,#loco-admin.wrap .is-translated>header>.icon-status:before{color:#2e892e;content:"✓";text-align:center}#loco-admin.wrap .icon-status.is-untranslated:before,#loco-admin.wrap .is-untranslated>header>.icon-status:before{color:#aaa;content:"×";text-align:center;font-size:1.1em}#loco-admin.wrap .icon-status.is-flagged:before,#loco-admin.wrap .is-flagged>header>.icon-status:before{color:#bd2c00;content:"";text-align:center}#loco-admin.wrap .icon-status.is-translated.is-blank:before,#loco-admin.wrap .icon-status.is-translated.is-inherit:before,#loco-admin.wrap .is-translated.is-blank>header>.icon-status:before,#loco-admin.wrap .is-translated.is-inherit>header>.icon-status:before{content:"🗌"}#loco-admin.wrap .icon-status.is-fuzzy:before,#loco-admin.wrap .is-fuzzy>header>.icon-status:before{color:#666;content:""}#loco-admin.wrap .lang,#loco-admin.wrap .region,#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy,#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd,#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia,#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca,#loco-admin.wrap .lang-eo,#loco-admin.wrap .lang-eu{color:#fff;background:#2e892e;display:inline-block;text-transform:uppercase;overflow:hidden;font-family:Verdana,Arial,sans-serif;font-size:9px;font-weight:normal;font-style:normal;line-height:12px;text-align:center;white-space:normal;text-shadow:none}#loco-admin.wrap .lang{width:20px;height:12px;line-height:12px;vertical-align:middle}#loco-admin.wrap .lang:before{content:attr(lang);vertical-align:baseline}#loco-admin.wrap .no-lang{width:18px;height:10px;border:solid 1px #2e892e;background:transparent}#loco-admin.wrap .lang-el{background-color:#1d48a3}#loco-admin.wrap .lang-el:before{content:"Ελ"}#loco-admin.wrap .region,#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy,#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd,#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia,#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca,#loco-admin.wrap .lang-eo,#loco-admin.wrap .lang-eu{width:16px;height:12px;margin:0 2px;background-image:url(../img/flags.png?v=2.6.3);background-repeat:no-repeat;background-color:transparent}#loco-admin.wrap .region:before,#loco-admin.wrap .variant-wales:before,#loco-admin.wrap .region-gb.lang-cy:before,#loco-admin.wrap .variant-scotland:before,#loco-admin.wrap .region-gb.lang-gd:before,#loco-admin.wrap .variant-valencia:before,#loco-admin.wrap .region-es.variant-valencia:before,#loco-admin.wrap .lang-ca:before,#loco-admin.wrap .region-es.lang-ca:before,#loco-admin.wrap .lang-eo:before,#loco-admin.wrap .lang-eu:before{visibility:hidden}#loco-admin.wrap .lang-zh{background-color:#b90000}#loco-admin.wrap .lang-zh.script-hans:before{content:"中国"}#loco-admin.wrap .lang-zh.script-hant:before{content:"中國"}#loco-admin.wrap .__{background-position:0 0}#loco-admin.wrap .lang-eo{background-position:0 -12px}#loco-admin.wrap .lang-eu{background-position:0 -24px}#loco-admin.wrap .lang-ca,#loco-admin.wrap .region-es.lang-ca{background-position:0 -36px}#loco-admin.wrap .region-tg{background-position:0 -48px}#loco-admin.wrap .region-me{background-position:0 -60px}#loco-admin.wrap .region-la{background-position:0 -73px}#loco-admin.wrap .region-mr{background-position:0 -85px}#loco-admin.wrap .region-ni{background-position:0 -97px}#loco-admin.wrap .region-lv{background-position:0 -109px}#loco-admin.wrap .region-om{background-position:0 -121px}#loco-admin.wrap .region-af{background-position:0 -133px}#loco-admin.wrap .region-cy{background-position:0 -145px}#loco-admin.wrap .region-bj{background-position:0 -157px}#loco-admin.wrap .region-aq{background-position:0 -169px}#loco-admin.wrap .region-cn{background-position:0 -186px}#loco-admin.wrap .region-co{background-position:0 -198px}#loco-admin.wrap .region-cx{background-position:0 -210px}#loco-admin.wrap .region-ag{background-position:0 -222px}#loco-admin.wrap .region-ms{background-position:0 -234px}#loco-admin.wrap .region-md{background-position:0 -246px}#loco-admin.wrap .region-zm{background-position:0 -258px}#loco-admin.wrap .region-vn{background-position:0 -270px}#loco-admin.wrap .region-tf{background-position:0 -282px}#loco-admin.wrap .region-td{background-position:0 -294px}#loco-admin.wrap .region-yt{background-position:0 -306px}#loco-admin.wrap .region-lb{background-position:0 -318px}#loco-admin.wrap .region-mf{background-position:0 -330px}#loco-admin.wrap .region-lu{background-position:0 -347px}#loco-admin.wrap .region-mq{background-position:0 -359px}#loco-admin.wrap .region-cz{background-position:0 -371px}#loco-admin.wrap .region-ae{background-position:0 -383px}#loco-admin.wrap .region-cm{background-position:0 -395px}#loco-admin.wrap .region-bi{background-position:0 -407px}#loco-admin.wrap .region-ar{background-position:0 -419px}#loco-admin.wrap .region-as{background-position:0 -431px}#loco-admin.wrap .region-bh{background-position:0 -443px}#loco-admin.wrap .region-cl{background-position:0 -455px}#loco-admin.wrap .region-ad{background-position:0 -467px}#loco-admin.wrap .region-mp{background-position:0 -479px}#loco-admin.wrap .region-lt{background-position:0 -491px}#loco-admin.wrap .region-mg{background-position:0 -503px}#loco-admin.wrap .region-lc{background-position:0 -515px}#loco-admin.wrap .region-tr{background-position:0 -527px}#loco-admin.wrap .region-ua{background-position:0 -539px}#loco-admin.wrap .region-tv{background-position:0 -551px}#loco-admin.wrap .region-vi{background-position:0 -563px}#loco-admin.wrap .region-mt{background-position:0 -575px}#loco-admin.wrap .region-no{background-position:0 -587px}#loco-admin.wrap .region-mc{background-position:0 -599px}#loco-admin.wrap .region-ch{background-position:0 -611px}#loco-admin.wrap .region-bl{background-position:0 -623px}#loco-admin.wrap .region-aw{background-position:0 -640px}#loco-admin.wrap .region-bz{background-position:0 -652px}#loco-admin.wrap .region-bm{background-position:0 -664px}#loco-admin.wrap .region-ci{background-position:0 -676px}#loco-admin.wrap .region-mu{background-position:0 -688px}#loco-admin.wrap .region-us{background-position:0 -700px}#loco-admin.wrap .region-tw{background-position:0 -712px}#loco-admin.wrap .region-ye{background-position:0 -724px}#loco-admin.wrap .region-mw{background-position:0 -736px}#loco-admin.wrap .region-nl{background-position:0 -748px}#loco-admin.wrap .region-ls{background-position:0 -760px}#loco-admin.wrap .region-bo{background-position:0 -772px}#loco-admin.wrap .region-at{background-position:0 -784px}#loco-admin.wrap .region-ck{background-position:0 -796px}#loco-admin.wrap .region-by{background-position:0 -808px}#loco-admin.wrap .region-au{background-position:0 -820px}#loco-admin.wrap .region-bn{background-position:0 -832px}#loco-admin.wrap .region-ma{background-position:0 -844px}#loco-admin.wrap .region-nz{background-position:0 -856px}#loco-admin.wrap .region-lr{background-position:0 -868px}#loco-admin.wrap .region-mv{background-position:0 -880px}#loco-admin.wrap .region-tc{background-position:0 -892px}#loco-admin.wrap .region-ug{background-position:0 -904px}#loco-admin.wrap .region-tt{background-position:0 -916px}#loco-admin.wrap .region-pl{background-position:0 -928px}#loco-admin.wrap .region-rs{background-position:0 -940px}#loco-admin.wrap .region-in{background-position:0 -952px}#loco-admin.wrap .region-ge{background-position:0 -964px}#loco-admin.wrap .region-gr{background-position:0 -976px}#loco-admin.wrap .region-gs{background-position:0 -988px}#loco-admin.wrap .region-gd{background-position:0 -1000px}#loco-admin.wrap .region-io{background-position:0 -1012px}#loco-admin.wrap .region-hk{background-position:0 -1024px}#loco-admin.wrap .region-kp{background-position:0 -1036px}#loco-admin.wrap .region-kg{background-position:0 -1048px}#loco-admin.wrap .region-pm{background-position:0 -1060px}#loco-admin.wrap .region-sv{background-position:0 -1072px}#loco-admin.wrap .region-re{background-position:0 -1084px}#loco-admin.wrap .region-sa{background-position:0 -1096px}#loco-admin.wrap .region-sc{background-position:0 -1108px}#loco-admin.wrap .region-st{background-position:0 -1120px}#loco-admin.wrap .region-ke{background-position:0 -1132px}#loco-admin.wrap .region-im{background-position:0 -1144px}#loco-admin.wrap .region-kr{background-position:0 -1161px}#loco-admin.wrap .region-gf{background-position:0 -1173px}#loco-admin.wrap .region-dj{background-position:0 -1185px}#loco-admin.wrap .region-gq{background-position:0 -1197px}#loco-admin.wrap .region-gp{background-position:0 -1209px}#loco-admin.wrap .region-dk{background-position:0 -1221px}#loco-admin.wrap .region-gg{background-position:0 -1233px}#loco-admin.wrap .region-il{background-position:0 -1250px}#loco-admin.wrap .region-pn{background-position:0 -1262px}#loco-admin.wrap .region-sb{background-position:0 -1274px}#loco-admin.wrap .region-py{background-position:0 -1286px}#loco-admin.wrap .region-ru{background-position:0 -1298px}#loco-admin.wrap .region-kw{background-position:0 -1310px}#loco-admin.wrap .region-do{background-position:0 -1322px}#loco-admin.wrap .region-gt{background-position:0 -1334px}#loco-admin.wrap .region-gb{background-position:0 -1346px}#loco-admin.wrap .region-gu{background-position:0 -1358px}#loco-admin.wrap .region-je{background-position:0 -1370px}#loco-admin.wrap .region-hm{background-position:0 -1387px}#loco-admin.wrap .region-sg{background-position:0 -1399px}#loco-admin.wrap .region-pk{background-position:0 -1411px}#loco-admin.wrap .region-sr{background-position:0 -1423px}#loco-admin.wrap .region-se{background-position:0 -1435px}#loco-admin.wrap .region-jp{background-position:0 -1447px}#loco-admin.wrap .region-gw{background-position:0 -1459px}#loco-admin.wrap .region-eh{background-position:0 -1471px}#loco-admin.wrap .region-dz{background-position:0 -1483px}#loco-admin.wrap .region-ga{background-position:0 -1495px}#loco-admin.wrap .region-fr{background-position:0 -1507px}#loco-admin.wrap .region-dm{background-position:0 -1519px}#loco-admin.wrap .region-hn{background-position:0 -1531px}#loco-admin.wrap .region-sd{background-position:0 -1543px}#loco-admin.wrap .region-rw{background-position:0 -1555px}#loco-admin.wrap .region-ph{background-position:0 -1567px}#loco-admin.wrap .region-ss{background-position:0 -1579px}#loco-admin.wrap .region-qa{background-position:0 -1596px}#loco-admin.wrap .region-pe{background-position:0 -1608px}#loco-admin.wrap .region-pr{background-position:0 -1620px}#loco-admin.wrap .region-si{background-position:0 -1632px}#loco-admin.wrap .region-ht{background-position:0 -1644px}#loco-admin.wrap .region-es{background-position:0 -1656px}#loco-admin.wrap .region-gl{background-position:0 -1668px}#loco-admin.wrap .region-gm{background-position:0 -1680px}#loco-admin.wrap .region-er{background-position:0 -1692px}#loco-admin.wrap .region-fi{background-position:0 -1704px}#loco-admin.wrap .region-ee{background-position:0 -1716px}#loco-admin.wrap .region-kn{background-position:0 -1728px}#loco-admin.wrap .region-hu{background-position:0 -1740px}#loco-admin.wrap .region-iq{background-position:0 -1752px}#loco-admin.wrap .region-ky{background-position:0 -1764px}#loco-admin.wrap .region-sh{background-position:0 -1776px}#loco-admin.wrap .region-ps{background-position:0 -1788px}#loco-admin.wrap .region-pf{background-position:0 -1800px}#loco-admin.wrap .region-sj{background-position:0 -1812px}#loco-admin.wrap .region-id{background-position:0 -1824px}#loco-admin.wrap .region-is{background-position:0 -1836px}#loco-admin.wrap .region-eg{background-position:0 -1848px}#loco-admin.wrap .region-fk{background-position:0 -1860px}#loco-admin.wrap .region-fj{background-position:0 -1872px}#loco-admin.wrap .region-gn{background-position:0 -1884px}#loco-admin.wrap .region-gy{background-position:0 -1896px}#loco-admin.wrap .region-ir{background-position:0 -1908px}#loco-admin.wrap .region-km{background-position:0 -1920px}#loco-admin.wrap .region-ie{background-position:0 -1932px}#loco-admin.wrap .region-kz{background-position:0 -1944px}#loco-admin.wrap .region-ro{background-position:0 -1956px}#loco-admin.wrap .region-sk{background-position:0 -1968px}#loco-admin.wrap .region-pg{background-position:0 -1980px}#loco-admin.wrap .region-pt{background-position:0 -1992px}#loco-admin.wrap .region-so{background-position:0 -2004px}#loco-admin.wrap .region-sx{background-position:0 -2016px}#loco-admin.wrap .region-hr{background-position:0 -2033px}#loco-admin.wrap .region-ki{background-position:0 -2045px}#loco-admin.wrap .region-jm{background-position:0 -2057px}#loco-admin.wrap .region-ec{background-position:0 -2069px}#loco-admin.wrap .region-et{background-position:0 -2081px}#loco-admin.wrap .region-fo{background-position:0 -2093px}#loco-admin.wrap .region-kh{background-position:0 -2105px}#loco-admin.wrap .region-sy{background-position:0 -2117px}#loco-admin.wrap .region-sn{background-position:0 -2129px}#loco-admin.wrap .region-pw{background-position:0 -2141px}#loco-admin.wrap .region-sl{background-position:0 -2153px}#loco-admin.wrap .region-fm{background-position:0 -2165px}#loco-admin.wrap .region-gi{background-position:0 -2177px}#loco-admin.wrap .region-de{background-position:0 -2189px}#loco-admin.wrap .region-gh{background-position:0 -2201px}#loco-admin.wrap .region-jo{background-position:0 -2213px}#loco-admin.wrap .region-it{background-position:0 -2225px}#loco-admin.wrap .region-pa{background-position:0 -2237px}#loco-admin.wrap .region-sz{background-position:0 -2249px}#loco-admin.wrap .region-sm{background-position:0 -2261px}#loco-admin.wrap .region-tn{background-position:0 -2273px}#loco-admin.wrap .region-ml{background-position:0 -2285px}#loco-admin.wrap .region-cg{background-position:0 -2297px}#loco-admin.wrap .region-ax{background-position:0 -2309px}#loco-admin.wrap .region-ao{background-position:0 -2321px}#loco-admin.wrap .region-bt{background-position:0 -2333px}#loco-admin.wrap .region-an{background-position:0 -2345px}#loco-admin.wrap .region-bb{background-position:0 -2357px}#loco-admin.wrap .region-cf{background-position:0 -2369px}#loco-admin.wrap .region-mm{background-position:0 -2381px}#loco-admin.wrap .region-li{background-position:0 -2393px}#loco-admin.wrap .region-na{background-position:0 -2405px}#loco-admin.wrap .region-mz{background-position:0 -2417px}#loco-admin.wrap .region-to{background-position:0 -2429px}#loco-admin.wrap .region-vg{background-position:0 -2441px}#loco-admin.wrap .region-ve{background-position:0 -2453px}#loco-admin.wrap .region-tz{background-position:0 -2465px}#loco-admin.wrap .region-tm{background-position:0 -2477px}#loco-admin.wrap .region-mx{background-position:0 -2489px}#loco-admin.wrap .region-nc{background-position:0 -2501px}#loco-admin.wrap .region-mo{background-position:0 -2513px}#loco-admin.wrap .region-lk{background-position:0 -2525px}#loco-admin.wrap .region-cd{background-position:0 -2537px}#loco-admin.wrap .region-al{background-position:0 -2549px}#loco-admin.wrap .region-bw{background-position:0 -2561px}#loco-admin.wrap .region-cs{background-position:0 -2573px}#loco-admin.wrap .region-cr{background-position:0 -2585px}#loco-admin.wrap .region-bv{background-position:0 -2597px}#loco-admin.wrap .region-am{background-position:0 -2609px}#loco-admin.wrap .region-az{background-position:0 -2621px}#loco-admin.wrap .region-ba{background-position:0 -2633px}#loco-admin.wrap .region-mn{background-position:0 -2645px}#loco-admin.wrap .region-nu{background-position:0 -2657px}#loco-admin.wrap .region-my{background-position:0 -2669px}#loco-admin.wrap .region-tl{background-position:0 -2681px}#loco-admin.wrap .region-ws{background-position:0 -2693px}#loco-admin.wrap .region-th{background-position:0 -2705px}#loco-admin.wrap .region-nf{background-position:0 -2717px}#loco-admin.wrap .region-ly{background-position:0 -2729px}#loco-admin.wrap .region-ai{background-position:0 -2741px}#loco-admin.wrap .region-br{background-position:0 -2753px}#loco-admin.wrap .region-cv{background-position:0 -2765px}#loco-admin.wrap .region-be{background-position:0 -2777px}#loco-admin.wrap .region-ca{background-position:0 -2789px}#loco-admin.wrap .region-bd{background-position:0 -2801px}#loco-admin.wrap .region-cw{background-position:0 -2813px}#loco-admin.wrap .region-bs{background-position:0 -2830px}#loco-admin.wrap .region-ng{background-position:0 -2842px}#loco-admin.wrap .region-mk{background-position:0 -2854px}#loco-admin.wrap .region-np{background-position:0 -2866px}#loco-admin.wrap .region-va{background-position:0 -2878px}#loco-admin.wrap .region-uz{background-position:0 -2890px}#loco-admin.wrap .region-um{background-position:0 -2902px}#loco-admin.wrap .region-tk{background-position:0 -2914px}#loco-admin.wrap .region-vc{background-position:0 -2926px}#loco-admin.wrap .region-zw{background-position:0 -2938px}#loco-admin.wrap .region-nr{background-position:0 -2950px}#loco-admin.wrap .region-ne{background-position:0 -2962px}#loco-admin.wrap .region-cu{background-position:0 -2974px}#loco-admin.wrap .region-bq{background-position:0 -2986px}#loco-admin.wrap .region-bf{background-position:0 -2998px}#loco-admin.wrap .region-bg{background-position:0 -3010px}#loco-admin.wrap .region-cc{background-position:0 -3022px}#loco-admin.wrap .region-mh{background-position:0 -3034px}#loco-admin.wrap .region-za{background-position:0 -3046px}#loco-admin.wrap .region-uy{background-position:0 -3058px}#loco-admin.wrap .region-wf{background-position:0 -3070px}#loco-admin.wrap .region-vu{background-position:0 -3082px}#loco-admin.wrap .region-tj{background-position:0 -3094px}#loco-admin.wrap .variant-scotland,#loco-admin.wrap .region-gb.lang-gd{background-position:0 -3106px}#loco-admin.wrap .variant-valencia,#loco-admin.wrap .region-es.variant-valencia{background-position:0 -3118px}#loco-admin.wrap .variant-wales,#loco-admin.wrap .region-gb.lang-cy{background-position:0 -3130px}#loco-admin.wrap .x-eu{background-position:0 -3142px}#loco-admin.wrap span.lang code{display:none}#loco-admin.wrap .icon-share:before{content:"↑"}#loco-admin.wrap .icon-notag:before{content:""}#loco-admin.wrap .icon-magnify:before{content:"🔍"}#loco-admin.wrap .icon-python:before{content:"🐍"}#loco-admin.wrap .icon-unicode:before{content:"u"}#loco-admin.wrap .icon-json:before{content:"{"}#loco-admin.wrap .icon-bullist:before{content:""}#loco-admin.wrap .icon-numlist:before{content:""}#loco-admin.wrap .icon-indent:before{content:""}#loco-admin.wrap .icon-outdent:before{content:""}#loco-admin.wrap .icon-link:before{content:""}#loco-admin.wrap .icon-unlink:before{content:""}#loco-admin.wrap .icon-bold:before{content:"B"}#loco-admin.wrap .icon-italic:before{content:"I"}#loco-admin.wrap .icon-translate:before{content:""}#loco-admin.wrap .icon-proj:before{content:""}#loco-admin.wrap .icon-plural:before{content:"᛬"}#loco-admin.wrap .icon-max:before,#loco-admin.wrap .icon-full-screen:before{content:""}#loco-admin.wrap .icon-min:before{content:""}#loco-admin.wrap .icon-sort:before{content:""}#loco-admin.wrap .icon-ok:before,#loco-admin.wrap .notice-success>.has-icon:before,#loco-admin.wrap .notice-success p>strong.has-icon:before{content:"✓"}#loco-admin.wrap .icon-ok-empty:before{content:"🗌"}#loco-admin.wrap .icon-checkbox-checked:before,#loco-admin.wrap .selector.multi li.checked .icon-checkbox:before{content:"☑"}#loco-admin.wrap .icon-checkbox-unchecked:before{content:"☐"}#loco-admin.wrap .icon-checkbox-partial:before{content:"☉"}#loco-admin.wrap .icon-radio-checked:before{content:"⚫"}#loco-admin.wrap .icon-radio-unchecked:before{content:"⚪"}#loco-admin.wrap .icon-ext:before{content:"⬈"}#loco-admin.wrap .icon-star:before{content:""}#loco-admin.wrap .icon-user:before{content:""}#loco-admin.wrap .icon-remove:before,#loco-admin.wrap a.icon.close:before{content:"×"}#loco-admin.wrap .icon-cog:before{content:""}#loco-admin.wrap .icon-trash:before{content:""}#loco-admin.wrap .icon-time:before,#loco-admin.wrap .icon-history:before{content:""}#loco-admin.wrap .icon-download:before{content:""}#loco-admin.wrap .icon-revert:before{content:""}#loco-admin.wrap .icon-sync:before{content:""}#loco-admin.wrap .icon-lock:before,#loco-admin.wrap .notice-locked>.has-icon:before,#loco-admin.wrap .notice-locked p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-flag:before{content:""}#loco-admin.wrap .icon-tag:before{content:""}#loco-admin.wrap .icon-tags:before{content:""}#loco-admin.wrap .icon-print:before{content:""}#loco-admin.wrap .icon-camera:before{content:""}#loco-admin.wrap .icon-pencil:before{content:""}#loco-admin.wrap .icon-add:before{content:""}#loco-admin.wrap .icon-del:before{content:""}#loco-admin.wrap .icon-clear:before,#loco-admin.wrap a.icon.clear:before{content:""}#loco-admin.wrap .icon-ok-sign:before{content:"✔"}#loco-admin.wrap .icon-help:before{content:"?"}#loco-admin.wrap .icon-info:before,#loco-admin.wrap .notice-info>.has-icon:before,#loco-admin.wrap .notice-info p>strong.has-icon:before{content:"ℹ"}#loco-admin.wrap .icon-cancel:before{content:""}#loco-admin.wrap .icon-warn:before,#loco-admin.wrap .notice-error>.has-icon:before,#loco-admin.wrap .notice-error p>strong.has-icon:before,#loco-admin.wrap .notice-warning>.has-icon:before,#loco-admin.wrap .notice-warning p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-comment:before{content:""}#loco-admin.wrap .icon-bar-chart:before{content:""}#loco-admin.wrap .icon-key:before{content:""}#loco-admin.wrap .icon-cogs:before{content:""}#loco-admin.wrap .icon-comments:before{content:""}#loco-admin.wrap .icon-signout:before{content:""}#loco-admin.wrap .icon-signin:before{content:""}#loco-admin.wrap .icon-upload:before{content:""}#loco-admin.wrap .icon-twitter:before{content:"🐦"}#loco-admin.wrap .icon-facebook:before{content:""}#loco-admin.wrap .icon-github:before{content:""}#loco-admin.wrap .icon-feed:before{content:""}#loco-admin.wrap .icon-globe:before{content:""}#loco-admin.wrap .icon-wrench:before,#loco-admin.wrap .notice-debug>.has-icon:before,#loco-admin.wrap .notice-debug p>strong.has-icon:before{content:""}#loco-admin.wrap .icon-group:before{content:""}#loco-admin.wrap .icon-cloud:before{content:""}#loco-admin.wrap .icon-copy:before{content:""}#loco-admin.wrap .icon-save:before{content:""}#loco-admin.wrap .icon-menu:before{content:""}#loco-admin.wrap .icon-table:before{content:""}#loco-admin.wrap .icon-caret-down:before{content:"▼"}#loco-admin.wrap .icon-caret-up:before{content:"▲"}#loco-admin.wrap .icon-caret-right:before{content:"▶"}#loco-admin.wrap .icon-mail:before{content:""}#loco-admin.wrap .icon-cloud-upload:before{content:""}#loco-admin.wrap .icon-file:before{content:""}#loco-admin.wrap .icon-circle-white:before{content:"⚬"}#loco-admin.wrap .icon-circle-black:before{content:"●"}#loco-admin.wrap .icon-eraser:before{content:""}#loco-admin.wrap .icon-unlock:before{content:""}#loco-admin.wrap .icon-apple:before{content:""}#loco-admin.wrap .icon-android:before{content:""}#loco-admin.wrap .icon-robot:before{content:"🤖"}#loco-admin.wrap .icon-back:before{content:"⬅"}#loco-admin.wrap .icon-next:before{content:"➔"}#loco-admin.wrap .icon-arrow-up:before{content:""}#loco-admin.wrap .icon-calendar:before{content:""}#loco-admin.wrap .icon-ccard:before{content:""}#loco-admin.wrap .icon-caret-left:before{content:"◀"}#loco-admin.wrap .icon-pro:before{content:"⚡"}#loco-admin.wrap .icon-bell:before{content:""}#loco-admin.wrap .icon-code:before{content:""}#loco-admin.wrap .icon-privacy:before{content:"🛡"}#loco-admin.wrap .icon-hellip:before{content:"…"}#loco-admin.wrap .icon-vellip:before{content:"⁞"}#loco-admin.wrap .icon-collapse:before{content:""}#loco-admin.wrap .icon-expand:before{content:""}#loco-admin.wrap .icon-wordpress:before{content:""}#loco-admin.wrap .icon-database:before{content:""}#loco-admin.wrap .icon-restore:before{content:""}#loco-admin.wrap .icon-pilcrow:before{content:"¶"}#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before,#loco-admin.wrap .has-dashicon:before{speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-admin.wrap .icon,#loco-admin.wrap .has-icon:before{font-family:"loco"}#loco-admin.wrap .has-dashicon:before{font-family:"dashicons";font-size:1.4em}#loco-admin.wrap .has-icon:before,#loco-admin.wrap .has-dashicon:before,#loco-admin.wrap .has-icon>span{display:inline-block;vertical-align:middle}#loco-admin.wrap .only-icon{text-align:center}#loco-admin.wrap .only-icon:before{text-align:center;padding:0}#loco-admin.wrap .only-icon span{display:none}#loco-admin.wrap a,#loco-admin.wrap .wp-core-ui .button-link{text-decoration:none}#loco-admin.wrap h3:hover>a.loco-anchor{color:#ccc}#loco-admin.wrap h3:hover>a.loco-anchor:before{content:"¶"}#loco-admin.wrap .has-lang>span{display:inline-block;vertical-align:middle}#loco-admin.wrap a.has-lang:hover>span:last-child{text-decoration:underline}#loco-admin.wrap h1 ul,#loco-admin.wrap h1 li{margin:0;padding:0}#loco-admin.wrap h1 li{display:inline-block}#loco-admin.wrap h1 li:after{content:"/";color:#999;text-shadow:none;display:inline-block}#loco-admin.wrap h1 li:last-child:after{content:""}#loco-admin.wrap h1 li:last-child a{color:inherit;pointer-events:none;cursor:auto}#loco-admin.wrap h2 span{color:#999;font-weight:normal}#loco-admin.wrap h2 .loco-meta,#loco-admin.wrap h3 .loco-meta{color:inherit;font-size:14px;font-weight:normal;vertical-align:middle}#loco-admin.wrap .wp-list-table td:first-child .icon{width:16px;display:inline-block;text-align:center}#loco-admin.wrap .wp-list-table td{white-space:nowrap}#loco-admin.wrap .wp-list-table td>a,#loco-admin.wrap .wp-list-table td>time{display:inline-block;max-width:100%;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis}#loco-admin.wrap .wp-list-table th.loco-sort{cursor:pointer}#loco-admin.wrap .wp-list-table th.loco-sort:hover{color:#000}#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after,#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after{padding:0 0 0 4px;color:#999}#loco-admin.wrap .wp-list-table th.loco-sort.loco-desc:after{content:"▼"}#loco-admin.wrap .wp-list-table th.loco-sort.loco-asc:after{content:"▲"}#loco-admin.wrap .wp-list-table td.has-row-actions{overflow:visible}#loco-admin.wrap form.loco-filter{display:block;margin-bottom:5px}#loco-admin.wrap form.loco-filter .icon-filter{color:#999}#loco-admin.wrap nav.above-list-table{margin-bottom:1em}#loco-admin.wrap nav.above-list-table a{display:inline-block;margin-right:1em}#loco-admin.wrap .wp-core-ui button.inverted,#loco-admin.wrap .wp-core-ui button.inverted:hover,#loco-admin.wrap .po-fuzzy button.icon-cloud{background:-moz-linear-gradient(top, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);background:-webkit-linear-gradient(top, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);background:linear-gradient(to bottom, #cccccc 0%, #e0e0e0 30%, #fefefe 100%);-webkit-box-shadow:0 1px 0 #fff;-moz-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff;border-color:gray}#loco-admin.wrap .wp-core-ui button:active,#loco-admin.wrap .wp-core-ui button.inverted:active{border-color:#5b9dd9}#loco-admin.wrap .loco-clearable{display:inline-block;vertical-align:middle;position:relative}#loco-admin.wrap .loco-clearable a.clear,#loco-admin.wrap .auto-comp-wrap a.clear{top:0;right:0;outline:none;margin:0;border:solid 1px transparent;padding:5px 5px;position:absolute;font-size:1em;line-height:inherit}#loco-admin.wrap .loco-clearable a.clear:before,#loco-admin.wrap .auto-comp-wrap a.clear:before{vertical-align:middle;padding:0;color:#999}#loco-admin.wrap .loco-clearable a.clear:hover:before,#loco-admin.wrap .auto-comp-wrap a.clear:hover:before{color:#333}#loco-admin.wrap .loco-clearable a.clear span,#loco-admin.wrap .auto-comp-wrap a.clear span{display:none}#loco-admin.wrap .loco-clearable ::-ms-clear,#loco-admin.wrap .auto-comp-wrap ::-ms-clear{display:none}#loco-admin.wrap div.progress{color:#000;background:transparent !important}#loco-admin.wrap div.progress *{height:100%;overflow:hidden;white-space:nowrap}#loco-admin.wrap div.progress .t{background-color:#ddd;border:1px solid #ccc}#loco-admin.wrap div.progress .t .bar{float:left;clear:none;background-color:#3db63d}#loco-admin.wrap div.progress .t .bar.f{background-color:#bd2c00}#loco-admin.wrap div.progress .l{display:block}#loco-admin.wrap td div.progress .t{border:none}#loco-admin.wrap td div.progress .l{display:none}#loco-admin.wrap code.path{color:#333;margin:0;padding:0;display:inline;background:transparent}#loco-admin.wrap .loco-danger{color:#d54e21}#loco-admin.wrap .notice,#loco-admin.wrap .panel{background:#fff;position:relative;margin:1em 0;padding:1px 12px}#loco-admin.wrap .notice-generic{border-color:#ddd}#loco-admin.wrap .notice-success>.has-icon,#loco-admin.wrap .notice-success p>strong.has-icon{color:#000}#loco-admin.wrap .notice-warning{border-color:orange}#loco-admin.wrap .notice-error{border-color:#dc3232}#loco-admin.wrap .notice-debug{border-color:#00a0d2}#loco-admin.wrap .notice-danger{border-color:#dc3232}#loco-admin.wrap .notice-locked{border-color:orange}#loco-admin.wrap .notice>.has-icon:before,#loco-admin.wrap .notice p>strong.has-icon:before{padding-right:6px}#loco-admin.wrap .notice>p>a.button.has-icon:before{width:1.2em}#loco-admin.wrap .notice>p>em{color:#d54e21;font-style:normal}#loco-admin.wrap .notice>p>em a{color:inherit}#loco-admin.wrap .notice>p a:hover,#loco-admin.wrap .notice>nav a:hover{text-decoration:underline}#loco-admin.wrap .notice>p a.button,#loco-admin.wrap .notice>nav a.button{text-decoration:inherit}#loco-admin.wrap .notice.has-nav{display:flex;flex-direction:row}#loco-admin.wrap .notice.has-nav p,#loco-admin.wrap .notice.has-nav nav{line-height:22px;flex-grow:1}#loco-admin.wrap .notice.has-nav nav{text-align:right;padding:2px;margin:.5em 0}#loco-admin.wrap .notice.has-nav.is-dismissible{padding-right:38px}#loco-admin.wrap .notice.has-nav a{white-space:nowrap}#loco-admin.wrap .notice.has-nav nav>span{color:#666}#loco-admin.wrap .notice>h3>span{display:inline-block;vertical-align:middle}#loco-admin.wrap ul.problems li{font-style:italic}#loco-admin.wrap label{position:relative}#loco-admin.wrap label.for-disabled,#loco-admin.wrap label.for-disabled>input{cursor:default !important}#loco-admin.wrap input.regular-text,#loco-admin.wrap textarea.regular-text{width:25em}#loco-admin.wrap .button-link{padding:0 10px 1px}#loco-admin.wrap .button-danger{background:#ba0000;border-color:#900 #600 #600;-webkit-box-shadow:0 1px 0 #600;-moz-box-shadow:0 1px 0 #600;box-shadow:0 1px 0 #600;color:#fff;text-shadow:0 -1px 1px #600,1px 0 1px #600,0 1px 1px #600,-1px 0 1px #600}#loco-admin.wrap .button-success{background:#00b500;border-color:#090 #2e892e #2e892e;-webkit-box-shadow:0 1px 0 #2e892e;-moz-box-shadow:0 1px 0 #2e892e;box-shadow:0 1px 0 #2e892e;color:#fff;text-shadow:0 -1px 1px #2e892e,1px 0 1px #2e892e,0 1px 1px #2e892e,-1px 0 1px #2e892e}#loco-admin.wrap .button-success:hover{background:#3db63d}#loco-admin.wrap .button-danger[disabled],#loco-admin.wrap .button-success[disabled]{text-shadow:none !important}#loco-admin.wrap form button.loco-loading.button-large{padding-left:0}#loco-admin.wrap form button.loco-loading.button-large:before{width:16px;height:16px;margin:0 4px;content:" ";font-size:16px;line-height:1;display:inline-block;vertical-align:sub}#loco-admin.wrap ::placeholder{color:#ccc}#loco-admin.wrap ::-webkit-input-placeholder{color:#ccc}#loco-admin.wrap :-moz-placeholder{color:#ccc;opacity:1}#loco-admin.wrap ::-moz-placeholder{color:#ccc;opacity:1}#loco-admin.wrap :-ms-input-placeholder{color:#ccc}#loco-admin.wrap .ielt10 .placeheld{color:#ccc}#loco-admin.wrap a.has-raquo:after{content:" »"}#loco-admin.wrap a.has-laquo:before{content:"« "}#loco-admin.wrap span.inline-spinner{display:inline-block;min-width:16px;min-height:16px;background:transparent url(../img/spin-modal.gif?v=2.6.3) 0 0 no-repeat}.js #wpbody-content>.notice{display:none}.js #wpbody-content>.notice.inline{display:block}.js #loco-admin.wrap .jshide,.no-js #loco-admin.wrap .jsonly{display:none !important}#loco-admin.wrap .invis{visibility:hidden}.form-table tr td{vertical-align:top}.form-table tr.compact td{padding-top:0}.form-table tr th a.icon-help{display:none}.loco-modal{min-width:50%;min-height:100px}.loco-modal-wide{min-width:90% !important}.loco-modal-no-close .ui-dialog-titlebar-close{display:none}.loco-modal .ui-dialog-titlebar-close{overflow:hidden}.loco-modal.request-filesystem-credentials-dialog{top:15% !important;max-height:85% !important}.loco-modal.request-filesystem-credentials-dialog>.ui-dialog-content{background:inherit}.loco-modal.request-filesystem-credentials-dialog .ftp-password>label>em:last-child{display:none}.ui-dialog-content>div.loco-loading{height:100%;background:transparent url(../img/spin-modal.gif?v=2.6.3) center 20px no-repeat}#loco-po-ref ol li{color:#aaa;margin:0;white-space:pre;padding:0 0 0 1em;font:normal 12px/17px Consolas,Monaco,monospace;background:transparent;border-left:1px solid #eee}#loco-po-ref ol li code{margin:0;padding:0;display:inline;background:inherit}#loco-po-ref ol li.highlighted{color:#666;background-color:#f8eec7}#loco-po-ref ol li.highlighted code.T_CONSTANT_ENCAPSED_STRING{color:#c931c7}#loco-credit>*{vertical-align:middle}#loco-credit>a{display:inline-block;position:relative;overflow:hidden;background:transparent url(../img/logo-foot.gif?v=2.6.3) 0 0 no-repeat;height:30px;width:100px;text-indent:200px;-webkit-transition-duration:0s;transition-duration:0s}#loco-credit>a:hover{background-position:0 -35px}#loco-content{position:relative}#footer-upgrade span:before{color:#ccc;content:" | ";display:inline;padding-left:.5em;padding-right:.5em}#footer-upgrade span:first-child:before{content:"";display:none}.loco-clearfix:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}dl.debug dt{font-weight:bold}dl.debug dt,dl.debug dd{white-space:pre}.wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(0,115,170,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#0073aa}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#66c6e4 !important;background:#008ec2 !important;border-color:#008ec2 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../img/skins/fresh/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/editor.css CHANGED
@@ -1 +1 @@
1
- #loco-editor{border:solid 1px #ccc}#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}#loco-editor ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.2) 0 0 no-repeat;min-height:75px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.2);background-size:16px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.2);background-size:16px}}#loco-editor ._green_glow_inner,#loco-editor .is-editable>.wg-content>textarea:focus,#loco-editor .is-editable>.wg-content.has-focus .ace_scroller,#loco-editor .is-editable>.wg-content.has-focus .wysihtml-editor,#loco-editor .is-editable>.wg-content.has-focus .mce-content-body{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-editor ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-editor .loco-font,#loco-editor .is-table .wg-thead .wg-sortable>header:after{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-editor div.ta-mirror{position:absolute;top:0;border:solid 1px transparent;color:transparent;padding:.4em .6em;pointer-events:none}#loco-editor div.ta-mirror span{position:relative}#loco-editor div.ta-mirror span:after{color:#ccc;white-space:pre;display:inline-block;position:absolute;top:0;line-height:normal}#loco-editor div.ta-mirror .crlf:after{content:"¬"}#loco-editor div.ta-mirror .eof:after{content:"¶"}#loco-editor div.ta-mirror .x20:after{content:"·";color:#aaa}#loco-editor div.ta-mirror .x9:after{content:"⟶"}#loco-editor div.ta-mirror,#loco-editor .has-mirror textarea{white-space:pre-wrap;word-wrap:break-word;word-spacing:0px}#loco-editor .has-mirror ::placeholder{color:transparent}#loco-editor .has-mirror ::-webkit-input-placeholder{color:transparent}#loco-editor .has-mirror :-moz-placeholder{color:transparent;opacity:1}#loco-editor .has-mirror ::-moz-placeholder{color:transparent;opacity:1}#loco-editor .has-mirror :-ms-input-placeholder{color:transparent}#loco-editor .has-mirror .ielt10 .placeheld{color:transparent}#loco-editor div.ta-mirror{left:0;text-align:left}#loco-editor div.ta-mirror span:after{left:0}#loco-editor div.ta-mirror .eol:after{padding-left:.2em}#loco-editor [dir=RTL] div.ta-mirror{left:auto;right:0;text-align:right}#loco-editor [dir=RTL] div.ta-mirror span:after{right:0}#loco-editor [dir=RTL] div.ta-mirror .eol:after{padding-left:0;padding-right:.2em}#loco-editor .has-proxy>textarea{display:none !important}#loco-editor .has-proxy .ace_editor{height:100%;font-size:13px !important;line-height:1.4 !important}#loco-editor .has-proxy .ace_editor .ace_marker-layer .ace_bracket{display:none}#loco-editor .has-proxy .ace_print-margin{display:none}#loco-editor .ace_printf{color:#b90690;background-color:#edf1be}#loco-editor .ace_locked{color:gray}#loco-editor .ace_icu-quoted{color:gray}#loco-editor .ace_icu{color:#697eb9}#loco-editor .ace_icu.ace_name{color:#b90600}#loco-editor .resizer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 0 6px 0;background:#f0f0f0 url(../img/wg/splity.png?v=2.6.2) center bottom no-repeat;border:1px solid #ddd;overflow:hidden;cursor:move;cursor:row-resize;cursor:s-resize}#loco-editor .resizer>*{height:100%;border:none}#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}#loco-editor ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.2) 0 0 no-repeat;min-height:75px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.2);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.2);background-size:16px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.2);background-size:16px}}#loco-editor ._green_glow_inner,#loco-editor .is-editable>.wg-content>textarea:focus,#loco-editor .is-editable>.wg-content.has-focus .ace_scroller,#loco-editor .is-editable>.wg-content.has-focus .wysihtml-editor,#loco-editor .is-editable>.wg-content.has-focus .mce-content-body{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-editor ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-editor .loco-font,#loco-editor .is-table .wg-thead .wg-sortable>header:after{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-editor .wg-cell,#loco-editor .wg-cell>div{clear:both;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;outline:none}#loco-editor .wg-cell{left:0;top:0;padding:0;margin:0;overflow:hidden}#loco-editor .wg-split{background:#eee}#loco-editor .wg-body:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}#loco-editor .wg-split-x>div>.not-first>*{margin-left:6px}#loco-editor .wg-split-y>div>.not-first>*{margin-top:6px}#loco-editor .wg-split>div>.has-title .wg-content{margin-top:0}#loco-editor .wg-split-x>div>.wg-cell{float:left;clear:none;height:100%}#loco-editor .wg-split-x>div{cursor:move;cursor:ew-resize;cursor:col-resize}#loco-editor .wg-split>div>.not-first:before{display:block;position:absolute;overflow:hidden;content:" "}#loco-editor .wg-split-x>div>.not-first:before{width:6px;height:100%;background:transparent url(../img/wg/splitx.png?v=2.6.2) center center no-repeat}#loco-editor .wg-split-y>div{cursor:move;cursor:ns-resize;cursor:row-resize}#loco-editor .wg-split-y>div>.not-first:before{height:6px;width:100%;background:transparent url(../img/wg/splity.png?v=2.6.2) center center no-repeat}#loco-editor .wg-split>div.locked{cursor:default}#loco-editor .wg-split-x>div.locked>.not-first>*{margin-left:0px}#loco-editor .wg-split-y>div.locked>.not-first>*{margin-top:0px}#loco-editor .wg-split>div.locked>.not-first:before{display:none}#loco-editor .has-title>header{background:#e2e2e2;cursor:default !important;margin:0;white-space:nowrap}#loco-editor .wg-content{background:#fff;cursor:default;padding:4px 6px;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#loco-editor .wg-toolbar{top:0;right:0;margin-top:6px;position:absolute}#loco-editor .wg-toolbar>span{color:#fff;background:#000;display:block;padding:0 6px;cursor:default !important}#loco-editor .wg-toolbar>span:active{color:#000;background-color:#fff}#loco-editor .wg-content,#loco-editor .wg-tbody>div{overflow:scroll;overflow-x:hidden;overflow-y:auto}#loco-editor .is-table{background-color:#fff}#loco-editor .is-table .wg-thead .has-title>header{font-weight:normal;background:transparent;padding:4px 0;margin:0 0 0 10px}#loco-editor .is-table .wg-thead>div>.not-first:before{background-position:center center}#loco-editor .is-table .wg-thead{background:#e2e2e2;border-bottom:solid 1px #ccc}#loco-editor .is-table .wg-tbody{background-image:url(data:image/gif;base64,R0lGODlhAQAsAIABAPz8/P///yH5BAEAAAEALAAAAAABACwAAAIIjI+pAe0PIygAOw==);position:relative}#loco-editor .is-table .wg-cols>div{float:left;clear:none}#loco-editor .is-table .wg-cols>div>div{white-space:nowrap;line-height:1.7em;padding-left:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;background-color:#fff}#loco-editor .is-table .wg-cols>div>div:nth-child(even){background-color:#f7f7f7}#loco-editor .is-table .wg-cols>div>div.selected{background-color:#3db63d;color:#fff}#loco-editor .is-table .wg-cols>div>div.selected::selection{background-color:#fff;color:#000}#loco-editor .is-table .wg-cols>div:first-child>div{padding-left:4px}#loco-editor .is-table .wg-dead{clear:both}#loco-editor .is-table .wg-thead .wg-sortable>header{cursor:pointer !important}#loco-editor .is-table .wg-thead .wg-sortable>header:after{padding:0 0 0 5px;color:#999}#loco-editor .is-table .wg-thead .wg-sortable.wg-asc>header:after{content:"▲"}#loco-editor .is-table .wg-thead .wg-sortable.wg-desc>header:after{content:"▼"}#loco-editor .is-table .wg-thead .wg-sortable:hover>header:after{color:#000}#loco-editor .is-field>.wg-content{cursor:text;padding:0;line-height:normal;overflow:hidden;overflow-y:hidden}#loco-editor .is-field>.wg-content>div,#loco-editor .is-field>.wg-content>textarea{font-size:14px;line-height:1.4;border:1px solid #ddd;width:100%;height:100%;padding:8px 10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}#loco-editor .is-field>.wg-content textarea{resize:none;overflow:auto;display:block}#loco-editor .is-field>.wg-content>.ace_editor{padding:0;border-width:0}#loco-editor .is-field>.wg-content>div[contenteditable]{overflow:scroll;overflow-x:hidden;overflow-y:auto}#loco-editor .is-readonly>.wg-content{cursor:default}#loco-editor .is-readonly>.wg-content>div,#loco-editor .is-readonly>.wg-content>textarea,#loco-editor .is-readonly>.wg-content>textarea[readonly]{background:#f8f8f8;text-shadow:0 1px #fff;color:inherit}#loco-editor .is-readonly>.wg-content .ace_scroller{cursor:default;background:#f8f8f8}#loco-editor .is-readonly>.wg-content .ace_cursor-layer{display:none}#loco-editor .is-readonly>.wg-content>textarea[readonly]{cursor:default}#loco-editor .is-editable>.wg-content[dir=RTL] .ace_editor .ace_line{direction:ltr;unicode-bidi:bidi-override}#loco-editor .wg-split-x>nav.wg-tabs{white-space:nowrap;text-align:center;cursor:default}#loco-editor .wg-split-x>nav.wg-tabs>a{display:inline-block;padding:.5em 1em;margin-top:.2em;color:#000;text-decoration:none;-webkit-border-radius:.2em .2em 0 0;-moz-border-radius:.2em .2em 0 0;-ms-border-radius:.2em .2em 0 0;-o-border-radius:.2em .2em 0 0;border-radius:.2em .2em 0 0;background-color:#f3f7fd}#loco-editor .wg-split-x>nav.wg-tabs>a:hover{background-color:#fff}#loco-editor .wg-split-x>nav.wg-tabs>a.active{background-color:#3db63d;color:#fff}#loco-editor .wg-split>div>.has-nav>.wg-body{margin-top:0px}#loco-editor .wg-dead{visibility:hidden}@media all and (max-width: 768px){#loco-editor .wg-split-x>div>.not-first>*{margin-left:20px}#loco-editor .wg-split-y>div>.not-first>*{margin-top:20px}#loco-editor .wg-split-x>div>.not-first:before{width:20px}#loco-editor .wg-split-y>div>.not-first:before{height:20px}#loco-editor .is-table .wg-thead header{padding-left:20px}}#loco-editor .is-table .po-fuzzy{color:#b59829;font-weight:bold}#loco-editor .is-table .po-empty{color:#1f507a;font-weight:bold}#loco-editor .is-table .po-flagged{color:#bd2c00}#loco-editor .is-table .wg-cols>div:first-child>div:before{font-family:loco;vertical-align:inherit;display:inline-block;content:" ";width:1.3em;line-height:1}#loco-editor .is-table .wg-cols>div:first-child>div.po-fuzzy:before{content:""}#loco-editor .is-table .wg-cols>div:first-child>div.po-flagged:before{content:""}#loco-editor .is-table .wg-cols>div:first-child>div.po-comment:before{content:"";color:#999}#loco-editor .is-table .wg-cols>div:first-child>div.po-unsaved:before{content:"";color:#f1d040}#loco-editor .is-table .wg-cols>div:first-child>div.po-error:before{content:"";color:#bd2c00}#loco-editor .is-table .wg-cols>div:first-child>div.selected:before{color:#fff !important}#loco-editor .wg-cell>.meta{color:#333;margin:0 !important;padding:6px 10px;font-weight:normal;font-size:13px;line-height:1.4em;cursor:default !important}#loco-editor .wg-cell>.meta>*{display:inline-block;margin-top:3px;margin-bottom:3px}#loco-editor .wg-cell>.meta>span{border:1px solid transparent;border-left:none}#loco-editor .wg-cell>.meta>mark{color:#fff;border-radius:2px;background-color:silver;border:1px solid silver;padding:0 .3em}#loco-editor .wg-cell>.meta>mark.tag{color:#999;background-color:#eee}#loco-editor .wg-cell>.meta>p{display:block;white-space:pre-line}#loco-editor .wg-cell>.meta .icon-warn{color:#c00}#loco-editor .wg-cell>.meta .has-icon:before{padding-right:0;width:17px}#loco-editor .wg-cell>.meta code{font-size:12px}#loco-editor .is-table .wg-cols>div>div>mark{display:inline-block;vertical-align:text-bottom;font:inherit;font-weight:normal;color:#fff;border-radius:2px;font-size:90%;line-height:1;padding:.2em .3em;background-color:rgba(0,0,0,.25)}#loco-editor .is-table .wg-cols>div>div.selected.po-flagged{background-color:#bd2c00}#loco-editor .is-table .wg-cols>div>div.selected.po-fuzzy{background-color:#b59829}#loco-editor .is-table .wg-cols>div>div.selected.po-empty{background-color:#999}#loco-editor #po-target header nav{display:block;position:absolute;right:0px;top:0px;padding:2px}#loco-editor #po-target header nav button{margin-left:5px}#loco-editor #po-target header nav.po-empty .icon-cloud{display:none !important}#loco-editor #po-list .wg-content{padding:0}#loco-editor #po-source>.wg-body>.has-title>header{background:transparent;font-weight:normal;float:left;clear:none;min-width:3.4em}#loco-editor #po-source>.wg-body>.has-title>.wg-content{clear:none}#loco-editor .has-title>header{line-height:normal;padding:6px}#loco-editor .has-title>header .lang{margin-right:6px;margin-bottom:1px}#loco-editor .trg-rtl #po-list-tbody .wg-cols>div[for=po-list-col-target]>div,#loco-editor .src-rtl #po-list-tbody .wg-cols>div[for=po-list-col-source]>div{direction:rtl;padding-left:0;padding-right:10px;text-align:right}#loco-editor #po-source>.wg-body>.has-title>h2{min-width:4.5em}#loco-editor .is-table .wg-td{font-size:13px}#loco-editor header,#loco-editor nav{display:block;position:relative}#loco-editor-inner{min-height:600px;font-size:14px;clear:both}#loco-editor-inner>div.loco-loading{height:100px;background:transparent url(../img/spin-editor-button.gif?v=2.6.2) center 20px no-repeat}#loco-editor-inner h2{color:#000;line-height:1}#loco-editor-inner .wg-cell>.meta code{padding:0;color:#0073aa;background:inherit;cursor:pointer}#loco-editor-inner .wg-cell>.meta code:hover{text-decoration:underline}#loco-admin.wrap #loco-editor>nav{font-size:14px;height:50px}#loco-admin.wrap #loco-editor>nav form{display:block;float:left;clear:none;padding:0;margin:0}#loco-admin.wrap #loco-editor>nav form.aux{float:right;margin-right:5px}#loco-admin.wrap #loco-editor>nav fieldset{display:block;position:relative;float:left;clear:none}#loco-admin.wrap #loco-editor>nav button,#loco-admin.wrap #loco-editor>nav input[type=text]{display:block;position:relative;float:left;clear:none;margin:5px 0 0 5px;height:36px;text-align:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#loco-admin.wrap #loco-editor>nav input[type=text]{padding:0 10px;font-size:14px;line-height:normal}#loco-admin.wrap #loco-editor>nav .invalid input[type=text]:focus{border-color:#c00;-webkit-box-shadow:0 0 2px rgba(153,0,0,.5);-moz-box-shadow:0 0 2px rgba(153,0,0,.5);box-shadow:0 0 2px rgba(153,0,0,.5)}#loco-admin.wrap #loco-editor>nav .loco-clearable{padding:0 20px}#loco-admin.wrap #loco-editor>nav .loco-clearable.invalid a.clear:before{color:#c00}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear{right:25px;line-height:2}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:hover:before{color:#c00}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:active:before{color:#000}#loco-admin.wrap #loco-editor>nav button.only-icon{width:40px}#loco-admin.wrap button.has-icon:before{width:16px;padding:0}#loco-admin.wrap button.has-icon.loco-loading:before{content:" ";height:16px;background:transparent url(../img/spin-editor-button.gif?v=2.6.2) 0 0 no-repeat}#loco-admin.wrap .button,#loco-admin.wrap .button-link,#loco-admin.wrap input[type=text]{border-color:#aaa;color:#444}#loco-admin.wrap .button:hover,#loco-admin.wrap .button-link:hover{color:#000}#loco-admin.wrap .button-primary,#loco-admin.wrap .button-primary:hover{color:#fff}#loco-admin.wrap button.icon-translate:before{font-size:16px}.loco-modal .loco-api{position:relative;padding:10px;background:#f7f7f7;border:solid 1px #eee;font-size:14px;margin-bottom:16px}.loco-modal .loco-api p{padding:0;margin:0;font-size:inherit}.loco-modal .loco-api blockquote{font-weight:bold;margin:0;padding:10px 0}.loco-modal .loco-api a.loco-api-credit{padding:0;display:block;position:absolute;right:10px;bottom:10px;text-decoration:none;white-space:nowrap;overflow:hidden;font-size:12px}.loco-modal .loco-api a.loco-api-credit:hover{text-decoration:underline}.loco-modal .loco-api-loading{text-indent:20px;background:transparent url(../img/spin-modal.gif?v=2.6.2) 10px center no-repeat}.loco-modal .loco-alert p{margin-bottom:2em;font-size:14px}.loco-modal .loco-alert nav{display:block;position:relative;margin:1em 0}.loco-modal .loco-alert nav a{display:inline-block;margin-right:1em;padding:10px}#loco-auto{display:none;min-width:50%;min-height:300px;position:relative}#loco-auto form blockquote{margin:0;padding:1em 0;font-size:14px}.loco-api a.loco-api-credit{color:inherit}.loco-api-google a.loco-api-credit{text-indent:200px;width:122px;height:16px;background:transparent url(../img/api/google.png?v=2.6.2) 0 0 no-repeat}.loco-api-microsoft a.loco-api-credit{text-indent:200px;width:152px;height:16px;background:transparent url(../img/api/microsoft.png?v=2.6.2) 0 0 no-repeat}.loco-api-deepl a.loco-api-credit{text-indent:200px;width:122px;height:16px;background:transparent url(../img/api/deepl.png?v=2.6.2) 0 0 no-repeat}
1
+ #loco-editor{border:solid 1px #ccc}#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}#loco-editor ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.3) 0 0 no-repeat;min-height:75px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.3);background-size:16px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.3);background-size:16px}}#loco-editor ._green_glow_inner,#loco-editor .is-editable>.wg-content>textarea:focus,#loco-editor .is-editable>.wg-content.has-focus .ace_scroller,#loco-editor .is-editable>.wg-content.has-focus .wysihtml-editor,#loco-editor .is-editable>.wg-content.has-focus .mce-content-body{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-editor ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-editor .loco-font,#loco-editor .is-table .wg-thead .wg-sortable>header:after{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-editor div.ta-mirror{position:absolute;top:0;border:solid 1px transparent;color:transparent;padding:.4em .6em;pointer-events:none}#loco-editor div.ta-mirror span{position:relative}#loco-editor div.ta-mirror span:after{color:#ccc;white-space:pre;display:inline-block;position:absolute;top:0;line-height:normal}#loco-editor div.ta-mirror .crlf:after{content:"¬"}#loco-editor div.ta-mirror .eof:after{content:"¶"}#loco-editor div.ta-mirror .x20:after{content:"·";color:#aaa}#loco-editor div.ta-mirror .x9:after{content:"⟶"}#loco-editor div.ta-mirror,#loco-editor .has-mirror textarea{white-space:pre-wrap;word-wrap:break-word;word-spacing:0px}#loco-editor .has-mirror ::placeholder{color:transparent}#loco-editor .has-mirror ::-webkit-input-placeholder{color:transparent}#loco-editor .has-mirror :-moz-placeholder{color:transparent;opacity:1}#loco-editor .has-mirror ::-moz-placeholder{color:transparent;opacity:1}#loco-editor .has-mirror :-ms-input-placeholder{color:transparent}#loco-editor .has-mirror .ielt10 .placeheld{color:transparent}#loco-editor div.ta-mirror{left:0;text-align:left}#loco-editor div.ta-mirror span:after{left:0}#loco-editor div.ta-mirror .eol:after{padding-left:.2em}#loco-editor [dir=RTL] div.ta-mirror{left:auto;right:0;text-align:right}#loco-editor [dir=RTL] div.ta-mirror span:after{right:0}#loco-editor [dir=RTL] div.ta-mirror .eol:after{padding-left:0;padding-right:.2em}#loco-editor .has-proxy>textarea{display:none !important}#loco-editor .has-proxy .ace_editor{height:100%;font-size:13px !important;line-height:1.4 !important}#loco-editor .has-proxy .ace_editor .ace_marker-layer .ace_bracket{display:none}#loco-editor .has-proxy .ace_print-margin{display:none}#loco-editor .ace_printf{color:#b90690;background-color:#edf1be}#loco-editor .ace_locked{color:gray}#loco-editor .ace_icu-quoted{color:gray}#loco-editor .ace_icu{color:#697eb9}#loco-editor .ace_icu.ace_name{color:#b90600}#loco-editor .resizer{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0 0 6px 0;background:#f0f0f0 url(../img/wg/splity.png?v=2.6.3) center bottom no-repeat;border:1px solid #ddd;overflow:hidden;cursor:move;cursor:row-resize;cursor:s-resize}#loco-editor .resizer>*{height:100%;border:none}#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}#loco-editor ._ajax_loader_f2x4{background:transparent url(../img/ajax-loader-f2-x4.gif?v=2.6.3) 0 0 no-repeat;min-height:75px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc.gif?v=2.6.3);background-repeat:no-repeat;min-height:16px}@media only screen and (-webkit-min-device-pixel-ratio: 2),only screen and (min--moz-device-pixel-ratio: 2),only screen and (-o-min-device-pixel-ratio: 2/1),only screen and (min-device-pixel-ratio: 2),only screen and (min-resolution: 192dpi),only screen and (min-resolution: 2dppx){#loco-editor ._ajax_loader_f2{background-image:url(../img/ajax-loader-f2-x2.gif?v=2.6.3);background-size:16px}#loco-editor ._ajax_loader_cc{background-image:url(../img/ajax-loader-cc-x2.gif?v=2.6.3);background-size:16px}}#loco-editor ._green_glow_inner,#loco-editor .is-editable>.wg-content>textarea:focus,#loco-editor .is-editable>.wg-content.has-focus .ace_scroller,#loco-editor .is-editable>.wg-content.has-focus .wysihtml-editor,#loco-editor .is-editable>.wg-content.has-focus .mce-content-body{-webkit-box-shadow:inset 0 0 10px 0 #3db63d;-moz-box-shadow:inset 0 0 10px 0 #3db63d;box-shadow:inset 0 0 10px 0 #3db63d}#loco-editor ._green_glow_outer{-webkit-box-shadow:0 0 .5em 0 #3db63d;-moz-box-shadow:0 0 .5em 0 #3db63d;box-shadow:0 0 .5em 0 #3db63d}#loco-editor .loco-font,#loco-editor .is-table .wg-thead .wg-sortable>header:after{font-family:"loco";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#loco-editor .wg-cell,#loco-editor .wg-cell>div{clear:both;position:relative;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;outline:none}#loco-editor .wg-cell{left:0;top:0;padding:0;margin:0;overflow:hidden}#loco-editor .wg-split{background:#eee}#loco-editor .wg-body:after{content:".";display:block;clear:both;visibility:hidden;line-height:0;height:0}#loco-editor .wg-split-x>div>.not-first>*{margin-left:6px}#loco-editor .wg-split-y>div>.not-first>*{margin-top:6px}#loco-editor .wg-split>div>.has-title .wg-content{margin-top:0}#loco-editor .wg-split-x>div>.wg-cell{float:left;clear:none;height:100%}#loco-editor .wg-split-x>div{cursor:move;cursor:ew-resize;cursor:col-resize}#loco-editor .wg-split>div>.not-first:before{display:block;position:absolute;overflow:hidden;content:" "}#loco-editor .wg-split-x>div>.not-first:before{width:6px;height:100%;background:transparent url(../img/wg/splitx.png?v=2.6.3) center center no-repeat}#loco-editor .wg-split-y>div{cursor:move;cursor:ns-resize;cursor:row-resize}#loco-editor .wg-split-y>div>.not-first:before{height:6px;width:100%;background:transparent url(../img/wg/splity.png?v=2.6.3) center center no-repeat}#loco-editor .wg-split>div.locked{cursor:default}#loco-editor .wg-split-x>div.locked>.not-first>*{margin-left:0px}#loco-editor .wg-split-y>div.locked>.not-first>*{margin-top:0px}#loco-editor .wg-split>div.locked>.not-first:before{display:none}#loco-editor .has-title>header{background:#e2e2e2;cursor:default !important;margin:0;white-space:nowrap}#loco-editor .wg-content{background:#fff;cursor:default;padding:4px 6px;overflow:hidden;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#loco-editor .wg-toolbar{top:0;right:0;margin-top:6px;position:absolute}#loco-editor .wg-toolbar>span{color:#fff;background:#000;display:block;padding:0 6px;cursor:default !important}#loco-editor .wg-toolbar>span:active{color:#000;background-color:#fff}#loco-editor .wg-content,#loco-editor .wg-tbody>div{overflow:scroll;overflow-x:hidden;overflow-y:auto}#loco-editor .is-table{background-color:#fff}#loco-editor .is-table .wg-thead .has-title>header{font-weight:normal;background:transparent;padding:4px 0;margin:0 0 0 10px}#loco-editor .is-table .wg-thead>div>.not-first:before{background-position:center center}#loco-editor .is-table .wg-thead{background:#e2e2e2;border-bottom:solid 1px #ccc}#loco-editor .is-table .wg-tbody{background-image:url(data:image/gif;base64,R0lGODlhAQAsAIABAPz8/P///yH5BAEAAAEALAAAAAABACwAAAIIjI+pAe0PIygAOw==);position:relative}#loco-editor .is-table .wg-cols>div{float:left;clear:none}#loco-editor .is-table .wg-cols>div>div{white-space:nowrap;line-height:1.7em;padding-left:10px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;-o-text-overflow:ellipsis;-ms-text-overflow:ellipsis;background-color:#fff}#loco-editor .is-table .wg-cols>div>div:nth-child(even){background-color:#f7f7f7}#loco-editor .is-table .wg-cols>div>div.selected{background-color:#3db63d;color:#fff}#loco-editor .is-table .wg-cols>div>div.selected::selection{background-color:#fff;color:#000}#loco-editor .is-table .wg-cols>div:first-child>div{padding-left:4px}#loco-editor .is-table .wg-dead{clear:both}#loco-editor .is-table .wg-thead .wg-sortable>header{cursor:pointer !important}#loco-editor .is-table .wg-thead .wg-sortable>header:after{padding:0 0 0 5px;color:#999}#loco-editor .is-table .wg-thead .wg-sortable.wg-asc>header:after{content:"▲"}#loco-editor .is-table .wg-thead .wg-sortable.wg-desc>header:after{content:"▼"}#loco-editor .is-table .wg-thead .wg-sortable:hover>header:after{color:#000}#loco-editor .is-field>.wg-content{cursor:text;padding:0;line-height:normal;overflow:hidden;overflow-y:hidden}#loco-editor .is-field>.wg-content>div,#loco-editor .is-field>.wg-content>textarea{font-size:14px;line-height:1.4;border:1px solid #ddd;width:100%;height:100%;padding:8px 10px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-border-radius:0;-moz-border-radius:0;-ms-border-radius:0;-o-border-radius:0;border-radius:0}#loco-editor .is-field>.wg-content textarea{resize:none;overflow:auto;display:block}#loco-editor .is-field>.wg-content>.ace_editor{padding:0;border-width:0}#loco-editor .is-field>.wg-content>div[contenteditable]{overflow:scroll;overflow-x:hidden;overflow-y:auto}#loco-editor .is-readonly>.wg-content{cursor:default}#loco-editor .is-readonly>.wg-content>div,#loco-editor .is-readonly>.wg-content>textarea,#loco-editor .is-readonly>.wg-content>textarea[readonly]{background:#f8f8f8;text-shadow:0 1px #fff;color:inherit}#loco-editor .is-readonly>.wg-content .ace_scroller{cursor:default;background:#f8f8f8}#loco-editor .is-readonly>.wg-content .ace_cursor-layer{display:none}#loco-editor .is-readonly>.wg-content>textarea[readonly]{cursor:default}#loco-editor .is-editable>.wg-content[dir=RTL] .ace_editor .ace_line{direction:ltr;unicode-bidi:bidi-override}#loco-editor .wg-split-x>nav.wg-tabs{white-space:nowrap;text-align:center;cursor:default}#loco-editor .wg-split-x>nav.wg-tabs>a{display:inline-block;padding:.5em 1em;margin-top:.2em;color:#000;text-decoration:none;-webkit-border-radius:.2em .2em 0 0;-moz-border-radius:.2em .2em 0 0;-ms-border-radius:.2em .2em 0 0;-o-border-radius:.2em .2em 0 0;border-radius:.2em .2em 0 0;background-color:#f3f7fd}#loco-editor .wg-split-x>nav.wg-tabs>a:hover{background-color:#fff}#loco-editor .wg-split-x>nav.wg-tabs>a.active{background-color:#3db63d;color:#fff}#loco-editor .wg-split>div>.has-nav>.wg-body{margin-top:0px}#loco-editor .wg-dead{visibility:hidden}@media all and (max-width: 768px){#loco-editor .wg-split-x>div>.not-first>*{margin-left:20px}#loco-editor .wg-split-y>div>.not-first>*{margin-top:20px}#loco-editor .wg-split-x>div>.not-first:before{width:20px}#loco-editor .wg-split-y>div>.not-first:before{height:20px}#loco-editor .is-table .wg-thead header{padding-left:20px}}#loco-editor .is-table .po-fuzzy{color:#b59829;font-weight:bold}#loco-editor .is-table .po-empty{color:#1f507a;font-weight:bold}#loco-editor .is-table .po-flagged{color:#bd2c00}#loco-editor .is-table .wg-cols>div:first-child>div:before{font-family:loco;vertical-align:inherit;display:inline-block;content:" ";width:1.3em;line-height:1}#loco-editor .is-table .wg-cols>div:first-child>div.po-fuzzy:before{content:""}#loco-editor .is-table .wg-cols>div:first-child>div.po-flagged:before{content:""}#loco-editor .is-table .wg-cols>div:first-child>div.po-comment:before{content:"";color:#999}#loco-editor .is-table .wg-cols>div:first-child>div.po-unsaved:before{content:"";color:#f1d040}#loco-editor .is-table .wg-cols>div:first-child>div.po-error:before{content:"";color:#bd2c00}#loco-editor .is-table .wg-cols>div:first-child>div.selected:before{color:#fff !important}#loco-editor .wg-cell>.meta{color:#333;margin:0 !important;padding:6px 10px;font-weight:normal;font-size:13px;line-height:1.4em;cursor:default !important}#loco-editor .wg-cell>.meta>*{display:inline-block;margin-top:3px;margin-bottom:3px}#loco-editor .wg-cell>.meta>span{border:1px solid transparent;border-left:none}#loco-editor .wg-cell>.meta>mark{color:#fff;border-radius:2px;background-color:silver;border:1px solid silver;padding:0 .3em}#loco-editor .wg-cell>.meta>mark.tag{color:#999;background-color:#eee}#loco-editor .wg-cell>.meta>p{display:block;white-space:pre-line}#loco-editor .wg-cell>.meta .icon-warn{color:#c00}#loco-editor .wg-cell>.meta .has-icon:before{padding-right:0;width:17px}#loco-editor .wg-cell>.meta code{font-size:12px}#loco-editor .is-table .wg-cols>div>div>mark{display:inline-block;vertical-align:text-bottom;font:inherit;font-weight:normal;color:#fff;border-radius:2px;font-size:90%;line-height:1;padding:.2em .3em;background-color:rgba(0,0,0,.25)}#loco-editor .is-table .wg-cols>div>div.selected.po-flagged{background-color:#bd2c00}#loco-editor .is-table .wg-cols>div>div.selected.po-fuzzy{background-color:#b59829}#loco-editor .is-table .wg-cols>div>div.selected.po-empty{background-color:#999}#loco-editor #po-target header nav{display:block;position:absolute;right:0px;top:0px;padding:2px}#loco-editor #po-target header nav button{margin-left:5px}#loco-editor #po-target header nav.po-empty .icon-cloud{display:none !important}#loco-editor #po-list .wg-content{padding:0}#loco-editor #po-source>.wg-body>.has-title>header{background:transparent;font-weight:normal;float:left;clear:none;min-width:3.4em}#loco-editor #po-source>.wg-body>.has-title>.wg-content{clear:none}#loco-editor .has-title>header{line-height:normal;padding:6px}#loco-editor .has-title>header .lang{margin-right:6px;margin-bottom:1px}#loco-editor .trg-rtl #po-list-tbody .wg-cols>div[for=po-list-col-target]>div,#loco-editor .src-rtl #po-list-tbody .wg-cols>div[for=po-list-col-source]>div{direction:rtl;padding-left:0;padding-right:10px;text-align:right}#loco-editor #po-source>.wg-body>.has-title>h2{min-width:4.5em}#loco-editor .is-table .wg-td{font-size:13px}#loco-editor header,#loco-editor nav{display:block;position:relative}#loco-editor-inner{min-height:600px;font-size:14px;clear:both}#loco-editor-inner>div.loco-loading{height:100px;background:transparent url(../img/spin-editor-button.gif?v=2.6.3) center 20px no-repeat}#loco-editor-inner h2{color:#000;line-height:1}#loco-editor-inner .wg-cell>.meta code{padding:0;color:#0073aa;background:inherit;cursor:pointer}#loco-editor-inner .wg-cell>.meta code:hover{text-decoration:underline}#loco-admin.wrap #loco-editor>nav{font-size:14px;height:50px}#loco-admin.wrap #loco-editor>nav form{display:block;float:left;clear:none;padding:0;margin:0}#loco-admin.wrap #loco-editor>nav form.aux{float:right;margin-right:5px}#loco-admin.wrap #loco-editor>nav fieldset{display:block;position:relative;float:left;clear:none}#loco-admin.wrap #loco-editor>nav button,#loco-admin.wrap #loco-editor>nav input[type=text]{display:block;position:relative;float:left;clear:none;margin:5px 0 0 5px;height:36px;text-align:left;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#loco-admin.wrap #loco-editor>nav input[type=text]{padding:0 10px;font-size:14px;line-height:normal}#loco-admin.wrap #loco-editor>nav .invalid input[type=text]:focus{border-color:#c00;-webkit-box-shadow:0 0 2px rgba(153,0,0,.5);-moz-box-shadow:0 0 2px rgba(153,0,0,.5);box-shadow:0 0 2px rgba(153,0,0,.5)}#loco-admin.wrap #loco-editor>nav .loco-clearable{padding:0 20px}#loco-admin.wrap #loco-editor>nav .loco-clearable.invalid a.clear:before{color:#c00}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear{right:25px;line-height:2;top:2px}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:focus{-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:hover:before{color:#c00}#loco-admin.wrap #loco-editor>nav .loco-clearable a.clear:active:before{color:#000}#loco-admin.wrap #loco-editor>nav button.only-icon{width:40px}#loco-admin.wrap button.has-icon:before{width:16px;padding:0}#loco-admin.wrap button.has-icon.loco-loading:before{content:" ";height:16px;background:transparent url(../img/spin-editor-button.gif?v=2.6.3) 0 0 no-repeat}#loco-admin.wrap .button,#loco-admin.wrap .button-link,#loco-admin.wrap input[type=text]{border-color:#aaa;color:#444}#loco-admin.wrap .button:hover,#loco-admin.wrap .button-link:hover{color:#000}#loco-admin.wrap .button-primary,#loco-admin.wrap .button-primary:hover{color:#fff}#loco-admin.wrap button.icon-translate:before{font-size:16px}.loco-modal .loco-api{position:relative;padding:10px;background:#f7f7f7;border:solid 1px #eee;font-size:14px;margin-bottom:16px}.loco-modal .loco-api p{padding:0;margin:0;font-size:inherit}.loco-modal .loco-api blockquote{font-weight:bold;margin:0;padding:10px 0}.loco-modal .loco-api a.loco-api-credit{padding:0;display:block;position:absolute;right:10px;bottom:10px;text-decoration:none;white-space:nowrap;overflow:hidden;font-size:12px}.loco-modal .loco-api a.loco-api-credit:hover{text-decoration:underline}.loco-modal .loco-api-loading{text-indent:20px;background:transparent url(../img/spin-modal.gif?v=2.6.3) 10px center no-repeat}.loco-modal .loco-alert p{margin-bottom:2em;font-size:14px}.loco-modal .loco-alert nav{display:block;position:relative;margin:1em 0}.loco-modal .loco-alert nav a{display:inline-block;margin-right:1em;padding:10px}#loco-auto{display:none;min-width:50%;min-height:300px;position:relative}#loco-auto form blockquote{margin:0;padding:1em 0;font-size:14px}.loco-api a.loco-api-credit{color:inherit}.loco-api-google a.loco-api-credit{text-indent:200px;width:122px;height:16px;background:transparent url(../img/api/google.png?v=2.6.3) 0 0 no-repeat}.loco-api-microsoft a.loco-api-credit{text-indent:200px;width:152px;height:16px;background:transparent url(../img/api/microsoft.png?v=2.6.3) 0 0 no-repeat}.loco-api-deepl a.loco-api-credit{text-indent:200px;width:122px;height:16px;background:transparent url(../img/api/deepl.png?v=2.6.3) 0 0 no-repeat}
pub/css/podiff.css CHANGED
@@ -1 +1 @@
1
- #loco-admin.wrap .revisions-diff{padding:10px;min-height:20px}#loco-admin.wrap table.diff{border-collapse:collapse;table-layout:auto}#loco-admin.wrap table.diff td{white-space:nowrap;overflow:hidden;font:normal 12px/17px "Monaco","Menlo","Ubuntu Mono","Consolas","source-code-pro",monospace;padding:2px}#loco-admin.wrap table.diff td>span{color:#aaa}#loco-admin.wrap table.diff td>span:after{content:". "}#loco-admin.wrap table.diff tbody{border-top:1px dashed #ccc}#loco-admin.wrap table.diff tbody:first-child{border-top:none}#loco-admin.wrap table.diff td>.dashicons{display:none}#loco-admin.wrap .revisions.loading .diff-meta{color:#eee}#loco-admin.wrap .revisions.loading .loading-indicator span.spinner{visibility:visible;background:#fff url(../img/spin-modal.gif?v=2.6.2) center center no-repeat}#loco-admin.wrap .revisions-meta{clear:both;padding:10px 12px;margin:0;position:relative;top:10px}#loco-admin.wrap .revisions-meta .diff-meta{clear:none;float:left;width:50%;padding:0;min-height:auto}#loco-admin.wrap .revisions-meta .diff-meta button{margin-top:5px}#loco-admin.wrap .revisions-meta .diff-meta-current{float:right;text-align:right}#loco-admin.wrap .revisions-meta time{color:#72777c}#loco-admin.wrap .revisions-control-frame{margin:10px 0}#loco-admin.wrap .revisions-diff-frame{margin-top:20px}
1
+ #loco-admin.wrap .revisions-diff{padding:10px;min-height:20px}#loco-admin.wrap table.diff{border-collapse:collapse;table-layout:auto}#loco-admin.wrap table.diff td{white-space:nowrap;overflow:hidden;font:normal 12px/17px "Monaco","Menlo","Ubuntu Mono","Consolas","source-code-pro",monospace;padding:2px}#loco-admin.wrap table.diff td>span{color:#aaa}#loco-admin.wrap table.diff td>span:after{content:". "}#loco-admin.wrap table.diff tbody{border-top:1px dashed #ccc}#loco-admin.wrap table.diff tbody:first-child{border-top:none}#loco-admin.wrap table.diff td>.dashicons{display:none}#loco-admin.wrap .revisions.loading .diff-meta{color:#eee}#loco-admin.wrap .revisions.loading .loading-indicator span.spinner{visibility:visible;background:#fff url(../img/spin-modal.gif?v=2.6.3) center center no-repeat}#loco-admin.wrap .revisions-meta{clear:both;padding:10px 12px;margin:0;position:relative;top:10px}#loco-admin.wrap .revisions-meta .diff-meta{clear:none;float:left;width:50%;padding:0;min-height:auto}#loco-admin.wrap .revisions-meta .diff-meta button{margin-top:5px}#loco-admin.wrap .revisions-meta .diff-meta-current{float:right;text-align:right}#loco-admin.wrap .revisions-meta time{color:#72777c}#loco-admin.wrap .revisions-control-frame{margin:10px 0}#loco-admin.wrap .revisions-diff-frame{margin-top:20px}
pub/css/poview.css CHANGED
@@ -1 +1 @@
1
- .js #loco-admin.wrap .loco-loading{min-height:100px;background:#fff url(../img/spin-modal.gif?v=2.6.2) center center no-repeat}.js #loco-admin.wrap .loco-loading ol.msgcat{display:none}#loco-admin.wrap #loco-po{padding-right:0;overflow:auto}#loco-admin.wrap ol.msgcat{margin-left:3em;padding-top:1em;border-top:1px dashed #ccc}#loco-admin.wrap ol.msgcat:first-child{padding-top:0;border-top:none}#loco-admin.wrap ol.msgcat li{color:#aaa;margin:0;padding:0 0 0 1em;font:normal 12px/17px "Monaco","Menlo","Ubuntu Mono","Consolas","source-code-pro",monospace;border-left:1px solid #eee}#loco-admin.wrap ol.msgcat li>*{color:#333;white-space:pre}#loco-admin.wrap ol.msgcat li>.po-comment{color:#3cc200}#loco-admin.wrap ol.msgcat li>.po-refs{color:#0073aa}#loco-admin.wrap ol.msgcat li>.po-refs a{color:inherit;text-decoration:none}#loco-admin.wrap ol.msgcat li>.po-refs a:hover{text-decoration:underline}#loco-admin.wrap ol.msgcat li>.po-flags{color:#77904a}#loco-admin.wrap ol.msgcat li>.po-flags em{font-style:normal}#loco-admin.wrap ol.msgcat li>.po-word{color:#000}#loco-admin.wrap ol.msgcat li>.po-junk{font-style:italic;color:#ccc}#loco-admin.wrap ol.msgcat li>.po-string>span{color:#c931c7}#loco-admin.wrap form.loco-filter{top:0;right:0;position:absolute}#loco-admin.wrap .loco-invalid form.loco-filter input[type=text]:focus{border-color:#c00;-webkit-box-shadow:0 0 2px rgba(153,0,0,.5);-moz-box-shadow:0 0 2px rgba(153,0,0,.5);box-shadow:0 0 2px rgba(153,0,0,.5)}#loco-admin.wrap .loco-invalid ol.msgcat{list-style-type:none}#loco-admin.wrap .loco-invalid ol.msgcat li{color:#000}
1
+ .js #loco-admin.wrap .loco-loading{min-height:100px;background:#fff url(../img/spin-modal.gif?v=2.6.3) center center no-repeat}.js #loco-admin.wrap .loco-loading ol.msgcat{display:none}#loco-admin.wrap #loco-po{padding-right:0;overflow:auto}#loco-admin.wrap ol.msgcat{margin-left:3em;padding-top:1em;border-top:1px dashed #ccc}#loco-admin.wrap ol.msgcat:first-child{padding-top:0;border-top:none}#loco-admin.wrap ol.msgcat li{color:#aaa;margin:0;padding:0 0 0 1em;font:normal 12px/17px "Monaco","Menlo","Ubuntu Mono","Consolas","source-code-pro",monospace;border-left:1px solid #eee}#loco-admin.wrap ol.msgcat li>*{color:#333;white-space:pre}#loco-admin.wrap ol.msgcat li>.po-comment{color:#3cc200}#loco-admin.wrap ol.msgcat li>.po-refs{color:#0073aa}#loco-admin.wrap ol.msgcat li>.po-refs a{color:inherit;text-decoration:none}#loco-admin.wrap ol.msgcat li>.po-refs a:hover{text-decoration:underline}#loco-admin.wrap ol.msgcat li>.po-flags{color:#77904a}#loco-admin.wrap ol.msgcat li>.po-flags em{font-style:normal}#loco-admin.wrap ol.msgcat li>.po-word{color:#000}#loco-admin.wrap ol.msgcat li>.po-junk{font-style:italic;color:#ccc}#loco-admin.wrap ol.msgcat li>.po-string>span{color:#c931c7}#loco-admin.wrap form.loco-filter{top:0;right:0;position:absolute}#loco-admin.wrap .loco-invalid form.loco-filter input[type=text]:focus{border-color:#c00;-webkit-box-shadow:0 0 2px rgba(153,0,0,.5);-moz-box-shadow:0 0 2px rgba(153,0,0,.5);box-shadow:0 0 2px rgba(153,0,0,.5)}#loco-admin.wrap .loco-invalid ol.msgcat{list-style-type:none}#loco-admin.wrap .loco-invalid ol.msgcat li{color:#000}
pub/css/skins/blue.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(9,100,132,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#096484}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1cdc7 !important;background:#db9925 !important;border-color:#db9925 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/blue/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(9,100,132,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#096484}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1cdc7 !important;background:#db9925 !important;border-color:#db9925 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/blue/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/coffee.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(199,165,137,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#c7a589}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1ccc7 !important;background:#ba906d !important;border-color:#ba906d !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/coffee/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(199,165,137,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#c7a589}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1ccc7 !important;background:#ba906d !important;border-color:#ba906d !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/coffee/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/ectoplasm.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(163,183,69,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#a3b745}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#cfd1c7 !important;background:#89993a !important;border-color:#89993a !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/ectoplasm/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(163,183,69,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#a3b745}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#cfd1c7 !important;background:#89993a !important;border-color:#89993a !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/ectoplasm/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/light.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(136,136,136,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#888}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7cfd1 !important;background:#0384a4 !important;border-color:#0384a4 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/light/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(136,136,136,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#888}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7cfd1 !important;background:#0384a4 !important;border-color:#0384a4 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/light/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/midnight.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(225,77,67,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#e14d43}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1c8c7 !important;background:#d92e23 !important;border-color:#d92e23 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/midnight/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(225,77,67,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#e14d43}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1c8c7 !important;background:#d92e23 !important;border-color:#d92e23 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/midnight/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/modern.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(56,88,233,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#3858e9}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7c9d1 !important;background:#193ddf !important;border-color:#193ddf !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/modern/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(56,88,233,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#3858e9}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7c9d1 !important;background:#193ddf !important;border-color:#193ddf !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/modern/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/ocean.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(158,186,160,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#9ebaa0}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7d1c8 !important;background:#86a989 !important;border-color:#86a989 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/ocean/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(158,186,160,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#9ebaa0}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#c7d1c8 !important;background:#86a989 !important;border-color:#86a989 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/ocean/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/css/skins/sunrise.css CHANGED
@@ -1 +1 @@
1
- .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(221,130,59,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#dd823b}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1cbc7 !important;background:#cc6d23 !important;border-color:#cc6d23 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/sunrise/spin-primary-button.gif?v=2.6.2) 0 0 no-repeat !important}
1
+ .wrap #loco-editor .is-table .wg-tr:nth-child(even){background-color:rgba(221,130,59,.05)}.wrap #loco-editor .wg-split-x>nav.wg-tabs>a.active,.wrap #loco-editor .is-table .wg-cols>div>div.selected{background-color:#dd823b}.wrap #loco-editor .is-editable>.wg-content>textarea:focus,.wrap #loco-editor .is-editable>.wg-content.has-focus .ace_scroller,.wrap #loco-editor .is-editable>.wg-content.has-focus .mce-content-body{border-color:#5b9dd9;-webkit-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);-moz-box-shadow:inset 0 0 .6em rgba(30,140,190,.8);box-shadow:inset 0 0 .6em rgba(30,140,190,.8)}.wp-core-ui .button-primary.loco-loading[disabled]{color:#d1cbc7 !important;background:#cc6d23 !important;border-color:#cc6d23 !important}.wp-core-ui .button-primary.loco-loading[disabled]:before{background:transparent url(../../img/skins/sunrise/spin-primary-button.gif?v=2.6.3) 0 0 no-repeat !important}
pub/js/min/admin.js CHANGED
@@ -1536,9 +1536,9 @@ c.style["-ms-scroll-snap-type"] = "mandatory", c.style["-ms-scroll-chaining"] =
1536
  },
1537
  scroll: function(a, b, d) {
1538
  x();
1539
- var f = c.scrollLeft, m = a > f ? 1 : -1, v = Math[1 === m ? "min" : "max"], g = Math.round(16 * b * m);
1540
  return r = q.require("$48", "fps.js").loop(function(b) {
1541
- b && (f = Math.max(0, v(a, f + g)), c.scrollLeft = f, a === f && (x(), d && d(f)));
1542
  }, c);
1543
  }
1544
  };
@@ -2681,10 +2681,10 @@ c.exists = function() {
2681
  return this === m[this.id];
2682
  };
2683
  c.clear = function() {
2684
- for (var a = this.el, b = this.cells, d = this.field, c = this.body, g = this.nav, h = this.length || 0; 0 !== h--; ) delete m[b[h].destroy().id];
2685
  this.cells = [];
2686
  this.length = 0;
2687
- g && (a.removeChild(g), this.nav = null);
2688
  c && (d && (n.ie() && k(c).triggerHandler("blur"), d.destroy(), this.field = null),
2689
  this.table && (this.table = null), a === c.parentNode && a.removeChild(c));
2690
  this.body = a.appendChild(f.el("", "wg-body"));
@@ -3262,14 +3262,21 @@ r.fire("poTab", [ c ]);
3262
  M && p(b, 0);
3263
  }
3264
  function p(c, f) {
3265
- c.on(d, function(b, d, g) {
3266
- a.translate(d, f);
3267
  r.validate(a);
3268
- r.setTrgMeta(a, f, c) && c.redraw();
 
 
 
 
 
 
3269
  0 === f && r.updateListCell(a, "target");
3270
  a.fuzzy(f) ? r.fuzzy(!1, a, f) : r.unsave(a, f);
3271
- "" === d ? (r.fire("poEmpty", [ !0, a, f ]), r.setStatus(a, f)) : "" === g && (r.fire("poEmpty", [ !1, a, f ]),
3272
  r.setStatus(a, f));
 
3273
  }).on(g, function() {
3274
  r.dict && r.rebuildSearch();
3275
  r.fire(b, [ a ]);
@@ -5003,7 +5010,7 @@ k("#loco-admin.wrap table.wp-list-table").each(function(e, c) {
5003
  q.require("$20", "tables.js").init(c);
5004
  });
5005
  D.validate = function(e) {
5006
- return "2.6.2" !== (/^\d+\.\d+\.\d+/.exec(e && e[0] || "") && RegExp.lastMatch) ? (D.notices.warn("admin.js is the wrong version (2.6.2). Please empty all relevant caches and reload this page."),
5007
  !1) : !0;
5008
  };
5009
  })(window, document, window.jQuery);
1536
  },
1537
  scroll: function(a, b, d) {
1538
  x();
1539
+ var f = c.scrollLeft, v = a > f ? 1 : -1, m = Math[1 === v ? "min" : "max"], g = Math.round(16 * b * v);
1540
  return r = q.require("$48", "fps.js").loop(function(b) {
1541
+ b && (f = Math.max(0, m(a, f + g)), c.scrollLeft = f, a === f && (x(), d && d(f)));
1542
  }, c);
1543
  }
1544
  };
2681
  return this === m[this.id];
2682
  };
2683
  c.clear = function() {
2684
+ for (var a = this.el, b = this.cells, d = this.field, c = this.body, v = this.nav, g = this.length || 0; 0 !== g--; ) delete m[b[g].destroy().id];
2685
  this.cells = [];
2686
  this.length = 0;
2687
+ v && (a.removeChild(v), this.nav = null);
2688
  c && (d && (n.ie() && k(c).triggerHandler("blur"), d.destroy(), this.field = null),
2689
  this.table && (this.table = null), a === c.parentNode && a.removeChild(c));
2690
  this.body = a.appendChild(f.el("", "wg-body"));
3262
  M && p(b, 0);
3263
  }
3264
  function p(c, f) {
3265
+ function h() {
3266
+ n = null;
3267
  r.validate(a);
3268
+ var b = a.errors(f).join(" ");
3269
+ e !== b && (e = b, r.setTrgMeta(a, f, c) && c.redraw());
3270
+ }
3271
+ var n, e = a.errors(f).join(" ");
3272
+ c.on(d, function(b, d, c) {
3273
+ n && (clearTimeout(n), n = null);
3274
+ a.translate(d, f);
3275
  0 === f && r.updateListCell(a, "target");
3276
  a.fuzzy(f) ? r.fuzzy(!1, a, f) : r.unsave(a, f);
3277
+ "" === d ? (r.fire("poEmpty", [ !0, a, f ]), r.setStatus(a, f)) : "" === c && (r.fire("poEmpty", [ !1, a, f ]),
3278
  r.setStatus(a, f));
3279
+ n = setTimeout(h, e ? 300 : 1e3);
3280
  }).on(g, function() {
3281
  r.dict && r.rebuildSearch();
3282
  r.fire(b, [ a ]);
5010
  q.require("$20", "tables.js").init(c);
5011
  });
5012
  D.validate = function(e) {
5013
+ return "2.6.3" !== (/^\d+\.\d+\.\d+/.exec(e && e[0] || "") && RegExp.lastMatch) ? (D.notices.warn("admin.js is the wrong version (2.6.3). Please empty all relevant caches and reload this page."),
5014
  !1) : !0;
5015
  };
5016
  })(window, document, window.jQuery);
readme.txt CHANGED
@@ -3,8 +3,8 @@ Contributors: timwhitlock
3
  Tags: translation, translators, localization, localisation, l10n, i18n, Gettext, PO, MO, productivity, multilingual, internationalization
4
  Requires at least: 5.2
5
  Requires PHP: 5.6.20
6
- Tested up to: 6.0.0
7
- Stable tag: 2.6.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -100,6 +100,13 @@ We don't collect your data or snoop on you. See the [plugin privacy notice](http
100
 
101
  == Changelog ==
102
 
 
 
 
 
 
 
 
103
  = 2.6.2 =
104
  * Bumped WordPress version to 6.0.0
105
  * Better labelling of reverse-engineered plural forms
@@ -468,7 +475,7 @@ We don't collect your data or snoop on you. See the [plugin privacy notice](http
468
 
469
  == Upgrade Notice ==
470
 
471
- = 2.6.2 =
472
  * Various improvements and bug fixes
473
 
474
 
3
  Tags: translation, translators, localization, localisation, l10n, i18n, Gettext, PO, MO, productivity, multilingual, internationalization
4
  Requires at least: 5.2
5
  Requires PHP: 5.6.20
6
+ Tested up to: 6.0.3
7
+ Stable tag: 2.6.3
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
100
 
101
  == Changelog ==
102
 
103
+ = 2.6.3 =
104
+ * Fixed bug in plural forms comparison
105
+ * Fixed bug generating author theme jsons
106
+ * Fixed errors in bundle debugger
107
+ * Extended cli type argument to filter specific bundle
108
+ * Bumped WordPress version to 6.0.3
109
+
110
  = 2.6.2 =
111
  * Bumped WordPress version to 6.0.0
112
  * Better labelling of reverse-engineered plural forms
475
 
476
  == Upgrade Notice ==
477
 
478
+ = 2.6.3 =
479
  * Various improvements and bug fixes
480
 
481
 
src/Locale.php CHANGED
@@ -57,7 +57,7 @@ class Loco_Locale implements JsonSerializable {
57
  private $valid;
58
 
59
  /**
60
- * @param string
61
  * @return Loco_Locale
62
  */
63
  public static function parse( $tag ){
@@ -77,9 +77,9 @@ class Loco_Locale implements JsonSerializable {
77
  /**
78
  * Construct from subtags NOT from composite tag. See self::parse
79
  * Note that this skips normalization and validation steps
80
- * @param string
81
- * @param string
82
- * @param string
83
  */
84
  public function __construct( $lang = '', $region = '', $variant = '' ){
85
  if( 1 == func_num_args() && isset($lang[3]) ){
@@ -92,7 +92,7 @@ class Loco_Locale implements JsonSerializable {
92
  /**
93
  * Allow read access to subtags
94
  * @internal
95
- * @param string
96
  * @return string
97
  */
98
  public function __get( $t ){
@@ -103,8 +103,8 @@ class Loco_Locale implements JsonSerializable {
103
  /**
104
  * Allow write access to subtags
105
  * @internal
106
- * @param string
107
- * @param string
108
  * @return void
109
  */
110
  public function __set( $t, $s ){
@@ -117,7 +117,7 @@ class Loco_Locale implements JsonSerializable {
117
 
118
  /**
119
  * Set subtags as produced from loco_parse_wp_locale
120
- * @param string[]
121
  * @return Loco_Locale
122
  */
123
  public function setSubtags( array $tag ){
@@ -185,7 +185,7 @@ class Loco_Locale implements JsonSerializable {
185
 
186
 
187
  /**
188
- * @param bool whether to get name in current display language
189
  * @return string | null
190
  */
191
  public function getName( $translate = true ){
@@ -245,7 +245,7 @@ class Loco_Locale implements JsonSerializable {
245
 
246
 
247
  /**
248
- * @param string CSS icon name
249
  * @return Loco_Locale
250
  */
251
  public function setIcon( $css ){
@@ -260,8 +260,8 @@ class Loco_Locale implements JsonSerializable {
260
 
261
 
262
  /**
263
- * @param string
264
- * @param string
265
  * @return Loco_Locale
266
  */
267
  public function setName( $english_name, $native_name = '' ){
@@ -285,7 +285,6 @@ class Loco_Locale implements JsonSerializable {
285
 
286
  /**
287
  * Resolve this locale's "official" name from WordPress's translation api
288
- * @param Loco_api_WordPressTranslations
289
  * @return string English name currently set
290
  */
291
  public function fetchName( Loco_api_WordPressTranslations $api ){
@@ -335,7 +334,6 @@ class Loco_Locale implements JsonSerializable {
335
 
336
  /**
337
  * Ensure locale has a label, even if it has to fall back to language code or error
338
- * @param Loco_api_WordPressTranslations
339
  * @return string
340
  */
341
  public function ensureName( Loco_api_WordPressTranslations $api ){
@@ -470,7 +468,7 @@ class Loco_Locale implements JsonSerializable {
470
 
471
  /**
472
  * Apply PO style Plural-Forms header.
473
- * @param string e.g. "nplurals=2; plural=n != 1;"
474
  * @return void
475
  */
476
  public function setPluralFormsHeader( $str ){
@@ -514,8 +512,11 @@ class Loco_Locale implements JsonSerializable {
514
  }
515
  $keys[] = implode(',',$sample).$suffix;
516
  }
517
- // use mnemonic tag only if it matches the default (CLDR) tag for the current language
518
- if( array_keys($this->plurals) !== $keys ) {
 
 
 
519
  // exception when two forms only and the first accepts n=1 and second n=2
520
  if( 2 === $nplurals && 0 === $formula->execute(1) && 1 === $formula->execute(2) ){
521
  $tags = ['one','other'];
@@ -534,7 +535,7 @@ class Loco_Locale implements JsonSerializable {
534
 
535
  /**
536
  * Crude normalizer for a plural equation such that similar formulae can be compared.
537
- * @param string original plural equation
538
  * @return string signature for comparison
539
  */
540
  private static function hashPlural( $str ){
57
  private $valid;
58
 
59
  /**
60
+ * @param string $tag
61
  * @return Loco_Locale
62
  */
63
  public static function parse( $tag ){
77
  /**
78
  * Construct from subtags NOT from composite tag. See self::parse
79
  * Note that this skips normalization and validation steps
80
+ * @param string $lang
81
+ * @param string $region
82
+ * @param string $variant
83
  */
84
  public function __construct( $lang = '', $region = '', $variant = '' ){
85
  if( 1 == func_num_args() && isset($lang[3]) ){
92
  /**
93
  * Allow read access to subtags
94
  * @internal
95
+ * @param string $t subtag
96
  * @return string
97
  */
98
  public function __get( $t ){
103
  /**
104
  * Allow write access to subtags
105
  * @internal
106
+ * @param string $t subtag, e.g. "lang"
107
+ * @param string $s subtag value, e.g. "en"
108
  * @return void
109
  */
110
  public function __set( $t, $s ){
117
 
118
  /**
119
  * Set subtags as produced from loco_parse_wp_locale
120
+ * @param string[] $tag
121
  * @return Loco_Locale
122
  */
123
  public function setSubtags( array $tag ){
185
 
186
 
187
  /**
188
+ * @param bool $translate whether to get name in current display language
189
  * @return string | null
190
  */
191
  public function getName( $translate = true ){
245
 
246
 
247
  /**
248
+ * @param string $css CSS icon name
249
  * @return Loco_Locale
250
  */
251
  public function setIcon( $css ){
260
 
261
 
262
  /**
263
+ * @param string $english_name
264
+ * @param string $native_name
265
  * @return Loco_Locale
266
  */
267
  public function setName( $english_name, $native_name = '' ){
285
 
286
  /**
287
  * Resolve this locale's "official" name from WordPress's translation api
 
288
  * @return string English name currently set
289
  */
290
  public function fetchName( Loco_api_WordPressTranslations $api ){
334
 
335
  /**
336
  * Ensure locale has a label, even if it has to fall back to language code or error
 
337
  * @return string
338
  */
339
  public function ensureName( Loco_api_WordPressTranslations $api ){
468
 
469
  /**
470
  * Apply PO style Plural-Forms header.
471
+ * @param string $str header value e.g. "nplurals=2; plural=n != 1;"
472
  * @return void
473
  */
474
  public function setPluralFormsHeader( $str ){
512
  }
513
  $keys[] = implode(',',$sample).$suffix;
514
  }
515
+ // cast to string for comparison due to PHP forcing integer keys in this->plurals
516
+ $expect = implode('|',$keys);
517
+ $actual = implode('|',array_keys($this->plurals));
518
+ // use mnemonic tags only if they match the default (CLDR) tags for the current language
519
+ if( $expect !== $actual ){
520
  // exception when two forms only and the first accepts n=1 and second n=2
521
  if( 2 === $nplurals && 0 === $formula->execute(1) && 1 === $formula->execute(2) ){
522
  $tags = ['one','other'];
535
 
536
  /**
537
  * Crude normalizer for a plural equation such that similar formulae can be compared.
538
+ * @param string $str original plural equation
539
  * @return string signature for comparison
540
  */
541
  private static function hashPlural( $str ){
src/admin/bundle/BaseController.php CHANGED
@@ -28,6 +28,19 @@ abstract class Loco_admin_bundle_BaseController extends Loco_mvc_AdminController
28
  }
29
 
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  /**
32
  * Commit bundle config to database
33
  * @return Loco_admin_bundle_BaseController
28
  }
29
 
30
 
31
+ /**
32
+ * Get current project's text domain if available
33
+ * @return string
34
+ */
35
+ public function getDomain(){
36
+ $project = $this->getOptionalProject();
37
+ if( $project instanceof Loco_package_Project ){
38
+ return $project->getDomain()->getName();
39
+ }
40
+ return '';
41
+ }
42
+
43
+
44
  /**
45
  * Commit bundle config to database
46
  * @return Loco_admin_bundle_BaseController
src/admin/file/DeleteController.php CHANGED
@@ -7,7 +7,7 @@ class Loco_admin_file_DeleteController extends Loco_admin_file_BaseController {
7
 
8
  /**
9
  * Expand single path to all files that will be deleted
10
- * @param Loco_fs_File primary file being deleted, probably the PO
11
  * @return array
12
  */
13
  private function expandFiles( Loco_fs_File $file ){
@@ -18,6 +18,7 @@ class Loco_admin_file_DeleteController extends Loco_admin_file_BaseController {
18
  $ext = $file->extension();
19
  throw new Loco_error_Exception( sprintf('Refusing to delete a %s file', strtoupper($ext) ) );
20
  }
 
21
  return $siblings->expand();
22
  }
23
 
7
 
8
  /**
9
  * Expand single path to all files that will be deleted
10
+ * @param Loco_fs_File $file primary file being deleted, probably the PO
11
  * @return array
12
  */
13
  private function expandFiles( Loco_fs_File $file ){
18
  $ext = $file->extension();
19
  throw new Loco_error_Exception( sprintf('Refusing to delete a %s file', strtoupper($ext) ) );
20
  }
21
+ $siblings->setDomain( $this->getDomain() );
22
  return $siblings->expand();
23
  }
24
 
src/admin/file/MoveController.php CHANGED
@@ -15,6 +15,7 @@ class Loco_admin_file_MoveController extends Loco_admin_file_BaseController {
15
  /* @var Loco_fs_File $file */
16
  if( $file->exists() && ! $file->isDirectory() ){
17
  $files = new Loco_fs_Siblings($file);
 
18
  // nonce action will be specific to file for extra security
19
  $path = $file->getPath();
20
  $action = 'move:'.$path;
@@ -98,6 +99,7 @@ class Loco_admin_file_MoveController extends Loco_admin_file_BaseController {
98
  if( wp_redirect($href) ){
99
  exit;
100
  }
 
101
  break;
102
  }
103
  }
@@ -116,14 +118,15 @@ class Loco_admin_file_MoveController extends Loco_admin_file_BaseController {
116
  return $fail;
117
  }
118
  // relocation requires knowing text domain and locale
 
119
  try {
120
  $project = $this->getProject();
 
121
  }
122
  catch( Loco_error_Exception $e ){
123
  Loco_error_AdminNotices::warn($e->getMessage());
124
  $project = null;
125
  }
126
- $files = new Loco_fs_Siblings($file);
127
  $file = new Loco_fs_LocaleFile( $files->getSource() );
128
  $locale = $file->getLocale();
129
  // switch between canonical move and custom file path mode
15
  /* @var Loco_fs_File $file */
16
  if( $file->exists() && ! $file->isDirectory() ){
17
  $files = new Loco_fs_Siblings($file);
18
+ $files->setDomain( $this->getDomain() );
19
  // nonce action will be specific to file for extra security
20
  $path = $file->getPath();
21
  $action = 'move:'.$path;
99
  if( wp_redirect($href) ){
100
  exit;
101
  }
102
+ // end pseudo loop
103
  break;
104
  }
105
  }
118
  return $fail;
119
  }
120
  // relocation requires knowing text domain and locale
121
+ $files = new Loco_fs_Siblings($file);
122
  try {
123
  $project = $this->getProject();
124
+ $files->setDomain( $project->getDomain()->getName() );
125
  }
126
  catch( Loco_error_Exception $e ){
127
  Loco_error_AdminNotices::warn($e->getMessage());
128
  $project = null;
129
  }
 
130
  $file = new Loco_fs_LocaleFile( $files->getSource() );
131
  $locale = $file->getLocale();
132
  // switch between canonical move and custom file path mode
src/ajax/MsginitController.php CHANGED
@@ -77,7 +77,7 @@ class Loco_ajax_MsginitController extends Loco_ajax_common_BundleController {
77
  if( $post->json ){
78
  $mergejson = true;
79
  $siblings = new Loco_fs_Siblings($potfile);
80
- $jsons = $siblings->getJsons();
81
  if( $jsons ){
82
  $refs = clone $data;
83
  $merge = new Loco_gettext_Matcher();
77
  if( $post->json ){
78
  $mergejson = true;
79
  $siblings = new Loco_fs_Siblings($potfile);
80
+ $jsons = $siblings->getJsons($domain);
81
  if( $jsons ){
82
  $refs = clone $data;
83
  $merge = new Loco_gettext_Matcher();
src/ajax/SyncController.php CHANGED
@@ -77,10 +77,10 @@ class Loco_ajax_SyncController extends Loco_mvc_AjaxController {
77
  if( 'pot' !== $potfile->extension() ){
78
  $translate = $opts->mergeMsgstr();
79
  }
80
- // related JSONs will only wor if source is a localized PO.
81
  if( $opts->mergeJson() ){
82
  $siblings = new Loco_fs_Siblings($potfile);
83
- $syncjsons = $siblings->getJsons();
84
  }
85
  }
86
  // else extract POT from source code
77
  if( 'pot' !== $potfile->extension() ){
78
  $translate = $opts->mergeMsgstr();
79
  }
80
+ // related JSONs will only sync if source is a localized PO.
81
  if( $opts->mergeJson() ){
82
  $siblings = new Loco_fs_Siblings($potfile);
83
+ $syncjsons = $siblings->getJsons( $project->getDomain()->getName() );
84
  }
85
  }
86
  // else extract POT from source code
src/cli/Commands.php CHANGED
@@ -12,7 +12,7 @@ class Loco_cli_Commands {
12
  * ## OPTIONS
13
  *
14
  * [<filter>]
15
- * : Restrict to a type of bundle (plugins|themes|core) or a specific Text Domain
16
  *
17
  * [--locale=<code>]
18
  * : Restrict to one or more locales. Separate multiple codes with commas.
@@ -30,9 +30,8 @@ class Loco_cli_Commands {
30
  *
31
  * wp loco sync plugins
32
  *
33
- *
34
- * @param string[]
35
- * @param string[]
36
  */
37
  public function sync( $args, $opts ){
38
  if( array_key_exists('fuzziness',$opts) ){
@@ -58,7 +57,7 @@ class Loco_cli_Commands {
58
  * ## OPTIONS
59
  *
60
  * [<filter>]
61
- * : Restrict to a type of bundle (plugins|themes|core) or a specific Text Domain
62
  *
63
  * [--maxsize=<size>]
64
  * : Override plugin settings for maximum PHP file size
@@ -73,8 +72,8 @@ class Loco_cli_Commands {
73
  *
74
  * wp loco extract core --maxsize=400K
75
  *
76
- * @param string[]
77
- * @param string[]
78
  */
79
  public function extract( $args, $opts ){
80
  try {
@@ -100,7 +99,7 @@ class Loco_cli_Commands {
100
  * ## OPTIONS
101
  *
102
  * [<filter>]
103
- * : Restrict to a type of bundle (plugins|themes|core) or a specific Text Domain
104
  *
105
  * [--locale=<code>]
106
  * : Restrict to one or more locales. Separate multiple codes with commas.
@@ -112,8 +111,8 @@ class Loco_cli_Commands {
112
  *
113
  * wp loco fetch loco-translate --locale=en_GB
114
  *
115
- * @param string[]
116
- * @param string[]
117
  */
118
  public function fetch( $args, $opts ){
119
  try {
12
  * ## OPTIONS
13
  *
14
  * [<filter>]
15
+ * : Restrict to a type of bundle (plugins|themes|core); a single bundle (e.g. plugins:<handle>); or a Text Domain
16
  *
17
  * [--locale=<code>]
18
  * : Restrict to one or more locales. Separate multiple codes with commas.
30
  *
31
  * wp loco sync plugins
32
  *
33
+ * @param string[] $args
34
+ * @param string[] $opts
 
35
  */
36
  public function sync( $args, $opts ){
37
  if( array_key_exists('fuzziness',$opts) ){
57
  * ## OPTIONS
58
  *
59
  * [<filter>]
60
+ * : Restrict to a type of bundle (plugins|themes|core); a single bundle (e.g. plugins:<handle>); or a Text Domain
61
  *
62
  * [--maxsize=<size>]
63
  * : Override plugin settings for maximum PHP file size
72
  *
73
  * wp loco extract core --maxsize=400K
74
  *
75
+ * @param string[] $args
76
+ * @param string[] $opts
77
  */
78
  public function extract( $args, $opts ){
79
  try {
99
  * ## OPTIONS
100
  *
101
  * [<filter>]
102
+ * : Restrict to a type of bundle (plugins|themes|core); a single bundle (e.g. plugins:<handle>); or a Text Domain
103
  *
104
  * [--locale=<code>]
105
  * : Restrict to one or more locales. Separate multiple codes with commas.
111
  *
112
  * wp loco fetch loco-translate --locale=en_GB
113
  *
114
+ * @param string[] $args
115
+ * @param string[] $opts
116
  */
117
  public function fetch( $args, $opts ){
118
  try {
src/cli/SyncCommand.php CHANGED
@@ -98,8 +98,8 @@ abstract class Loco_cli_SyncCommand {
98
  $matcher->loadRefs($ref,$translate );
99
  // Merge jsons if configured and available
100
  if( $opts->mergeJson() ){
101
- $siblings = new Loco_fs_Siblings($potfile);
102
- $njson = $matcher->loadJsons( $siblings->getJsons() );
103
  if( 0 !== $njson ){
104
  Loco_cli_Utils::debug('> merged json files:%u', $njson );
105
  }
98
  $matcher->loadRefs($ref,$translate );
99
  // Merge jsons if configured and available
100
  if( $opts->mergeJson() ){
101
+ $siblings = new Loco_fs_Siblings($pofile);
102
+ $njson = $matcher->loadJsons( $siblings->getJsons( $project->getDomain()->getName() ) );
103
  if( 0 !== $njson ){
104
  Loco_cli_Utils::debug('> merged json files:%u', $njson );
105
  }
src/cli/Utils.php CHANGED
@@ -7,26 +7,40 @@ abstract class Loco_cli_Utils {
7
 
8
  /**
9
  * Collect translation sets according to type/domain filter
10
- * @param string Type of bundle (plugins|themes|core) or a specific Text Domain
11
  * @return Loco_package_Project[]
12
  */
13
  public static function collectProjects( $filter ){
14
  $projects = [];
15
- $filter = strtolower($filter);
16
- // bundle type filter
17
- if( 'plugins' === $filter ){
18
- $bundles = Loco_package_Plugin::getAll();
19
- $filter = null;
20
- }
21
- else if( 'themes' === $filter ){
22
- $bundles = Loco_package_Theme::getAll();
23
- $filter = null;
24
- }
25
- else if( 'core' === $filter ) {
26
- $bundles = [ Loco_package_Core::create() ];
27
- $filter = null;
 
 
 
 
 
 
 
 
 
 
 
 
 
28
  }
 
29
  else {
 
30
  $bundles = [ Loco_package_Core::create() ];
31
  $bundles = array_merge( $bundles, Loco_package_Plugin::getAll() );
32
  $bundles = array_merge( $bundles, Loco_package_Theme::getAll() );
@@ -34,7 +48,10 @@ abstract class Loco_cli_Utils {
34
  /* @var Loco_package_Project $project */
35
  foreach( $bundles as $bundle ){
36
  foreach( $bundle as $project ){
37
- if( $filter && strtolower( $project->getDomain() ) !== $filter ){
 
 
 
38
  continue;
39
  }
40
  $projects[] = $project;
7
 
8
  /**
9
  * Collect translation sets according to type/domain filter
 
10
  * @return Loco_package_Project[]
11
  */
12
  public static function collectProjects( $filter ){
13
  $projects = [];
14
+ $domain = null;
15
+ $slug = null;
16
+ // bundle type filter, with optional argument
17
+ if( preg_match('/^(plugins|themes|core)(?::(.+))?/i',$filter,$matched) ){
18
+ $type = strtolower($matched[1]);
19
+ $handle = isset($matched[2]) ? $matched[2] : '';
20
+ if( 'plugins' === $type ){
21
+ if( $handle ){
22
+ $bundles = [ Loco_package_Plugin::create($handle) ];
23
+ }
24
+ else {
25
+ $bundles = Loco_package_Plugin::getAll();
26
+ }
27
+ }
28
+ else if( 'themes' === $type ){
29
+ if( $handle ){
30
+ $bundles = [ Loco_package_Theme::create($handle) ];
31
+ }
32
+ else {
33
+ $bundles = Loco_package_Theme::getAll();
34
+ }
35
+ }
36
+ else {
37
+ $bundles = [ Loco_package_Core::create() ];
38
+ $slug = $handle;
39
+ }
40
  }
41
+ // else fall back to text domain filter
42
  else {
43
+ $domain = $filter;
44
  $bundles = [ Loco_package_Core::create() ];
45
  $bundles = array_merge( $bundles, Loco_package_Plugin::getAll() );
46
  $bundles = array_merge( $bundles, Loco_package_Theme::getAll() );
48
  /* @var Loco_package_Project $project */
49
  foreach( $bundles as $bundle ){
50
  foreach( $bundle as $project ){
51
+ if( $domain && $project->getDomain()->getName() !== $domain ){
52
+ continue;
53
+ }
54
+ if( $slug && $project->getSlug() !== $slug ){
55
  continue;
56
  }
57
  $projects[] = $project;
src/config/ArrayModel.php CHANGED
@@ -4,12 +4,25 @@
4
  */
5
  class Loco_config_ArrayModel extends Loco_config_Model {
6
 
 
 
 
 
 
7
 
8
  /**
9
  * {@inheritdoc}
10
  */
11
  public function createDom(){
12
- return new LocoConfigDocument( ['#document', [], [] ] );
 
 
 
 
 
 
 
 
13
  }
14
 
15
 
@@ -45,7 +58,7 @@ class Loco_config_ArrayModel extends Loco_config_Model {
45
  $match = new LocoConfigNodeList;
46
  $query = explode('/', $query );
47
  // absolute path always starts in document
48
- if( $absolute = empty($query[0]) ){
49
  $match->append( $this->getDom() );
50
  }
51
  // else start with base for relative path
@@ -95,7 +108,7 @@ abstract class LocoConfigNode implements IteratorAggregate {
95
 
96
  /**
97
  * Raw data of internal format
98
- * @var array
99
  */
100
  protected $data;
101
 
@@ -110,15 +123,24 @@ abstract class LocoConfigNode implements IteratorAggregate {
110
  */
111
  abstract public function export();
112
 
 
 
 
113
  final public function __construct( $data ){
114
  $this->data = $data;
115
  }
116
 
 
 
 
117
  protected function get_nodeName(){
118
  return $this->data[0];
119
  }
120
-
121
 
 
 
 
 
122
  protected function get_childNodes(){
123
  return $this->getIterator();
124
  }
@@ -129,6 +151,7 @@ abstract class LocoConfigNode implements IteratorAggregate {
129
  if( is_callable($method) ){
130
  return call_user_func( $method );
131
  }
 
132
  }
133
 
134
 
@@ -220,13 +243,13 @@ class LocoConfigNodeList implements Iterator, Countable, ArrayAccess {
220
  }
221
 
222
  #[ReturnTypeWillChange]
223
- public function offsetExists( $i ){
224
- return $i >= 0 && $i < $this->n;
225
  }
226
 
227
  #[ReturnTypeWillChange]
228
- public function offsetGet( $i ){
229
- $node = $this->nodes[$i];
230
  if( ! $node instanceof LocoConfigNode ){
231
  if( is_array($node) ){
232
  $node = new LocoConfigElement( $node );
@@ -234,7 +257,7 @@ class LocoConfigNodeList implements Iterator, Countable, ArrayAccess {
234
  else {
235
  $node = new LocoConfigText( $node );
236
  }
237
- $this->nodes[$i] = $node;
238
  }
239
  return $node;
240
  }
@@ -243,16 +266,16 @@ class LocoConfigNodeList implements Iterator, Countable, ArrayAccess {
243
  * @codeCoverageIgnore
244
  */
245
  #[ReturnTypeWillChange]
246
- public function offsetSet( $i, $value ){
247
- throw new Exception('Use append');
248
  }
249
 
250
  /**
251
  * @codeCoverageIgnore
252
  */
253
  #[ReturnTypeWillChange]
254
- public function offsetUnset( $i ){
255
- throw new Exception('Read only');
256
  }
257
 
258
 
@@ -284,6 +307,7 @@ class LocoConfigNodeList implements Iterator, Countable, ArrayAccess {
284
 
285
  /**
286
  * Document
 
287
  */
288
  class LocoConfigDocument extends LocoConfigNode {
289
 
@@ -294,7 +318,7 @@ class LocoConfigDocument extends LocoConfigNode {
294
  $this->data = $data;
295
  $this->children = null;
296
  }
297
-
298
 
299
  /**
300
  * @return LocoConfigElement
@@ -329,9 +353,8 @@ class LocoConfigDocument extends LocoConfigNode {
329
  * Override to keep single element root
330
  */
331
  public function export(){
332
- if( $root = $this->get_documentElement() ){
333
- return $root->export();
334
- }
335
  }
336
 
337
  }
@@ -379,7 +402,9 @@ class LocoConfigElement extends LocoConfigNode {
379
 
380
 
381
  /**
382
- * Text
 
 
383
  */
384
  class LocoConfigText extends LocoConfigNode {
385
 
@@ -399,10 +424,12 @@ class LocoConfigText extends LocoConfigNode {
399
  return (string) $this->data;
400
  }
401
 
 
402
  public function get_nodeValue(){
403
  return (string) $this->data;
404
  }
405
-
 
406
  public function get_textContent(){
407
  return (string) $this->data;
408
  }
4
  */
5
  class Loco_config_ArrayModel extends Loco_config_Model {
6
 
7
+ /**
8
+ * @var LocoConfigDocument
9
+ */
10
+ private $dom;
11
+
12
 
13
  /**
14
  * {@inheritdoc}
15
  */
16
  public function createDom(){
17
+ $this->dom = new LocoConfigDocument( ['#document', [], [] ] );
18
+ }
19
+
20
+
21
+ /**
22
+ * @return LocoConfigDocument
23
+ */
24
+ public function getDom(){
25
+ return $this->dom;
26
  }
27
 
28
 
58
  $match = new LocoConfigNodeList;
59
  $query = explode('/', $query );
60
  // absolute path always starts in document
61
+ if( empty($query[0]) ){
62
  $match->append( $this->getDom() );
63
  }
64
  // else start with base for relative path
108
 
109
  /**
110
  * Raw data of internal format
111
+ * @var array|string
112
  */
113
  protected $data;
114
 
123
  */
124
  abstract public function export();
125
 
126
+ /**
127
+ * @param array|string $data
128
+ */
129
  final public function __construct( $data ){
130
  $this->data = $data;
131
  }
132
 
133
+ /**
134
+ * @internal
135
+ */
136
  protected function get_nodeName(){
137
  return $this->data[0];
138
  }
 
139
 
140
+
141
+ /**
142
+ * @internal
143
+ */
144
  protected function get_childNodes(){
145
  return $this->getIterator();
146
  }
151
  if( is_callable($method) ){
152
  return call_user_func( $method );
153
  }
154
+ return null;
155
  }
156
 
157
 
243
  }
244
 
245
  #[ReturnTypeWillChange]
246
+ public function offsetExists( $offset ){
247
+ return $offset >= 0 && $offset < $this->n;
248
  }
249
 
250
  #[ReturnTypeWillChange]
251
+ public function offsetGet( $offset ){
252
+ $node = $this->nodes[$offset];
253
  if( ! $node instanceof LocoConfigNode ){
254
  if( is_array($node) ){
255
  $node = new LocoConfigElement( $node );
257
  else {
258
  $node = new LocoConfigText( $node );
259
  }
260
+ $this->nodes[$offset] = $node;
261
  }
262
  return $node;
263
  }
266
  * @codeCoverageIgnore
267
  */
268
  #[ReturnTypeWillChange]
269
+ public function offsetSet( $offset, $value ){
270
+ throw new LogicException('Use append');
271
  }
272
 
273
  /**
274
  * @codeCoverageIgnore
275
  */
276
  #[ReturnTypeWillChange]
277
+ public function offsetUnset( $offset ){
278
+ throw new LogicException('Read only');
279
  }
280
 
281
 
307
 
308
  /**
309
  * Document
310
+ * @property-read LocoConfigElement $documentElement
311
  */
312
  class LocoConfigDocument extends LocoConfigNode {
313
 
318
  $this->data = $data;
319
  $this->children = null;
320
  }
321
+
322
 
323
  /**
324
  * @return LocoConfigElement
353
  * Override to keep single element root
354
  */
355
  public function export(){
356
+ $root = $this->get_documentElement();
357
+ return $root ? $root->export() : null;
 
358
  }
359
 
360
  }
402
 
403
 
404
  /**
405
+ * Text node
406
+ * @property-read string $nodeValue
407
+ * @property-read string $textContent
408
  */
409
  class LocoConfigText extends LocoConfigNode {
410
 
424
  return (string) $this->data;
425
  }
426
 
427
+ /** @internal */
428
  public function get_nodeValue(){
429
  return (string) $this->data;
430
  }
431
+
432
+ /** @internal */
433
  public function get_textContent(){
434
  return (string) $this->data;
435
  }
src/config/BundleReader.php CHANGED
@@ -19,7 +19,6 @@ class Loco_config_BundleReader {
19
 
20
 
21
  /**
22
- * @param Loco_fs_File loco.xml file
23
  * @return Loco_package_Bundle
24
  */
25
  public function loadXml( Loco_fs_File $file ){
19
 
20
 
21
  /**
 
22
  * @return Loco_package_Bundle
23
  */
24
  public function loadXml( Loco_fs_File $file ){
src/config/BundleWriter.php CHANGED
@@ -69,7 +69,8 @@ class Loco_config_BundleWriter implements JsonSerializable {
69
  $systemTargets = $bundle->getSystemTargets();
70
 
71
  $dom = $model->getDom();
72
- $root = $dom->appendChild( $dom->createElement('bundle') );
 
73
  $root->setAttribute( 'name', $bundle->getName() );
74
 
75
  /*/ additional headers for information only (not read back in)
@@ -78,11 +79,13 @@ class Loco_config_BundleWriter implements JsonSerializable {
78
  }*/
79
 
80
  foreach( $bundle->exportGrouped() as $domainName => $projects ){
81
- $domainElement = $root->appendChild( $dom->createElement('domain') );
 
82
  $domainElement->setAttribute( 'name', $domainName );
83
  /* @var $proj Loco_package_Project */
84
  foreach( $projects as $proj ){
85
- $projElement = $domainElement->appendChild( $dom->createElement('project') );
 
86
  // add project name even if it's the same as the bundle name
87
  // when loading however, missing name will default to bundle name
88
  $value = $proj->getName() or $value = $bundle->getName();
@@ -93,7 +96,7 @@ class Loco_config_BundleWriter implements JsonSerializable {
93
  // <source>
94
  // zero or more source file locations
95
  $sourcesElement = $dom->createElement('source');
96
- /* @var $file Loco_fs_Directory */
97
  foreach( $proj->getConfiguredSources() as $file ){
98
  $sourcesElement->appendChild( $model->createFileElement($file) );
99
  }
@@ -131,7 +134,8 @@ class Loco_config_BundleWriter implements JsonSerializable {
131
  // <template>
132
  // add single POT template location
133
  if( $file = $proj->getPot() ){
134
- $templateElement = $projElement->appendChild( $dom->createElement('template') );
 
135
  $templateElement->appendChild( $model->createFileElement($file) );
136
  // template may be protected from end-user tampering
137
  if( $proj->isPotLocked() ){
69
  $systemTargets = $bundle->getSystemTargets();
70
 
71
  $dom = $model->getDom();
72
+ $root = $dom->createElement('bundle') ;
73
+ $dom->appendChild($root);
74
  $root->setAttribute( 'name', $bundle->getName() );
75
 
76
  /*/ additional headers for information only (not read back in)
79
  }*/
80
 
81
  foreach( $bundle->exportGrouped() as $domainName => $projects ){
82
+ $domainElement = $dom->createElement('domain');
83
+ $root->appendChild( $domainElement );
84
  $domainElement->setAttribute( 'name', $domainName );
85
  /* @var $proj Loco_package_Project */
86
  foreach( $projects as $proj ){
87
+ $projElement = $dom->createElement('project');
88
+ $domainElement->appendChild($projElement);
89
  // add project name even if it's the same as the bundle name
90
  // when loading however, missing name will default to bundle name
91
  $value = $proj->getName() or $value = $bundle->getName();
96
  // <source>
97
  // zero or more source file locations
98
  $sourcesElement = $dom->createElement('source');
99
+ /* @var Loco_fs_File $file */
100
  foreach( $proj->getConfiguredSources() as $file ){
101
  $sourcesElement->appendChild( $model->createFileElement($file) );
102
  }
134
  // <template>
135
  // add single POT template location
136
  if( $file = $proj->getPot() ){
137
+ $templateElement = $dom->createElement('template');
138
+ $projElement->appendChild($templateElement);
139
  $templateElement->appendChild( $model->createFileElement($file) );
140
  // template may be protected from end-user tampering
141
  if( $proj->isPotLocked() ){
src/config/FormModel.php CHANGED
@@ -128,8 +128,9 @@ class Loco_config_FormModel extends Loco_config_ArrayModel {
128
  // transform posted data into internal model:
129
  // deliberately not configuring bundle object at this point. simply converting data for storage.
130
  $dom = $this->getDom();
131
- $root = $dom->appendChild( $dom->createElement('bundle') );
132
  $root->setAttribute( 'name', $name );
 
133
 
134
  // bundle level excluded paths
135
  if( $nodes = array_intersect_key( $post->getArrayCopy(), [ 'exclude' => '' ] ) ) {
@@ -138,7 +139,7 @@ class Loco_config_FormModel extends Loco_config_ArrayModel {
138
 
139
  // collect all projects grouped by domain
140
  $domains = [];
141
- foreach( $confs as $i => $conf ){
142
  if( ! empty($conf['removed']) ){
143
  continue;
144
  }
@@ -159,8 +160,9 @@ class Loco_config_FormModel extends Loco_config_ArrayModel {
159
  }
160
  // add all domains and their projects
161
  foreach( $domains as $name => $projects ){
162
- $parent = $root->appendChild( $dom->createElement('domain') );
163
- $parent->setAttribute( 'name', $name );
 
164
  /* @var $project LocoConfigElement */
165
  foreach( $projects as $project ){
166
  $parent->appendChild( $project );
@@ -183,13 +185,13 @@ class Loco_config_FormModel extends Loco_config_ArrayModel {
183
  if( 'file' === $name || 'directory' === $name || 'path' === $name ){
184
  // form model has multiline "path" nodes which we'll expand from non-empty lines
185
  // resolving empty paths to "." must be done elsewhere. here empty means ignore.
186
- foreach( preg_split('/\\R/', trim( $data,"\n\r"), -1, PREG_SPLIT_NO_EMPTY ) as $path ){
187
  $ext = pathinfo( $path, PATHINFO_EXTENSION );
188
  $child = $parent->appendChild( $dom->createElement( $ext ? 'file' : 'directory' ) );
189
  $child->appendChild( $dom->createTextNode($path) );
190
  }
191
  }
192
- // else assume valud is an attribute
193
  else {
194
  $parent->setAttribute( $name, $data );
195
  }
@@ -201,7 +203,8 @@ class Loco_config_FormModel extends Loco_config_ArrayModel {
201
  throw new InvalidArgumentException('Invalid datatype');
202
  }
203
  else {
204
- $child = $parent->appendChild( $dom->createElement($name) );
 
205
  $this->loadStruct( $child, $data );
206
  }
207
  }
128
  // transform posted data into internal model:
129
  // deliberately not configuring bundle object at this point. simply converting data for storage.
130
  $dom = $this->getDom();
131
+ $root = $dom->createElement('bundle');
132
  $root->setAttribute( 'name', $name );
133
+ $dom->appendChild($root);
134
 
135
  // bundle level excluded paths
136
  if( $nodes = array_intersect_key( $post->getArrayCopy(), [ 'exclude' => '' ] ) ) {
139
 
140
  // collect all projects grouped by domain
141
  $domains = [];
142
+ foreach( $confs as $conf ){
143
  if( ! empty($conf['removed']) ){
144
  continue;
145
  }
160
  }
161
  // add all domains and their projects
162
  foreach( $domains as $name => $projects ){
163
+ $parent = $dom->createElement('domain');
164
+ $parent->setAttribute('name',$name);
165
+ $root->appendChild($parent);
166
  /* @var $project LocoConfigElement */
167
  foreach( $projects as $project ){
168
  $parent->appendChild( $project );
185
  if( 'file' === $name || 'directory' === $name || 'path' === $name ){
186
  // form model has multiline "path" nodes which we'll expand from non-empty lines
187
  // resolving empty paths to "." must be done elsewhere. here empty means ignore.
188
+ foreach( preg_split('/[\\r\\n]+/', trim( $data,"\n\r"), -1, PREG_SPLIT_NO_EMPTY ) as $path ){
189
  $ext = pathinfo( $path, PATHINFO_EXTENSION );
190
  $child = $parent->appendChild( $dom->createElement( $ext ? 'file' : 'directory' ) );
191
  $child->appendChild( $dom->createTextNode($path) );
192
  }
193
  }
194
+ // else assume value is an attribute
195
  else {
196
  $parent->setAttribute( $name, $data );
197
  }
203
  throw new InvalidArgumentException('Invalid datatype');
204
  }
205
  else {
206
+ $child = $dom->createElement($name);
207
+ $parent->appendChild($child);
208
  $this->loadStruct( $child, $data );
209
  }
210
  }
src/config/Model.php CHANGED
@@ -3,11 +3,6 @@
3
  * Generic configuration model serializer for portable Loco configs
4
  */
5
  abstract class Loco_config_Model {
6
-
7
- /**
8
- * @var LocoConfigDocument
9
- */
10
- private $dom;
11
 
12
  /**
13
  * Root directory for calculating relative file paths
@@ -16,7 +11,7 @@ abstract class Loco_config_Model {
16
  private $base;
17
 
18
  /**
19
- * registry of location contants that may have been overridden
20
  * @var array
21
  */
22
  private $dirs;
@@ -27,17 +22,22 @@ abstract class Loco_config_Model {
27
  abstract public function query( $query, $context = null );
28
 
29
  /**
30
- * @return LocoConfigDocument
31
  */
32
  abstract public function createDom();
33
 
 
 
 
 
 
34
 
35
  /**
36
- *
37
  */
38
  final public function __construct(){
39
  $this->dirs = [];
40
- $this->dom = $this->createDom();
41
  $this->setDirectoryPath( loco_constant('ABSPATH') );
42
  }
43
 
@@ -54,19 +54,11 @@ abstract class Loco_config_Model {
54
  $this->dirs[$key] = $path;
55
  }
56
  }
57
-
58
-
59
- /**
60
- * @return LocoConfigDocument
61
- */
62
- public function getDom(){
63
- return $this->dom;
64
- }
65
 
66
 
67
  /**
68
  * Evaluate a name constant pointing to a file location
69
- * @param string one of 'LOCO_LANG_DIR', 'WP_LANG_DIR', 'WP_PLUGIN_DIR', 'WPMU_PLUGIN_DIR', 'WP_CONTENT_DIR', or 'ABSPATH'
70
  */
71
  public function getDirectoryPath( $key = null ){
72
  if( is_null($key) ){
@@ -87,7 +79,7 @@ abstract class Loco_config_Model {
87
  * @return LocoConfigElement
88
  */
89
  public function createFileElement( Loco_fs_File $file ){
90
- $node = $this->dom->createElement( $file->isDirectory() ? 'directory' : 'file' );
91
  if( $path = $file->getPath() ) {
92
  // Calculate relative path to the config file itself
93
  $relpath = $file->getRelativePath( $this->base );
@@ -104,7 +96,7 @@ abstract class Loco_config_Model {
104
  $relpath = substr( $path, $len );
105
  break;
106
  }
107
- } // @codeCoverageIgnore
108
  }
109
  }
110
  $path = $relpath;
@@ -114,20 +106,20 @@ abstract class Loco_config_Model {
114
  }
115
 
116
 
117
-
118
  /**
119
- * @param LocoConfigElement
120
- * @param string
121
  * @return LocoConfigText
122
  */
123
  protected function setFileElementPath( $node, $path ){
124
- return $node->appendChild( $this->dom->createTextNode($path) );
 
 
125
  }
126
 
127
 
128
-
129
  /**
130
- * @param LocoConfigElement
131
  * @return Loco_fs_File
132
  */
133
  public function evaluateFileElement( $el ){
@@ -163,9 +155,9 @@ abstract class Loco_config_Model {
163
  }
164
 
165
 
166
-
167
  /**
168
- * @param LocoConfigElement
 
169
  * @return bool
170
  */
171
  public function evaulateBooleanAttribute( $el, $attr ){
3
  * Generic configuration model serializer for portable Loco configs
4
  */
5
  abstract class Loco_config_Model {
 
 
 
 
 
6
 
7
  /**
8
  * Root directory for calculating relative file paths
11
  private $base;
12
 
13
  /**
14
+ * registry of location constants that may have been overridden
15
  * @var array
16
  */
17
  private $dirs;
22
  abstract public function query( $query, $context = null );
23
 
24
  /**
25
+ * @return void
26
  */
27
  abstract public function createDom();
28
 
29
+ /**
30
+ * @return DOMDocument|LocoConfigDocument
31
+ */
32
+ abstract public function getDom();
33
+
34
 
35
  /**
36
+ * Super constructor for all model types
37
  */
38
  final public function __construct(){
39
  $this->dirs = [];
40
+ $this->createDom();
41
  $this->setDirectoryPath( loco_constant('ABSPATH') );
42
  }
43
 
54
  $this->dirs[$key] = $path;
55
  }
56
  }
 
 
 
 
 
 
 
 
57
 
58
 
59
  /**
60
  * Evaluate a name constant pointing to a file location
61
+ * @param string|null $key one of 'LOCO_LANG_DIR', 'WP_LANG_DIR', 'WP_PLUGIN_DIR', 'WPMU_PLUGIN_DIR', 'WP_CONTENT_DIR', or 'ABSPATH'
62
  */
63
  public function getDirectoryPath( $key = null ){
64
  if( is_null($key) ){
79
  * @return LocoConfigElement
80
  */
81
  public function createFileElement( Loco_fs_File $file ){
82
+ $node = $this->getDom()->createElement( $file->isDirectory() ? 'directory' : 'file' );
83
  if( $path = $file->getPath() ) {
84
  // Calculate relative path to the config file itself
85
  $relpath = $file->getRelativePath( $this->base );
96
  $relpath = substr( $path, $len );
97
  break;
98
  }
99
+ }
100
  }
101
  }
102
  $path = $relpath;
106
  }
107
 
108
 
 
109
  /**
110
+ * @param LocoConfigElement $node
111
+ * @param string $path
112
  * @return LocoConfigText
113
  */
114
  protected function setFileElementPath( $node, $path ){
115
+ $text = $this->getDom()->createTextNode($path);
116
+ $node->appendChild($text);
117
+ return $text;
118
  }
119
 
120
 
 
121
  /**
122
+ * @param LocoConfigElement $el
123
  * @return Loco_fs_File
124
  */
125
  public function evaluateFileElement( $el ){
155
  }
156
 
157
 
 
158
  /**
159
+ * @param LocoConfigElement $el
160
+ * @param string $attr
161
  * @return bool
162
  */
163
  public function evaulateBooleanAttribute( $el, $attr ){
src/config/XMLModel.php CHANGED
@@ -3,6 +3,11 @@
3
  * Holds a bundle definition in a DOM document
4
  */
5
  class Loco_config_XMLModel extends Loco_config_Model {
 
 
 
 
 
6
 
7
  /**
8
  * @var DOMXpath
@@ -18,7 +23,14 @@ class Loco_config_XMLModel extends Loco_config_Model {
18
  $dom->formatOutput = true;
19
  $dom->registerNodeClass('DOMElement','LocoConfig_DOMElement');
20
  $this->xpath = new DOMXPath($dom);
21
- return $dom;
 
 
 
 
 
 
 
22
  }
23
 
24
 
@@ -47,7 +59,7 @@ class Loco_config_XMLModel extends Loco_config_Model {
47
  // parse with silent errors, clearing after
48
  $used_errors = libxml_use_internal_errors(true);
49
 
50
- $result = $dom->loadXML( $source, LIBXML_NONET );
51
  unset( $source );
52
 
53
  // fetch errors and ensure clean for next run.
@@ -57,21 +69,22 @@ class Loco_config_XMLModel extends Loco_config_Model {
57
 
58
  // Throw exception if error level exceeds current tolerance
59
  if( $errors ){
60
- /* @var $error LibXMLError */
61
  foreach( $errors as $error ){
62
  if( $error->level >= LIBXML_ERR_FATAL ){
63
- $e = new Loco_error_XmlParseException( trim($error->message) );
64
- //$e->setContext( $error->line, $error->column, $source );
65
- throw $e;
66
- } // @codeCoverageIgnoreStart
67
  }
68
  }
69
- // @codeCoverageIgnoreEnd
70
 
71
- // Not currently validating against a DTD, but may as well pre-empt generic model loading errors
72
- if( ! $dom->documentElement || 'bundle' !== $dom->documentElement->nodeName ){
 
73
  throw new Loco_error_XmlParseException('Expected <bundle> document element');
74
  }
 
 
 
75
 
76
  $this->xpath = new DOMXPath($dom);
77
  }
3
  * Holds a bundle definition in a DOM document
4
  */
5
  class Loco_config_XMLModel extends Loco_config_Model {
6
+
7
+ /**
8
+ * @var DOMDocument
9
+ */
10
+ private $dom;
11
 
12
  /**
13
  * @var DOMXpath
23
  $dom->formatOutput = true;
24
  $dom->registerNodeClass('DOMElement','LocoConfig_DOMElement');
25
  $this->xpath = new DOMXPath($dom);
26
+ $this->dom = $dom;
27
+ }
28
+
29
+ /**
30
+ * @return DOMDocument
31
+ */
32
+ public function getDom(){
33
+ return $this->dom;
34
  }
35
 
36
 
59
  // parse with silent errors, clearing after
60
  $used_errors = libxml_use_internal_errors(true);
61
 
62
+ $dom->loadXML( $source, LIBXML_NONET );
63
  unset( $source );
64
 
65
  // fetch errors and ensure clean for next run.
69
 
70
  // Throw exception if error level exceeds current tolerance
71
  if( $errors ){
 
72
  foreach( $errors as $error ){
73
  if( $error->level >= LIBXML_ERR_FATAL ){
74
+ throw new Loco_error_XmlParseException( trim($error->message) );
75
+ // ->setContext( $error->line, $error->column, $source );
76
+ }
 
77
  }
78
  }
 
79
 
80
+ // Not currently validating against a DTD, but will preempt generic model loading errors
81
+ $root = $dom->documentElement;
82
+ if( ! $root instanceof DOMNode ){
83
  throw new Loco_error_XmlParseException('Expected <bundle> document element');
84
  }
85
+ if( 'bundle' !== strtolower($root->nodeName) ){
86
+ throw new Loco_error_XmlParseException('Expected <bundle> document element, got <'.$root->nodeName.'>');
87
+ }
88
 
89
  $this->xpath = new DOMXPath($dom);
90
  }
src/error/AdminNotices.php CHANGED
@@ -29,7 +29,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
29
 
30
 
31
  /**
32
- * @param Loco_error_Exception
33
  * @return Loco_error_Exception
34
  */
35
  public static function add( Loco_error_Exception $error ){
@@ -62,7 +62,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
62
 
63
  /**
64
  * Raise a success message
65
- * @param string
66
  * @return Loco_error_Exception
67
  */
68
  public static function success( $message ){
@@ -73,7 +73,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
73
 
74
  /**
75
  * Raise a failure message
76
- * @param string
77
  * @return Loco_error_Exception
78
  */
79
  public static function err( $message ){
@@ -84,7 +84,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
84
 
85
  /**
86
  * Raise a warning message
87
- * @param string
88
  * @return Loco_error_Exception
89
  */
90
  public static function warn( $message ){
@@ -95,7 +95,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
95
 
96
  /**
97
  * Raise a generic info message
98
- * @param string
99
  * @return Loco_error_Exception
100
  */
101
  public static function info( $message ){
@@ -106,7 +106,7 @@ class Loco_error_AdminNotices extends Loco_hooks_Hookable {
106
 
107
  /**
108
  * Raise a debug notice, if debug is enabled
109
- * @param string
110
  * @return Loco_error_Debug
111
  */
112
  public static function debug( $message ){
29
 
30
 
31
  /**
32
+ * @param Loco_error_Exception $error
33
  * @return Loco_error_Exception
34
  */
35
  public static function add( Loco_error_Exception $error ){
62
 
63
  /**
64
  * Raise a success message
65
+ * @param string $message
66
  * @return Loco_error_Exception
67
  */
68
  public static function success( $message ){
73
 
74
  /**
75
  * Raise a failure message
76
+ * @param string $message
77
  * @return Loco_error_Exception
78
  */
79
  public static function err( $message ){
84
 
85
  /**
86
  * Raise a warning message
87
+ * @param string $message
88
  * @return Loco_error_Exception
89
  */
90
  public static function warn( $message ){
95
 
96
  /**
97
  * Raise a generic info message
98
+ * @param string $message
99
  * @return Loco_error_Exception
100
  */
101
  public static function info( $message ){
106
 
107
  /**
108
  * Raise a debug notice, if debug is enabled
109
+ * @param string $message
110
  * @return Loco_error_Debug
111
  */
112
  public static function debug( $message ){
src/error/Exception.php CHANGED
@@ -86,7 +86,7 @@ class Loco_error_Exception extends Exception implements JsonSerializable {
86
 
87
 
88
  /**
89
- * @param int number of levels up from callee
90
  * @return Loco_error_Exception
91
  */
92
  public function setCallee( $depth = 0 ){
@@ -101,15 +101,14 @@ class Loco_error_Exception extends Exception implements JsonSerializable {
101
 
102
  /**
103
  * Write this error to file regardless of log level
104
- * @param Loco_error_Exception
105
  * @return void
106
  */
107
  public function log(){
108
  $file = new Loco_fs_File( $this->getRealFile() );
109
  $path = $file->getRelativePath( loco_plugin_root() );
110
  $text = sprintf('[Loco.%s] "%s" in %s:%u', $this->getType(), $this->getMessage(), $path, $this->getRealLine() );
111
- // separate error log in CWD for tests
112
- if( defined('LOCO_TEST') && LOCO_TEST ){
113
  error_log( '['.date('c').'] '.$text."\n", 3, 'debug.log' );
114
  }
115
  // Else write to default PHP log, but note that WordPress may have set this to wp-content/debug.log.
@@ -184,8 +183,8 @@ class Loco_error_Exception extends Exception implements JsonSerializable {
184
 
185
  /**
186
  * Push navigation links into error. Use for help pages etc..
187
- * @param string
188
- * @param string
189
  * @return Loco_error_Exception
190
  */
191
  public function addLink( $href, $text ){
@@ -204,7 +203,7 @@ class Loco_error_Exception extends Exception implements JsonSerializable {
204
 
205
  /**
206
  * Convert generic exception to one of ours
207
- * @param Exception original error
208
  * @return Loco_error_Exception
209
  */
210
  public static function convert( Exception $e ){
86
 
87
 
88
  /**
89
+ * @param int $depth number of levels up from callee
90
  * @return Loco_error_Exception
91
  */
92
  public function setCallee( $depth = 0 ){
101
 
102
  /**
103
  * Write this error to file regardless of log level
 
104
  * @return void
105
  */
106
  public function log(){
107
  $file = new Loco_fs_File( $this->getRealFile() );
108
  $path = $file->getRelativePath( loco_plugin_root() );
109
  $text = sprintf('[Loco.%s] "%s" in %s:%u', $this->getType(), $this->getMessage(), $path, $this->getRealLine() );
110
+ // separate error log for cli tests
111
+ if( 'cli' === PHP_SAPI && defined('LOCO_TEST_DATA_ROOT') ){
112
  error_log( '['.date('c').'] '.$text."\n", 3, 'debug.log' );
113
  }
114
  // Else write to default PHP log, but note that WordPress may have set this to wp-content/debug.log.
183
 
184
  /**
185
  * Push navigation links into error. Use for help pages etc..
186
+ * @param string $href
187
+ * @param string $text
188
  * @return Loco_error_Exception
189
  */
190
  public function addLink( $href, $text ){
203
 
204
  /**
205
  * Convert generic exception to one of ours
206
+ * @param Exception $e original error
207
  * @return Loco_error_Exception
208
  */
209
  public static function convert( Exception $e ){
src/fs/File.php CHANGED
@@ -580,7 +580,7 @@ class Loco_fs_File {
580
 
581
  /**
582
  * Copy this object with an alternative file extension
583
- * @param string new extension
584
  * @return self
585
  */
586
  public function cloneExtension( $ext ){
@@ -591,7 +591,7 @@ class Loco_fs_File {
591
 
592
  /**
593
  * Copy this object with an alternative name under the same directory
594
- * @param string new name
595
  * @return self
596
  */
597
  public function cloneBasename( $name ){
@@ -602,24 +602,6 @@ class Loco_fs_File {
602
  }
603
 
604
 
605
- /**
606
- * Copy this object as a WordPress script translation file
607
- * @param string relative path to .js file presumed to exist
608
- * @return self
609
- */
610
- public function cloneJson( $ref ){
611
- $name = $this->filename();
612
- if( is_string($ref) && '' !== $ref ){
613
- // Hashable reference is always finally unminified, as per load_script_textdomain()
614
- if( substr($ref,-7) === '.min.js' ) {
615
- $ref = substr($ref,0,-7).'.js';
616
- }
617
- $name .= '-'.md5($ref);
618
- }
619
- return $this->cloneBasename( $name.'.json' );
620
- }
621
-
622
-
623
  /**
624
  * Ensure full parent directory tree exists
625
  * @return Loco_fs_Directory|null
@@ -634,7 +616,7 @@ class Loco_fs_File {
634
 
635
 
636
  /**
637
- * @param string file contents
638
  * @return int number of bytes written to file
639
  */
640
  public function putContents( $data ){
580
 
581
  /**
582
  * Copy this object with an alternative file extension
583
+ * @param string $ext new extension
584
  * @return self
585
  */
586
  public function cloneExtension( $ext ){
591
 
592
  /**
593
  * Copy this object with an alternative name under the same directory
594
+ * @param string $name new name
595
  * @return self
596
  */
597
  public function cloneBasename( $name ){
602
  }
603
 
604
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
605
  /**
606
  * Ensure full parent directory tree exists
607
  * @return Loco_fs_Directory|null
616
 
617
 
618
  /**
619
+ * @param string $data file contents
620
  * @return int number of bytes written to file
621
  */
622
  public function putContents( $data ){
src/fs/LocaleFile.php CHANGED
@@ -41,7 +41,7 @@ class Loco_fs_LocaleFile extends Loco_fs_File {
41
  $this->prefix = implode('-',$parts);
42
  // handle situations where unsuffixed name is wrongly taken as the prefix
43
  // e.g. "de.po" is valid but "hello.po" is not.
44
- // There are still some ambiguous situations, e.g. "foo-bar.po" is valid, but nonsense
45
  if( ! $this->prefix && ! $this->getLocale()->isValid() ){
46
  $this->prefix = $this->suffix;
47
  $this->suffix = '';
@@ -69,7 +69,7 @@ class Loco_fs_LocaleFile extends Loco_fs_File {
69
 
70
 
71
  /**
72
- * @param Loco_locale
73
  * @return Loco_fs_LocaleFile
74
  */
75
  public function cloneLocale( Loco_locale $locale ){
@@ -133,6 +133,5 @@ class Loco_fs_LocaleFile extends Loco_fs_File {
133
  $info = $this->split();
134
  return $info[0] && ! $info[1];
135
  }
136
-
137
-
138
  }
41
  $this->prefix = implode('-',$parts);
42
  // handle situations where unsuffixed name is wrongly taken as the prefix
43
  // e.g. "de.po" is valid but "hello.po" is not.
44
+ // There are still some ambiguous situations, e.g. "foo-bar.po" is valid, but nonsense
45
  if( ! $this->prefix && ! $this->getLocale()->isValid() ){
46
  $this->prefix = $this->suffix;
47
  $this->suffix = '';
69
 
70
 
71
  /**
72
+ * @param $locale Loco_locale
73
  * @return Loco_fs_LocaleFile
74
  */
75
  public function cloneLocale( Loco_locale $locale ){
133
  $info = $this->split();
134
  return $info[0] && ! $info[1];
135
  }
136
+
 
137
  }
src/fs/Locations.php CHANGED
@@ -119,7 +119,7 @@ class Loco_fs_Locations extends ArrayObject {
119
 
120
 
121
  /**
122
- * @param array
123
  */
124
  public function __construct( array $paths ){
125
  parent::__construct( [] );
@@ -130,7 +130,7 @@ class Loco_fs_Locations extends ArrayObject {
130
 
131
 
132
  /**
133
- * @param string normalized absolute path
134
  * @return Loco_fs_Locations
135
  */
136
  public function add( $path ){
@@ -144,7 +144,7 @@ class Loco_fs_Locations extends ArrayObject {
144
 
145
  /**
146
  * Check if a given path begins with any of the registered ones
147
- * @param string absolute path
148
  * @return bool whether path matched
149
  */
150
  public function check( $path ){
@@ -162,7 +162,7 @@ class Loco_fs_Locations extends ArrayObject {
162
  /**
163
  * Match location and return the relative subpath.
164
  * Note that exact match is returned as "." indicating self
165
- * @param string
166
  * @return string | null
167
  */
168
  public function rel( $path ){
@@ -181,7 +181,7 @@ class Loco_fs_Locations extends ArrayObject {
181
 
182
 
183
  /**
184
- * @param string
185
  * @return string[]
186
  */
187
  private function expand( $path ){
119
 
120
 
121
  /**
122
+ * Create instance from list of locations
123
  */
124
  public function __construct( array $paths ){
125
  parent::__construct( [] );
130
 
131
 
132
  /**
133
+ * @param string $path normalized absolute path
134
  * @return Loco_fs_Locations
135
  */
136
  public function add( $path ){
144
 
145
  /**
146
  * Check if a given path begins with any of the registered ones
147
+ * @param string $path absolute path
148
  * @return bool whether path matched
149
  */
150
  public function check( $path ){
162
  /**
163
  * Match location and return the relative subpath.
164
  * Note that exact match is returned as "." indicating self
165
+ * @param string $path
166
  * @return string | null
167
  */
168
  public function rel( $path ){
181
 
182
 
183
  /**
184
+ * @param string $path
185
  * @return string[]
186
  */
187
  private function expand( $path ){
src/fs/Siblings.php CHANGED
@@ -14,7 +14,15 @@ class Loco_fs_Siblings {
14
  */
15
  private $mo;
16
 
17
-
 
 
 
 
 
 
 
 
18
  public function __construct( Loco_fs_File $file ){
19
  $ext = $file->extension();
20
  if( 'pot' === $ext ){
@@ -34,6 +42,15 @@ class Loco_fs_Siblings {
34
  }
35
 
36
 
 
 
 
 
 
 
 
 
 
37
  /**
38
  * Get all dependant files (including self) that actually exist on disk
39
  * @return Loco_fs_File[]
@@ -53,7 +70,7 @@ class Loco_fs_Siblings {
53
  }
54
  // JSON exports, unless in POT mode:
55
  if( 'po' === $this->po->extension() ){
56
- $siblings = array_merge($siblings,$this->getJsons());
57
  }
58
 
59
  return $siblings;
@@ -77,12 +94,18 @@ class Loco_fs_Siblings {
77
 
78
 
79
  /**
 
80
  * @return Loco_fs_File[]
81
  */
82
- public function getJsons(){
83
  $list = new Loco_fs_FileList;
84
  $name = $this->po->filename();
85
  $finder = new Loco_fs_FileFinder( $this->po->dirname() );
 
 
 
 
 
86
  // match .json files with same name as .po, plus hashed names
87
  $regex = '/^'.preg_quote($name,'/').'-[0-9a-f]{32}$/';
88
  /* @var Loco_fs_File $file */
14
  */
15
  private $mo;
16
 
17
+ /**
18
+ * @var string
19
+ */
20
+ private $td = '';
21
+
22
+
23
+ /**
24
+ * @param Loco_fs_File $file Master file, either PO/MO or POT
25
+ */
26
  public function __construct( Loco_fs_File $file ){
27
  $ext = $file->extension();
28
  if( 'pot' === $ext ){
42
  }
43
 
44
 
45
+ /**
46
+ * Set text domain explicitly, required if unknown from PO/POT file name
47
+ * @return void
48
+ */
49
+ public function setDomain( $domain ){
50
+ $this->td = $domain ?: 'default';
51
+ }
52
+
53
+
54
  /**
55
  * Get all dependant files (including self) that actually exist on disk
56
  * @return Loco_fs_File[]
70
  }
71
  // JSON exports, unless in POT mode:
72
  if( 'po' === $this->po->extension() ){
73
+ $siblings = array_merge($siblings,$this->getJsons($this->td));
74
  }
75
 
76
  return $siblings;
94
 
95
 
96
  /**
97
+ * @param string $prefix Prefix required in case not present in PO file name
98
  * @return Loco_fs_File[]
99
  */
100
+ public function getJsons( $prefix ){
101
  $list = new Loco_fs_FileList;
102
  $name = $this->po->filename();
103
  $finder = new Loco_fs_FileFinder( $this->po->dirname() );
104
+ // Handle problem that PO file has no text domain prefix
105
+ if( $prefix && 'default' !== $prefix && preg_match('/^[a-z]{2,3}(?:_[a-z\\d_]+)?$/i',$name) ){
106
+ $name = $prefix.'-'.$name;
107
+ }
108
+ // locale must also be known, which it should be if only localised po file is set
109
  // match .json files with same name as .po, plus hashed names
110
  $regex = '/^'.preg_quote($name,'/').'-[0-9a-f]{32}$/';
111
  /* @var Loco_fs_File $file */
src/gettext/Compiler.php CHANGED
@@ -29,7 +29,7 @@ class Loco_gettext_Compiler {
29
 
30
  /**
31
  * Construct with primary file (PO) being saved
32
- * @param Loco_fs_LocaleFile Localised PO file which may or may not exist yet
33
  */
34
  public function __construct( Loco_fs_LocaleFile $pofile ){
35
  $this->fs = new Loco_api_WordPressFileSystem;
@@ -44,7 +44,7 @@ class Loco_gettext_Compiler {
44
 
45
  /**
46
  * Set overwrite mode
47
- * @param bool whether to overwrite existing files during compilation
48
  * @return self
49
  */
50
  public function overwrite( $overwrite ){
@@ -54,8 +54,6 @@ class Loco_gettext_Compiler {
54
 
55
 
56
  /**
57
- * @param Loco_gettext_Data
58
- * @param Loco_package_Project|null
59
  * @return self
60
  */
61
  public function writeAll( Loco_gettext_Data $po, Loco_package_Project $project = null ){
@@ -69,7 +67,6 @@ class Loco_gettext_Compiler {
69
 
70
 
71
  /**
72
- * @param Loco_gettext_Data PO data
73
  * @return int bytes written to PO file
74
  * @throws Loco_error_WriteException
75
  */
@@ -92,7 +89,6 @@ class Loco_gettext_Compiler {
92
 
93
 
94
  /**
95
- * @param Loco_gettext_Data PO data
96
  * @return int bytes written to MO file
97
  */
98
  public function writeMo( Loco_gettext_Data $po ){
@@ -112,8 +108,8 @@ class Loco_gettext_Compiler {
112
 
113
 
114
  /**
115
- * @param Loco_package_Project Translation set, required to resolve script paths
116
- * @param Loco_gettext_Data PO data to export
117
  * @return Loco_fs_FileList All json files created
118
  */
119
  public function writeJson( Loco_package_Project $project, Loco_gettext_Data $po ){
@@ -182,23 +178,25 @@ class Loco_gettext_Compiler {
182
  $buffer[$use] = $fragment;
183
  }
184
  }
185
- // write all buffered fragments to their computed JSON paths
186
- foreach( $buffer as $ref => $fragment ) {
187
- $jsonfile = $pofile->cloneJson($ref);
188
- try {
189
- $this->writeFile( $jsonfile, $fragment->msgjed($domain,$ref) );
190
- $jsons->add($jsonfile);
191
- }
192
- catch( Loco_error_WriteException $e ){
193
- Loco_error_AdminNotices::debug( $e->getMessage() );
194
- Loco_error_AdminNotices::warn( sprintf(__('JSON compilation failed for %s','loco-translate'),$ref));
 
 
195
  }
 
196
  }
197
- $buffer = null;
198
  }
199
  // clean up redundant JSONs including if no JSONs were compiled
200
  if( Loco_data_Settings::get()->jed_clean ){
201
- foreach( $this->files->getJsons() as $path ){
202
  $jsonfile = new Loco_fs_File($path);
203
  if( ! $jsons->has($jsonfile) ){
204
  try {
@@ -215,6 +213,27 @@ class Loco_gettext_Compiler {
215
  }
216
 
217
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
218
  /**
219
  * Fetch compilation summary and raise most relevant success message
220
  * @return Loco_mvc_ViewParams
@@ -259,7 +278,7 @@ class Loco_gettext_Compiler {
259
 
260
  /**
261
  * @param Loco_fs_File $file
262
- * @param string Serialized JSON to write to given file
263
  * @return int bytes written
264
  */
265
  public function writeFile( Loco_fs_File $file, $data ){
29
 
30
  /**
31
  * Construct with primary file (PO) being saved
32
+ * @param Loco_fs_LocaleFile $pofile Localised PO file which may or may not exist yet
33
  */
34
  public function __construct( Loco_fs_LocaleFile $pofile ){
35
  $this->fs = new Loco_api_WordPressFileSystem;
44
 
45
  /**
46
  * Set overwrite mode
47
+ * @param bool $overwrite whether to overwrite existing files during compilation
48
  * @return self
49
  */
50
  public function overwrite( $overwrite ){
54
 
55
 
56
  /**
 
 
57
  * @return self
58
  */
59
  public function writeAll( Loco_gettext_Data $po, Loco_package_Project $project = null ){
67
 
68
 
69
  /**
 
70
  * @return int bytes written to PO file
71
  * @throws Loco_error_WriteException
72
  */
89
 
90
 
91
  /**
 
92
  * @return int bytes written to MO file
93
  */
94
  public function writeMo( Loco_gettext_Data $po ){
108
 
109
 
110
  /**
111
+ * @param Loco_package_Project $project Translation set, required to resolve script paths
112
+ * @param Loco_gettext_Data $po PO data to export
113
  * @return Loco_fs_FileList All json files created
114
  */
115
  public function writeJson( Loco_package_Project $project, Loco_gettext_Data $po ){
178
  $buffer[$use] = $fragment;
179
  }
180
  }
181
+ if( $buffer ){
182
+ // write all buffered fragments to their computed JSON paths
183
+ foreach( $buffer as $ref => $fragment ) {
184
+ $jsonfile = $this->cloneJson($pofile,$ref,$domain);
185
+ try {
186
+ $this->writeFile( $jsonfile, $fragment->msgjed($domain,$ref) );
187
+ $jsons->add($jsonfile);
188
+ }
189
+ catch( Loco_error_WriteException $e ){
190
+ Loco_error_AdminNotices::debug( $e->getMessage() );
191
+ Loco_error_AdminNotices::warn( sprintf(__('JSON compilation failed for %s','loco-translate'),$ref));
192
+ }
193
  }
194
+ $buffer = null;
195
  }
 
196
  }
197
  // clean up redundant JSONs including if no JSONs were compiled
198
  if( Loco_data_Settings::get()->jed_clean ){
199
+ foreach( $this->files->getJsons($domain) as $path ){
200
  $jsonfile = new Loco_fs_File($path);
201
  if( ! $jsons->has($jsonfile) ){
202
  try {
213
  }
214
 
215
 
216
+ /**
217
+ * Clone localised file as a WordPress script translation file
218
+ * @return Loco_fs_File
219
+ */
220
+ private function cloneJson( Loco_fs_File $pofile, $ref, $domain ){
221
+ $name = $pofile->filename();
222
+ // Theme author PO files have no text domain, but JSON files must always be prefixed
223
+ if( $domain && 'default' !== $domain && preg_match('/^[a-z]{2,3}(?:_[a-z\\d_]+)?$/i',$name) ){
224
+ $name = $domain.'-'.$name;
225
+ }
226
+ // Hashable reference is always finally unminified, as per load_script_textdomain()
227
+ if( is_string($ref) && '' !== $ref ){
228
+ if( substr($ref,-7) === '.min.js' ) {
229
+ $ref = substr($ref,0,-7).'.js';
230
+ }
231
+ $name .= '-'.md5($ref);
232
+ }
233
+ return $pofile->cloneBasename( $name.'.json' );
234
+ }
235
+
236
+
237
  /**
238
  * Fetch compilation summary and raise most relevant success message
239
  * @return Loco_mvc_ViewParams
278
 
279
  /**
280
  * @param Loco_fs_File $file
281
+ * @param string $data Serialized JSON to write to given file
282
  * @return int bytes written
283
  */
284
  public function writeFile( Loco_fs_File $file, $data ){
src/gettext/Data.php CHANGED
@@ -9,7 +9,6 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
9
 
10
  /**
11
  * Normalize file extension to internal type
12
- * @param Loco_fs_File
13
  * @return string Normalized file extension "po", "pot" or "mo"
14
  * @throws Loco_error_Exception
15
  */
@@ -25,7 +24,6 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
25
 
26
 
27
  /**
28
- * @param Loco_fs_File
29
  * @return Loco_gettext_Data
30
  */
31
  public static function load( Loco_fs_File $file ){
@@ -49,7 +47,6 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
49
 
50
  /**
51
  * Like load but just pulls header, saving a full parse. PO only
52
- * @param Loco_fs_File
53
  * @return LocoPoHeaders
54
  * @throws InvalidArgumentException
55
  */
@@ -64,7 +61,7 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
64
 
65
 
66
  /**
67
- * @param string assumed PO source
68
  * @return Loco_gettext_Data
69
  */
70
  public static function fromSource( $src ){
@@ -74,7 +71,7 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
74
 
75
 
76
  /**
77
- * @param string assumed MO bytes
78
  * @return Loco_gettext_Data
79
  */
80
  public static function fromBinary( $bin ){
@@ -95,7 +92,7 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
95
  /**
96
  * Ensure PO source is UTF-8.
97
  * Required if we want PO code when we're not parsing it. e.g. source view
98
- * @param string
99
  * @return string
100
  */
101
  public static function ensureUtf8( $src ){
@@ -140,7 +137,7 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
140
 
141
  /**
142
  * Get final UTF-8 string for writing to file
143
- * @param bool whether to sort output, generally only for extracting strings
144
  * @return string
145
  */
146
  public function msgcat( $sort = false ){
@@ -158,8 +155,8 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
158
 
159
  /**
160
  * Compile JED flavour JSON
161
- * @param string text domain for JED metadata
162
- * @param string source file that uses included strings
163
  * @return string
164
  */
165
  public function msgjed( $domain = 'messages', $source = '' ){
@@ -316,9 +313,6 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
316
 
317
 
318
  /**
319
- * @param string[] Required headers
320
- * @param string[] Default headers
321
- * @param string[] Custom headers
322
  * @return LocoPoHeaders
323
  */
324
  private function applyHeaders( array $required = [], array $defaults = [], array $custom = [] ){
@@ -344,9 +338,9 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
344
  /**
345
  * Remap proprietary base path when PO file is moving to another location.
346
  *
347
- * @param Loco_fs_File the file that was originally extracted to (POT)
348
- * @param Loco_fs_File the file that must now target references relative to itself
349
- * @param string vendor name used in header keys
350
  * @return bool whether base header was altered
351
  */
352
  public function rebaseHeader( Loco_fs_File $origin, Loco_fs_File $target, $vendor ){
@@ -368,7 +362,6 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
368
 
369
  /**
370
  * Inherit meta values from header given, but leave standard headers intact.
371
- * @param LocoPoHeaders source header
372
  */
373
  public function inheritHeader( LocoPoHeaders $source ){
374
  $target = $this->getHeaders();
@@ -381,7 +374,7 @@ class Loco_gettext_Data extends LocoPoIterator implements JsonSerializable {
381
 
382
 
383
  /**
384
- * @param string date format as Gettext states "YEAR-MO-DA HO:MI+ZONE"
385
  * @return int
386
  */
387
  public static function parseDate( $podate ){
9
 
10
  /**
11
  * Normalize file extension to internal type
 
12
  * @return string Normalized file extension "po", "pot" or "mo"
13
  * @throws Loco_error_Exception
14
  */
24
 
25
 
26
  /**
 
27
  * @return Loco_gettext_Data
28
  */
29
  public static function load( Loco_fs_File $file ){
47
 
48
  /**
49
  * Like load but just pulls header, saving a full parse. PO only
 
50
  * @return LocoPoHeaders
51
  * @throws InvalidArgumentException
52
  */
61
 
62
 
63
  /**
64
+ * @param string $src PO source
65
  * @return Loco_gettext_Data
66
  */
67
  public static function fromSource( $src ){
71
 
72
 
73
  /**
74
+ * @param string $bin MO bytes
75
  * @return Loco_gettext_Data
76
  */
77
  public static function fromBinary( $bin ){
92
  /**
93
  * Ensure PO source is UTF-8.
94
  * Required if we want PO code when we're not parsing it. e.g. source view
95
+ * @param string $src PO source
96
  * @return string
97
  */
98
  public static function ensureUtf8( $src ){
137
 
138
  /**
139
  * Get final UTF-8 string for writing to file
140
+ * @param bool $sort Whether to sort output, generally only for extracting strings
141
  * @return string
142
  */
143
  public function msgcat( $sort = false ){
155
 
156
  /**
157
  * Compile JED flavour JSON
158
+ * @param string $domain text domain for JED metadata
159
+ * @param string $source reference to file that uses included strings
160
  * @return string
161
  */
162
  public function msgjed( $domain = 'messages', $source = '' ){
313
 
314
 
315
  /**
 
 
 
316
  * @return LocoPoHeaders
317
  */
318
  private function applyHeaders( array $required = [], array $defaults = [], array $custom = [] ){
338
  /**
339
  * Remap proprietary base path when PO file is moving to another location.
340
  *
341
+ * @param Loco_fs_File $origin the file that was originally extracted to (POT)
342
+ * @param Loco_fs_File $target the file that must now target references relative to itself
343
+ * @param string $vendor name used in header keys
344
  * @return bool whether base header was altered
345
  */
346
  public function rebaseHeader( Loco_fs_File $origin, Loco_fs_File $target, $vendor ){
362
 
363
  /**
364
  * Inherit meta values from header given, but leave standard headers intact.
 
365
  */
366
  public function inheritHeader( LocoPoHeaders $source ){
367
  $target = $this->getHeaders();
374
 
375
 
376
  /**
377
+ * @param string $podate Gettext data formatted "YEAR-MO-DA HO:MI+ZONE"
378
  * @return int
379
  */
380
  public static function parseDate( $podate ){
src/package/Bundle.php CHANGED
@@ -514,11 +514,8 @@ abstract class Loco_package_Bundle extends ArrayObject implements JsonSerializab
514
  }
515
 
516
 
517
-
518
  /**
519
  * Get XML configuration file used to define this bundle
520
- * TODO will we also support JSON for when dom extension is loaded?
521
- * TODO support custom location for user-saved XML?
522
  * @return Loco_fs_File
523
  */
524
  public function getConfigFile(){
@@ -531,7 +528,6 @@ abstract class Loco_package_Bundle extends ArrayObject implements JsonSerializab
531
  }
532
 
533
 
534
-
535
  /**
536
  * Check whether bundle is manually configured, as opposed to guessed
537
  * @return string (file|db|meta|internal)
514
  }
515
 
516
 
 
517
  /**
518
  * Get XML configuration file used to define this bundle
 
 
519
  * @return Loco_fs_File
520
  */
521
  public function getConfigFile(){
528
  }
529
 
530
 
 
531
  /**
532
  * Check whether bundle is manually configured, as opposed to guessed
533
  * @return string (file|db|meta|internal)
src/package/Debugger.php CHANGED
@@ -18,35 +18,35 @@ class Loco_package_Debugger implements IteratorAggregate {
18
  /**
19
  * Run immediately on construct
20
  */
21
- public function __construct( Loco_package_Bundle $bundle ){
22
-
23
  $this->messages = [];
24
- $this->counts = [
25
  'success' => 0,
26
  'warning' => 0,
27
  'debug' => 0,
28
  'info' => 0,
29
  ];
30
-
31
  // config storage type
32
- switch( $bundle->isConfigured() ){
33
- case 'db':
34
- $this->info("Custom configuration saved in database");
35
- break;
36
- case 'meta':
37
- $this->good("Configuration auto-detected from file headers");
38
- break;
39
- case 'file':
40
- $this->good("Official configuration provided by author");
41
- break;
42
- case 'internal':
43
- $this->info("Configuration built-in to Loco");
44
- break;
45
- case '':
46
- $this->warn("Cannot auto-detect configuration");
47
- break;
48
- default:
49
- throw new Exception('Unexpected isConfigured() return value');
50
  }
51
 
52
  $base = $bundle->getDirectoryPath();
@@ -54,180 +54,165 @@ class Loco_package_Debugger implements IteratorAggregate {
54
 
55
  // self-declarations provided by author in file headers
56
  $native = $bundle->getHeaderInfo();
57
- if( $value = $native->TextDomain ){
58
- $this->info('WordPress says primary text domain is "%s"', $value);
59
  // WordPress 4.6 changes mean this header could be a fallback and not actually declared by author
60
- if( $bundle->isPlugin() ){
61
- $map = [ 'TextDomain' => 'Text Domain' ];
62
  $raw = get_file_data( $bundle->getBootstrapPath(), $map, 'plugin' );
63
- if( empty($raw['TextDomain']) ){
64
- $this->warn('Author doesn\'t define the TextDomain header, WordPress guessed it');
65
  }
66
  }
67
  // Warn if WordPress-assumed text domain is not configured. plugin/theme headers won't be translated
68
  $domains = $bundle->getDomains();
69
- if( ! isset($domains[$value]) && ! isset($domains['*']) ){
70
- $this->warn('Expected text domain "%s" is not configured', $value );
71
  }
 
 
72
  }
73
- else {
74
- $this->warn("Author doesn't define the TextDomain header");
75
- }
76
- if( $value = $native->DomainPath ){
77
- $this->good('Primary domain path declared by author as "%s"', $value );
 
78
  }
79
- else if( is_dir($base.'/languages') ){
80
- $this->info('Standard "languages" folder found, although DomainPath not declared');
81
- }
82
- else {
83
- $this->warn("Author doesn't define the DomainPath header");
84
- }
85
-
86
  // check validity of single-file plugins
87
- if( $bundle->isSingleFile() && ! $bundle->getBootstrapPath() ){
88
- $this->warn('Plugin is a single file, but bootstrap file is unknown');
89
  }
90
-
91
  // collecting only configured domains to match against source code
92
- $domains = [];
93
  $templates = [];
94
-
95
  // show each known subset
96
- if( $count = count($bundle) ){
97
  /* @var $project Loco_package_Project */
98
- foreach( $bundle as $project ){
99
- $id = $project->getId();
100
  $domain = (string) $project->getDomain();
101
- if( '*' === $domain ){
102
- $this->devel('Wildcard text domain configured for %s', $project );
103
  $domain = '';
104
  }
105
- $domains[$domain] = true;
106
  // Domain path[s] within bundle directory
107
  $targets = [];
108
  /* @var $dir Loco_fs_Directory */
109
- foreach( $project->getConfiguredTargets() as $dir ){
110
- $targets[] = $dir->getRelativePath($base);
111
  }
112
- if( $targets ){
113
- $this->info('%u domain path[s] configured for "%s" -> %s', count($targets), $id, json_encode($targets,JSON_UNESCAPED_SLASHES) );
114
- }
115
- else {
116
- $this->warn('No domain paths configured for "%s"', $id );
117
  }
118
  // POT template file
119
- if( $potfile = $project->getPot() ){
120
- if( $potfile->exists() ){
121
- $this->good('Template file for "%s" exists at "%s"', $id, $potfile->getRelativePath($base) );
122
  try {
123
- $data = Loco_gettext_Data::load($potfile);
124
- $templates[$domain][] = $data;
125
- }
126
- catch( Exception $e ){
127
- $this->warn('Template file for "%s" is invalid format', $id );
128
  }
 
 
129
  }
130
- else {
131
- $this->warn('Template file for "%s" does not exist (%s)', $id, $potfile->getRelativePath($base) );
132
- }
133
- }
134
- else {
135
- $this->warn('No template file configured for "%s"', $domain );
136
- if( $potfile = $project->guessPot() ){
137
- $this->devel('Possible non-standard name for "%s" template at "%s"', $id, $potfile->getRelativePath($base) );
138
  $project->setPot( $potfile ); // <- adding so that invert ignores it
139
  }
140
  }
141
  }
142
  $default = $bundle->getDefaultProject();
143
- if( ! $default ){
144
- $this->warn('%u subsets configured, but failed to establish the default/primary', $count );
145
  }
146
- }
147
- else {
148
  $default = $bundle->createDefault();
149
- $domain = (string) $default->getDomain();
150
  $this->devel( 'Suggested text domain: "%s"', $domain );
151
  }
152
-
153
  // files picked up with no context as to what they're for
154
- if( $bundle->isTheme() || ( $bundle->isPlugin() && ! $bundle->isSingleFile() ) ){
155
  $unknown = $bundle->invert();
156
- if( $n = count($unknown) ){
157
  /* @var $project Loco_package_Project */
158
- foreach( $unknown as $project ){
159
  $domain = (string) $project->getDomain();
160
  // should only have one target due the way the inverter groups results
161
  /* @var $dir Loco_fs_Directory */
162
- foreach( $project->getConfiguredTargets() as $dir ){
163
- $reldir = $dir->getRelativePath($base) or $stub = '.';
164
- $this->warn('Unconfigured files found in "%s", possible domain name: "%s"', $reldir, $domain );
165
  }
166
  }
167
  }
168
  }
169
-
170
  // source code extraction across entire bundle
171
- $tmp = clone $bundle;
172
- $tmp->exchangeArray( [] );
173
- $project = $tmp->createDefault( (string) $default->getDomain() );
174
- $extr = new Loco_gettext_Extraction( $tmp );
175
- $extr->addProject( $project );
176
-
177
- if( $total = $extr->getTotal() ){
178
- // real count excludes additional metadata
179
- $realCounts = $extr->getDomainCounts();
180
- $counts = $extr->includeMeta()->getDomainCounts();
181
- // $this->good("%u string[s] can be extracted from source code for %s", $total, $this->implodeKeys($counts) );
182
- foreach( array_intersect_key($counts, $domains) as $domain => $count ){
183
- if( isset($realCounts[$domain]) ){
184
- $count = $counts[$domain];
185
- $realCount = $realCounts[$domain];
186
- // translators: 1: Number of strings; 2: Text Domain; e.g. 100 strings extracted from source code for "loco-translate"
187
- $str = _n( '%1$s string extracted from source code for "%2$s"', '%1$s strings extracted from source code for "%2$s"', $realCount, 'loco-translate' );
188
- $this->good( $str.' (%s including metadata)', number_format($realCount), $domain?$domain:'*', number_format($count) );
189
- }
190
- else {
191
- $this->warn('No strings extracted from source code for "%s"', $domain?$domain:'*' );
192
- }
193
- // check POT agrees with extracted count, but only if domain has single POT (i.e. not split across files on purpose)
194
- if( isset($templates[$domain]) && 1 === count($templates[$domain]) ){
195
- $data = current( $templates[$domain] );
196
- if( ! $extr->getTemplate($domain)->equalSource($data) ){
197
- $meta = Loco_gettext_Metadata::create( new Loco_fs_DummyFile(''), $data );
198
- $this->devel('Template is not in sync with source code (%s in file)', $meta->getTotalSummary() );
199
- }
200
- }
201
  }
202
- // with extracted strings we can check for domain mismatches
203
- if( $missing = array_diff_key($domains, $realCounts) ){
204
- $num = count($missing);
205
- $str = _n( 'Configured domain has no extractable strings', '%u configured domains have no extractable strings', $num, 'loco-translate' );
206
- $this->warn( $str.': %2$s', $num, $this->implodeKeys($missing) );
 
 
207
  }
208
- if( $extra = array_diff_key($realCounts,$domains) ){
209
-
210
- $this->info('%u unconfigured domain[s] found in source code: %s', count($extra), $this->implodeKeys($extra) );
211
- /*/ debug other domains extracted
212
- foreach( $extra as $name => $count ){
213
- $this->devel(' > %s (%u)', $name, $count );
214
- }*/
215
- // extracted domains could prove that declared domain is wrong
216
- if( $missing ){
217
- foreach( array_keys($extra) as $name ){
218
- $flat = preg_replace('/[^a-z0-9]/','', strtolower($name) );
219
- foreach( array_keys($missing) as $decl ){
220
- if( preg_replace('/[^a-z0-9]/','', strtolower($decl) ) === $flat ){
221
- $this->devel('"%s" might be a mistake. Should it be "%s"?', $decl, $name );
222
- }
 
 
 
 
 
 
223
  }
224
  }
225
  }
226
  }
227
-
228
- }
229
- else {
230
- $this->warn("No strings can be extracted from source code");
231
  }
232
 
233
  }
18
  /**
19
  * Run immediately on construct
20
  */
21
+ public function __construct( Loco_package_Bundle $bundle ) {
22
+
23
  $this->messages = [];
24
+ $this->counts = [
25
  'success' => 0,
26
  'warning' => 0,
27
  'debug' => 0,
28
  'info' => 0,
29
  ];
30
+
31
  // config storage type
32
+ switch ( $bundle->isConfigured() ) {
33
+ case 'db':
34
+ $this->info( "Custom configuration saved in database" );
35
+ break;
36
+ case 'meta':
37
+ $this->good( "Configuration auto-detected from file headers" );
38
+ break;
39
+ case 'file':
40
+ $this->good( "Official configuration provided by author" );
41
+ break;
42
+ case 'internal':
43
+ $this->info( "Configuration built-in to Loco" );
44
+ break;
45
+ case '':
46
+ $this->warn( "Cannot auto-detect configuration" );
47
+ break;
48
+ default:
49
+ throw new Exception( 'Unexpected isConfigured() return value' );
50
  }
51
 
52
  $base = $bundle->getDirectoryPath();
54
 
55
  // self-declarations provided by author in file headers
56
  $native = $bundle->getHeaderInfo();
57
+ if ( $value = $native->TextDomain ) {
58
+ $this->info( 'WordPress says primary text domain is "%s"', $value );
59
  // WordPress 4.6 changes mean this header could be a fallback and not actually declared by author
60
+ if ( $bundle->isPlugin() ) {
61
+ $map = [ 'TextDomain' => 'Text Domain' ];
62
  $raw = get_file_data( $bundle->getBootstrapPath(), $map, 'plugin' );
63
+ if ( empty( $raw['TextDomain'] ) ) {
64
+ $this->warn( 'Author doesn\'t define the TextDomain header, WordPress guessed it' );
65
  }
66
  }
67
  // Warn if WordPress-assumed text domain is not configured. plugin/theme headers won't be translated
68
  $domains = $bundle->getDomains();
69
+ if ( ! isset( $domains[ $value ] ) && ! isset( $domains['*'] ) ) {
70
+ $this->warn( 'Expected text domain "%s" is not configured', $value );
71
  }
72
+ } else {
73
+ $this->warn( "Author doesn't define the TextDomain header" );
74
  }
75
+ if ( $value = $native->DomainPath ) {
76
+ $this->good( 'Primary domain path declared by author as "%s"', $value );
77
+ } else if ( is_dir( $base . '/languages' ) ) {
78
+ $this->info( 'Standard "languages" folder found, although DomainPath not declared' );
79
+ } else {
80
+ $this->warn( "Author doesn't define the DomainPath header" );
81
  }
82
+
 
 
 
 
 
 
83
  // check validity of single-file plugins
84
+ if ( $bundle->isSingleFile() && ! $bundle->getBootstrapPath() ) {
85
+ $this->warn( 'Plugin is a single file, but bootstrap file is unknown' );
86
  }
87
+
88
  // collecting only configured domains to match against source code
89
+ $domains = [];
90
  $templates = [];
91
+
92
  // show each known subset
93
+ if ( $count = count( $bundle ) ) {
94
  /* @var $project Loco_package_Project */
95
+ foreach ( $bundle as $project ) {
96
+ $id = $project->getId();
97
  $domain = (string) $project->getDomain();
98
+ if ( '*' === $domain ) {
99
+ $this->devel( 'Wildcard text domain configured for %s', $project );
100
  $domain = '';
101
  }
102
+ $domains[ $domain ] = true;
103
  // Domain path[s] within bundle directory
104
  $targets = [];
105
  /* @var $dir Loco_fs_Directory */
106
+ foreach ( $project->getConfiguredTargets() as $dir ) {
107
+ $targets[] = $dir->getRelativePath( $base );
108
  }
109
+ if ( $targets ) {
110
+ $this->info( '%u domain path[s] configured for "%s" -> %s', count( $targets ), $id, json_encode( $targets, JSON_UNESCAPED_SLASHES ) );
111
+ } else {
112
+ $this->warn( 'No domain paths configured for "%s"', $id );
 
113
  }
114
  // POT template file
115
+ if ( $potfile = $project->getPot() ) {
116
+ if ( $potfile->exists() ) {
117
+ $this->good( 'Template file for "%s" exists at "%s"', $id, $potfile->getRelativePath( $base ) );
118
  try {
119
+ $data = Loco_gettext_Data::load( $potfile );
120
+ $templates[ $domain ][] = $data;
121
+ } catch ( Exception $e ) {
122
+ $this->warn( 'Template file for "%s" is invalid format', $id );
 
123
  }
124
+ } else {
125
+ $this->warn( 'Template file for "%s" does not exist (%s)', $id, $potfile->getRelativePath( $base ) );
126
  }
127
+ } else {
128
+ $this->warn( 'No template file configured for "%s"', $domain );
129
+ if ( $potfile = $project->guessPot() ) {
130
+ $this->devel( 'Possible non-standard name for "%s" template at "%s"', $id, $potfile->getRelativePath( $base ) );
 
 
 
 
131
  $project->setPot( $potfile ); // <- adding so that invert ignores it
132
  }
133
  }
134
  }
135
  $default = $bundle->getDefaultProject();
136
+ if ( ! $default ) {
137
+ $this->warn( '%u subsets configured, but failed to establish the default/primary', $count );
138
  }
139
+ } else {
 
140
  $default = $bundle->createDefault();
141
+ $domain = (string) $default->getDomain();
142
  $this->devel( 'Suggested text domain: "%s"', $domain );
143
  }
144
+
145
  // files picked up with no context as to what they're for
146
+ if ( $bundle->isTheme() || ( $bundle->isPlugin() && ! $bundle->isSingleFile() ) ) {
147
  $unknown = $bundle->invert();
148
+ if ( count( $unknown ) ) {
149
  /* @var $project Loco_package_Project */
150
+ foreach ( $unknown as $project ) {
151
  $domain = (string) $project->getDomain();
152
  // should only have one target due the way the inverter groups results
153
  /* @var $dir Loco_fs_Directory */
154
+ foreach ( $project->getConfiguredTargets() as $dir ) {
155
+ $reldir = $dir->getRelativePath( $base ) ?: '.';
156
+ $this->warn( 'Unconfigured files found in "%s", possible domain name: "%s"', $reldir, $domain );
157
  }
158
  }
159
  }
160
  }
161
+
162
  // source code extraction across entire bundle
163
+ $extr = new Loco_gettext_Extraction( $bundle );
164
+ foreach ( $bundle as $project ) {
165
+ $extr->addProject( $project );
166
+ }
167
+
168
+ // real count excludes additional metadata
169
+ $realCounts = $extr->getDomainCounts();
170
+ $counts = $extr->includeMeta()->getDomainCounts();
171
+ // $this->devel( json_encode(compact('realCounts','counts')) );
172
+ foreach( array_intersect_key($counts, $domains) as $domain => $count ){
173
+ if( isset($realCounts[$domain]) ){
174
+ $count = $counts[$domain];
175
+ $realCount = $realCounts[$domain];
176
+ // translators: 1: Number of strings; 2: Text Domain; e.g. 100 strings extracted from source code for "loco-translate"
177
+ $str = _n( '%1$s string extracted from source code for "%2$s"', '%1$s strings extracted from source code for "%2$s"', $realCount, 'loco-translate' );
178
+ $this->good( $str.' (%s including metadata)', number_format($realCount), $domain?:'*', number_format($count) );
179
+ }
180
+ else {
181
+ $this->warn('No strings extracted from source code for "%s"', $domain?:'*' );
 
 
 
 
 
 
 
 
 
 
 
182
  }
183
+ // check POT agrees with extracted count, but only if domain has single POT (i.e. not split across files on purpose)
184
+ if( isset($templates[$domain]) && 1 === count($templates[$domain]) ){
185
+ $data = current( $templates[$domain] );
186
+ if( ! $extr->getTemplate($domain)->equalSource($data) ){
187
+ $meta = Loco_gettext_Metadata::create( new Loco_fs_DummyFile(''), $data );
188
+ $this->devel('Template is not in sync with source code (%s in file)', $meta->getTotalSummary() );
189
+ }
190
  }
191
+ }
192
+ // with extracted strings we can check for domain mismatches
193
+ if( $missing = array_diff_key($domains, $realCounts) ){
194
+ $num = count($missing);
195
+ $str = _n( 'Configured domain has no extractable strings', '%u configured domains have no extractable strings', $num, 'loco-translate' );
196
+ $this->warn( $str.': %2$s', $num, $this->implodeKeys($missing) );
197
+ }
198
+ if( $extra = array_diff_key($realCounts,$domains) ){
199
+
200
+ $this->info('%u unconfigured domain[s] found in source code: %s', count($extra), $this->implodeKeys($extra) );
201
+ /*/ debug other domains extracted
202
+ foreach( $extra as $name => $count ){
203
+ $this->devel(' > %s (%u)', $name, $count );
204
+ }*/
205
+ // extracted domains could prove that declared domain is wrong
206
+ if( $missing ){
207
+ foreach( array_keys($extra) as $name ){
208
+ $flat = preg_replace('/[^a-z\\d]/','', strtolower($name) );
209
+ foreach( array_keys($missing) as $decl ){
210
+ if( preg_replace('/[^a-z\\d]/','', strtolower($decl) ) === $flat ){
211
+ $this->devel('"%s" might be a mistake. Should it be "%s"?', $decl, $name );
212
  }
213
  }
214
  }
215
  }
 
 
 
 
216
  }
217
 
218
  }
src/package/Project.php CHANGED
@@ -421,8 +421,8 @@ class Loco_package_Project {
421
  $exts = $this->sexts;
422
  if( is_null($exts) ){
423
  $conf = Loco_data_Settings::get();
424
- $exts = (array) $conf->php_alias;
425
- $exts = array_merge( $exts, (array) $conf->jsx_alias );
426
  }
427
  // always ensure we have at least PHP files scanned
428
  return array_merge( $exts, ['php'] );
@@ -430,9 +430,9 @@ class Loco_package_Project {
430
 
431
 
432
  /**
433
- * Utility excludes current exclude paths from target finder
434
  * @param Loco_fs_FileFinder
435
- * @return Loco_fs_FileFinder
436
  */
437
  private function excludeSources( Loco_fs_FileFinder $finder ){
438
  foreach( $this->xspaths as $file ){
@@ -445,7 +445,6 @@ class Loco_package_Project {
445
  $finder->exclude( $path );
446
  }
447
  }
448
- return $finder;
449
  }
450
 
451
 
@@ -691,21 +690,20 @@ class Loco_package_Project {
691
  public function findSourceFiles(){
692
  $source = $this->getSourceFinder();
693
  // augment file list from directories unless already done so
694
- if( ! $source->isCached() ){
695
- $crawled = $source->exportGroups();
696
- foreach( $crawled as $ext => $files ){
697
- /* @var Loco_fs_File $file */
698
- foreach( $files as $file ){
699
- $name = $file->filename();
700
- // skip "{name}.min.{ext}" but only if "{name}.{ext}" exists
701
- if( '.min' === substr($name,-4) && file_exists( $file->dirname().'/'.substr($name,0,-4).'.'.$ext ) ){
702
- continue;
703
- }
704
- $this->sfiles->add($file);
705
  }
 
706
  }
707
  }
708
- return $this->sfiles;
709
  }
710
 
711
 
421
  $exts = $this->sexts;
422
  if( is_null($exts) ){
423
  $conf = Loco_data_Settings::get();
424
+ $exts = $conf->php_alias;
425
+ $exts = array_merge( $exts, $conf->jsx_alias );
426
  }
427
  // always ensure we have at least PHP files scanned
428
  return array_merge( $exts, ['php'] );
430
 
431
 
432
  /**
433
+ * Utility excludes current exclude paths from passed target finder
434
  * @param Loco_fs_FileFinder
435
+ * @return void
436
  */
437
  private function excludeSources( Loco_fs_FileFinder $finder ){
438
  foreach( $this->xspaths as $file ){
445
  $finder->exclude( $path );
446
  }
447
  }
 
448
  }
449
 
450
 
690
  public function findSourceFiles(){
691
  $source = $this->getSourceFinder();
692
  // augment file list from directories unless already done so
693
+ $list = $this->sfiles->copy();
694
+ $crawled = $source->exportGroups();
695
+ foreach( $crawled as $ext => $files ){
696
+ /* @var Loco_fs_File $file */
697
+ foreach( $files as $file ){
698
+ $name = $file->filename();
699
+ // skip "{name}.min.{ext}" but only if "{name}.{ext}" exists
700
+ if( '.min' === substr($name,-4) && file_exists( $file->dirname().'/'.substr($name,0,-4).'.'.$ext ) ){
701
+ continue;
 
 
702
  }
703
+ $list->add($file);
704
  }
705
  }
706
+ return $list;
707
  }
708
 
709
 
tpl/admin/bundle/debug.php CHANGED
@@ -12,7 +12,7 @@ $this->extend('../layout');
12
  </p>
13
 
14
  <?php
15
- /* @var $notice Loco_mvc_ViewParams */
16
  foreach( $notices as $notice ):?>
17
  <div class="<?php $notice->e('style')?>">
18
  <p>
@@ -21,7 +21,7 @@ $this->extend('../layout');
21
  </p>
22
  </div><?php
23
  endforeach;
24
-
25
  if( $params->has('xml') ):?>
26
  <div class="notice inline notice-generic">
27
  <h4>Current configuration as XML:</h4>
12
  </p>
13
 
14
  <?php
15
+ /* @var $notices Loco_mvc_ViewParams[] */
16
  foreach( $notices as $notice ):?>
17
  <div class="<?php $notice->e('style')?>">
18
  <p>
21
  </p>
22
  </div><?php
23
  endforeach;
24
+
25
  if( $params->has('xml') ):?>
26
  <div class="notice inline notice-generic">
27
  <h4>Current configuration as XML:</h4>