From 8dd29e227f44e2379a0a72a4f60130b24e54a14b Mon Sep 17 00:00:00 2001
From: tbrehm <t.brehm@ispconfig.org>
Date: Sun, 21 Sep 2008 17:12:41 +0000
Subject: [PATCH] Added a function to merge language files.

---
 .../web/admin/form/software_repo.tform.php    | 153 ++++++++++++++++++
 interface/web/admin/language_complete.php     | 146 +++++++++++++++++
 .../admin/lib/lang/en_language_complete.lng   |   6 +
 interface/web/admin/lib/module.conf.php       |   4 +
 .../web/admin/templates/language_complete.htm |  12 ++
 5 files changed, 321 insertions(+)
 create mode 100644 interface/web/admin/form/software_repo.tform.php
 create mode 100644 interface/web/admin/language_complete.php
 create mode 100644 interface/web/admin/lib/lang/en_language_complete.lng
 create mode 100644 interface/web/admin/templates/language_complete.htm

diff --git a/interface/web/admin/form/software_repo.tform.php b/interface/web/admin/form/software_repo.tform.php
new file mode 100644
index 0000000000..cffcd0137a
--- /dev/null
+++ b/interface/web/admin/form/software_repo.tform.php
@@ -0,0 +1,153 @@
+<?php
+
+/*
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+/*
+	Form Definition
+
+	Tabellendefinition
+
+	Datentypen:
+	- INTEGER (Wandelt Ausdrücke in Int um)
+	- DOUBLE
+	- CURRENCY (Formatiert Zahlen nach Währungsnotation)
+	- VARCHAR (kein weiterer Format Check)
+	- TEXT (kein weiterer Format Check)
+	- DATE (Datumsformat, Timestamp Umwandlung)
+
+	Formtype:
+	- TEXT (normales Textfeld)
+	- TEXTAREA (normales Textfeld)
+	- PASSWORD (Feldinhalt wird nicht angezeigt)
+	- SELECT (Gibt Werte als option Feld aus)
+	- RADIO
+	- CHECKBOX
+	- FILE
+
+	VALUE:
+	- Wert oder Array
+
+	Hinweis:
+	Das ID-Feld ist nicht bei den Table Values einzufügen.
+
+
+*/
+
+$form["title"] 			= "Software Repository";
+$form["description"] 	= "Software Repositoy which may contain addons or updates";
+$form["name"] 			= "software_repo";
+$form["action"]			= "software_repo_edit.php";
+$form["db_table"]		= "software_repo";
+$form["db_table_idx"]	= "software_repo_id";
+$form["db_history"]		= "no";
+$form["tab_default"]	= "software_repo";
+$form["list_default"]	= "software_repo_list.php";
+$form["auth"]			= 'yes';
+
+$form["auth_preset"]["userid"]  = 0; // 0 = id of the user, > 0 id must match with id of current user
+$form["auth_preset"]["groupid"] = 0; // 0 = default groupid of the user, > 0 id must match with groupid of current user
+$form["auth_preset"]["perm_user"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_group"] = 'riud'; //r = read, i = insert, u = update, d = delete
+$form["auth_preset"]["perm_other"] = ''; //r = read, i = insert, u = update, d = delete
+
+$form["tabs"]['software_repo'] = array (
+	'title' 	=> "Repository",
+	'width' 	=> 80,
+	'template' 	=> "templates/software_repo_edit.htm",
+	'fields' 	=> array (
+	##################################
+	# Beginn Datenbankfelder
+	##################################
+		'repo_name' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'repo_name_empty'),
+										1 => array (	'type'	=> 'UNIQUE',
+														'errmsg'=> 'repo_name_unique'),
+									),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '40',
+			'maxlength'	=> '40',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'repo_url' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'validators'	=> array ( 	0 => array (	'type'	=> 'NOTEMPTY',
+														'errmsg'=> 'repo_name_empty'),
+										1 => array (	'type'	=> 'UNIQUE',
+														'errmsg'=> 'repo_name_unique'),
+									),
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '40',
+			'maxlength'	=> '40',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'repo_username' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'TEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '30',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'repo_password' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'PASSWORD',
+			'encryption' => 'CLEARTEXT',
+			'default'	=> '',
+			'value'		=> '',
+			'separator'	=> '',
+			'width'		=> '30',
+			'maxlength'	=> '30',
+			'rows'		=> '',
+			'cols'		=> ''
+		),
+		'active' => array (
+			'datatype'	=> 'VARCHAR',
+			'formtype'	=> 'CHECKBOX',
+			'default'	=> 'y',
+			'value'		=> array(0 => 'n',1 => 'y')
+		),
+	##################################
+	# ENDE Datenbankfelder
+	##################################
+	)
+);
+?>
\ No newline at end of file
diff --git a/interface/web/admin/language_complete.php b/interface/web/admin/language_complete.php
new file mode 100644
index 0000000000..4f45724cc2
--- /dev/null
+++ b/interface/web/admin/language_complete.php
@@ -0,0 +1,146 @@
+<?php
+/*
+Copyright (c) 2008, Till Brehm, projektfarm Gmbh
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright notice,
+      this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above copyright notice,
+      this list of conditions and the following disclaimer in the documentation
+      and/or other materials provided with the distribution.
+    * Neither the name of ISPConfig nor the names of its contributors
+      may be used to endorse or promote products derived from this software without
+      specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+require_once('../../lib/config.inc.php');
+require_once('../../lib/app.inc.php');
+
+//* Check permissions for module
+$app->auth->check_module_permissions('admin');
+
+//* This is only allowed for administrators
+if(!$app->auth->is_admin()) die('only allowed for administrators.');
+
+$app->uses('tpl');
+
+$app->tpl->newTemplate('form.tpl.htm');
+$app->tpl->setInclude('content_tpl', 'templates/language_complete.htm');
+
+//* reading languages
+$language_option = '';
+$error = '';
+$msg = '';
+$selected_language = (isset($_REQUEST['lng_select']))?substr($_REQUEST['lng_select'],0,2):'en';
+if(!preg_match("/^[a-z]{2}$/i", $selected_language)) die('unallowed characters in selected language name.');
+
+$handle = opendir(ISPC_ROOT_PATH.'/lib/lang/'); 
+while ($file = readdir ($handle)) { 
+    if ($file != '.' && $file != '..') {
+		$tmp_lng = substr($file,0,-4);
+		if($tmp_lng !='' && $tmp_lng != 'en') {
+			$selected = ($tmp_lng == $selected_language)?'SELECTED':'';
+			$language_option .= "<option value='$tmp_lng' $selected>$tmp_lng</option>";
+			//if(isset($_POST['lng_new']) && $_POST['lng_new'] == $tmp_lng) $error = 'Language exists already.';
+		}
+	}
+}
+$app->tpl->setVar('language_option',$language_option);
+$app->tpl->setVar('error',$error);
+
+// Export the language file
+if(isset($_POST['lng_select']) && $error == '') {
+	
+	// complete the global langauge file
+	merge_langfile(ISPC_LIB_PATH."/lang/".$selected_language.".lng",ISPC_LIB_PATH."/lang/en.lng");
+	
+	// Go trough all language files
+	$bgcolor = '#FFFFFF';
+	$language_files_list = array();
+	$handle = @opendir(ISPC_WEB_PATH); 
+	while ($file = @readdir ($handle)) { 
+	   	if ($file != '.' && $file != '..') {
+	        if(@is_dir(ISPC_WEB_PATH.'/'.$file.'/lib/lang')) {
+				$handle2 = opendir(ISPC_WEB_PATH.'/'.$file.'/lib/lang');
+				while ($lang_file = @readdir ($handle2)) {
+					if ($lang_file != '.' && $lang_file != '..' && substr($lang_file,0,2) == 'en') {
+						$target_lang_file = $selected_language.substr($lang_file,2);
+						merge_langfile(ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$target_lang_file,ISPC_WEB_PATH.'/'.$file.'/lib/lang/'.$lang_file);
+					}
+				}
+			}
+		}
+	}
+}
+
+function merge_langfile($langfile,$masterfile) {
+	global $msg;
+	
+	if(is_file($langfile)) {
+	
+		// Load the english language file
+		include($masterfile);
+		if(isset($wb) && is_array($wb)) {
+			$wb_master = $wb;
+			unset($wb);
+		} else {
+			$wb_master = array();
+		}
+	
+		// Load the incomplete language file
+		$wb = array();
+		include($langfile);
+	
+		$n = 0;
+		foreach($wb_master as $key => $val) {
+			if(!isset($wb[$key])) {
+				$wb[$key] = $val;
+				$n++;
+			}
+		}
+	
+		$file_content = "<?php\n";
+		foreach($wb as $key => $val) {
+			$val = str_replace("'",'',$val);
+			$val = str_replace('"','',$val);
+			$file_content .= '$wb['."'$key'".'] = '."'$val';\n";
+		}
+		$file_content .= "?>\n";
+	
+		$msg .= "Added $n lines to the file $langfile<br />";
+		file_put_contents($langfile ,$file_content);
+	} else {
+		$msg .= "File does not exist yet. Copied file $masterfile to $langfile<br />";
+		copy($masterfile,$langfile);
+	}
+}
+
+
+
+
+$app->tpl->setVar('msg',$msg);
+
+//* load language file 
+$lng_file = 'lib/lang/'.$_SESSION['s']['language'].'_language_complete.lng';
+include($lng_file);
+$app->tpl->setVar($wb);
+
+$app->tpl_defaults();
+$app->tpl->pparse();
+
+
+?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/lang/en_language_complete.lng b/interface/web/admin/lib/lang/en_language_complete.lng
new file mode 100644
index 0000000000..734e75c5fa
--- /dev/null
+++ b/interface/web/admin/lib/lang/en_language_complete.lng
@@ -0,0 +1,6 @@
+<?php
+$wb["list_head_txt"] = 'Merge the selected language file with the english master language file. <br />This adds missing strings from the english master language files to the selected language.';
+$wb["language_select_txt"] = 'Select language';
+$wb['btn_save_txt'] = 'Merge files now';
+$wb['btn_cancel_txt'] = 'Back';
+?>
\ No newline at end of file
diff --git a/interface/web/admin/lib/module.conf.php b/interface/web/admin/lib/module.conf.php
index a37dd96969..5b631553f2 100644
--- a/interface/web/admin/lib/module.conf.php
+++ b/interface/web/admin/lib/module.conf.php
@@ -136,6 +136,10 @@ $items[] = array( 'title' 	=> 'New Language',
 				  'target' 	=> 'content',
 				  'link'	=> 'admin/language_add.php');
 				  
+$items[] = array( 'title' 	=> 'Merge',
+				  'target' 	=> 'content',
+				  'link'	=> 'admin/language_complete.php');
+
 $items[] = array( 'title' 	=> 'Export',
 				  'target' 	=> 'content',
 				  'link'	=> 'admin/language_export.php');
diff --git a/interface/web/admin/templates/language_complete.htm b/interface/web/admin/templates/language_complete.htm
new file mode 100644
index 0000000000..144e9ebcc1
--- /dev/null
+++ b/interface/web/admin/templates/language_complete.htm
@@ -0,0 +1,12 @@
+<div class="frmTextHead"><tmpl_var name="list_head_txt"></div><br />
+<p class="frmText11">
+  <tmpl_var name="language_select_txt">: <select name="lng_select">{tmpl_var name='language_option'}</select>
+</p>
+<tmpl_if name="msg">
+  <p class="msg" ><tmpl_var name="msg"></p>
+</tmpl_if>
+<tmpl_if name="error">
+  <p class="error" ><tmpl_var name="error"></p>
+</tmpl_if>
+<input name="btn_save" type="button" class="button" value="{tmpl_var name='btn_save_txt'}" onClick="submitForm('pageForm','admin/language_complete.php');"><div class="buttonEnding"></div>
+      <input name="btn_cancel" type="button" class="button" value="{tmpl_var name='btn_cancel_txt'}" onClick="loadContent('admin/language_list.php');"><div class="buttonEnding"></div>
\ No newline at end of file
-- 
GitLab