icingaweb2/library/Icinga/Application/TranslationHelper.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);
}
}
}