|
|
|
#!/usr/bin/env php
|
|
|
|
<?php
|
|
|
|
/*
|
|
|
|
|
|
|
|
+-----------------------------------------------------------------------+
|
|
|
|
| bin/exportgettext.sh |
|
|
|
|
| |
|
|
|
|
| This file is part of the Roundcube Webmail client |
|
|
|
|
| Copyright (C) 2011, The Roundcube Dev Team |
|
|
|
|
| Licensed under the GNU GPLv3 |
|
|
|
|
| |
|
|
|
|
| PURPOSE: |
|
|
|
|
| Export PHP-based localization files to PO files for gettext |
|
|
|
|
+-----------------------------------------------------------------------+
|
|
|
|
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
|
|
|
+-----------------------------------------------------------------------+
|
|
|
|
|
|
|
|
$Id$
|
|
|
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
define('INSTALL_PATH', realpath(dirname(__FILE__) . '/..') . '/' );
|
|
|
|
require INSTALL_PATH.'program/include/clisetup.php';
|
|
|
|
|
|
|
|
if ($argc < 2) {
|
|
|
|
die("Usage: " . basename($argv[0]) . " SRCDIR DESTDIR\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
$srcdir = unslashify(realpath($argv[1]));
|
|
|
|
$destdir = unslashify($argv[2]);
|
|
|
|
$layout = 'launchpad'; # or 'narro';
|
|
|
|
|
|
|
|
|
|
|
|
// converting roundcube localization dir
|
|
|
|
if (is_dir($srcdir.'/en_US')) {
|
|
|
|
load_en_US($srcdir.'/en_US');
|
|
|
|
|
|
|
|
foreach (glob($srcdir.'/*') as $locdir) {
|
|
|
|
if (is_dir($locdir)) {
|
|
|
|
$lang = basename($locdir);
|
|
|
|
//echo "$locdir => $destdir$lang\n";
|
|
|
|
convert_dir($locdir, $destdir . ($layout != 'launchpad' ? $lang : ''));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// converting plugin localization
|
|
|
|
else if (is_dir($srcdir)) {
|
|
|
|
load_en_US($srcdir.'/en_US.inc');
|
|
|
|
convert_dir($srcdir, $destdir);
|
|
|
|
}
|
|
|
|
// converting a single file
|
|
|
|
else if (is_file($srcdir)) {
|
|
|
|
//load_en_US();
|
|
|
|
convert_file($srcdir, $destdir);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load en_US localization which is used to build msgids
|
|
|
|
*/
|
|
|
|
function load_en_US($fn)
|
|
|
|
{
|
|
|
|
$texts = array();
|
|
|
|
|
|
|
|
if (is_dir($fn)) {
|
|
|
|
foreach (glob($fn.'/*.inc') as $ifn) {
|
|
|
|
include($ifn);
|
|
|
|
$texts = array_merge($texts, (array)$labels, (array)$messages);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else if (is_file($fn)) {
|
|
|
|
include($fn);
|
|
|
|
$texts = array_merge($texts, (array)$labels);
|
|
|
|
}
|
|
|
|
|
|
|
|
$GLOBALS['en_US'] = $texts;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert all .inc files in the given src directory
|
|
|
|
*/
|
|
|
|
function convert_dir($indir, $outdir)
|
|
|
|
{
|
|
|
|
global $layout;
|
|
|
|
|
|
|
|
if (!is_dir($outdir)) // attempt to create destination dir
|
|
|
|
mkdir($outdir, 0777, true);
|
|
|
|
|
|
|
|
foreach (glob($indir.'/*.inc') as $fn) {
|
|
|
|
$filename = basename($fn);
|
|
|
|
|
|
|
|
// create subdir for each template (launchpad rules)
|
|
|
|
if ($layout == 'launchpad' && preg_match('/^(labels|messages)/', $filename, $m)) {
|
|
|
|
$lang = end(explode('/', $indir));
|
|
|
|
$destdir = $outdir . '/' . $m[1];
|
|
|
|
if (!is_dir($destdir))
|
|
|
|
mkdir($destdir, 0777, true);
|
|
|
|
$outfn = $destdir . '/' . $lang . '.po';
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
$outfn = $outdir . '/' . preg_replace('/\.[a-z0-9]+$/i', '', basename($fn)) . '.po';
|
|
|
|
}
|
|
|
|
|
|
|
|
convert_file($fn, $outfn);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Convert the given Roundcube localization file into a gettext .po file
|
|
|
|
*/
|
|
|
|
function convert_file($fn, $outfn)
|
|
|
|
{
|
|
|
|
global $layout;
|
|
|
|
|
|
|
|
$basename = basename($fn);
|
|
|
|
$srcname = str_replace(INSTALL_PATH, '', $fn);
|
|
|
|
$product = preg_match('!plugins/(\w+)!', $srcname, $m) ? 'roundcube-plugin-' . $m[1] : 'roundcubemail';
|
|
|
|
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
|
|
|
|
$labels = $messages = $seen = array();
|
|
|
|
|
|
|
|
if (is_dir($outfn))
|
|
|
|
$outfn .= '/' . $basename . '.po';
|
|
|
|
|
|
|
|
// launchpad requires the template file to have the same name as the directory
|
|
|
|
if (strstr($outfn, '/en_US') && $layout == 'launchpad') {
|
|
|
|
$a = explode('/', $outfn);
|
|
|
|
array_pop($a);
|
|
|
|
$templ = end($a);
|
|
|
|
$a[] = $templ . '.pot';
|
|
|
|
$outfn = join('/', $a);
|
|
|
|
$is_pot = true;
|
|
|
|
}
|
|
|
|
// launchpad is very picky about file names
|
|
|
|
else if ($layout == 'launchpad' && preg_match($regex = '!/([a-z]{2})_([A-Z]{2})!', $outfn, $m) && $m[1] == strtolower($m[2])) {
|
|
|
|
$outfn = preg_replace($regex, '/\1', $outfn);
|
|
|
|
}
|
|
|
|
|
|
|
|
include($fn);
|
|
|
|
$texts = $labels ? $labels : $messages;
|
|
|
|
|
|
|
|
// write header
|
|
|
|
$header = <<<EOF
|
|
|
|
# Converted from Roundcube PHP localization files
|
|
|
|
# Copyright (C) 2011 The Roundcube Dev Team
|
|
|
|
# This file is distributed under the same license as the Roundcube package.
|
|
|
|
#
|
|
|
|
#: %s
|
|
|
|
msgid ""
|
|
|
|
msgstr ""
|
|
|
|
"Project-Id-Version: %s\\n"
|
|
|
|
"Report-Msgid-Bugs-To: \\n"
|
|
|
|
"POT-Creation-Date: %s\\n"
|
|
|
|
"PO-Revision-Date: %s\\n"
|
|
|
|
"Last-Translator: \\n"
|
|
|
|
"Language-Team: Translations <hello@roundcube.net>\\n"
|
|
|
|
"Language: %s\\n"
|
|
|
|
"Content-Type: text/plain; charset=UTF-8\\n"
|
|
|
|
"Content-Transfer-Encoding: 8bit\\n"
|
|
|
|
EOF;
|
|
|
|
|
|
|
|
$out = sprintf($header, $srcname, $product, date('c'), date('c'), $lang);
|
|
|
|
$out .= "\n";
|
|
|
|
|
|
|
|
$messages = array();
|
|
|
|
foreach ((array)$texts as $label => $msgstr) {
|
|
|
|
$msgid = $GLOBALS['en_US'][$label] ?: $label;
|
|
|
|
$messages[$msgid][] = $label;
|
|
|
|
}
|
|
|
|
|
|
|
|
foreach ($messages as $msgid => $labels) {
|
|
|
|
$out .= "\n";
|
|
|
|
foreach ($labels as $label)
|
|
|
|
$out .= "#: $srcname:$label\n";
|
|
|
|
$msgstr = $texts[$label];
|
|
|
|
$out .= 'msgid ' . gettext_quote($msgid) . "\n";
|
|
|
|
$out .= 'msgstr ' . gettext_quote(!$is_pot ? $msgstr : '') . "\n";
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($outfn == '-')
|
|
|
|
echo $out;
|
|
|
|
else {
|
|
|
|
echo "$fn\t=>\t$outfn\n";
|
|
|
|
file_put_contents($outfn, $out);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
function gettext_quote($str)
|
|
|
|
{
|
|
|
|
$out = "";
|
|
|
|
$lines = explode("\n", stripslashes($str));
|
|
|
|
$suffix = count($lines) > 1 ? '\n' : '';
|
|
|
|
foreach ($lines as $line)
|
|
|
|
$out .= '"' . addcslashes($line, '"') . $suffix . "\"\n";
|
|
|
|
return rtrim($out);
|
|
|
|
}
|
|
|
|
|
|
|
|
?>
|