Ik heb maar eens de stoute schoenen aangetrokken en in plaats van een vertaalde 3rd party oplossing te plaatsen nu dan eens eentje van eigen hand..
Net als velen erger ik mij al geruime tijd aan de af en toe wel heel kromme vertalingen van Synology... Vandaar mijn besluit om een StringEditor te bouwen.
...en hier is 'ie dan...
Er valt te kiezen uit het bewerken van een drietal bestanden, te weten: /usr/syno/synoman/webman/texts/nld/strings (hierin staan alle systeem strings zoals die bv. in de DSM gebruikt worden), /usr/syno/synoman/webman/texts/nld/mails (alle mailteksten) en /usr/syno/synoman/phpsrc/photo/language/nld.php (de teksten van Photo Station).
Zoals aan het plaatje te zien is, dien je eerst een keuze te maken wélk bestand je wilt bewerken. Indien de keuze valt op strings of mails, dan dien je vervolgens in het geval van strings te kiezen welke sectie je wilt bewerken en in het geval van mails, welk mailbericht. Photo kent deze tussenkeuze niet.
Vervolgens wordt de inhoud van de gekozen optie zichtbaar in het bewerkingsvenster, gevolgd door een tweetal (bij mails overigens maar één) knoppen, Toon en Opslaan.
Bij Strings en Photo kan HTML opmaak worden toegepast, vandaar dat hierbij de knop Toon getoond wordt. In het voorbeeldvenster kan je dan zien wat je opmaakcodes in de praktijk voor effect hebben... Mails worden door Synology's niet als HTML-mail verstuurd; kunnen géén HTML opmaak hebben en dus ontbreekt hier deze knop.
De knop Opslaan zorgt er vervolgens voor dat de wijzigingen worden doorgevoerd.
Voor de volledigheid nog even de volgende zaken:
- bij opslaan wordt het originele bestand opgeslagen als bestandsnaam.bak (dus strings.bak, mails.bak en nld.php.bak).
Iedere druk op de knop Opslaan zorgt voor aanmaak van dit bestand, dus alleen de laatste wijziging is op die manier terug te halen!
- in een aantal teksten staan placeholders voor variabelen, te herkennen aan { en } rondom de naam van de placeholder. Dat je hiermee moet uitkijken lijkt mij voor de hand liggen. Je kunt ze weghalen, maar teksten slaan dan soms nergens meer op en achteraf verzinnen wat er zou hebben gestaan is lastig...
- Wellicht een overbodige, maar de code gaat er van uit dat de eerder genoemde lokaties waar de bestanden staan gewoon benaderbaar zijn.
De oplossing bestaat uit een drietal bestanden: stringeditor.php (het hoofdbestand), helper.php (bewerkingsvenster) en setstring.php (opslaan van wijzigingen). stringeditor.php dien je vanuit application.cfg aan te roepen.
stringeditor.php
<?php
putenv('HTTP_COOKIE='.$_SERVER['HTTP_COOKIE']);
putenv('REMOTE_ADDR='.$_SERVER['REMOTE_ADDR']);
$user=exec('/usr/syno/synoman/webman/modules/authenticate.cgi');
if($user != 'admin'){
header("HTTP/1.0 403 Forbidden");
exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>StringEditor</title>
<script>
function $(e) {return document.getElementById(e);}
function verwijs(keuze, action) {
document.getElementById('legenda').innerHTML = 'Bewerken van waarden uit '+keuze;
document.getElementById('iframe').src='helper.php?keuze='+keuze+'&action='+action
}
</script>
<style>
body,input,td{font:11px Verdana}
.fieldset {
height: 400px;
width: auto;
}
</style>
</head>
<body>
<form id="f" name="f" action="stringeditor.php">
<fieldset><legend>Kies welk bestand u wilt bewerken:</legend><br />
<input type="hidden" id="action" name="action" value="" />
<input type="button" id="type" value="strings" onClick="$('action').value=this.value;submit();">
<input type="button" id="type" value="mails" onClick="$('action').value=this.value;submit();">
<input type="button" id="type" value="photo" onClick="$('action').value=this.value;submit();"><p>
</fieldset>
<?php
$stringspath = "../../../synoman/webman/texts/nld/";
$mailspath = "../../../synoman/webman/texts/nld/";
$photopath = "../../phpsrc/photo/language/";
$file = $stringspath.'strings';
if ($_REQUEST['action'] == '' || $_REQUEST['action'] == 'strings' ) {
$action='strings';
$file = $stringspath.'strings';
} else {
$file = $stringspath.$_REQUEST['action'];
}
if ($_REQUEST['action'] == "photo") {
$file = $photopath."nld.php&keuze=photo";
echo "<p>";
} else {
$bestand = fopen($file,"r");
while(! feof($bestand)) {
$test = fgets($bestand);
if (substr($test,0,1) == "[") {
$headerarray[] = str_replace(chr(10),"",$test);
}
}
fclose($bestand);
echo "<p>";
echo "<fieldset><legend>Kies welk";
if ($action == 'strings') {
echo "e sectie";
} else {
echo " bericht";
}
echo " u wilt bewerken:</legend><br /> ";
echo "<select onchange=".chr(34)."verwijs(this.value,'".$action."');".chr(34).">";
for($i = 0; $i < count($headerarray); $i++) {
$selected = ($headerarray[$i] == $_REQUEST['keuze']) ? " selected='selected'" : "";
echo "<option value='".$headerarray[$i]."'".$selected.">".$headerarray[$i]."</option>";
}
echo "</select><p></fieldset><p>";
}
if ($_REQUEST['keuze'] == "" ) $keuze = $headerarray[0];
echo "<fieldset class='fieldset'><legend id='legenda'>Bewerkingsvenster</legend><br /> ";
echo "<iframe id='iframe' src='helper.php?keuze=".$keuze."&action=".$action."' height='90%' width='91%'></iframe><p></fieldset>";
echo "<fieldset><legend>Voorbeeld</legend><br /> ";
echo "<div id='voorbeeld'></div><p></fieldset>";
if ($action == "photo") {
if (strlen($_REQUEST['keuze']) > 1) echo "<script>verwijs('".$_REQUEST['keuze']."','".$_REQUEST['action']."');</script>";
}
?>
</body></html>
helper.php
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>StringEditor</title></head><body>
<style>body,input,td, textarea{font:11px Verdana}
</style>
<script language="javascript" type="text/javascript">
function changeDivHTML(welketext)
{
parent.document.getElementById('voorbeeld').innerHTML = document.getElementById(welketext).value;
}
function save(welketext, welkitem, file, keuze, actie)
{
if (welkitem == 'subject') {
document.getElementById('item').value = document.getElementById(welkitem).value;
} else {
document.getElementById('item').value = document.getElementById(welkitem).innerHTML;
}
document.getElementById('tekst').value = document.getElementById(welketext).value;
document.getElementById('action').value = actie;
document.getElementById('file').value = file;
document.getElementById('keuze').value = keuze;
document.helper.submit();
}
</script>
<form action="setstring.php" method="post" name="helper">
<input type="hidden" name="action" id="action" value="" >
<input type="hidden" name="item" id="item" value="" >
<input type="hidden" name="tekst" id="tekst" value="" >
<input type="hidden" name="file" id="file" value="" >
<input type="hidden" name="keuze" id="keuze" value="" >
<?php
$stringspath = "../../../synoman/webman/texts/nld/";
$mailspath = "../../../synoman/webman/texts/nld/";
$photopath = "../../phpsrc/photo/language/";
$action = $_REQUEST['action'];
if ($action == "strings") {
$file = $stringspath.$action;
} elseif ($action == "mails") {
$file = $mailspath.$action;
} else {
$file = $photopath."nld.php";
}
$keuze = $_REQUEST['keuze'];
if ($action == "photo") {
$array=file($file);
$teller = 0;
echo "";
foreach($array as $waarde) {
if ($teller >= 2) {
$positie = stripos($waarde,"=",1);
$item = substr($waarde,0,$positie);
$inhoud= str_replace("';","",substr(substr($waarde,$positie+1),2));
$inhoud = str_replace("'","'",$inhoud);
echo "<b><div id='div".$teller."'>".$item.":</div></b>";
echo "<input type='text' id='text".$teller."' size='140' value='".$inhoud."'> ";
echo "<input type='button' value='Toon' onclick=changeDivHTML('text".$teller."')> ";
echo "<input type='button' value='Opslaan' onclick=save('text".$teller."','div".$teller."','".$file."','".$keuze."','".$action."')><p>";
}
$teller++;
}
echo "<br />";
} else {
if ($action == "strings") {
echo "Bewerken van waarden uit ".$keuze."<p>";
} else {
echo "Bewerken van bericht ".$keuze."<p>";
}
$temparray=file($file);
$x=count($temparray);
for ($y=0;$y<$x;$y++){
$temp = $temparray[$y];
if (substr($temp,0,1) == "[") {
$hulp = str_replace(chr(10),"",$temp);
$header[] = $temp;
$array[$hulp][] = $temp;
} else {
$array[$hulp][] = $temp;
}
}
$teller = 0;
foreach($array[$keuze] as $key => $waarde) {
if ($action == "strings") {
if ($teller > 0) {
if (str_replace(chr(10),"",$waarde) != "") {
$positie = stripos($waarde,"=",1);
$item = substr($waarde,0,$positie);
$inhoud= str_replace(chr(34),"",trim(substr($waarde,$positie+1)));
echo "<b><div id='div".$teller."'>".$item.":</div></b>";
if (strlen($inhoud) >= 140) {
echo "<textarea id='text".$teller."' cols='139' rows='7'>".$inhoud."</textarea> ";
} else {
echo "<input type='text' id='text".$teller."' size='140' value='".$inhoud."'> ";
}
echo "<input type='button' value='Toon' onclick=changeDivHTML('text".$teller."')> ";
echo "<input type='button' value='Opslaan' onclick=save('text".$teller."','div".$teller."','".$file."','".$keuze."','".$action."')><p>";
echo "<br />";
}
}
} else {
if ($waarde != $keuze.chr(10)) {
if (substr($waarde,0,8) == "Subject:") {
$subject = str_replace("Subject: ","",$waarde);
} else {
if ($teller != count($array[$keuze])-1) {
$tekst .= $waarde;
}
}
}
}
$teller++;
}
if ($action == "mails") {
echo "<b>Onderwerp:</b><br />";
echo "<input type='text' id='subject' size='140' value='".$subject."'><br />";
echo "<b>Bericht:</b><br />";
echo "<textarea id='mailtext' cols='139' rows='16'>".$tekst."</textarea> ";
echo "<input type='button' value='Opslaan' onclick=save('mailtext','subject','".$file."','".$keuze."','".$action."')>";
}
}
?>
</body></html>
setstring.php
<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>StringEditor</title></head><body>
<style>body,input,td, textarea{font:11px Verdana}
</style>
<?php
function describeAnidatedArray($array) {
$buf = '';
foreach($array as $key => $value) {
if(is_array($value)) {
$buf .= describeAnidatedArray($value);
} else {
$buf .= $value;
}
}
return $buf;
}
function array_insert(&$xarray, $insert, $position = -1) {
$position = ($position == -1) ? (count($xarray)) : $position ;
if($position != (count($xarray))) {
$ta = $xarray;
for($i = $position; $i < (count($xarray)); $i++) {
if(!isset($xarray[$i])) {
die(print_r($xarray, 1)."rnInvalid array: All keys must be numerical and in sequence.");
}
$tmp[$i+1] = $xarray[$i];
unset($ta[$i]);
}
$ta[$position] = $insert;
$xarray = $ta + $tmp;
} else {
$xarray[$position] = $insert;
}
ksort($xarray);
return true;
}
function array_delete(&$ary,$key_to_be_deleted)
{
$new = array();
if(is_string($key_to_be_deleted)) {
if(!array_key_exists($key_to_be_deleted,$ary)) {
return;
}
foreach($ary as $key => $value) {
if($key != $key_to_be_deleted) {
$new[$key] = $value;
}
}
$ary = $new;
}
if(is_array($key_to_be_deleted)) {
foreach($key_to_be_deleted as $del) {
array_delete(&$ary,$del);
}
}
}
$stringspath = "../../../synoman/webman/texts/nld/";
$mailspath = "../../../synoman/webman/texts/nld/";
$photopath = "../../phpsrc/photo/language/";
$item=trim(str_replace(":","",$_REQUEST['item']));
$tekst=$_REQUEST['tekst'];
$keuze=$_REQUEST['keuze'];
if ($action == "photo") {
$file = $photopath."nld.php";
$temparray=file($file);
file_put_contents($file.".bak", $temparray);
$teller = 0;
foreach($temparray as $waarde) {
$positie = stripos($waarde,"=",1);
$tezoekenitem = substr($waarde,0,$positie-1);
if ($tezoekenitem == $item) {
echo "String gevonden, oude sting is:<br />";
echo $waarde."<br />";
echo "nieuwe string wordt:<br /><b>";
echo $item.chr(9)."=".chr(9).chr(39).addslashes($tekst).chr(39).";".chr(10)."</b><p>";
$temparray[$teller] = $item.chr(9)."=".chr(9).chr(39).addslashes($tekst).chr(39).";".chr(10);
}
$teller++;
}
} else {
$file = $_REQUEST['file'];
$temparray=file($file);
file_put_contents($file.".bak", $temparray);
$x=count($temparray);
for ($y=0;$y<$x;$y++){
$temp = $temparray[$y];
if (substr($temp,0,1) == "[") {
$hulp = str_replace(chr(10),"",$temp);
$array[$hulp][] = $temp;
} else {
$array[$hulp][] = $temp;
if ($_REQUEST['action'] == "strings") {
if ($hulp == $keuze) {
if (substr($temp,0,strlen($item)+1) == $item.chr(9)) {
echo "String gevonden, oude sting is:<br />";
echo $temp."<br />";
echo "nieuwe string wordt:<br /><b>";
echo $item.chr(9)."=".chr(9).chr(34).$tekst.chr(34).chr(10)."</b><p>";
$temparray[$y] = $item.chr(9)."=".chr(9).chr(34).$tekst.chr(34).chr(10);
}
}
}
}
}
if ($_REQUEST['action'] == "mails") {
echo "Mail gevonden, oude mail is:<br />";
$x=count($array[$keuze]);
for ($y=0;$y<$x;$y++){
print $array[$keuze][$y]."<br />";
}
$mailhulp = explode(chr(10),$tekst);
$maantal = count($mailhulp)+3;
$kaantal = count($array[$keuze]);
if ($kaantal < $maantal) {
$x = $maantal - $kaantal;
for ($y=0;$y<$x;$y++){
array_insert($array[$keuze],chr(10));
}
} else {
array_splice($array[$keuze],$maantal);
}
$x=count($array[$keuze]);
for ($y=0;$y<$x;$y++){
$temp = str_replace(chr(13),"",$array[$keuze][$y]);
if ($y == 0) {
$array[$keuze][$y] = $keuze.chr(10);
$array[$keuze][$y+1] = "Subject: ".$item.chr(10);
$array[$keuze][$y+2] = chr(10);
$y=2;
} else {
$array[$keuze][$y] = str_replace(chr(13),"",$mailhulp[$y-3]).chr(10);
}
}
$kaantal = count($array[$keuze])-1;
$x = 0;
if ($array[$keuze][$kaantal-1] != chr(10)) $x++;
if ($array[$keuze][$kaantal] != chr(10)) $x++;
for ($y=0;$y<$x;$y++){
array_insert($array[$keuze],chr(10));
}
unset($temparray);
$temparray = explode(chr(10),describeAnidatedArray($array));
$x=count($temparray);
for ($y=0;$y<$x;$y++){
if (strpos($temparray[$y],chr(10)) == false) $temparray[$y] .= chr(10);
}
echo "nieuwe mail wordt:<br /><b>";
$x=count($mailhulp);
for ($y=0;$y<$x;$y++){
print $mailhulp[$y]."<br />";
}
echo "</b>";
}
}
file_put_contents($file, $temparray);
echo "<p>";
echo "<input type='submit' name='Submit' value='Keer terug naar beginscherm' onClick=parent.window.location.href='stringeditor.php?action=".$_REQUEST['action']."&keuze=".$keuze."'>";
?>
</body></html>
Bijbehorende icoontjes:
Mochten er nog opmerkingen /verbeteringen / vragen zijn, dan hoor ik het graag
Alles gaat uiteraard op eigen risico
Zorg ondanks de ingebouwde veiligheidskopie voor de nodige extra zakerheid en maak voordat je begint te editen sowiezo eerst even een kopie van de drie bestanden op een aparte plek.
Veel plezier ermee!
Wizjos