/var/www/html_it/wp-content/plugins/loco-translate/src/package/Inverter.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
<?php
/**
 * Bundle inverter utility class.
 */
abstract class Loco_package_Inverter {
    
    
/**
     * Get all Gettext files that are not configured and valid in the given bundle
     * @return array
     */
    
public static function exportLoco_package_Bundle $bundle ){
        
// search paths for inverted bundle will exclude global ignore paths, 
        // plus anything known to the current configuration which we'll add now.
        
$finder $bundle->getFileFinder();
        
        
/* @var $project Loco_package_Project */
        
foreach( $bundle as $project ){
            if( 
$file $project->getPot() ){
                
// excluding all extensions in case POT is actually a PO/MO pair
                
foreach( ['pot','po','mo'] as $ext ){
                    
$file $file->cloneExtension($ext); 
                    if( 
$path realpath$file->getPath() ) ){
                        
$finder->exclude$path );
                    }
                }
            }
            foreach( 
$project->findLocaleFiles('po') as $file ){
                if( 
$path realpath$file->getPath() ) ){
                    
$finder->exclude$path );
                }
            }
            foreach( 
$project->findLocaleFiles('mo') as $file ){
                if( 
$path realpath$file->getPath() ) ){
                    
$finder->exclude$path );
                }
            }
        }
        
// Do a deep scan of all files that haven't been seen, or been excluded:
        // This will include files in global directories and inside the bundle.
        
return $finder->setRecursive(true)->followLinks(false)->group('po','mo','pot')->exportGroups();
    }    
    
    
    
/**
     * Compile anything found under bundle root that isn't configured in $known
     * @return Loco_package_Bundle
     */
    
public static function compileLoco_package_Bundle $bundle ){
        
        
$found self::export($bundle);
        
        
// done with original bundle now
        
$bundle = clone $bundle;
        
$bundle->clear();
        

        
// first iteration groups found files into common locations that should hopefully indicate translation sets
        
$groups = [];
        
$templates = [];
        
$localised = [];
        
$root $bundle->getDirectoryPath();

        
/* @var $list Loco_fs_FileList */
        
foreach( $found as $ext => $list ){
            
/* @var $file Loco_fs_LocaleFile */
            
foreach( $list as $file ){
                
// printf("Found: %s <br />\n", $file );
                // This file is NOT known to be part of a configured project
                
$dir $file->getParent();
                
$key $dir->getRelativePath$root );
                
//
                
if( ! isset($groups[$key]) ){
                    
$groups[$key] = $dir;
                    
$templates[$key] = [];
                    
$localised[$key] = [];
                }
                
// template should define single set of translations unique by directory and file prefix
                
if( 'pot' === $ext ){
                    
$slug $file->filename();
                    
$templates[$key][$slug] = true;
                }
                
// else ideally PO/MO files will correspond to a template by common prefix
                
else {
                    
$file = new Loco_fs_LocaleFile$file );
                    
$slug $file->getPrefix();
                    if( 
$file->getLocale()->isValid() ){
                        
$localised[$key][$slug] = true;
                    }
                    
// else could be some kind of non-standard template
                    
else {
                        
$slug $file->filename();
                        
$templates[$key][$slug] = true;
                    }
                }
            }
        }

        unset(
$found);


        
// next iteration matches collected files together into likely project sets
        
$unique = [];
        
        
/* @var $list Loco_fs_Directory */
        
foreach( $groups as $key => $dir ){
            
// pair up all projects that match templates neatly to prefixed files
            
foreach( $templates[$key] as $slug => $bool ){
                if( isset(
$localised[$key][$slug]) ){
                    
//printf("Perfect match on domain '%s' in %s <br />\n", $slug, $key );
                    
$unique[$key][$slug] = $dir;
                    
// done with this perfectly matched set
                    
$templates[$key][$slug] = null;
                    
$localised[$key][$slug] = null;
                }
            }
            
// pair up any unprefixed localised files
            
if( isset($localised[$key]['']) ){
                
$slug 'unknown';
                
// Match to first (hopefully only) template to establish a slug
                
foreach( $templates[$key] as $_slug => $bool ){
                    if( 
$bool ){
                        
$slug $_slug;
                        
$templates[$key][$slug] = null;
                        break; 
// <- not possible to know how multiple POTs might be paired up
                    
}
                }
                
//printf("Pairing unprefixed files in %s to '%s' <br />\n", $key, $slug );
                
$unique[$key][$slug] = $dir;
                
// done with unprefixed localised files in this directory
                
$localised[$key][''] = null;
            }
            
// add any orphaned translations (those with no template matched)
            
foreach( $localised[$key] as $slug => $bool ){
                if( 
$bool ){
                    
// printf("Picked up orphoned locales in %s as '%s' <br />\n", $key, $slug );
                    
$unique[$key][$slug] = $dir;
                }
            }
            
// add any orphaned templates (those with no localised files matched)
            
foreach( $templates[$key] as $slug => $bool ){
                if( 
$bool ){
                    
//printf("Picked up orphoned template in %s as '%s' <br />\n", $key, $slug );
                    
$unique[$key][$slug] = $dir;
                }
            }
        }

        unset( 
$groups$localised$templates );

               
        
// final iteration adds unique projects to bundle
        
        
foreach( $unique as $key => $sets ){
            foreach( 
$sets as $slug => $dir ){
                
$name ucfirststrtr$slug'-_''  ' ) );
                
$domain = new Loco_package_TextDomain$slug );
                
$project $domain->createProject$bundle$name );
                
$project->addTargetDirectory($dir);
                
$bundle->addProject($project);
            }
            
// TODO how to prevent overlapping sets by adding each other's files to exclude lists
        
}
        
        
        return 
$bundle;
    }    
    
    
    
}