xref: /dokuwiki/bin/striplangs.php (revision dccd6b2bba7367e4d1d2d7aa84c9f9d15584b593)
1#!/usr/bin/env php
2<?php
3
4use splitbrain\phpcli\CLI;
5use splitbrain\phpcli\Options;
6
7if(!defined('DOKU_INC')) define('DOKU_INC', realpath(__DIR__ . '/../') . '/');
8define('NOSESSION', 1);
9require_once(DOKU_INC . 'inc/init.php');
10
11/**
12 * Remove unwanted languages from a DokuWiki install
13 */
14class StripLangsCLI extends CLI
15{
16
17    /**
18     * Register options and arguments on the given $options object
19     *
20     * @param Options $options
21     * @return void
22     */
23    protected function setup(Options $options)
24    {
25
26        $options->setHelp(
27            'Remove all languages from the installation, besides the ones specified. English language ' .
28            'is never removed!'
29        );
30
31        $options->registerOption(
32            'keep',
33            'Comma separated list of languages to keep in addition to English.',
34            'k',
35            'langcodes'
36        );
37        $options->registerOption(
38            'english-only',
39            'Remove all languages except English',
40            'e'
41        );
42    }
43
44    /**
45     * Your main program
46     *
47     * Arguments and options have been parsed when this is run
48     *
49     * @param Options $options
50     * @return void
51     */
52    protected function main(Options $options)
53    {
54        if($options->getOpt('keep')) {
55            $keep = explode(',', $options->getOpt('keep'));
56            if(!in_array('en', $keep)) $keep[] = 'en';
57        } elseif($options->getOpt('english-only')) {
58            $keep = ['en'];
59        } else {
60            echo $options->help();
61            exit(0);
62        }
63
64        // Kill all language directories in /inc/lang and /lib/plugins besides those in $langs array
65        $this->stripDirLangs(realpath(__DIR__ . '/../inc/lang'), $keep);
66        $this->processExtensions(realpath(__DIR__ . '/../lib/plugins'), $keep);
67        $this->processExtensions(realpath(__DIR__ . '/../lib/tpl'), $keep);
68    }
69
70    /**
71     * Strip languages from extensions
72     *
73     * @param string $path path to plugin or template dir
74     * @param array $keep_langs languages to keep
75     */
76    protected function processExtensions($path, $keep_langs)
77    {
78        if(is_dir($path)) {
79            $entries = scandir($path);
80
81            foreach($entries as $entry) {
82                if($entry != "." && $entry != "..") {
83                    if(is_dir($path . '/' . $entry)) {
84
85                        $plugin_langs = $path . '/' . $entry . '/lang';
86
87                        if(is_dir($plugin_langs)) {
88                            $this->stripDirLangs($plugin_langs, $keep_langs);
89                        }
90                    }
91                }
92            }
93        }
94    }
95
96    /**
97     * Strip languages from path
98     *
99     * @param string $path path to lang dir
100     * @param array $keep_langs languages to keep
101     */
102    protected function stripDirLangs($path, $keep_langs)
103    {
104        $dir = dir($path);
105
106        while(($cur_dir = $dir->read()) !== false) {
107            if($cur_dir != '.' && $cur_dir != '..' && is_dir($path . '/' . $cur_dir)) {
108
109                if(!in_array($cur_dir, $keep_langs, true)) {
110                    io_rmdir($path . '/' . $cur_dir, true);
111                }
112            }
113        }
114        $dir->close();
115    }
116}
117
118$cli = new StripLangsCLI();
119$cli->run();
120