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
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
|
<?php /** * */ class Loco_admin_bundle_SetupController extends Loco_admin_bundle_BaseController {
/** * {@inheritdoc} */ public function init(){ parent::init(); $bundle = $this->getBundle(); // translators: where %s is a plugin or theme $this->set( 'title', sprintf( __('Set up %s','loco-translate'),$bundle->getName() ) ); }
/** * {@inheritdoc} */ public function getHelpTabs(){ return [ __('Setup tab','loco-translate') => $this->viewSnippet('tab-bundle-setup'), ]; }
/** * {@inheritdoc} */ public function render(){
$this->prepareNavigation()->add( __('Bundle setup','loco-translate') ); $bundle = $this->getBundle(); $action = 'setup:'.$bundle->getId(); // execute auto-configure if posted $post = Loco_mvc_PostParams::get(); if( $post->has('auto-setup') && $this->checkNonce( 'auto-'.$action) ){ if( 0 === count($bundle) ){ $bundle->createDefault(); } foreach( $bundle as $project ){ if( ! $project->getPot() && ( $file = $project->guessPot() ) ){ $project->setPot( $file ); } } // forcefully add every additional project into bundle foreach( $bundle->invert() as $project ){ if( ! $project->getPot() && ( $file = $project->guessPot() ) ){ $project->setPot( $file ); } $bundle[] = $project; } $this->saveBundle(); $bundle = $this->getBundle(); $this->set('auto', null ); } // execute XML-based config if posted else if( $post->has('xml-setup') && $this->checkNonce( 'xml-'.$action) ){ $bundle->clear(); $model = new Loco_config_XMLModel; $model->loadXml( trim( $post['xml-content'] ) ); $reader = new Loco_config_BundleReader($bundle); $reader->loadModel( $model ); $this->saveBundle(); $bundle = $this->getBundle(); $this->set('xml', null ); } // execute JSON-based config if posted else if( $post->has('json-setup') && $this->checkNonce( 'json-'.$action) ){ $bundle->clear(); $model = new Loco_config_ArrayModel; $model->loadJson( trim( $post['json-content'] ) ); $reader = new Loco_config_BundleReader($bundle); $reader->loadModel( $model ); $this->saveBundle(); $bundle = $this->getBundle(); $this->set('json', null ); } // execute reset if posted else if( $post->has('reset-setup') && $this->checkNonce( 'reset-'.$action) ){ $this->resetBundle(); $bundle = $this->getBundle(); }
// bundle author links $info = $bundle->getHeaderInfo(); $this->set( 'credit', $info->getAuthorCredit() );
// render according to current configuration method (save type) $configured = $this->get('force') or $configured = $bundle->isConfigured();
$notices = new ArrayIterator; $this->set('notices', $notices ); // collect configuration warnings foreach( $bundle as $project ){ $potfile = $project->getPot(); if( ! $potfile ){ $notices[] = sprintf('No translation template for the "%s" text domain', $project->getSlug() ); } } // if extra files found consider incomplete if( $bundle->isTheme() || ( $bundle->isPlugin() && ! $bundle->isSingleFile() ) ){ $unknown = Loco_package_Inverter::export($bundle); $n = 0; foreach( $unknown as $ext => $files ){ $n += count($files); } if( $n ){ // translators: %s is a quantity of files which were found, but whose context is unknown $notices[] = sprintf( _n("%s file can't be matched to a known set of strings","%s files can't be matched to a known set of strings",$n,'loco-translate'), number_format_i18n($n) ); } } // display setup options if at least one option specified $doconf = false;
// enable form to invoke auto-configuration if( $this->get('auto') ){ $fields = new Loco_mvc_HiddenFields(); $fields->setNonce( 'auto-'.$action ); $this->set('autoFields', $fields ); $doconf = true; } // enable form to paste XML config if( $this->get('xml') ){ $fields = new Loco_mvc_HiddenFields(); $fields->setNonce( 'xml-'.$action ); $this->set('xmlFields', $fields ); $doconf = true; } /*/ JSON config via remote lookup has been scrapped if( $this->get('json') ){ $fields = new Loco_mvc_HiddenFields( [ 'json-content' => '', 'version' => $info->Version, ] ); $fields->setNonce( 'json-'.$action ); $this->set('jsonFields', $fields ); // other information for looking up bundle via api $this->set('vendorSlug', $bundle->getSlug() ); // remote config is done via JavaScript $this->enqueueScript('setup'); $apiBase = apply_filters( 'loco_api_url', 'https://localise.biz/api' ); $this->set('js', new Loco_mvc_ViewParams( [ 'apiUrl' => $apiBase.'/wp/'.strtolower( $bundle->getType() ), ] ) ); $doconf = true; }*/ // display configurator if configuring if( $doconf ){ return $this->view( 'admin/bundle/setup/conf' ); }
// Add some debugging information on all screens except config // this used to be accessed via the Debug tab, which is removed if( loco_debugging() && count($bundle) ){ $this->set('debug', $this->getDebug($bundle) ); }
// set configurator links back to self with required option ... if( ! $configured || ! count($bundle) ){ return $this->view( 'admin/bundle/setup/none' ); }
if( 'db' === $configured ){ // form for resetting config $fields = new Loco_mvc_HiddenFields(); $fields->setNonce( 'reset-'.$action ); $this->set( 'reset', $fields ); return $this->view('admin/bundle/setup/saved'); }
if( 'internal' === $configured ){ return $this->view('admin/bundle/setup/core'); }
if( 'file' === $configured ){ return $this->view('admin/bundle/setup/author'); } if( count($notices) ){ return $this->view('admin/bundle/setup/partial'); } return $this->view('admin/bundle/setup/meta'); }
/** * @return Loco_mvc_ViewParams */ private function getDebug( Loco_package_Bundle $bundle ){ $debug = new Loco_mvc_ViewParams;
// XML config $writer = new Loco_config_BundleWriter($bundle); $debug['xml'] = $writer->toXml(); // general notes, followed by related warnings $notes = []; $warns = []; // show auto-detected settings, either assumed (by wp) or declared (by author) if( 'meta' === $bundle->isConfigured() ){ // Text Domain: $native = $bundle->getHeaderInfo(); $domain = $native->TextDomain; if( $domain ){ // Translators: %s will be replaced with a text domain, e.g. "loco-translate" $notes[] = sprintf( __('WordPress says the primary text domain is "%s"','loco-translate'), $domain ); // WordPress 4.6 changes mean this header could be a fallback and not actually declared by the author if( $bundle->isPlugin() ) { $map = [ 'TextDomain' => 'Text Domain' ]; $raw = get_file_data( $bundle->getBootstrapPath(), $map, 'plugin' ); if( ! isset($raw['TextDomain']) || '' === $raw['TextDomain'] ) { // Translators: This warning is shown when a text domain has defaulted to same as the folder name (or slug) $warns[] = __("This plugin doesn't declare a text domain. It's assumed to be the same as the slug, but this could be wrong",'loco-translate'); } } // Warn if WordPress-assumed text domain is not configured. plugin/theme headers won't be translated $domains = $bundle->getDomains(); if ( ! isset($domains[$domain ]) && ! isset($domains['*']) ) { $warns[] = __("This text domain is not in Loco Translate's bundle configuration",'loco-translate'); } } else { $warns[] = __("This bundle does't declare a text domain; try configuring it in the Advanced tab",'loco-translate'); } // Domain Path: $path = $native->DomainPath; if( $path ){ // Translators: %s will be replaced with a relative path like "/languages" $notes[] = sprintf( __('The domain path is declared by the author as "%s"','loco-translate'), $path ); } else { $guess = new Loco_fs_Directory( $bundle->getDirectoryPath().'/languages' ); if( $guess->readable() ){ $notes[] = __('The default "languages" domain path has been detected','loco-translate'); } else { $warns[] = __("This bundle doesn't declare a domain path. Add one via the Advanced tab if needed",'loco-translate'); } } }
$debug['notices'] = [ 'info' => $notes, 'warning' => $warns ]; return $debug; } }
|