mirror of
				https://github.com/Icinga/icingaweb2.git
				synced 2025-11-03 20:54:27 +01:00 
			
		
		
		
	Add all untested files from incubator's library/Icinga to working tree library/Icinga refs #4257
		
			
				
	
	
		
			148 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			148 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Icinga\Application;
 | 
						|
 | 
						|
class TranslationHelper
 | 
						|
{
 | 
						|
    protected $basedir;
 | 
						|
    protected $moduledir;
 | 
						|
    protected $tmpfile;
 | 
						|
    protected $potfile;
 | 
						|
    protected $locale;
 | 
						|
    protected $module;
 | 
						|
 | 
						|
    public function __construct(ApplicationBootstrap $bootstrap, $locale, $module = null)
 | 
						|
    {
 | 
						|
        $this->moduledir  = $bootstrap->getModuleDir();
 | 
						|
        if ($module) {
 | 
						|
            $this->basedir = $bootstrap->getModuleDir($module) . '/application';
 | 
						|
        } else {
 | 
						|
            $this->basedir = $bootstrap->getApplicationDir();
 | 
						|
        }
 | 
						|
        $this->locale     = $locale;
 | 
						|
        $this->module     = $module;
 | 
						|
        $this->targetfile = $this->basedir
 | 
						|
                          . '/locale/'
 | 
						|
                          . $this->locale
 | 
						|
                          . '/LC_MESSAGES/'
 | 
						|
                          . ($module ? $module : 'icinga')
 | 
						|
                          . '.po';
 | 
						|
        $target_dir = dirname($this->targetfile);
 | 
						|
        if (! is_dir($target_dir)) {
 | 
						|
            mkdir($target_dir, 0755, true);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function __destruct()
 | 
						|
    {
 | 
						|
        if ($this->tmpfile !== null) {
 | 
						|
            unlink($this->tmpfile);
 | 
						|
        }
 | 
						|
        if ($this->potfile !== null) {
 | 
						|
            unlink($this->potfile);
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function extractTexts()
 | 
						|
    {
 | 
						|
        $tmpdir = sys_get_temp_dir();
 | 
						|
        $this->potfile = tempnam($tmpdir, 'IcingaPot_');
 | 
						|
        $cmd = '/usr/bin/xgettext'
 | 
						|
             . ' --language=PHP'
 | 
						|
             . ' --from-code=iso-8859-15'
 | 
						|
             . ' --keyword='
 | 
						|
             . ($this->module ? '_mt:2' : '_t')
 | 
						|
             . ' --sort-output'
 | 
						|
             . ' --force-po'
 | 
						|
             . ' --package-name=Icinga'
 | 
						|
             . ' --package-version=0.1'
 | 
						|
             . ' --copyright-holder="Icinga Team"'
 | 
						|
             . ' --msgid-bugs-address="dev@icinga.org"'
 | 
						|
             . ' --files-from=' . $this->tmpfile
 | 
						|
             . ' --output=' . $this->potfile
 | 
						|
             ;
 | 
						|
         `$cmd`;
 | 
						|
         $this->fixPotfile();
 | 
						|
         $this->mergeOldTranslations();
 | 
						|
         return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function fixPotfile()
 | 
						|
    {
 | 
						|
        $content = file_get_contents($this->potfile);
 | 
						|
        $fh = fopen($this->potfile, 'w');
 | 
						|
        foreach (preg_split('~\n~', $content) as $line) {
 | 
						|
            // if (preg_match('~^"Language:~', $line)) continue;
 | 
						|
            if (preg_match('~^"Content-Type:~', $line)) {
 | 
						|
                $line = '"Content-Type: text/plain; charset=utf-8\n"';
 | 
						|
            }
 | 
						|
            fwrite($fh, $line . "\n");
 | 
						|
        }
 | 
						|
        fclose($fh);
 | 
						|
    }
 | 
						|
 | 
						|
    protected function mergeOldTranslations()
 | 
						|
    {
 | 
						|
        if (is_file($this->targetfile)) {
 | 
						|
            $cmd = sprintf(
 | 
						|
                '/usr/bin/msgmerge %s %s -o %s 2>&1',
 | 
						|
                $this->targetfile,
 | 
						|
                $this->potfile,
 | 
						|
                $this->targetfile . '.new'
 | 
						|
            );
 | 
						|
            `$cmd`;
 | 
						|
            rename($this->targetfile . '.new', $this->targetfile);
 | 
						|
        } else {
 | 
						|
            file_put_contents($this->targetfile, file_get_contents($this->potfile));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function createTemporaryFileList()
 | 
						|
    {
 | 
						|
        $tmpdir = sys_get_temp_dir();
 | 
						|
        $this->tmpfile = tempnam($tmpdir, 'IcingaTranslation_');
 | 
						|
        $tmp_fh = fopen($this->tmpfile, 'w');
 | 
						|
        if (! $tmp_fh) {
 | 
						|
            throw new \Exception('Unable to create ' . $this->tmpfile);
 | 
						|
        }
 | 
						|
        if ($this->module) {
 | 
						|
            $blacklist = array();
 | 
						|
        } else {
 | 
						|
            $blacklist = array(
 | 
						|
                $this->moduledir
 | 
						|
            );
 | 
						|
        }
 | 
						|
        $this->getSourceFileNames($this->basedir, $tmp_fh, $blacklist);
 | 
						|
        $this->getSourceFileNames(ICINGA_LIBDIR, $tmp_fh, $blacklist);
 | 
						|
        fclose($tmp_fh);
 | 
						|
        return $this;
 | 
						|
    }
 | 
						|
 | 
						|
    protected function getSourceFileNames($dir, & $fh, $blacklist = array())
 | 
						|
    {
 | 
						|
        $dh = opendir($dir);
 | 
						|
        if (! $dh) {
 | 
						|
            throw new \Exception("Unable to read files from $dir");
 | 
						|
        }
 | 
						|
        $subdirs = array();
 | 
						|
        while ($filename = readdir($dh)) {
 | 
						|
            if ($filename[0] === '.') {
 | 
						|
                continue;
 | 
						|
            }
 | 
						|
            $fullname = $dir . '/' . $filename;
 | 
						|
            if (preg_match('~\.(?:php|phtml)$~', $filename)) {
 | 
						|
                fwrite($fh, "$fullname\n");
 | 
						|
            } elseif (is_dir($fullname)) {
 | 
						|
                if (in_array($fullname, $blacklist)) {
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
                $subdirs[] = $fullname;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        closedir($dh);
 | 
						|
        foreach ($subdirs as $dir) {
 | 
						|
            $this->getSourceFileNames($dir, $fh, $blacklist);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 |