/var/www/html_sp/wp-content/plugins/loco-translate/src/hooks/TranslateBuffer.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
<?php
/**
 * Buffers translations requested via __, _x, _n and _nx for exporting in a raw form.
 */
class Loco_hooks_TranslateBuffer extends Loco_hooks_Hookable {
    
    
/**
     * Temporary buffer of raw translation lookup keys
     * @var array
     */
    
private $buffer = [];
    
    
/**
     * `gettext` filter callback
     */
    
public function filter_gettext$msgstr$msgid$domain ){
        
$this->buffer[$domain][$msgid] = null;
        return 
$msgstr;
    }    


    
/**
     * `gettext_with_context` filter callback
     */
    
public function filter_gettext_with_context$msgstr$msgid$msgctxt$domain ){
        
$this->buffer[$domain][$msgctxt."\x04".$msgid] = null;
        return 
$msgstr;
    }


    
/**
     * `ngettext` filter callback
     */
    
public function filter_ngettext$msgstr$msgid$msgid_plural$number$domain ){
        
$this->buffer[$domain][$msgid] = null;
        return 
$msgstr;
    }


    
/**
     * `ngettext_with_context` filter callback
     */
    
function filter_ngettext_with_context$msgstr$msgid$msgid_plural$number$msgctxt$domain ){
        
$this->buffer[$domain][$msgctxt."\x04".$msgid] = null;
        return 
$msgstr;
    }



    
/**
     * Export all captured translations in a raw form and reset buffer
     * @param string $domain the specific domain listened for
     * @return array
     */
    
public function flush$domain ){
        
$export = [];
        if( isset(
$this->buffer[$domain]) ){
            
// what we captures was just a unique namespace
            
$captured $this->buffer[$domain];
            unset(
$this->buffer[$domain]);
            
// process raw data for all that actually exist
            // this survives on WordPress internals not changing :-/
            
$loaded get_translations_for_domain($domain);
            
// since WordPress 6.5, this class doesn't pre-index the values
            
if( $loaded instanceof WP_Translations ){
                
/* @var Translation_Entry $entry */
                
foreach( $loaded->entries as $entry ){
                    
$key $entry->key();
                    if( 
array_key_exists($key,$captured) ){
                        
$export[$key] = $entry->translations;
                    }
                }
            }
            
// legacy, entries are indexed already by the key:
            
else if( $loaded instanceof Translations ){
                
$entries array_intersect_key$loaded->entries$captured );
                
/* @var $entry Translation_Entry */
                
foreach( $entries as $key => $entry ){
                    
$export[$key] = $entry->translations;
                }
            }
        }

        return 
$export;
    }


}