#!/usr/bin/env php
|
<?php
|
/*
|
+-----------------------------------------------------------------------+
|
| bin/importgettext.sh |
|
| |
|
| This file is part of the Roundcube Webmail client |
|
| Copyright (C) 2011, The Roundcube Dev Team |
|
| Licensed under the GNU General Public License |
|
| |
|
| PURPOSE: |
|
| Import localizations from gettext PO format |
|
+-----------------------------------------------------------------------+
|
| Author: Thomas Bruederli <roundcube@gmail.com> |
|
+-----------------------------------------------------------------------+
|
*/
|
|
define('INSTALL_PATH', realpath(__DIR__ . '/..') . '/' );
|
require INSTALL_PATH.'program/include/clisetup.php';
|
|
if ($argc < 2) {
|
die("Usage: " . basename($argv[0]) . " SRCDIR\n");
|
}
|
|
$srcdir = unslashify(realpath($argv[1]));
|
|
if (is_dir($srcdir)) {
|
$out = import_dir($srcdir);
|
}
|
else if (is_file($srcdir)) {
|
$out = import_file($srcdir);
|
}
|
|
// write output files
|
foreach ($out as $outfn => $texts) {
|
$lang = preg_match('!/([a-z]{2}(_[A-Z]{2})?)[./]!', $outfn, $m) ? $m[1] : '';
|
$varname = strpos($outfn, 'messages.inc') !== false ? 'messages' : 'labels';
|
|
$header = <<<EOF
|
<?php
|
|
/*
|
+-----------------------------------------------------------------------+
|
| localization/%s/%-51s|
|
| |
|
| Language file of the Roundcube Webmail client |
|
| Copyright (C) %s, The Roundcube Dev Team |
|
| Licensed under the GNU General Public License |
|
| |
|
+-----------------------------------------------------------------------+
|
| Author: %-62s|
|
+-----------------------------------------------------------------------+
|
*/
|
|
$%s = array();
|
|
EOF;
|
|
$author = preg_replace('/\s*<Unknown>/i', '', $texts['_translator']);
|
$output = sprintf($header, $lang, $varname.'.inc', date('Y'), $author, $varname);
|
|
foreach ($texts as $label => $value) {
|
if (is_array($value)) { var_dump($outfn, $label, $value); exit; }
|
if ($label[0] != '_' && strlen($value))
|
$output .= sprintf("\$%s['%s'] = '%s';\n", $varname, $label, strtr(addcslashes($value, "'"), array("\r" => '', "\n" => '\n')));
|
}
|
|
$output .= "\n";
|
$dir = dirname($outfn);
|
@mkdir($dir, 0755, true);
|
if (file_put_contents($outfn, $output))
|
echo "-> $outfn\n";
|
}
|
|
|
/**
|
* Convert all .po files in the given src directory
|
*/
|
function import_dir($indir)
|
{
|
$out = array();
|
foreach (glob($indir.'/*.po') as $fn) {
|
$out = array_merge_recursive($out, import_file($fn));
|
}
|
return $out;
|
}
|
|
/**
|
* Convert the given .po file into a Roundcube localization array
|
*/
|
function import_file($fn)
|
{
|
$out = array();
|
$lines = file($fn);
|
$language = '';
|
$translator = '';
|
|
// get language code from file name
|
if (preg_match('/-([a-z_]+).po$/i', $fn, $m))
|
$language = expand_langcode($m[1]);
|
|
$is_header = true;
|
$msgid = null;
|
$msgstr = '';
|
$dests = array();
|
foreach ($lines as $i => $line) {
|
$line = trim($line);
|
|
// parse header
|
if ($is_header && $line[0] == '"') {
|
list($key, $val) = explode(": ", preg_replace('/\\\n$/', '', trim($line, '"')), 2);
|
switch (strtolower($key)) {
|
case 'language':
|
$language = expand_langcode($val);
|
break;
|
case 'last-translator':
|
$translator = $val;
|
break;
|
}
|
}
|
|
// empty line
|
if ($line == '') {
|
if ($msgid && $dests) {
|
foreach ($dests as $dest) {
|
list($file, $label) = explode(':', $dest);
|
$out[$file][$label] = $msgstr;
|
$out[$file]['_translator'] = $translator;
|
}
|
}
|
|
$msgid = null;
|
$msgstr = '';
|
$dests = array();
|
}
|
|
// meta line
|
if ($line[0] == '#') {
|
$value = trim(substr($line, 2));
|
if ($line[1] == ':')
|
$dests[] = str_replace('en_US', $language, $value);
|
}
|
else if (strpos($line, 'msgid') === 0) {
|
$msgid = gettext_decode(substr($line, 6));
|
|
if (!empty($msgid))
|
$is_header = false;
|
}
|
else if (strpos($line, 'msgstr') === 0) {
|
$msgstr = gettext_decode(substr($line, 7));
|
}
|
else if ($msgid && $line[0] == '"') {
|
$msgstr .= gettext_decode($line);
|
}
|
else if ($msgid !== null && $line[0] == '"') {
|
$msgid .= gettext_decode($line);
|
}
|
}
|
|
if ($msgid && $dests) {
|
foreach ($dests as $dest) {
|
list($file, $label) = explode(':', $dest);
|
$out[$file][$label] = $msgstr;
|
$out[$file]['_translator'] = $translator;
|
}
|
}
|
|
return $language ? $out : array();
|
}
|
|
|
function gettext_decode($str)
|
{
|
return stripslashes(trim($str, '"'));
|
}
|
|
/**
|
* Translate two-chars language codes to our internally used language identifiers
|
*/
|
function expand_langcode($lang)
|
{
|
static $rcube_language_aliases, $rcube_languages;
|
|
if (!$rcube_language_aliases)
|
include(INSTALL_PATH . 'program/localization/index.inc');
|
|
if ($rcube_language_aliases[$lang])
|
return $rcube_language_aliases[$lang];
|
else if (strlen($lang) == 2 && !isset($rcube_languages[$lang]))
|
return strtolower($lang) . '_' . strtoupper($lang);
|
else
|
return $lang;
|
}
|
|
|
?>
|