translater/index.php

1225 lines
46 KiB
PHP

<?php
# -- BEGIN LICENSE BLOCK ----------------------------------
#
# This file is part of translater, a plugin for Dotclear 2.
#
# Copyright (c) 2009-2016 Jean-Christian Denis and contributors
#
# Licensed under the GPL version 2.0 license.
# A copy of this license is available in LICENSE file or at
# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
#
# -- END LICENSE BLOCK ------------------------------------
if (!defined('DC_CONTEXT_ADMIN')) {
return;
}
dcPage::checkSuper();
#
# Init some variables
#
$translater = new dcTranslater($core);
$combo_start_page = [
'setting' => __('Settings'),
'modules_plugin' => __('Plugins'),
'modules_theme' => __('Themes'),
'pack' => __('Import/Export')
];
$combo_backup_limit = [
5 => 5,
10 => 10,
15 => 15,
20 => 20,
40 => 40,
60 => 60
];
$combo_backup_folder = [
'module' => __('locales folders of each module'),
'plugin' => __('plugins folder root'),
'public' => __('public folder root'),
'cache' => __('cache folder of Dotclear'),
'translater' =>__('locales folder of translater')
];
$succes = [
'save_setting' => __('Configuration successfully updated'),
'update_lang' => __('Translation successfully updated'),
'add_lang' => __('Translation successfully created'),
'delete_lang' => __('Translation successfully deleted'),
'create_backup' => __('Backups successfully create'),
'restore_backup' => __('Backups successfully restored'),
'delete_backup' => __('Backups successfully deleted'),
'import_pack' => __('Package successfully imported'),
'export_pack' => __('Package successfully exported')
];
$errors = [
'save_setting' => __('Failed to update settings: %s'),
'update_lang' => __('Failed to update translation: %s'),
'add_lang' => __('Failed to create translation: %s'),
'delete_lang' => __('Failed to delete translation: %s'),
'create_backup' => __('Failed to create backups: %s'),
'restore_backup' => __('Failed to restore backups: %s'),
'delete_backup' => __('Failed to delete backups: %s'),
'import_pack' => __('Failed to import package: %s'),
'export_pack' => __('Failed to export package: %s')
];
$p_url = 'plugin.php?p=translater';
$start_page = @explode('_', $translater->start_page);
if (count($start_page) < 2) {
$start_page[1] = '';
}
#
# Parse request
#
$msg = isset($_REQUEST['msg']) ? $_REQUEST['msg'] : '';
$part = isset($_REQUEST['part']) ? $_REQUEST['part'] : $start_page[0];
$tab = isset($_REQUEST['tab']) ? $_REQUEST['tab'] : '';
$action = isset($_REQUEST['action']) ? $_REQUEST['action'] : '';
$type = isset($_REQUEST['type']) ? $_REQUEST['type'] : $start_page[1];
$module = isset($_REQUEST['module']) ? $_REQUEST['module'] : '';
$from = isset($_POST['from']) && $_POST['from'] != '-' ? $_POST['from'] : '';
$lang = isset($_REQUEST['lang']) && $_REQUEST['lang'] != '-' ? $_REQUEST['lang'] : '';
if ($type == '-' || $module == '-') {
$type = $module = '';
}
#
# Manage action
#
switch ($action) {
case '':
break;
/**
* Create lang for a module
*/
case 'module_add_lang':
try {
if (empty($lang)) {
throw new Exception(__('No lang to create'));
}
$translater->addLang($module, $lang, $from);
http::redirect($p_url . '&part=lang&module=' . $module . '&type=' . $type . '&lang=' . $lang . '&msg=add_lang');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Delete lang for a module
*/
case 'module_delete_lang':
try {
if (empty($lang)) {
throw new Exception(__('No lang to delete'));
}
$translater->delLang($module, $lang);
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-lang&msg=delete_lang');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Create backup for a module
*/
case 'module_create_backup':
try {
if (empty($_POST['modules']) || empty($_POST['langs'])) {
throw new Exception(__('No lang to backup'));
}
foreach($_POST['modules'] as $b_module) {
$b_list = $translater->listLangs($b_module);
foreach($_POST['langs'] as $b_lang) {
if (isset($b_list[$b_lang])) {
$translater->createBackup($b_module, $b_lang);
}
}
}
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=creat_backup');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Restore backup for a module
*/
case 'module_restore_backup':
try {
if (empty($_POST['modules']) || empty($_POST['files'])) {
throw New Exception(__('No blackup to restore'));
}
sort($_POST['files']);
$done = false;
foreach($_POST['modules'] as $b_module) {
$b_list = $translater->listBackups($b_module, true);
foreach($_POST['files'] as $b_file) {
if (in_array($b_file, $b_list)) {
$translater->restoreBackup($b_module, $b_file);
$done = true;
}
}
}
if (!$done) {
throw new Exception(__('No bakcup to to restore'));
}
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=restore_backup');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Delete backup for a module
*/
case 'module_delete_backup':
try {
if (empty($_POST['modules']) || empty($_POST['files'])) {
throw New Exception(__('No backup to delete'));
}
$done = false;
foreach($_POST['modules'] as $b_module) {
$b_list = $translater->listBackups($b_module, true);
foreach($_POST['files'] as $b_file) {
if (in_array($b_file, $b_list)) {
$translater->deleteBackup($b_module, $b_file);
$done = true;
}
}
}
if (!$done) {
throw new Exception(__('No backup to delete'));
}
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-backup&msg=delete_backup');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action],$e->getMessage()));
}
break;
/**
* Import language package for a module
*/
case 'module_import_pack':
try {
if (empty($_FILES['packfile']['name'])) {
throw new Exception(__('Nothing to import'));
}
$translater->importPack($_POST['modules'], $_FILES['packfile']);
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-pack&msg=import_pack');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Export language package for a module
*/
case 'module_export_pack':
try {
if (empty($_POST['modules']) || empty($_POST['entries'])) {
throw new Exception(__('Nothing to export'));
}
$translater->exportPack($_POST['modules'], $_POST['entries']);
http::redirect($p_url . '&part=module&module=' . $module . '&type=' . $type . '&tab=module-pack&msg=export_pack');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Update language
*/
case 'update_lang':
try {
if (empty($_POST['entries']) || empty($lang) || empty($module)) {
throw new Exception(__('No language to update'));
}
foreach($_POST['entries'] as $i => $entry) {
if (isset($entry['check']) && isset($_POST['multigroup'])) {
$_POST['entries'][$i]['group'] = $_POST['multigroup'];
unset($_POST['entries'][$i]['check']);
}
}
$translater->updLang($module, $lang, $_POST['entries']);
http::redirect($p_url . '&part=lang&module=' . $module . '&type=' . $type . '&lang=' . $lang . '&msg=' . $action);
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Import language packages
*/
case 'import_pack':
try {
if (empty($_FILES['packfile']['name'])) {
throw new Exception(__('Nothing to import'));
}
$translater->importPack($_POST['modules'], $_FILES['packfile']);
http::redirect($p_url . '&part=pack&msg=' . $action . '&tab=pack-import');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Export language packages
*/
case 'export_pack':
try {
if (empty($_POST['modules']) || empty($_POST['entries'])) {
throw new Exception(__('Nothing to export'));
}
$translater->exportPack($_POST['modules'], $_POST['entries']);
http::redirect($p_url . '&part=pack&msg=' . $action . '&tab=pack-export');
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Save settings
*/
case 'save_setting':
try {
if (empty($_POST['translater_write_po'])
&& empty($_POST['translater_write_langphp'])) {
throw new Exception('You must choose one file format at least');
}
foreach($translater->getDefaultSettings() as $k => $v) {
$translater->set($k,(isset($_POST['translater_' . $k]) ? $_POST['translater_' . $k] : ''));
}
foreach($translater->proposal->getTools() AS $k => $v) {
$v->save();
}
http::redirect($p_url . '&part=setting&msg=' . $action);
} catch (Exception $e) {
$core->error->add(sprintf($errors[$action], $e->getMessage()));
}
break;
/**
* Modules / Unknow / None
*/
default:
break;
}
#
# Fill in title and prepare display
#
switch ($part) {
/**
* Modules
*/
case 'modules':
$title = '<span class="page-title">' . ($type == 'theme' ? __('Themes') : __('Plugins')) . '</span>';
break;
/**
* Module
*/
case 'module':
# Get info about requested module
try {
$M = $translater->getModule($module, $type);
} catch(Exception $e) {
$core->error->add(sprintf(__('Failed to launch translater: %s'), $e->getMessage()));
$action = $module = $type = '';
$M = false;
}
if (!empty($module) && !empty($type) && !$M) {
$action = $module = $type = '';
$M = false;
}
$M->langs = $translater->listLangs($module);
$M->backups = $translater->listBackups($module);
$M->unused_langs = array_flip(array_diff($translater->getIsoCodes(), $M->langs));
$M->used_langs = array_flip(array_diff($M->langs, array_flip($translater->getIsoCodes())));
$allowed_groups = array_combine(
dcTranslater::$allowed_l10n_groups,
dcTranslater::$allowed_l10n_groups
);
$title =
'<a href="' . $p_url . '&amp;part=modules&type=' . $type . '">' . ($type == 'theme' ? __('Themes') : __('Plugins')) . '</a>' .
' &rsaquo; <span class="page-title">' . $module . '</span>';
break;
/**
* Lang
*/
case 'lang':
# Get infos on module wanted
try {
$M = $translater->getModule($module, $type);
# Retrieve some infos
$M->langs = $translater->listLangs($module);
$M->backups = $translater->listBackups($module);
$M->unused_langs = array_flip(array_diff($translater->getIsoCodes(), $M->langs));
$M->used_langs = array_flip(array_diff($M->langs, array_flip($translater->getIsoCodes())));
$allowed_groups = array_combine(
dcTranslater::$allowed_l10n_groups,
dcTranslater::$allowed_l10n_groups
);
} catch(Exception $e) {
$core->error->add(sprintf(__('Failed to launch translater: %s'), $e->getMessage()));
$action = $module = $type = '';
$M = false;
}
if (!empty($module) && !empty($type) && !$M) {
$action = $module = $type = '';
$M = false;
}
$title =
'<a href="' . $p_url . '&amp;part=modules&type=' . $type . '">' . ($type == 'theme' ? __('Themes') : __('Plugins')) . '</a>' .
' &rsaquo; ' .
'<a href="' . $p_url . '&amp;part=module&type=' . $type . '&module=' . $module . '&amp;tab=module-lang">' . $module . '</a>';
if (!empty($M->langs) && isset($M->langs[$lang])) {
$title .= ' &rsaquo; <span class="page-title">' . $M->langs[$lang] . '</span>';
}
break;
/**
* Import/Export (pack)
*/
case 'pack':
$title = '<span class="page-title">' . __('Import/Export') . '</span>';
break;
/**
* Settings
*/
case 'setting':
default:
$title = '<span class="page-title">' . __('Settings') . '</span>';
break;
}
#
# Display page
#
echo '
<html>
<head><title>' . __('Translater') . '</title>' .
dcPage::jsPageTabs($tab) .
dcPage::jsLoad('js/_posts_list.js') .
dcPage::jsLoad('index.php?pf=translater/js/jquery.translater.js');
if ('' != $translater->proposal_tool) {
echo
'<style type="text/css">' .
' .addfield, .togglelist { border: none; }' .
"</style>\n" .
"<script type=\"text/javascript\"> \n" .
"//<![CDATA[\n" .
" \$(function(){if(!document.getElementById){return;} \n" .
" \$.fn.translater.defaults.url = '" . html::escapeJS('services.php') . "'; \n" .
" \$.fn.translater.defaults.func = '" . html::escapeJS('getProposal') . "'; \n" .
" \$.fn.translater.defaults.from = '" . html::escapeJS($translater->proposal_lang) . "'; \n" .
" \$.fn.translater.defaults.to = '" . html::escapeJS($lang) . "'; \n" .
" \$.fn.translater.defaults.tool = '" . html::escapeJS($translater->proposal_tool) . "'; \n" .
" \$.fn.translater.defaults.title = '" . html::escapeJS(sprintf(__('Use this %s translation:'), $translater->proposal_tool)) . "'; \n" .
" \$.fn.translater.defaults.title_go = '" . html::escapeJS(sprintf(__('Translate this text with %s'), $translater->proposal_tool)) . "'; \n" .
" \$.fn.translater.defaults.title_add = '" . html::escapeJS(__('Use this text')) . "'; \n" .
" \$('.translaterline').translater(); \n" .
"})\n" .
"//]]>\n" .
"</script>\n";
}
# --BEHAVIOR-- translaterAdminHeaders
$core->callBehavior('translaterAdminHeaders');
echo
'</head>
<body><h2>' . __('Translater') . ' &rsaquo; ' . $title .
' - <a class="button" href="' . $p_url . '&amp;part=modules&amp;type=plugin">' . __('Plugins') . '</a>' .
' - <a class="button" href="' . $p_url . '&amp;part=modules&amp;type=theme">' . __('Themes') . '</a>' .
' - <a class="button" href="' . $p_url . '&amp;part=pack">' . __('Import/Export') . '</a>' .
'</h2>';
if (isset($succes[$msg])) {
dcPage::success($succes[$msg]);
}
switch ($part) {
/**
* Modules
*/
case 'modules':
echo '<form id="theme-form" method="post" action="' . $p_url . '">';
$res = '';
foreach ($translater->listModules($type) as $k => $v) {
if ($translater->hide_default && in_array($k, dcTranslater::$default_dotclear_modules[$type])) {
continue;
}
if ($v['root_writable']) {
$res .=
'<tr class="line">' .
'<td class="nowrap">' .
'<a href="' . $p_url . '&amp;part=module&amp;type=' . $type . '&amp;module=' . $k . '" title="' .
sprintf(
($type == 'theme' ?
html::escapeHTML(__('Translate theme "%s" (by %s)')) :
html::escapeHTML(__('Translate plugin "%s" (by %s)'))
),
html::escapeHTML(__($v['name'])), html::escapeHTML($v['author'])
) .
'">' . $k . '</a></td>';
} else {
$res .=
'<tr class="line offline">' .
'<td class="nowrap">' . $k . '</td>';
}
$res .=
'<td class="nowrap">' . $v['version'] . '</td>' .
'<td class="nowrap">';
$array_langs = array();
foreach ($translater->listLangs($k) as $lang_name => $lang_infos) {
$array_langs[$lang_name] =
'<a class="wait maximal nowrap" title="' . __('Edit translation') . '" href="' . $p_url . '&amp;part=lang&amp;type=' . $type . '&amp;module=' . $k . '&amp;lang=' . $lang_name . '">' .
$lang_name . '</a>';
}
$res .= implode(', ', $array_langs) .
'</td>' .
'</tr>';
}
if ($res) {
echo '
<table class="clear">
<tr>
<th>' . __('Id') . '</th>
<th class="nowrap">' . __('Version') . '</th>
<th class="nowrap maximal">' . __('Languages') . '</th>
</tr>' .
$res .
'</table>';
} else {
echo '<tr><td colspan="6">' . __('There is no editable modules') . '</td></tr>';
}
echo '
<p>&nbsp;</p>
</form>';
break;
/**
* Module
*/
case 'module':
# Summary
echo '
<div class="multi-part" id="module-summary" title="' . __('Summary') . '">
<h3>' . __('Module') . '</h3>
<table class="clear maximal">
<tr><th colspan="2">' . __('About') . '</th></tr>
<tr class="line">
<td class="nowrap">' . __('Name') . '</td><td class="nowrap"> ' . $M->name . '</td>
</tr><tr class="line">
<td class="nowrap">' . __('Version') . '</td><td class="nowrap"> ' . $M->version . '</td>
</tr><tr class="line">
<td class="nowrap">' . __('Author') . '</td><td class="nowrap"> ' . $M->author . '</td>
</tr><tr class="line">
<td class="nowrap">' . __('Type') . '</td><td class="nowrap"> ' . $M->type . '</td>
</tr><tr class="line">
<td class="nowrap">' . __('Root') . '</td><td class="nowrap"> ' . $M->root . '</td>
</tr><tr class="line">
<td class="nowrap">' . __('Backups') . '</td><td class="nowrap"> ' .
$translater->getBackupFolder($module) . '</td>
</tr>
</table>
<p>&nbsp;</p>';
if (count($M->langs)) {
echo
'<h3>' . __('l10n') . '</h3>' .
'<table class="clear maximal">' .
'<tr>' .
'<th>' . __('Languages') . '</th>' .
'<th>' . __('Code') . '</th>' .
'<th>' . __('Backups') . '</th>' .
'<th>' . __('Last backup') . '</th>' .
'</tr>';
foreach($M->langs AS $lang => $name) {
echo
'<tr class="line">' .
'<td class="nowrap">' .
'<a href="' . $p_url . '&amp;part=lang&amp;type=' . $type . '&amp;module=' . $module . '&amp;lang=' . $lang . '">' . $name . '</a>' .
'</td>' .
'<td class="nowrap"> ' . $lang . '</td>';
if (isset($M->backups[$lang])) {
foreach($M->backups[$lang] AS $file => $info) {
$time[$lang] = isset($time[$lang]) && $time[$lang] > $info['time'] ?
$time[$lang] : $info['time'];
}
echo
'<td class="nowrap">' . count($M->backups[$lang]) . '</td>' .
'<td class="nowrap"> ' .
dt::str('%Y-%m-%d %H:%M', $time[$lang], $core->blog->settings->system->blog_timezone) .
'</td>';
} else {
echo '<td class="nowrap" colspan="4">' . __('no backup') . '</td>';
}
echo '</tr>';
}
echo '</table>';
}
echo '</div>';
# Add/Remove/Edit lang
echo '<div class="multi-part" id="module-lang" title="' . __('Translations') . '">';
# Edit lang
if (!empty($M->langs)) {
echo '
<h3>' . __('Edit language') . '</h3>
<form id="module-lang-edit-form" method="post" action="' . $p_url . '">
<p>' . __('Select language:') . ' ' .
form::combo(array('lang'), $M->used_langs,$lang) . '</p>
<p><input type="submit" name="save" value="' . __('Edit translation') . '" />' .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), '') .
form::hidden(array('part'), 'lang') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
<p>&nbsp;</p>';
}
# New lang
if (!empty($M->unused_langs)) {
echo '
<h3>' . __('Add language') . '</h3>
<form id="muodule-lang-create-form" method="post" action="' . $p_url . '">
<p class="nowrap">' . __('Select language:') . ' ' .
form::combo(array('lang'), array_merge(array('-'=>'-'), $M->unused_langs), $core->auth->getInfo('user_lang')) . '</p>';
if (!empty($M->used_langs)) {
echo
'<p>' . __('Copy from language:') . ' ' .
form::combo(array('from'),array_merge(array('-'=>'-'), $M->used_langs)) .
' (' . __('Optionnal') . ')</p>';
} else {
echo '<p>' . form::hidden(array('from'), '') . '</p>';
}
echo '
<p><input type="submit" name="save" value="' . __('Add translation') . '" />' .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'module_add_lang') .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-lang') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
<p>&nbsp;</p>';
}
# Delete lang
if (!empty($M->used_langs)) {
echo '
<h3>' . __('Delete language') . '</h3>
<form id="module-lang-delete-form" method="post" action="' . $p_url . '">
<p>' . __('Select language:') . ' ' .
form::combo(array('lang'), array_merge(array('-'=>'-'), $M->used_langs)) . '</p>
<p><input type="submit" name="save" value="' . __('Delete translation') . '" />' .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'module_delete_lang') .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-lang') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
<p>&nbsp;</p>';
}
echo '</div>';
# Create/delete/restore backups
if (!empty($M->used_langs) || !empty($M->backups)) {
echo '<div class="multi-part" id="module-backup" title="' . __('Backups') . '">';
if (!empty($M->used_langs)) {
echo '
<h3>' . __('Create backups') . '</h3>
<form id="module-backup-create-form" method="post" action="' . $p_url . '">
<p>' . __('Choose languages to backup') . '</p>
<table class="clear">
<tr><th colspan="3"></th></tr>';
$i=0;
foreach($M->used_langs AS $name => $lang) {
$i++;
echo '
<tr class="line">
<td class="minimal">' . form::checkbox(array('langs[]') ,$lang, '', '', '', false) . '</td>
<td class="maximal">' . $name . '</td>
<td class="nowrap">' . $lang . '</td>
</tr>';
}
echo '
</table>
<div class="two-cols">
<p class="col checkboxes-helpers">&nbsp;</p>
<p class="col right">&nbsp;</p>
</div>
<p>
<input type="submit" name="save" value="' . __('Backup') . '" />' .
form::hidden(array('modules[]'), $module) .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'module_create_backup') .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-backup') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
<p>&nbsp;</p>';
}
if (!empty($M->backups)) {
echo
'<h3>' . __('List of backups') . '</h3>' .
'<form id="module-backup-edit-form" method="post" action="' . $p_url . '">' .
'<table class="clear">' .
'<tr>' .
'<th colspan="2">' . __('File') . '</th>' .
'<th>' . __('Date') . '</th>' .
'<th>' . __('Language') . '</th>' .
'<th>' . __('Size') . '</th>' .
'</tr>';
$i=0;
foreach($M->backups as $lang => $langs) {
foreach($langs as $file => $infos) {
$i++;
echo
'<tr class="line">' .
'<td class="minimal">' . form::checkbox(array('files[]'), $file, '', '', '', false) . '</td>' .
'<td class="maximal">' . $file . '</td>' .
'<td class="nowrap">' .
dt::str(__('%Y-%m-%d %H:%M:%S'), $infos['time'], $core->blog->settings->system->blog_timezone) .
'</td>' .
'<td class="nowrap">' . $translater->isIsoCode($lang) . '</td>' .
'<td class="nowrap">' . files::size($infos['size']) . '</td>' .
'</tr>';
}
}
echo '
</table>
<div class="two-cols">
<p class="col checkboxes-helpers">&nbsp;</p>
<p class="col right">' . __('Selected backups action:') . ' ' .
form::combo('action', array(
__('Restore backups') => 'module_restore_backup',
__('Delete backups') => 'module_delete_backup')
) . '
<input type="submit" name="save" value="' . __('ok') . '" />' .
form::hidden(array('modules[]'), $module) .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-backup') .
form::hidden(array('p'), 'translater') . '
</p>
</div>
</form>
<p>&nbsp;</p>';
}
echo '</div>';
} // end if (!empty($M->used_langs) || !empty($M->backups)) {
# Import/Export pack
echo '<div class="multi-part" id="module-pack" title="' . __('Import/Export') . '">';
# Import
echo '
<h3>' . __('Import') . '</h3>
<form id="module-pack-import-form" method="post" action="' . $p_url . '" enctype="multipart/form-data">
<p>' . __('Choose language package to import') . '<br />
<input type="file" name="packfile" size="40"/></p>
<p>
<input type="submit" name="save" value="' . __('Import') . '" />' .
form::hidden(array('modules[]'), $module) .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'module_import_pack') .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-pack') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
<p>&nbsp;</p>';
# Export
if (!empty($M->used_langs)) {
echo
'<h3>' . __('Export') . '</h3>' .
'<form id="module-pack-export-form" method="post" action="' . $p_url . '">' .
'<p>' . __('Choose languages to export') . '</p>' .
'<table class="clear">' .
'<tr><th colspan="3"></th></tr>';
$i=0;
foreach($M->used_langs AS $name => $lang) {
$i++;
echo
'<tr class="line">' .
'<td class="minimal">' .
form::checkbox(array('entries[]'), $lang, '', '', '', false) .
'</td>' .
'<td class="maximal">' . $name . '</td>' .
'<td class="nowrap">' . $lang . '</td>' .
'</tr>';
}
echo
'</table>' .
'<div class="two-cols">' .
'<p class="col checkboxes-helpers">&nbsp;</p>' .
'<p class="col right">&nbsp;</p>' .
'</div>' .
'<p>' .
'<input type="submit" name="save" value="' . __('Export') . '" />' .
form::hidden(array('modules[]'), $module) .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'module_export_pack') .
form::hidden(array('part'), 'module') .
form::hidden(array('tab'), 'module-pack') .
form::hidden(array('p'), 'translater') .
'</p>' .
'</form>' .
'<p>&nbsp;</p>';
}
echo '</div>';
break;
/**
* Lang
*/
case 'lang':
# Existing langs
if (empty($M->langs) || !isset($M->langs[$lang])) {
break;
}
$iso = $M->langs[$lang];
$i = 0;
$sort_order = 'asc';
$lines = $translater->getMsgs($module, $lang);
# Sort array
if (isset($_GET['sort']) && !empty($lines)) {
$sort = explode(',', $_GET['sort']);
$sort_by = $sort[0];
$sort_order = isset($sort[1]) && $sort[1] == 'desc' ? 'asc' : 'desc';
switch($sort_by) {
case 'group':
foreach($lines AS $k => $v) {
$sort_list[] = $v['group'];
}
break;
case 'msgid':
foreach($lines AS $k => $v) {
$sort_list[] = strtolower($k);
}
break;
case 'file':
foreach($lines AS $k => $v) {
$file = array();
foreach($v['files'] as $fv) {
$file[] = empty($fv[0]) || empty($fv[1]) ? '' : $fv[0] . ($fv[1] /1000);
}
sort($file);
$sort_list[] = $file[0];
}
break;
case 'msgstr':
foreach($lines AS $k => $v) {
$sort_list[] = strtolower($v['msgstr']);
}
break;
default:
$sort_list = false;
break;
}
if ($sort_list) {
array_multisort(
$sort_list,
($sort_order == 'asc' ? SORT_DESC : SORT_ASC),
SORT_STRING,
$lines
);
}
}
echo
'<div id="lang-form" title="' . $iso . '">' .
'<form id="lang-edit-form" method="post" action="' . $p_url . '">' .
'<table>' .
'<tr>' .
'<th><a href="' . $p_url . '&amp;part=lang&amp;module=' . $module . '&amp;type=' . $type . '&amp;lang=' . $lang .
'&amp;sort=group,' . $sort_order . '">' . __('Group') . '</a></th>' .
'<th><a href="' . $p_url . '&amp;part=lang&amp;module=' . $module . '&amp;type=' . $type . '&amp;lang=' . $lang .
'&amp;sort=msgid,' . $sort_order . '">' . __('String') . '</a></th>' .
'<th><a href="' . $p_url . '&amp;part=lang&amp;module=' . $module . '&amp;type=' . $type . '&amp;lang=' . $lang .
'&amp;sort=msgstr,' . $sort_order . '">' . __('Translation') . '</a></th>' .
'<th>' . __('Existing') . '</th>' .
'<th><a href="' . $p_url . '&amp;part=lang&amp;module=' . $module . '&amp;type=' . $type . '&amp;lang=' . $lang .
'&amp;sort=file,' . $sort_order . '">' . __('File') . '</a></th>' .
'</tr>';
foreach ($lines AS $msgid => $rs) {
$i++;
$in_dc = ($rs['in_dc'] && $translater->parse_nodc);
echo
'<tr class="line' . ($in_dc ? ' offline' : ' translaterline') . '">' .
'<td class="nowrap">' .
form::checkbox(array('entries[' . $i . '][check]'), 1) . ' ' .
form::combo(array('entries[' . $i . '][group]'),
$allowed_groups,$rs['group'], '', '', $in_dc
) .
'</td>' .
'<td' . ('' != $translater->proposal_tool ? ' class="translatermsgid"' : '' ) . '>' .
html::escapeHTML($msgid) . '</td>' .
'<td class="nowrap translatertarget">' .
form::hidden(array('entries[' . $i . '][msgid]'), html::escapeHTML($msgid)) .
form::field(array('entries[' . $i . '][msgstr]'),
48, 255, html::escapeHTML($rs['msgstr']), '', '', $in_dc) .
'</td>' .
'<td class="translatermsgstr">';
$strin = array();
foreach($rs['o_msgstrs'] AS $o_msgstr) {
if (!isset($strin[$o_msgstr['msgstr']])) {
$strin[$o_msgstr['msgstr']] = array();
}
$strin[$o_msgstr['msgstr']][] = array('module' => $o_msgstr['module'], 'file' => $o_msgstr['file']);
}
foreach($strin as $k => $v) {
echo '<div class="subtranslatermsgstr"><strong>' . html::escapeHTML($k) . '</strong><div class="strlist">';
foreach($v as $str) {
echo '<i>' . html::escapeHTML($str['module'] . ' => ' . $str['file']) . '</i><br />';
}
echo '</div></div><br />';
}
echo
'</td>' .
'<td class="nowrap translatermsgfile">';
if (empty($rs['files'][0])) {
echo '&nbsp;';
} elseif (count($rs['files']) == 1) {
echo $rs['files'][0][0] . ' : ' . $rs['files'][0][1];
} else {
echo
'<strong>' . sprintf(__('%s occurrences'), count($rs['files'])) . '</strong>' .
'<div class="strlist">';
foreach($rs['files'] as $location) {
echo '<i>' . implode(' : ', $location) . '</i><br />';
}
echo '</div>';
}
echo
'</td>' .
'</tr>';
}
$i++;
echo
'<tr>' .
'<td class="nowrap">' .
form::checkbox(array('entries[' . $i . '][check]'), 1) . ' ' .
form::combo(array('entries[' . $i . '][group]'), $allowed_groups, 'main') .
'</td>' .
'<td class="">' . form::field(array('entries[' . $i . '][msgid]'), 48, 255, '') . '</td>' .
'<td class="nowrap">' . form::field(array('entries[' . $i . '][msgstr]'), 48, 255, '') . '</td>' .
'<td class="">&nbsp;</td>' .
'<td class="">&nbsp;</td>' .
'</tr>' .
'</table>' .
'<p>' . sprintf(__('Total of %s strings . '), $i-1) . '</p>' .
'<p class="col checkboxes-helpers"></p>' .
'<p class="col right">' . __('Change the group of the selected entries to:') . ' ' .
form::combo(array('multigroup'), $allowed_groups) .
'</p>' .
'<p>' .
'<input type="submit" name="save" value="' . __('Save') . '" />' .
$core->formNonce() .
form::hidden(array('lang'), $lang) .
form::hidden(array('type') ,$type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'update_lang') .
form::hidden(array('part'), 'lang') .
form::hidden(array('p'), 'translater') .
'</p>' .
'</form>' .
'<p>&nbsp;</p>' .
'</div>';
break;
/**
* Import/Export (Pack)
*/
case 'pack':
# Import
echo '
<div class="multi-part" id="pack-import" title="' . __('Import') . '">
<form id="pack-import-form" method="post" action="' . $p_url . '" enctype="multipart/form-data">
<p>' . __('Choose language package to import') . '<br />
<input type="file" name="packfile" size="40"/></p>
<p>
<input type="submit" name="save" value="' . __('Import') . '" />';
$i=0;
foreach($translater->listModules() AS $k => $v) {
if ($translater->hide_default && (
in_array($k,dcTranslater::$default_dotclear_modules['plugin']) ||
in_array($k,dcTranslater::$default_dotclear_modules['theme']))) {
continue;
}
echo form::hidden(array('modules[]'), $k);$i++;
}
echo
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'import_pack') .
form::hidden(array('part'), 'pack') .
form::hidden(array('tab'), 'pack-import') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
</div>';
# Export
echo '
<div class="multi-part" id="pack-export" title="' . __('Export') . '">
<form id="pack-export-form" method="post" action="' . $p_url . '">
<p>' . __('Choose modules to export') . '</p>
<table class="clear">
<tr><th colspan="2">' . __('Modules') . '</th><th>' . __('Languages') . '</th></tr>';
$i=0;
$langs_list = array();
foreach($translater->listModules() AS $k => $v) {
if ($translater->hide_default && (
in_array($k,dcTranslater::$default_dotclear_modules['plugin']) ||
in_array($k,dcTranslater::$default_dotclear_modules['theme']))) {
continue;
}
$info_lang = $translater->listLangs($k);
if (!is_array($info_lang) || 1 > count($info_lang)) {
continue;
}
$i++;
$langs_list = array_merge($langs_list, $info_lang);
echo '
<tr class="line">
<td class="minimal">' . form::checkbox(array('modules[]'), $k, '', '', '', false) . '</td>
<td class="nowrap">' . $v['name'] . '</td>
<td class="maximal">' . implode(', ', $info_lang) . '</td>
</tr>';
}
echo '
</table>
<p>' . __('Choose languages to export') . '</p>
<table class="clear">
<tr><th colspan="2">' . __('Languages') . '</th><th>' . __('Code') . '</th></tr>';
$i=0;
foreach($langs_list AS $k => $v) {
$i++;
echo '
<tr class="line">
<td class="minimal">' . form::checkbox(array('entries[]'), $k, '', '', '', false) . '</td>
<td class="nowwrap">' . $v . '</td>
<td class="maximal">' . $k . '</td>
</tr>';
}
echo '
</table>
<div class="two-cols">
<p class="col checkboxes-helpers"></p>
<p class="col right">&nbsp;</p>
</div>
<p>
<input type="submit" name="save" value="' . __('Export') . '" />' .
$core->formNonce() .
form::hidden(array('type'), $type) .
form::hidden(array('module'), $module) .
form::hidden(array('action'), 'export_pack') .
form::hidden(array('part'), 'pack') .
form::hidden(array('tab'), 'pack-export') .
form::hidden(array('p'), 'translater') . '
</p>
</form>
</div>';
break;
/**
* Settings
*/
case 'setting':
default:
echo '
<form id="setting-form" method="post" action="' . $p_url . '">
<div class="multi-part" id="setting-translation" title="' . __('Translation') . '">
<p><label class="classic">' .
form::checkbox('translater_write_po', '1' ,$translater->write_po) . '
' . __('Write .po files') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_write_langphp', '1', $translater->write_langphp) . '
' . __('Write .lang.php files') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_scan_tpl', '1', $translater->scan_tpl) . '
' . __('Translate also strings of template files') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_parse_nodc', '1', $translater->parse_nodc) . '
' . __('Translate only unknow strings') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_hide_default', '1', $translater->hide_default) . '
' . __('Hide default modules of Dotclear') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_parse_comment', '1', $translater->parse_comment) . '
' . __('Write comments in files') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_parse_user', '1', $translater->parse_user) . '
' . __('Write informations about author in files') . '</label><br />
' . form::field('translater_parse_userinfo', 65, 255, $translater->parse_userinfo) . '</p>
</div>
<div class="multi-part" id="setting-tool" title="' . __('Tools') . '">
<p><label class="classic">' . __('Default language of l10n source:') . '<br />' .
form::combo('translater_proposal_lang',
array_flip($translater->getIsoCodes()), $translater->proposal_lang) . '</label></p>
<h4>' . __('Select and configure the tool to use to translate strings:') . '</h4>';
foreach($translater->proposal->getTools() AS $k => $v) {
$form = $v->form();
echo '
<dd>
<dt><label class="classic">' .
form::radio('translater_proposal_tool', $k, $k == $translater->proposal_tool) . '
' . $v->getDesc() . '</label></dt><dd>' .
(empty($form) ?
'<p>' . sprintf(__('Nothing to configure for %s tool . '), $v->getName()) . '</p>' :
$form
) . '</dd></dl>';
}
echo '
</div>
<div class="multi-part" id="setting-pack" title="' . __('Import/Export') . '">
<p><label class="classic">' .
form::checkbox('translater_import_overwrite', '1', $translater->import_overwrite) . '
' . __('Overwrite existing languages') . '</label></p>
<p><label class="classic">' . __('Name of exported package') . '<br />
' . form::field('translater_export_filename', 65, 255, $translater->export_filename) . '</label></p>
</div>
<div class="multi-part" id="setting-backup" title="' . __('Backups') . '">
<p><label class="classic">' .
form::checkbox('translater_backup_auto', '1', $translater->backup_auto) . '
' . __('Make backups when changes are made') . '</label></p>
<p><label class="classic">' . sprintf(__('Limit backups to %s files per module'),
form::combo('translater_backup_limit',
array_flip($combo_backup_limit), $translater->backup_limit)) . '</label></p>
<p><label class="classic">' . sprintf(__('Store backups in %s'),
form::combo('translater_backup_folder',
array_flip($combo_backup_folder), $translater->backup_folder)) . '</label></p>
</div>
<div class="multi-part" id="setting-plugin" title="' . __('Behaviors') . '">
<p><label class="classic">' . __('Default start menu:') . '<br />' .
form::combo('translater_start_page',
array_flip($combo_start_page), $translater->start_page) . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_plugin_menu', '1', $translater->plugin_menu) . '
' . __('Enable menu on extensions page') . '</label></p>
<p><label class="classic">' .
form::checkbox('translater_theme_menu', '1', $translater->theme_menu) . '
' . __('Enable menu on themes page') . '</label></p>
</div>
<div class="clear">
<p><input type="submit" name="save" value="' . __('Save') . '" />' .
$core->formNonce() .
form::hidden(array('p'), 'translater') .
form::hidden(array('part'), 'setting') .
form::hidden(array('action'), 'save_setting') . '
</p></div>
</form>';
break;
}
dcPage::helpBlock('translater');
echo '
</body></html>';